From b863aa48949166cfa6fe29bb8e5f78db27e4b81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 23 Sep 2024 09:35:57 +0200 Subject: [PATCH 001/159] feat: initial implementation of graph primitives --- Cargo.lock | 20 ++ .../re_types/definitions/rerun/archetypes.fbs | 2 + .../rerun/archetypes/graph_edges.fbs | 32 ++ .../rerun/archetypes/graph_nodes.fbs | 36 ++ .../re_types/definitions/rerun/components.fbs | 2 + .../rerun/components/graph_edge.fbs | 19 + .../rerun/components/graph_node_id.fbs | 18 + .../re_types/definitions/rerun/datatypes.fbs | 1 + .../rerun/datatypes/graph_node_id.fbs | 17 + .../re_types/src/archetypes/.gitattributes | 2 + .../re_types/src/archetypes/graph_edges.rs | 300 ++++++++++++++++ .../re_types/src/archetypes/graph_nodes.rs | 336 ++++++++++++++++++ crates/store/re_types/src/archetypes/mod.rs | 4 + .../re_types/src/components/.gitattributes | 2 + .../re_types/src/components/graph_edge.rs | 290 +++++++++++++++ .../re_types/src/components/graph_node_id.rs | 126 +++++++ crates/store/re_types/src/components/mod.rs | 4 + .../re_types/src/datatypes/.gitattributes | 1 + .../re_types/src/datatypes/graph_node_id.rs | 170 +++++++++ crates/store/re_types/src/datatypes/mod.rs | 2 + crates/viewer/re_viewer/src/reflection/mod.rs | 69 ++++ docs/content/reference/types/archetypes.md | 5 + .../reference/types/archetypes/.gitattributes | 2 + .../reference/types/archetypes/graph_edges.md | 23 ++ .../reference/types/archetypes/graph_nodes.md | 23 ++ docs/content/reference/types/components.md | 2 + .../reference/types/components/.gitattributes | 2 + .../reference/types/components/class_id.md | 2 + .../reference/types/components/color.md | 2 + .../reference/types/components/graph_edge.md | 22 ++ .../types/components/graph_node_id.md | 20 ++ .../reference/types/components/position2d.md | 1 + .../reference/types/components/show_labels.md | 2 + .../reference/types/components/text.md | 2 + docs/content/reference/types/datatypes.md | 1 + .../reference/types/datatypes/.gitattributes | 1 + .../types/datatypes/graph_node_id.md | 21 ++ examples/rust/graph_view/Cargo.toml | 24 ++ examples/rust/graph_view/README.md | 1 + .../rust/graph_view/src/graph_space_view.rs | 185 ++++++++++ .../graph_view/src/graph_visualizer_system.rs | 112 ++++++ examples/rust/graph_view/src/main.rs | 62 ++++ examples/rust/node_link_graph/Cargo.toml | 17 + examples/rust/node_link_graph/README.md | 1 + examples/rust/node_link_graph/src/main.rs | 67 ++++ rerun_cpp/src/rerun/archetypes.hpp | 2 + rerun_cpp/src/rerun/archetypes/.gitattributes | 4 + .../src/rerun/archetypes/graph_edges.cpp | 53 +++ .../src/rerun/archetypes/graph_edges.hpp | 101 ++++++ .../src/rerun/archetypes/graph_nodes.cpp | 58 +++ .../src/rerun/archetypes/graph_nodes.hpp | 112 ++++++ rerun_cpp/src/rerun/components.hpp | 2 + rerun_cpp/src/rerun/components/.gitattributes | 3 + rerun_cpp/src/rerun/components/graph_edge.cpp | 68 ++++ rerun_cpp/src/rerun/components/graph_edge.hpp | 61 ++++ .../src/rerun/components/graph_node_id.hpp | 73 ++++ rerun_cpp/src/rerun/datatypes.hpp | 1 + rerun_cpp/src/rerun/datatypes/.gitattributes | 2 + .../src/rerun/datatypes/graph_node_id.cpp | 56 +++ .../src/rerun/datatypes/graph_node_id.hpp | 62 ++++ .../rerun_sdk/rerun/archetypes/.gitattributes | 2 + .../rerun_sdk/rerun/archetypes/__init__.py | 4 + .../rerun_sdk/rerun/archetypes/graph_edges.py | 124 +++++++ .../rerun_sdk/rerun/archetypes/graph_nodes.py | 144 ++++++++ .../rerun_sdk/rerun/components/.gitattributes | 2 + .../rerun_sdk/rerun/components/__init__.py | 10 + .../rerun_sdk/rerun/components/graph_edge.py | 74 ++++ .../rerun/components/graph_node_id.py | 36 ++ .../rerun_sdk/rerun/datatypes/.gitattributes | 1 + .../rerun_sdk/rerun/datatypes/__init__.py | 6 + .../rerun/datatypes/graph_node_id.py | 67 ++++ 71 files changed, 3181 insertions(+) create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs create mode 100644 crates/store/re_types/definitions/rerun/components/graph_edge.fbs create mode 100644 crates/store/re_types/definitions/rerun/components/graph_node_id.fbs create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs create mode 100644 crates/store/re_types/src/archetypes/graph_edges.rs create mode 100644 crates/store/re_types/src/archetypes/graph_nodes.rs create mode 100644 crates/store/re_types/src/components/graph_edge.rs create mode 100644 crates/store/re_types/src/components/graph_node_id.rs create mode 100644 crates/store/re_types/src/datatypes/graph_node_id.rs create mode 100644 docs/content/reference/types/archetypes/graph_edges.md create mode 100644 docs/content/reference/types/archetypes/graph_nodes.md create mode 100644 docs/content/reference/types/components/graph_edge.md create mode 100644 docs/content/reference/types/components/graph_node_id.md create mode 100644 docs/content/reference/types/datatypes/graph_node_id.md create mode 100644 examples/rust/graph_view/Cargo.toml create mode 100644 examples/rust/graph_view/README.md create mode 100644 examples/rust/graph_view/src/graph_space_view.rs create mode 100644 examples/rust/graph_view/src/graph_visualizer_system.rs create mode 100644 examples/rust/graph_view/src/main.rs create mode 100644 examples/rust/node_link_graph/Cargo.toml create mode 100644 examples/rust/node_link_graph/README.md create mode 100644 examples/rust/node_link_graph/src/main.rs create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.hpp create mode 100644 rerun_cpp/src/rerun/components/graph_edge.cpp create mode 100644 rerun_cpp/src/rerun/components/graph_edge.hpp create mode 100644 rerun_cpp/src/rerun/components/graph_node_id.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/graph_node_id.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/graph_node_id.hpp create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node_id.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py diff --git a/Cargo.lock b/Cargo.lock index 6aff8cbde065..c40c5d8b2731 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2725,6 +2725,16 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "graph_view" +version = "0.0.0" +dependencies = [ + "mimalloc", + "re_crash_handler", + "re_sdk_comms", + "re_viewer", +] + [[package]] name = "half" version = "1.8.2" @@ -3672,6 +3682,16 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "node_link_graph" +version = "0.19.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "glam", + "rerun", +] + [[package]] name = "nohash-hasher" version = "0.2.0" diff --git a/crates/store/re_types/definitions/rerun/archetypes.fbs b/crates/store/re_types/definitions/rerun/archetypes.fbs index e8cc336b3afb..bda48b2bb794 100644 --- a/crates/store/re_types/definitions/rerun/archetypes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes.fbs @@ -13,6 +13,8 @@ include "./archetypes/depth_image.fbs"; include "./archetypes/disconnected_space.fbs"; include "./archetypes/ellipsoids3d.fbs"; include "./archetypes/encoded_image.fbs"; +include "./archetypes/graph_edges.fbs"; +include "./archetypes/graph_nodes.fbs"; include "./archetypes/image.fbs"; include "./archetypes/instance_poses3d.fbs"; include "./archetypes/line_strips2d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs new file mode 100644 index 000000000000..82227d289bb8 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -0,0 +1,32 @@ +namespace rerun.archetypes; + +// --- + +/// A list of nodes in a graph with optional labels, colors, etc. +table GraphEdges ( + "attr.rust.derive": "PartialEq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + edges: [rerun.components.GraphEdge] ("attr.rerun.component_required", order: 1000); + + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs new file mode 100644 index 000000000000..d6f82df6b1ec --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -0,0 +1,36 @@ +namespace rerun.archetypes; + +// --- + +/// A list of nodes in a graph with optional labels, colors, etc. +table GraphNodes ( + "attr.rust.derive": "PartialEq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + node_ids: [rerun.components.GraphNodeId] ("attr.rerun.component_required", order: 1000); + + // --- Recommended --- + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 2000); + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional center positions of the nodes. + centers: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/components.fbs b/crates/store/re_types/definitions/rerun/components.fbs index b212c946a50d..950d3cd28ce4 100644 --- a/crates/store/re_types/definitions/rerun/components.fbs +++ b/crates/store/re_types/definitions/rerun/components.fbs @@ -16,6 +16,8 @@ include "./components/entity_path.fbs"; include "./components/fill_mode.fbs"; include "./components/fill_ratio.fbs"; include "./components/gamma_correction.fbs"; +include "./components/graph_edge.fbs"; +include "./components/graph_node_id.fbs"; include "./components/half_size2d.fbs"; include "./components/half_size3d.fbs"; include "./components/image_buffer.fbs"; diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs new file mode 100644 index 000000000000..b8075f3167dc --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -0,0 +1,19 @@ +namespace rerun.components; + +// --- + +/// An edge in a graph connecting two nodes. +/// +/// Depending on the context this could represent a directed or undirected edge. +// +// TODO: Why do we need `Default` here? +struct GraphEdge ( + "attr.arrow.transparent", + "attr.python.aliases": "Tuple(int, int)", + "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + edge: [rerun.datatypes.GraphNodeId: 2] (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs new file mode 100644 index 000000000000..047496ed7623 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs @@ -0,0 +1,18 @@ +namespace rerun.components; + +// --- + +/// A 32-bit ID representing a node in a graph. +// +// TODO: Why do we need `Default` here? +struct GraphNodeId ( + "attr.arrow.transparent", + "attr.python.aliases": "int", + "attr.python.array_aliases": "int, npt.NDArray[np.uint8], npt.NDArray[np.uint16], npt.NDArray[np.uint32], npt.NDArray[np.uint64]", + "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + id: rerun.datatypes.GraphNodeId (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 203c6105aa1a..ec757355739b 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -12,6 +12,7 @@ include "./datatypes/color_model.fbs"; include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; +include "./datatypes/graph_node_id.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs new file mode 100644 index 000000000000..9e4c6c8f2f91 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs @@ -0,0 +1,17 @@ +namespace rerun.datatypes; + +// --- + +/// A 32-bit ID representing a node in a graph. +struct GraphNodeId ( + "attr.arrow.transparent", + "attr.python.aliases": "int", + "attr.python.array_aliases": "int, npt.ArrayLike", + "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", + "attr.rust.repr": "transparent", + "attr.rust.tuple_struct", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + id: uint (order: 100); +} diff --git a/crates/store/re_types/src/archetypes/.gitattributes b/crates/store/re_types/src/archetypes/.gitattributes index 1dbfddfe109b..014d68c38829 100644 --- a/crates/store/re_types/src/archetypes/.gitattributes +++ b/crates/store/re_types/src/archetypes/.gitattributes @@ -13,6 +13,8 @@ depth_image.rs linguist-generated=true disconnected_space.rs linguist-generated=true ellipsoids3d.rs linguist-generated=true encoded_image.rs linguist-generated=true +graph_edges.rs linguist-generated=true +graph_nodes.rs linguist-generated=true image.rs linguist-generated=true instance_poses3d.rs linguist-generated=true line_strips2d.rs linguist-generated=true diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs new file mode 100644 index 000000000000..47a59c16bf0f --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -0,0 +1,300 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq)] +pub struct GraphEdges { + /// A list of node IDs. + pub edges: Vec, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphEdges { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.edges.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdge".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.GraphEdgesIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdge".into(), + "rerun.components.Color".into(), + "rerun.components.GraphEdgesIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphEdges { + /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 6usize; +} + +/// Indicator component for the [`GraphEdges`] [`::re_types_core::Archetype`] +pub type GraphEdgesIndicator = ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphEdges { + type Indicator = GraphEdgesIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphEdges".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph edges" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphEdgesIndicator = GraphEdgesIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let edges = { + let array = arrays_by_name + .get("rerun.components.GraphEdge") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphEdges#edges")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#edges")? + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#colors")? + }) + } else { + None + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#labels")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#class_ids")? + }) + } else { + None + }; + Ok(Self { + edges, + colors, + labels, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphEdges { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.edges as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdges {} + +impl GraphEdges { + /// Create a new `GraphEdges`. + #[inline] + pub fn new(edges: impl IntoIterator>) -> Self { + Self { + edges: edges.into_iter().map(Into::into).collect(), + colors: None, + labels: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs new file mode 100644 index 000000000000..14620a3973c4 --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_nodes.rs @@ -0,0 +1,336 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq)] +pub struct GraphNodes { + /// A list of node IDs. + pub node_ids: Vec, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional center positions of the nodes. + pub centers: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphNodes { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.node_ids.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.centers.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphNodeId".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.Position2D".into(), + "rerun.components.GraphNodesIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 7usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphNodeId".into(), + "rerun.components.Color".into(), + "rerun.components.Position2D".into(), + "rerun.components.GraphNodesIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphNodes { + /// The total number of components in the archetype: 1 required, 3 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 7usize; +} + +/// Indicator component for the [`GraphNodes`] [`::re_types_core::Archetype`] +pub type GraphNodesIndicator = ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphNodes { + type Indicator = GraphNodesIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphNodes".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph nodes" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphNodesIndicator = GraphNodesIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let node_ids = { + let array = arrays_by_name + .get("rerun.components.GraphNodeId") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphNodes#node_ids")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#node_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#node_ids")? + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#labels")? + }) + } else { + None + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#colors")? + }) + } else { + None + }; + let centers = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#centers")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#centers")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#class_ids")? + }) + } else { + None + }; + Ok(Self { + node_ids, + labels, + colors, + centers, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphNodes { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.node_ids as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.centers + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphNodes {} + +impl GraphNodes { + /// Create a new `GraphNodes`. + #[inline] + pub fn new( + node_ids: impl IntoIterator>, + ) -> Self { + Self { + node_ids: node_ids.into_iter().map(Into::into).collect(), + labels: None, + colors: None, + centers: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional center positions of the nodes. + #[inline] + pub fn with_centers( + mut self, + centers: impl IntoIterator>, + ) -> Self { + self.centers = Some(centers.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 46c6b161b698..34f38386f8e2 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -21,6 +21,8 @@ mod ellipsoids3d; mod ellipsoids3d_ext; mod encoded_image; mod encoded_image_ext; +mod graph_edges; +mod graph_nodes; mod image; mod image_ext; mod instance_poses3d; @@ -61,6 +63,8 @@ pub use self::depth_image::DepthImage; pub use self::disconnected_space::DisconnectedSpace; pub use self::ellipsoids3d::Ellipsoids3D; pub use self::encoded_image::EncodedImage; +pub use self::graph_edges::GraphEdges; +pub use self::graph_nodes::GraphNodes; pub use self::image::Image; pub use self::instance_poses3d::InstancePoses3D; pub use self::line_strips2d::LineStrips2D; diff --git a/crates/store/re_types/src/components/.gitattributes b/crates/store/re_types/src/components/.gitattributes index bfc236554ca9..d3a36f04667c 100644 --- a/crates/store/re_types/src/components/.gitattributes +++ b/crates/store/re_types/src/components/.gitattributes @@ -16,6 +16,8 @@ entity_path.rs linguist-generated=true fill_mode.rs linguist-generated=true fill_ratio.rs linguist-generated=true gamma_correction.rs linguist-generated=true +graph_edge.rs linguist-generated=true +graph_node_id.rs linguist-generated=true half_size2d.rs linguist-generated=true half_size3d.rs linguist-generated=true image_buffer.rs linguist-generated=true diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge.rs new file mode 100644 index 000000000000..701eda8f4b7f --- /dev/null +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -0,0 +1,290 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Component**: An edge in a graph connecting two nodes. +/// +/// Depending on the context this could represent a directed or undirected edge. +#[derive( + Clone, + Debug, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + bytemuck::Pod, + bytemuck::Zeroable, +)] +#[repr(transparent)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphEdge(pub [crate::datatypes::GraphNodeId; 2usize]); + +impl ::re_types_core::SizeBytes for GraphEdge { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.0.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + <[crate::datatypes::GraphNodeId; 2usize]>::is_pod() + } +} + +impl> From for GraphEdge { + fn from(v: T) -> Self { + Self(v.into()) + } +} + +impl std::borrow::Borrow<[crate::datatypes::GraphNodeId; 2usize]> for GraphEdge { + #[inline] + fn borrow(&self) -> &[crate::datatypes::GraphNodeId; 2usize] { + &self.0 + } +} + +impl std::ops::Deref for GraphEdge { + type Target = [crate::datatypes::GraphNodeId; 2usize]; + + #[inline] + fn deref(&self) -> &[crate::datatypes::GraphNodeId; 2usize] { + &self.0 + } +} + +impl std::ops::DerefMut for GraphEdge { + #[inline] + fn deref_mut(&mut self) -> &mut [crate::datatypes::GraphNodeId; 2usize] { + &mut self.0 + } +} + +::re_types_core::macros::impl_into_cow!(GraphEdge); + +impl ::re_types_core::Loggable for GraphEdge { + type Name = ::re_types_core::ComponentName; + + #[inline] + fn name() -> Self::Name { + "rerun.components.GraphEdge".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::FixedSizeList( + std::sync::Arc::new(Field::new( + "item", + ::arrow_datatype(), + false, + )), + 2usize, + ) + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data0): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + let datum = datum.map(|datum| datum.into_owned().0); + (datum.is_some(), datum) + }) + .unzip(); + let data0_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + use arrow2::{buffer::Buffer, offset::OffsetsBuffer}; + let data0_inner_data: Vec<_> = data0 + .into_iter() + .flat_map(|v| match v { + Some(v) => itertools::Either::Left(v.into_iter()), + None => itertools::Either::Right( + std::iter::repeat(Default::default()).take(2usize), + ), + }) + .collect(); + let data0_inner_bitmap: Option = + data0_bitmap.as_ref().map(|bitmap| { + bitmap + .iter() + .map(|b| std::iter::repeat(b).take(2usize)) + .flatten() + .collect::>() + .into() + }); + FixedSizeListArray::new( + Self::arrow_datatype(), + PrimitiveArray::new( + DataType::UInt32, + data0_inner_data.into_iter().map(|datum| datum.0).collect(), + data0_inner_bitmap, + ) + .boxed(), + data0_bitmap, + ) + .boxed() + } + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok({ + let arrow_data = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.components.GraphEdge#edge")?; + if arrow_data.is_empty() { + Vec::new() + } else { + let offsets = (0..) + .step_by(2usize) + .zip((2usize..).step_by(2usize).take(arrow_data.len())); + let arrow_data_inner = { + let arrow_data_inner = &**arrow_data.values(); + arrow_data_inner + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = DataType::UInt32; + let actual = arrow_data_inner.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.components.GraphEdge#edge")? + .into_iter() + .map(|opt| opt.copied()) + .map(|res_or_opt| res_or_opt.map(crate::datatypes::GraphNodeId)) + .collect::>() + }; + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets, + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, end): (usize, usize)| { + debug_assert!(end - start == 2usize); + if end > arrow_data_inner.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_inner.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = unsafe { arrow_data_inner.get_unchecked(start..end) }; + let data = data.iter().cloned().map(Option::unwrap_or_default); + + // NOTE: Unwrapping cannot fail: the length must be correct. + #[allow(clippy::unwrap_used)] + Ok(array_init::from_iter(data).unwrap()) + }) + .transpose() + }) + .collect::>>>()? + } + .into_iter() + } + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .map(|res| res.map(|v| Some(Self(v)))) + .collect::>>>() + .with_context("rerun.components.GraphEdge#edge") + .with_context("rerun.components.GraphEdge")?) + } + + #[inline] + fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + if let Some(validity) = arrow_data.validity() { + if validity.unset_bits() != 0 { + return Err(DeserializationError::missing_data()); + } + } + Ok({ + let slice = { + let arrow_data = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = DataType::FixedSizeList( + std::sync::Arc::new(Field::new( + "item", + ::arrow_datatype(), + false, + )), + 2usize, + ); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.components.GraphEdge#edge")?; + let arrow_data_inner = &**arrow_data.values(); + bytemuck::cast_slice::<_, [_; 2usize]>( + arrow_data_inner + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = DataType::UInt32; + let actual = arrow_data_inner.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.components.GraphEdge#edge")? + .values() + .as_slice(), + ) + }; + { + slice.iter().copied().map(Self).collect::>() + } + }) + } +} diff --git a/crates/store/re_types/src/components/graph_node_id.rs b/crates/store/re_types/src/components/graph_node_id.rs new file mode 100644 index 000000000000..7087c9ea2ad1 --- /dev/null +++ b/crates/store/re_types/src/components/graph_node_id.rs @@ -0,0 +1,126 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Component**: A 32-bit ID representing a node in a graph. +#[derive( + Clone, + Debug, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + bytemuck::Pod, + bytemuck::Zeroable, +)] +#[repr(transparent)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphNodeId(pub crate::datatypes::GraphNodeId); + +impl ::re_types_core::SizeBytes for GraphNodeId { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.0.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() + } +} + +impl> From for GraphNodeId { + fn from(v: T) -> Self { + Self(v.into()) + } +} + +impl std::borrow::Borrow for GraphNodeId { + #[inline] + fn borrow(&self) -> &crate::datatypes::GraphNodeId { + &self.0 + } +} + +impl std::ops::Deref for GraphNodeId { + type Target = crate::datatypes::GraphNodeId; + + #[inline] + fn deref(&self) -> &crate::datatypes::GraphNodeId { + &self.0 + } +} + +impl std::ops::DerefMut for GraphNodeId { + #[inline] + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNodeId { + &mut self.0 + } +} + +::re_types_core::macros::impl_into_cow!(GraphNodeId); + +impl ::re_types_core::Loggable for GraphNodeId { + type Name = ::re_types_core::ComponentName; + + #[inline] + fn name() -> Self::Name { + "rerun.components.GraphNodeId".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + crate::datatypes::GraphNodeId::arrow_datatype() + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + crate::datatypes::GraphNodeId::to_arrow_opt(data.into_iter().map(|datum| { + datum.map(|datum| match datum.into() { + ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), + ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), + }) + })) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + crate::datatypes::GraphNodeId::from_arrow_opt(arrow_data) + .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) + } + + #[inline] + fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> + where + Self: Sized, + { + crate::datatypes::GraphNodeId::from_arrow(arrow_data).map(bytemuck::cast_vec) + } +} diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index b2010e7147e2..1e127db43b91 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -24,6 +24,8 @@ mod fill_ratio; mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; +mod graph_edge; +mod graph_node_id; mod half_size2d; mod half_size2d_ext; mod half_size3d; @@ -128,6 +130,8 @@ pub use self::entity_path::EntityPath; pub use self::fill_mode::FillMode; pub use self::fill_ratio::FillRatio; pub use self::gamma_correction::GammaCorrection; +pub use self::graph_edge::GraphEdge; +pub use self::graph_node_id::GraphNodeId; pub use self::half_size2d::HalfSize2D; pub use self::half_size3d::HalfSize3D; pub use self::image_buffer::ImageBuffer; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 4eb79a8a65dd..5bad104b598b 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -9,6 +9,7 @@ class_description.rs linguist-generated=true class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true +graph_node_id.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_node_id.rs b/crates/store/re_types/src/datatypes/graph_node_id.rs new file mode 100644 index 000000000000..7a7a41125d3f --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_node_id.rs @@ -0,0 +1,170 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: A 32-bit ID representing a node in a graph. +#[derive( + Clone, + Debug, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + bytemuck::Pod, + bytemuck::Zeroable, +)] +#[repr(transparent)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphNodeId(pub u32); + +impl ::re_types_core::SizeBytes for GraphNodeId { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.0.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() + } +} + +impl From for GraphNodeId { + #[inline] + fn from(id: u32) -> Self { + Self(id) + } +} + +impl From for u32 { + #[inline] + fn from(value: GraphNodeId) -> Self { + value.0 + } +} + +::re_types_core::macros::impl_into_cow!(GraphNodeId); + +impl ::re_types_core::Loggable for GraphNodeId { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphNodeId".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::UInt32 + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data0): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + let datum = datum.map(|datum| datum.into_owned().0); + (datum.is_some(), datum) + }) + .unzip(); + let data0_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + PrimitiveArray::new( + Self::arrow_datatype(), + data0.into_iter().map(|v| v.unwrap_or_default()).collect(), + data0_bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok(arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphNodeId#id")? + .into_iter() + .map(|opt| opt.copied()) + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .map(|res| res.map(|v| Some(Self(v)))) + .collect::>>>() + .with_context("rerun.datatypes.GraphNodeId#id") + .with_context("rerun.datatypes.GraphNodeId")?) + } + + #[inline] + fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + if let Some(validity) = arrow_data.validity() { + if validity.unset_bits() != 0 { + return Err(DeserializationError::missing_data()); + } + } + Ok({ + let slice = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = DataType::UInt32; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphNodeId#id")? + .values() + .as_slice(); + { + slice.iter().copied().map(Self).collect::>() + } + }) + } +} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index c59c58d03b4c..9d0b65963498 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -16,6 +16,7 @@ mod class_id; mod class_id_ext; mod color_model; mod color_model_ext; +mod graph_node_id; mod image_format; mod image_format_ext; mod keypoint_id; @@ -74,6 +75,7 @@ pub use self::class_description::ClassDescription; pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; +pub use self::graph_node_id::GraphNodeId; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 92e4eb2f0358..d1e01954a8d2 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -370,6 +370,20 @@ fn generate_component_reflection() -> Result::name(), + ComponentReflection { + docstring_md: "An edge in a graph connecting two nodes.\n\nDepending on the context this could represent a directed or undirected edge.", + placeholder: Some(GraphEdge::default().to_arrow()?), + }, + ), + ( + ::name(), + ComponentReflection { + docstring_md: "A 32-bit ID representing a node in a graph.", + placeholder: Some(GraphNodeId::default().to_arrow()?), + }, + ), ( ::name(), ComponentReflection { @@ -1058,6 +1072,61 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { ], }, ), + ( + ArchetypeName::new("rerun.archetypes.GraphEdges"), + ArchetypeReflection { + display_name: "Graph edges", + fields: vec![ + ArchetypeFieldReflection { component_name : + "rerun.components.GraphEdge".into(), display_name : "Edges", + docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, + ], + }, + ), + ( + ArchetypeName::new("rerun.archetypes.GraphNodes"), + ArchetypeReflection { + display_name: "Graph nodes", + fields: vec![ + ArchetypeFieldReflection { component_name : + "rerun.components.GraphNodeId".into(), display_name : "Node ids", + docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.Position2D".into(), display_name : "Centers", + docstring_md : "Optional center positions of the nodes.", is_required + : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, + ], + }, + ), ( ArchetypeName::new("rerun.archetypes.Image"), ArchetypeReflection { diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index be8c53d8ec70..cbfdf8ad16d4 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -12,6 +12,11 @@ the intent of the logging code and triggers the activation of the corresponding This page lists all built-in archetypes. +## Graph + +* [`GraphEdges`](archetypes/graph_edges.md): A list of nodes in a graph with optional labels, colors, etc. +* [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. + ## Image & tensor * [`DepthImage`](archetypes/depth_image.md): A depth image, i.e. as captured by a depth camera. diff --git a/docs/content/reference/types/archetypes/.gitattributes b/docs/content/reference/types/archetypes/.gitattributes index c0ce3b7563c5..96cbe96c0299 100644 --- a/docs/content/reference/types/archetypes/.gitattributes +++ b/docs/content/reference/types/archetypes/.gitattributes @@ -14,6 +14,8 @@ depth_image.md linguist-generated=true disconnected_space.md linguist-generated=true ellipsoids3d.md linguist-generated=true encoded_image.md linguist-generated=true +graph_edges.md linguist-generated=true +graph_nodes.md linguist-generated=true image.md linguist-generated=true instance_poses3d.md linguist-generated=true line_strips2d.md linguist-generated=true diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges.md new file mode 100644 index 000000000000..128b5d5b9c48 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_edges.md @@ -0,0 +1,23 @@ +--- +title: "GraphEdges" +--- + + +A list of nodes in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphEdge`](../components/graph_edge.md) + +**Recommended**: [`Color`](../components/color.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdges`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdges.html) + * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdges) + * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html) + diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md new file mode 100644 index 000000000000..f600054e3019 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -0,0 +1,23 @@ +--- +title: "GraphNodes" +--- + + +A list of nodes in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphNodeId`](../components/graph_node_id.md) + +**Recommended**: [`Color`](../components/color.md), [`Position2D`](../components/position2d.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html) + * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphNodes) + * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html) + diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 11aba202b4d0..38d60b4ffcb8 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,6 +29,8 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. +* [`GraphEdge`](components/graph_edge.md): An edge in a graph connecting two nodes. +* [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. * [`HalfSize3D`](components/half_size3d.md): Half-size (radius) of a 3D box. * [`ImageBuffer`](components/image_buffer.md): A buffer that is known to store image data. diff --git a/docs/content/reference/types/components/.gitattributes b/docs/content/reference/types/components/.gitattributes index c07d94eee94f..ba6eaac44f4f 100644 --- a/docs/content/reference/types/components/.gitattributes +++ b/docs/content/reference/types/components/.gitattributes @@ -17,6 +17,8 @@ entity_path.md linguist-generated=true fill_mode.md linguist-generated=true fill_ratio.md linguist-generated=true gamma_correction.md linguist-generated=true +graph_edge.md linguist-generated=true +graph_node_id.md linguist-generated=true half_size2d.md linguist-generated=true half_size3d.md linguist-generated=true image_buffer.md linguist-generated=true diff --git a/docs/content/reference/types/components/class_id.md b/docs/content/reference/types/components/class_id.md index be0847bc2e4d..c7fdad731526 100644 --- a/docs/content/reference/types/components/class_id.md +++ b/docs/content/reference/types/components/class_id.md @@ -22,6 +22,8 @@ A 16-bit ID representing a type of semantic class. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index c5703e66ea2f..b57c22f3be6c 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,6 +26,8 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md new file mode 100644 index 000000000000..cccef4e17797 --- /dev/null +++ b/docs/content/reference/types/components/graph_edge.md @@ -0,0 +1,22 @@ +--- +title: "GraphEdge" +--- + + +An edge in a graph connecting two nodes. + +Depending on the context this could represent a directed or undirected edge. + +## Fields + +* edge: 2x [`GraphNodeId`](../datatypes/graph_node_id.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) + * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) + * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) + + +## Used by + +* [`GraphEdges`](../archetypes/graph_edges.md) diff --git a/docs/content/reference/types/components/graph_node_id.md b/docs/content/reference/types/components/graph_node_id.md new file mode 100644 index 000000000000..b74c96382c09 --- /dev/null +++ b/docs/content/reference/types/components/graph_node_id.md @@ -0,0 +1,20 @@ +--- +title: "GraphNodeId" +--- + + +A 32-bit ID representing a node in a graph. + +## Fields + +* id: [`GraphNodeId`](../datatypes/graph_node_id.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNodeId.html) + * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNodeId) + * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNodeId.html) + + +## Used by + +* [`GraphNodes`](../archetypes/graph_nodes.md) diff --git a/docs/content/reference/types/components/position2d.md b/docs/content/reference/types/components/position2d.md index 65694d28345a..a787c7672dda 100644 --- a/docs/content/reference/types/components/position2d.md +++ b/docs/content/reference/types/components/position2d.md @@ -19,4 +19,5 @@ A position in 2D space. * [`Arrows2D`](../archetypes/arrows2d.md) * [`Boxes2D`](../archetypes/boxes2d.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index ed7a79e5c6eb..21cd75b09b39 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,6 +26,8 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index 54744c09abd2..0a2c9be1be3d 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,6 +22,8 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index cd0d22cc5249..b4b58cafff1b 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -19,6 +19,7 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`EntityPath`](datatypes/entity_path.md): A path to an entity in the `ChunkStore`. * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. +* [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index 0998d55ed838..ece07faa8407 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -13,6 +13,7 @@ color_model.md linguist-generated=true entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true +graph_node_id.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md new file mode 100644 index 000000000000..ddd83af883c8 --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_node_id.md @@ -0,0 +1,21 @@ +--- +title: "GraphNodeId" +--- + + +A 32-bit ID representing a node in a graph. + +## Fields + +* id: `u32` + +## API reference links + * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNodeId.html) + * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNodeId) + * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNodeId.html) + + +## Used by + +* [`GraphEdge`](../components/graph_edge.md) +* [`GraphNodeId`](../components/graph_node_id.md) diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml new file mode 100644 index 000000000000..035b38014b62 --- /dev/null +++ b/examples/rust/graph_view/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "graph_view" +edition = "2021" +rust-version = "1.76" +license = "MIT OR Apache-2.0" +publish = false + +[features] +default = [] + +# Turn on if you want to share analytics with Rerun (e.g. callstacks on crashes). +analytics = ["re_crash_handler/analytics", "re_viewer/analytics"] + +[dependencies] +re_crash_handler = { path = "../../../crates/utils/re_crash_handler" } +re_viewer = { path = "../../../crates/viewer/re_viewer", default-features = false } + +# We need re_sdk_comms to receive log events from and SDK: +re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ + "server", +] } + +# mimalloc is a much faster allocator: +mimalloc = "0.1" diff --git a/examples/rust/graph_view/README.md b/examples/rust/graph_view/README.md new file mode 100644 index 000000000000..1333ed77b7e1 --- /dev/null +++ b/examples/rust/graph_view/README.md @@ -0,0 +1 @@ +TODO diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs new file mode 100644 index 000000000000..a944ccefe9ff --- /dev/null +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -0,0 +1,185 @@ +use re_viewer::external::{ + egui::{self, Label}, + re_data_ui::{item_ui, DataUi}, + re_entity_db::InstancePath, + re_log_types::EntityPath, + re_types::SpaceViewClassIdentifier, + re_ui, + re_viewer_context::{ + HoverHighlight, IdentifiedViewSystem as _, Item, SelectionHighlight, SpaceViewClass, + SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, + SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, + SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, UiLayout, + ViewQuery, ViewerContext, + }, +}; + +use crate::graph_visualizer_system::{GraphNodeSystem, NodeIdWithInstance}; + +// /// The different modes for displaying color coordinates in the custom space view. +// #[derive(Default, Debug, PartialEq, Clone, Copy)] +// enum ColorCoordinatesMode { +// #[default] +// Hs, +// Hv, +// Rg, +// } + +// impl ColorCoordinatesMode { +// pub const ALL: [ColorCoordinatesMode; 3] = [ +// ColorCoordinatesMode::Hs, +// ColorCoordinatesMode::Hv, +// ColorCoordinatesMode::Rg, +// ]; +// } + +// impl std::fmt::Display for ColorCoordinatesMode { +// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +// match self { +// ColorCoordinatesMode::Hs => "Hue/Saturation".fmt(f), +// ColorCoordinatesMode::Hv => "Hue/Value".fmt(f), +// ColorCoordinatesMode::Rg => "Red/Green".fmt(f), +// } +// } +// } + +/// Space view state for the custom space view. +/// +/// This state is preserved between frames, but not across Viewer sessions. +#[derive(Default)] +pub struct GraphSpaceViewState { + // TODO(wumpf, jleibs): This should be part of the Blueprint so that it is serialized out. + // but right now there is no way of doing that. + // mode: ColorCoordinatesMode, +} + +impl SpaceViewState for GraphSpaceViewState { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} + +#[derive(Default)] +pub struct GraphSpaceView; + +impl SpaceViewClass for GraphSpaceView { + // State type as described above. + + fn identifier() -> SpaceViewClassIdentifier { + "Graph".into() + } + + fn display_name(&self) -> &'static str { + "Graph" + } + + fn icon(&self) -> &'static re_ui::Icon { + &re_ui::icons::SPACE_VIEW_GENERIC + } + + fn help_markdown(&self, _egui_ctx: &egui::Context) -> String { + "A space view that shows a graph as a node link diagram.".to_owned() + } + + /// Register all systems (contexts & parts) that the space view needs. + fn on_register( + &self, + system_registry: &mut SpaceViewSystemRegistrator<'_>, + ) -> Result<(), SpaceViewClassRegistryError> { + system_registry.register_visualizer::() + } + + fn new_state(&self) -> Box { + Box::::default() + } + + fn preferred_tile_aspect_ratio(&self, _state: &dyn SpaceViewState) -> Option { + // Prefer a square tile if possible. + Some(1.0) + } + + fn layout_priority(&self) -> SpaceViewClassLayoutPriority { + Default::default() + } + + fn spawn_heuristics(&self, ctx: &ViewerContext<'_>) -> SpaceViewSpawnHeuristics { + // By default spawn a single view at the root if there's anything the visualizer is applicable to. + if ctx + .applicable_entities_per_visualizer + .get(&GraphNodeSystem::identifier()) + .map_or(true, |entities| entities.is_empty()) + { + SpaceViewSpawnHeuristics::default() + } else { + SpaceViewSpawnHeuristics::root() + } + } + + /// Additional UI displayed when the space view is selected. + /// + /// In this sample we show a combo box to select the color coordinates mode. + fn selection_ui( + &self, + _ctx: &ViewerContext<'_>, + ui: &mut egui::Ui, + state: &mut dyn SpaceViewState, + _space_origin: &EntityPath, + _space_view_id: SpaceViewId, + ) -> Result<(), SpaceViewSystemExecutionError> { + let state = state.downcast_mut::()?; + + // ui.horizontal(|ui| { + // ui.label("Coordinates mode"); + // egui::ComboBox::from_id_salt("color_coordinates_mode") + // .selected_text(state.mode.to_string()) + // .show_ui(ui, |ui| { + // for mode in &ColorCoordinatesMode::ALL { + // ui.selectable_value(&mut state.mode, *mode, mode.to_string()); + // } + // }); + // }); + + Ok(()) + } + + /// The contents of the Space View window and all interaction within it. + /// + /// This is called with freshly created & executed context & part systems. + fn ui( + &self, + ctx: &ViewerContext<'_>, + ui: &mut egui::Ui, + state: &mut dyn SpaceViewState, + + query: &ViewQuery<'_>, + system_output: SystemExecutionOutput, + ) -> Result<(), SpaceViewSystemExecutionError> { + let graph_nodes = system_output.view_systems.get::()?; + let state = state.downcast_mut::()?; + + egui::Frame { + inner_margin: re_ui::DesignTokens::view_padding().into(), + ..egui::Frame::default() + } + .show(ui, |ui| { + ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { + egui::ScrollArea::both().show(ui, |ui| { + for (entity, nodes) in graph_nodes.nodes.iter() { + let text = egui::RichText::new(entity.to_owned()); + ui.add(Label::new(text)); + for n in nodes { + let text = egui::RichText::new(format!("{:?}", n.node_id.0.0)); + ui.add(Label::new(text)); + } + } + }) + }) + .response + }); + Ok(()) + } +} diff --git a/examples/rust/graph_view/src/graph_visualizer_system.rs b/examples/rust/graph_view/src/graph_visualizer_system.rs new file mode 100644 index 000000000000..1edc2206691c --- /dev/null +++ b/examples/rust/graph_view/src/graph_visualizer_system.rs @@ -0,0 +1,112 @@ +use std::string; + +use re_viewer::external::{ + egui, + re_log::external::log, + re_log_types::{EntityPath, Instance}, + re_renderer, + re_types::{ + self, + archetypes::GraphNodes, + components::{Color, GraphEdge, GraphNodeId, Text}, + ComponentName, Loggable as _, + }, + re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, + ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, + VisualizerSystem, + }, +}; + +/// Our space view consist of single part which holds a list of egui colors for each entity path. +#[derive(Default)] +pub struct GraphNodeSystem { + pub nodes: Vec<(EntityPath, Vec)>, + pub edges: Vec<(EntityPath, Vec)>, +} + +pub struct NodeIdWithInstance { + pub node_id: GraphNodeId, + // pub instance: Instance, + pub label: Option, +} + +pub struct EdgeWithInstance { + pub edge: GraphEdge, + // pub instance: Instance, + pub label: Option, +} + +impl IdentifiedViewSystem for GraphNodeSystem { + fn identifier() -> ViewSystemIdentifier { + "Graph Nodes".into() + } +} + +impl VisualizerSystem for GraphNodeSystem { + fn visualizer_query_info(&self) -> VisualizerQueryInfo { + VisualizerQueryInfo::from_archetype::() + } + + /// Populates the scene part with data from the store. + fn execute( + &mut self, + ctx: &ViewContext<'_>, + query: &ViewQuery<'_>, + _context_systems: &ViewContextCollection, + ) -> Result, SpaceViewSystemExecutionError> { + for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { + let results = ctx.recording().query_caches().latest_at( + ctx.recording_store(), + &ctx.current_query(), + &data_result.entity_path, + [GraphNodeId::name(), GraphEdge::name()], + ); + + if let Some(node_ids) = results.component_batch::() { + log::debug!("Node ids: {:?}", node_ids); + + self.nodes.push(( + data_result.entity_path.clone(), + node_ids + .iter() + .map(|&node_id| NodeIdWithInstance { + node_id, + label: None, + }) + .collect(), + )); + } + + if let Some(edges) = results.component_batch::() { + log::debug!("Edges: {:?}", edges); + + self.edges.push(( + data_result.entity_path.clone(), + edges + .iter() + .map(|&edge | EdgeWithInstance { + edge, + label: None, + }) + .collect(), + )); + } + + } + + // We're not using `re_renderer` here, so return an empty vector. + // If you want to draw additional primitives here, you can emit re_renderer draw data here directly. + Ok(Vec::new()) + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { + self + } +} + +re_viewer_context::impl_component_fallback_provider!(GraphNodeSystem => []); diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs new file mode 100644 index 000000000000..1c682b97c6c9 --- /dev/null +++ b/examples/rust/graph_view/src/main.rs @@ -0,0 +1,62 @@ +//! This example shows how to add custom Space Views to the Rerun Viewer. + +use re_viewer::external::{re_log, re_memory}; + +mod graph_space_view; +mod graph_visualizer_system; + +// By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, +// and prune the data store when it goes above a certain limit. +// By using `mimalloc` we get faster allocations. +#[global_allocator] +static GLOBAL: re_memory::AccountingAllocator = + re_memory::AccountingAllocator::new(mimalloc::MiMalloc); + +fn main() -> Result<(), Box> { + // Direct calls using the `log` crate to stderr. Control with `RUST_LOG=debug` etc. + re_log::setup_logging(); + + // Install handlers for panics and crashes that prints to stderr and send + // them to Rerun analytics (if the `analytics` feature is on in `Cargo.toml`). + re_crash_handler::install_crash_handlers(re_viewer::build_info()); + + // Listen for TCP connections from Rerun's logging SDKs. + // There are other ways of "feeding" the viewer though - all you need is a `re_smart_channel::Receiver`. + let rx = re_sdk_comms::serve( + "0.0.0.0", + re_sdk_comms::DEFAULT_SERVER_PORT, + Default::default(), + )?; + + let startup_options = re_viewer::StartupOptions::default(); + + // This is used for analytics, if the `analytics` feature is on in `Cargo.toml` + let app_env = re_viewer::AppEnvironment::Custom("Rerun Graph Viewer".to_owned()); + + println!( + "This example starts a graph viewer that is ready to accept data… you have to give it some!" + ); + println!("Try for example to run: `cargo run -p node_link_graph -- --connect` in another terminal instance."); + + re_viewer::run_native_app( + Box::new(move |cc| { + let mut app = re_viewer::App::new( + re_viewer::build_info(), + &app_env, + startup_options, + cc.egui_ctx.clone(), + cc.storage, + ); + app.add_receiver(rx); + + // Register the custom space view + app.add_space_view_class::() + .unwrap(); + + Box::new(app) + }), + None, + )?; + + Ok(()) +} diff --git a/examples/rust/node_link_graph/Cargo.toml b/examples/rust/node_link_graph/Cargo.toml new file mode 100644 index 000000000000..976cf9280003 --- /dev/null +++ b/examples/rust/node_link_graph/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "node_link_graph" +version = "0.19.0-alpha.1+dev" +edition = "2021" +rust-version = "1.76" +license = "MIT OR Apache-2.0" +publish = false + +[dependencies] +rerun = { path = "../../../crates/top/rerun", features = [ + "clap", +] } + +anyhow = "1.0" +clap = { version = "4.0", features = ["derive"] } +glam = "0.28" + diff --git a/examples/rust/node_link_graph/README.md b/examples/rust/node_link_graph/README.md new file mode 100644 index 000000000000..1333ed77b7e1 --- /dev/null +++ b/examples/rust/node_link_graph/README.md @@ -0,0 +1 @@ +TODO diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs new file mode 100644 index 000000000000..455b9d4d96af --- /dev/null +++ b/examples/rust/node_link_graph/src/main.rs @@ -0,0 +1,67 @@ +//! Demonstrates how to accept arguments and connect to running rerun servers. +//! +//! Usage: +//! ``` +//! cargo run -p minimal_options -- --help +//! ``` + +use rerun::datatypes::GraphNodeId; +use rerun::external::re_log; + +use rerun::demo_util::grid; + +#[derive(Debug, clap::Parser)] +#[clap(author, version, about)] +struct Args { + #[command(flatten)] + rerun: rerun::clap::RerunArgs, + + #[clap(long, default_value = "10")] + num_points_per_axis: usize, + + #[clap(long, default_value = "10.0")] + radius: f32, +} + +fn main() -> anyhow::Result<()> { + re_log::setup_logging(); + + use clap::Parser as _; + let args = Args::parse(); + + let (rec, _serve_guard) = args.rerun.init("rerun_example_node_link_graph")?; + run(&rec, &args) +} + +fn run(rec: &rerun::RecordingStream, args: &Args) -> anyhow::Result<()> { + rec.set_time_sequence("frame", 0); + rec.log( + "graph", + &rerun::GraphNodes::new([1, 2, 3]).with_labels(["a", "b", "c"]), + ); + rec.log( + "graph", + &rerun::GraphEdges::new([ + // TODO: Provide a nicer way to create these. + [GraphNodeId(1), GraphNodeId(2)], + [GraphNodeId(2), GraphNodeId(3)], + [GraphNodeId(1), GraphNodeId(3)], + ]), + ); + + rec.set_time_sequence("frame", 1); + rec.log( + "graph/level-1", + &rerun::GraphNodes::new([4, 5, 6]).with_labels(["d", "e", "f"]), + ); + rec.log( + "graph/level-1", + &rerun::GraphEdges::new([ + [GraphNodeId(3), GraphNodeId(4)], + [GraphNodeId(4), GraphNodeId(5)], + [GraphNodeId(5), GraphNodeId(6)], + ]), + ); + + Ok(()) +} diff --git a/rerun_cpp/src/rerun/archetypes.hpp b/rerun_cpp/src/rerun/archetypes.hpp index 4922c62f6956..a5a700e7808b 100644 --- a/rerun_cpp/src/rerun/archetypes.hpp +++ b/rerun_cpp/src/rerun/archetypes.hpp @@ -15,6 +15,8 @@ #include "archetypes/disconnected_space.hpp" #include "archetypes/ellipsoids3d.hpp" #include "archetypes/encoded_image.hpp" +#include "archetypes/graph_edges.hpp" +#include "archetypes/graph_nodes.hpp" #include "archetypes/image.hpp" #include "archetypes/instance_poses3d.hpp" #include "archetypes/line_strips2d.hpp" diff --git a/rerun_cpp/src/rerun/archetypes/.gitattributes b/rerun_cpp/src/rerun/archetypes/.gitattributes index 0151357a4f60..dd9503d9a9a0 100644 --- a/rerun_cpp/src/rerun/archetypes/.gitattributes +++ b/rerun_cpp/src/rerun/archetypes/.gitattributes @@ -27,6 +27,10 @@ ellipsoids3d.cpp linguist-generated=true ellipsoids3d.hpp linguist-generated=true encoded_image.cpp linguist-generated=true encoded_image.hpp linguist-generated=true +graph_edges.cpp linguist-generated=true +graph_edges.hpp linguist-generated=true +graph_nodes.cpp linguist-generated=true +graph_nodes.hpp linguist-generated=true image.cpp linguist-generated=true image.hpp linguist-generated=true instance_poses3d.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges.cpp new file mode 100644 index 000000000000..4e18f290d515 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.cpp @@ -0,0 +1,53 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#include "graph_edges.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphEdges& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(6); + + { + auto result = ComponentBatch::from_loggable(archetype.edges); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphEdges::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp new file mode 100644 index 000000000000..c762817ecff6 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp @@ -0,0 +1,101 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_edge.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphEdges { + /// A list of node IDs. + Collection edges; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphEdgesIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphEdges() = default; + GraphEdges(GraphEdges&& other) = default; + + explicit GraphEdges(Collection _edges) + : edges(std::move(_edges)) {} + + /// Optional colors for the boxes. + GraphEdges with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional text labels for the node. + GraphEdges with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphEdges with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphEdges with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize(const archetypes::GraphEdges& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp new file mode 100644 index 000000000000..2e1febe0fbca --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp @@ -0,0 +1,58 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#include "graph_nodes.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphNodes& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(7); + + { + auto result = ComponentBatch::from_loggable(archetype.node_ids); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.centers.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.centers.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphNodes::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp new file mode 100644 index 000000000000..e97b80461f2b --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp @@ -0,0 +1,112 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_node_id.hpp" +#include "../components/position2d.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphNodes { + /// A list of node IDs. + Collection node_ids; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional center positions of the nodes. + std::optional> centers; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphNodesIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphNodes() = default; + GraphNodes(GraphNodes&& other) = default; + + explicit GraphNodes(Collection _node_ids) + : node_ids(std::move(_node_ids)) {} + + /// Optional text labels for the node. + GraphNodes with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional colors for the boxes. + GraphNodes with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional center positions of the nodes. + GraphNodes with_centers(Collection _centers) && { + centers = std::move(_centers); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphNodes with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphNodes with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize(const archetypes::GraphNodes& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/components.hpp b/rerun_cpp/src/rerun/components.hpp index e11d74969590..4d31b84e7ce9 100644 --- a/rerun_cpp/src/rerun/components.hpp +++ b/rerun_cpp/src/rerun/components.hpp @@ -18,6 +18,8 @@ #include "components/fill_mode.hpp" #include "components/fill_ratio.hpp" #include "components/gamma_correction.hpp" +#include "components/graph_edge.hpp" +#include "components/graph_node_id.hpp" #include "components/half_size2d.hpp" #include "components/half_size3d.hpp" #include "components/image_buffer.hpp" diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index a63cd0bb87b8..2317e71e1463 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,6 +21,9 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true +graph_edge.cpp linguist-generated=true +graph_edge.hpp linguist-generated=true +graph_node_id.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true image_buffer.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge.cpp b/rerun_cpp/src/rerun/components/graph_edge.cpp new file mode 100644 index 000000000000..5d5115faa1f8 --- /dev/null +++ b/rerun_cpp/src/rerun/components/graph_edge.cpp @@ -0,0 +1,68 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +#include "graph_edge.hpp" + +#include "../datatypes/graph_node_id.hpp" + +#include +#include + +namespace rerun::components {} + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::fixed_size_list( + arrow::field("item", Loggable::arrow_datatype(), false), + 2 + ); + return datatype; + } + + Result> Loggable::to_arrow( + const components::GraphEdge* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::FixedSizeListBuilder* builder, const components::GraphEdge* elements, + size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + auto value_builder = static_cast(builder->value_builder()); + + ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements))); + static_assert(sizeof(elements[0].edge) == sizeof(elements[0])); + ARROW_RETURN_NOT_OK(value_builder->AppendValues( + elements[0].edge.data(), + static_cast(num_elements * 2), + nullptr + )); + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp new file mode 100644 index 000000000000..69c8dcc4161f --- /dev/null +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -0,0 +1,61 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +#pragma once + +#include "../datatypes/graph_node_id.hpp" +#include "../result.hpp" + +#include +#include +#include + +namespace arrow { + class Array; + class DataType; + class FixedSizeListBuilder; +} // namespace arrow + +namespace rerun::components { + /// **Component**: An edge in a graph connecting two nodes. + /// + /// Depending on the context this could represent a directed or undirected edge. + struct GraphEdge { + std::array edge; + + public: + GraphEdge() = default; + + GraphEdge(std::array edge_) : edge(edge_) {} + + GraphEdge& operator=(std::array edge_) { + edge = edge_; + return *this; + } + }; +} // namespace rerun::components + +namespace rerun { + template + struct Loggable; + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdge"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype(); + + /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. + static Result> to_arrow( + const components::GraphEdge* instances, size_t num_instances + ); + + /// Fills an arrow array builder with an array of this type. + static rerun::Error fill_arrow_array_builder( + arrow::FixedSizeListBuilder* builder, const components::GraphEdge* elements, + size_t num_elements + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/components/graph_node_id.hpp b/rerun_cpp/src/rerun/components/graph_node_id.hpp new file mode 100644 index 000000000000..8cf47a054c39 --- /dev/null +++ b/rerun_cpp/src/rerun/components/graph_node_id.hpp @@ -0,0 +1,73 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". + +#pragma once + +#include "../datatypes/graph_node_id.hpp" +#include "../result.hpp" + +#include +#include + +namespace rerun::components { + /// **Component**: A 32-bit ID representing a node in a graph. + struct GraphNodeId { + rerun::datatypes::GraphNodeId id; + + public: + GraphNodeId() = default; + + GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(id_) {} + + GraphNodeId& operator=(rerun::datatypes::GraphNodeId id_) { + id = id_; + return *this; + } + + GraphNodeId(uint32_t id_) : id(id_) {} + + GraphNodeId& operator=(uint32_t id_) { + id = id_; + return *this; + } + + /// Cast to the underlying GraphNodeId datatype + operator rerun::datatypes::GraphNodeId() const { + return id; + } + }; +} // namespace rerun::components + +namespace rerun { + static_assert(sizeof(rerun::datatypes::GraphNodeId) == sizeof(components::GraphNodeId)); + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphNodeId"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype() { + return Loggable::arrow_datatype(); + } + + /// Serializes an array of `rerun::components::GraphNodeId` into an arrow array. + static Result> to_arrow( + const components::GraphNodeId* instances, size_t num_instances + ) { + if (num_instances == 0) { + return Loggable::to_arrow(nullptr, 0); + } else if (instances == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Passed array instances is null when num_elements> 0." + ); + } else { + return Loggable::to_arrow( + &instances->id, + num_instances + ); + } + } + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index 9cd8ab48bdd2..45c128a3a3d1 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -14,6 +14,7 @@ #include "datatypes/entity_path.hpp" #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" +#include "datatypes/graph_node_id.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 315de38d7a47..135e67d5d0fe 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -25,6 +25,8 @@ float32.cpp linguist-generated=true float32.hpp linguist-generated=true float64.cpp linguist-generated=true float64.hpp linguist-generated=true +graph_node_id.cpp linguist-generated=true +graph_node_id.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp new file mode 100644 index 000000000000..62a9a4faa288 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp @@ -0,0 +1,56 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". + +#include "graph_node_id.hpp" + +#include +#include + +namespace rerun::datatypes {} + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::uint32(); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphNodeId* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::UInt32Builder* builder, const datatypes::GraphNodeId* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + static_assert(sizeof(*elements) == sizeof(elements->id)); + ARROW_RETURN_NOT_OK(builder->AppendValues(&elements->id, static_cast(num_elements)) + ); + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp new file mode 100644 index 000000000000..4e1fadfc86e5 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp @@ -0,0 +1,62 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". + +#pragma once + +#include "../result.hpp" + +#include +#include + +namespace arrow { + /// \private + template + class NumericBuilder; + + class Array; + class DataType; + class UInt32Type; + using UInt32Builder = NumericBuilder; +} // namespace arrow + +namespace rerun::datatypes { + /// **Datatype**: A 32-bit ID representing a node in a graph. + struct GraphNodeId { + uint32_t id; + + public: + GraphNodeId() = default; + + GraphNodeId(uint32_t id_) : id(id_) {} + + GraphNodeId& operator=(uint32_t id_) { + id = id_; + return *this; + } + }; +} // namespace rerun::datatypes + +namespace rerun { + template + struct Loggable; + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphNodeId"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype(); + + /// Serializes an array of `rerun::datatypes::GraphNodeId` into an arrow array. + static Result> to_arrow( + const datatypes::GraphNodeId* instances, size_t num_instances + ); + + /// Fills an arrow array builder with an array of this type. + static rerun::Error fill_arrow_array_builder( + arrow::UInt32Builder* builder, const datatypes::GraphNodeId* elements, + size_t num_elements + ); + }; +} // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes index b57110b5036e..09937336c43a 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes @@ -15,6 +15,8 @@ depth_image.py linguist-generated=true disconnected_space.py linguist-generated=true ellipsoids3d.py linguist-generated=true encoded_image.py linguist-generated=true +graph_edges.py linguist-generated=true +graph_nodes.py linguist-generated=true image.py linguist-generated=true instance_poses3d.py linguist-generated=true line_strips2d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py index 8ba5d3fcdee3..5ed9e4b83586 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py @@ -15,6 +15,8 @@ from .disconnected_space import DisconnectedSpace from .ellipsoids3d import Ellipsoids3D from .encoded_image import EncodedImage +from .graph_edges import GraphEdges +from .graph_nodes import GraphNodes from .image import Image from .instance_poses3d import InstancePoses3D from .line_strips2d import LineStrips2D @@ -48,6 +50,8 @@ "DisconnectedSpace", "Ellipsoids3D", "EncodedImage", + "GraphEdges", + "GraphNodes", "Image", "InstancePoses3D", "LineStrips2D", diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py new file mode 100644 index 000000000000..f198974133e5 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -0,0 +1,124 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +# You can extend this class by creating a "GraphEdgesExt" class in "graph_edges_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphEdges"] + + +@define(str=False, repr=False, init=False) +class GraphEdges(Archetype): + """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + edges: components.GraphEdgeArrayLike, + *, + colors: datatypes.Rgba32ArrayLike | None = None, + labels: datatypes.Utf8ArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphEdges archetype. + + Parameters + ---------- + edges: + A list of node IDs. + colors: + Optional colors for the boxes. + labels: + Optional text labels for the node. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphEdgesExt in graph_edges_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + edges=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphEdges: + """Produce an empty GraphEdges, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + edges: components.GraphEdgeBatch = field( + metadata={"component": "required"}, + converter=components.GraphEdgeBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py new file mode 100644 index 000000000000..ad6fb9244bc5 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py @@ -0,0 +1,144 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +# You can extend this class by creating a "GraphNodesExt" class in "graph_nodes_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphNodes"] + + +@define(str=False, repr=False, init=False) +class GraphNodes(Archetype): + """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + node_ids: datatypes.GraphNodeIdArrayLike, + *, + labels: datatypes.Utf8ArrayLike | None = None, + colors: datatypes.Rgba32ArrayLike | None = None, + centers: datatypes.Vec2DArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphNodes archetype. + + Parameters + ---------- + node_ids: + A list of node IDs. + labels: + Optional text labels for the node. + colors: + Optional colors for the boxes. + centers: + Optional center positions of the nodes. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphNodesExt in graph_nodes_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__( + node_ids=node_ids, + labels=labels, + colors=colors, + centers=centers, + show_labels=show_labels, + class_ids=class_ids, + ) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + node_ids=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + centers=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphNodes: + """Produce an empty GraphNodes, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + node_ids: components.GraphNodeIdBatch = field( + metadata={"component": "required"}, + converter=components.GraphNodeIdBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + centers: components.Position2DBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.Position2DBatch._optional, # type: ignore[misc] + ) + # Optional center positions of the nodes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/.gitattributes b/rerun_py/rerun_sdk/rerun/components/.gitattributes index 6541e94fa6eb..5ab5fddd81c7 100644 --- a/rerun_py/rerun_sdk/rerun/components/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/components/.gitattributes @@ -18,6 +18,8 @@ entity_path.py linguist-generated=true fill_mode.py linguist-generated=true fill_ratio.py linguist-generated=true gamma_correction.py linguist-generated=true +graph_edge.py linguist-generated=true +graph_node_id.py linguist-generated=true half_size2d.py linguist-generated=true half_size3d.py linguist-generated=true image_buffer.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index 7fa9bf8b8c02..4b0270d9f4cd 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,6 +30,8 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType +from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType +from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType from .image_buffer import ImageBuffer, ImageBufferBatch, ImageBufferType @@ -151,6 +153,14 @@ "GammaCorrection", "GammaCorrectionBatch", "GammaCorrectionType", + "GraphEdge", + "GraphEdgeArrayLike", + "GraphEdgeBatch", + "GraphEdgeLike", + "GraphEdgeType", + "GraphNodeId", + "GraphNodeIdBatch", + "GraphNodeIdType", "HalfSize2D", "HalfSize2DBatch", "HalfSize2DType", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py new file mode 100644 index 000000000000..4fc456f91e1c --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -0,0 +1,74 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Sequence, Tuple, Union + +import pyarrow as pa +from attrs import define, field + +from .. import datatypes +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] + + +@define(init=False) +class GraphEdge(ComponentMixin): + """ + **Component**: An edge in a graph connecting two nodes. + + Depending on the context this could represent a directed or undirected edge. + """ + + _BATCH_TYPE = None + + def __init__(self: Any, edge: GraphEdgeLike): + """Create a new instance of the GraphEdge component.""" + + # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py + self.__attrs_init__(edge=edge) + + edge: list[datatypes.GraphNodeId] = field() + + +if TYPE_CHECKING: + GraphEdgeLike = Union[GraphEdge, Tuple(int, int)] +else: + GraphEdgeLike = Any + +GraphEdgeArrayLike = Union[ + GraphEdge, + Sequence[GraphEdgeLike], +] + + +class GraphEdgeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.components.GraphEdge" + + def __init__(self) -> None: + pa.ExtensionType.__init__( + self, pa.list_(pa.field("item", pa.uint32(), nullable=False, metadata={}), 2), self._TYPE_NAME + ) + + +class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike], ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeType() + + @staticmethod + def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: + raise NotImplementedError( + "Arrow serialization of GraphEdge not implemented: We lack codegen for arrow-serialization of general structs" + ) # You need to implement native_to_pa_array_override in graph_edge_ext.py + + +# This is patched in late to avoid circular dependencies. +GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py new file mode 100644 index 000000000000..4ff668e9281c --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". + +# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphNodeId", "GraphNodeIdBatch", "GraphNodeIdType"] + + +class GraphNodeId(datatypes.GraphNodeId, ComponentMixin): + """**Component**: A 32-bit ID representing a node in a graph.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + + # Note: there are no fields here because GraphNodeId delegates to datatypes.GraphNodeId + pass + + +class GraphNodeIdType(datatypes.GraphNodeIdType): + _TYPE_NAME: str = "rerun.components.GraphNodeId" + + +class GraphNodeIdBatch(datatypes.GraphNodeIdBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphNodeIdType() + + +# This is patched in late to avoid circular dependencies. +GraphNodeId._BATCH_TYPE = GraphNodeIdBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index 4181907f6192..d3f74a2e3182 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -14,6 +14,7 @@ color_model.py linguist-generated=true entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true +graph_node_id.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 3521f94f07d9..469b46d5f505 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -38,6 +38,7 @@ from .entity_path import EntityPath, EntityPathArrayLike, EntityPathBatch, EntityPathLike, EntityPathType from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type +from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -181,6 +182,11 @@ "Float64Batch", "Float64Like", "Float64Type", + "GraphNodeId", + "GraphNodeIdArrayLike", + "GraphNodeIdBatch", + "GraphNodeIdLike", + "GraphNodeIdType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py new file mode 100644 index 000000000000..f7f1c469f988 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py @@ -0,0 +1,67 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". + +# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Sequence, Union + +import numpy as np +import numpy.typing as npt +import pyarrow as pa +from attrs import define, field + +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", "GraphNodeIdLike", "GraphNodeIdType"] + + +@define(init=False) +class GraphNodeId: + """**Datatype**: A 32-bit ID representing a node in a graph.""" + + def __init__(self: Any, id: GraphNodeIdLike): + """Create a new instance of the GraphNodeId datatype.""" + + # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + self.__attrs_init__(id=id) + + id: int = field(converter=int) + + def __array__(self, dtype: npt.DTypeLike = None) -> npt.NDArray[Any]: + # You can define your own __array__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + return np.asarray(self.id, dtype=dtype) + + def __int__(self) -> int: + return int(self.id) + + def __hash__(self) -> int: + return hash(self.id) + + +if TYPE_CHECKING: + GraphNodeIdLike = Union[GraphNodeId, int] +else: + GraphNodeIdLike = Any + +GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], int, npt.ArrayLike] + + +class GraphNodeIdType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphNodeId" + + def __init__(self) -> None: + pa.ExtensionType.__init__(self, pa.uint32(), self._TYPE_NAME) + + +class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): + _ARROW_TYPE = GraphNodeIdType() + + @staticmethod + def _native_to_pa_array(data: GraphNodeIdArrayLike, data_type: pa.DataType) -> pa.Array: + array = np.asarray(data, dtype=np.uint32).flatten() + return pa.array(array, type=data_type) From d3b22d1ef31e3475aac51c0c640839a870c7c39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 24 Sep 2024 13:31:55 +0200 Subject: [PATCH 002/159] WIP: try to get `egui_graphs` to work --- Cargo.lock | 20 +++- .../rerun/components/graph_edge.fbs | 2 +- .../rerun/components/graph_node_id.fbs | 2 +- examples/rust/graph_view/Cargo.toml | 3 + examples/rust/graph_view/README.md | 2 +- .../rust/graph_view/src/graph_space_view.rs | 106 ++++++++++-------- .../graph_view/src/graph_visualizer_system.rs | 21 +--- examples/rust/node_link_graph/Cargo.toml | 5 +- examples/rust/node_link_graph/README.md | 2 +- examples/rust/node_link_graph/src/main.rs | 10 +- 10 files changed, 94 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c40c5d8b2731..ab40e9a7c3e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1992,6 +1992,18 @@ dependencies = [ "winit", ] +[[package]] +name = "egui_graphs" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1908479c6946869bd37be4948545fef74b1a5a86c60e9e693c19e0987839f8d5" +dependencies = [ + "egui", + "petgraph", + "rand", + "serde", +] + [[package]] name = "egui_plot" version = "0.29.0" @@ -2729,7 +2741,9 @@ dependencies = [ name = "graph_view" version = "0.0.0" dependencies = [ + "egui_graphs", "mimalloc", + "petgraph", "re_crash_handler", "re_sdk_comms", "re_viewer", @@ -4255,12 +4269,12 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.1.0", ] [[package]] diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index b8075f3167dc..6cb3adfcbcdc 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -6,7 +6,7 @@ namespace rerun.components; /// /// Depending on the context this could represent a directed or undirected edge. // -// TODO: Why do we need `Default` here? +// TODO(grtlr): Why do we need `Default` here? struct GraphEdge ( "attr.arrow.transparent", "attr.python.aliases": "Tuple(int, int)", diff --git a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs index 047496ed7623..72b623d4c0c3 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs @@ -4,7 +4,7 @@ namespace rerun.components; /// A 32-bit ID representing a node in a graph. // -// TODO: Why do we need `Default` here? +// TODO(grtlr): Why do we need `Default` here? struct GraphNodeId ( "attr.arrow.transparent", "attr.python.aliases": "int", diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 035b38014b62..ed4851419061 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -22,3 +22,6 @@ re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ # mimalloc is a much faster allocator: mimalloc = "0.1" + +petgraph = "0.6.5" +egui_graphs = { version = "0.21.1", features = ["egui_persistence"] } diff --git a/examples/rust/graph_view/README.md b/examples/rust/graph_view/README.md index 1333ed77b7e1..05c762cec414 100644 --- a/examples/rust/graph_view/README.md +++ b/examples/rust/graph_view/README.md @@ -1 +1 @@ -TODO +# graph_view diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index a944ccefe9ff..cd603c1f17e5 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,56 +1,42 @@ +use egui_graphs::SettingsInteraction; use re_viewer::external::{ - egui::{self, Label}, - re_data_ui::{item_ui, DataUi}, - re_entity_db::InstancePath, + egui::{self, Label, Stroke}, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, re_ui, re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, Item, SelectionHighlight, SpaceViewClass, - SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, - SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, - SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, UiLayout, - ViewQuery, ViewerContext, + IdentifiedViewSystem as _, SpaceViewClass, SpaceViewClassLayoutPriority, + SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, + SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, + SystemExecutionOutput, ViewQuery, ViewerContext, }, }; -use crate::graph_visualizer_system::{GraphNodeSystem, NodeIdWithInstance}; - -// /// The different modes for displaying color coordinates in the custom space view. -// #[derive(Default, Debug, PartialEq, Clone, Copy)] -// enum ColorCoordinatesMode { -// #[default] -// Hs, -// Hv, -// Rg, -// } - -// impl ColorCoordinatesMode { -// pub const ALL: [ColorCoordinatesMode; 3] = [ -// ColorCoordinatesMode::Hs, -// ColorCoordinatesMode::Hv, -// ColorCoordinatesMode::Rg, -// ]; -// } - -// impl std::fmt::Display for ColorCoordinatesMode { -// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { -// match self { -// ColorCoordinatesMode::Hs => "Hue/Saturation".fmt(f), -// ColorCoordinatesMode::Hv => "Hue/Value".fmt(f), -// ColorCoordinatesMode::Rg => "Red/Green".fmt(f), -// } -// } -// } +use crate::graph_visualizer_system::GraphNodeSystem; /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. -#[derive(Default)] pub struct GraphSpaceViewState { - // TODO(wumpf, jleibs): This should be part of the Blueprint so that it is serialized out. - // but right now there is no way of doing that. - // mode: ColorCoordinatesMode, + graph: egui_graphs::Graph<(), ()>, +} + +impl Default for GraphSpaceViewState { + fn default() -> Self { + let mut g = petgraph::stable_graph::StableGraph::new(); + + let a = g.add_node(()); + let b = g.add_node(()); + let c = g.add_node(()); + + g.add_edge(a, b, ()); + g.add_edge(b, c, ()); + g.add_edge(c, a, ()); + + Self { + graph: egui_graphs::Graph::from(&g), + } + } } impl SpaceViewState for GraphSpaceViewState { @@ -125,12 +111,12 @@ impl SpaceViewClass for GraphSpaceView { fn selection_ui( &self, _ctx: &ViewerContext<'_>, - ui: &mut egui::Ui, + _ui: &mut egui::Ui, state: &mut dyn SpaceViewState, _space_origin: &EntityPath, _space_view_id: SpaceViewId, ) -> Result<(), SpaceViewSystemExecutionError> { - let state = state.downcast_mut::()?; + let _state = state.downcast_mut::()?; // ui.horizontal(|ui| { // ui.label("Coordinates mode"); @@ -151,16 +137,31 @@ impl SpaceViewClass for GraphSpaceView { /// This is called with freshly created & executed context & part systems. fn ui( &self, - ctx: &ViewerContext<'_>, + _ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, - - query: &ViewQuery<'_>, + _query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let graph_nodes = system_output.view_systems.get::()?; let state = state.downcast_mut::()?; + let interaction_settings = &SettingsInteraction::new() + .with_dragging_enabled(true) + .with_node_clicking_enabled(true) + .with_node_selection_enabled(true) + .with_node_selection_multi_enabled(true) + .with_edge_clicking_enabled(true) + .with_edge_selection_enabled(true) + .with_edge_selection_multi_enabled(true); + + let navigation_settings = + &egui_graphs::SettingsNavigation::new().with_fit_to_screen_enabled(true); + + let mut graph_view = egui_graphs::GraphView::new(&mut state.graph) + .with_interactions(interaction_settings) + .with_navigations(navigation_settings); + egui::Frame { inner_margin: re_ui::DesignTokens::view_padding().into(), ..egui::Frame::default() @@ -172,14 +173,23 @@ impl SpaceViewClass for GraphSpaceView { let text = egui::RichText::new(entity.to_owned()); ui.add(Label::new(text)); for n in nodes { - let text = egui::RichText::new(format!("{:?}", n.node_id.0.0)); + let text = egui::RichText::new(format!("{:?}", n.node_id.0 .0)); ui.add(Label::new(text)); } } }) - }) - .response + }); + + egui::Frame::none() + .stroke(Stroke { + width: 1.0, + color: egui::Color32::RED, + }) + .show(ui, |ui| { + ui.add(&mut graph_view); + }); }); + Ok(()) } } diff --git a/examples/rust/graph_view/src/graph_visualizer_system.rs b/examples/rust/graph_view/src/graph_visualizer_system.rs index 1edc2206691c..98ad7aae1875 100644 --- a/examples/rust/graph_view/src/graph_visualizer_system.rs +++ b/examples/rust/graph_view/src/graph_visualizer_system.rs @@ -1,15 +1,10 @@ -use std::string; - use re_viewer::external::{ - egui, - re_log::external::log, - re_log_types::{EntityPath, Instance}, + re_log_types::EntityPath, re_renderer, re_types::{ self, - archetypes::GraphNodes, - components::{Color, GraphEdge, GraphNodeId, Text}, - ComponentName, Loggable as _, + components::{GraphEdge, GraphNodeId}, + Loggable as _, }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, @@ -64,7 +59,7 @@ impl VisualizerSystem for GraphNodeSystem { ); if let Some(node_ids) = results.component_batch::() { - log::debug!("Node ids: {:?}", node_ids); + // log::debug!("Node ids: {:?}", node_ids); self.nodes.push(( data_result.entity_path.clone(), @@ -79,20 +74,16 @@ impl VisualizerSystem for GraphNodeSystem { } if let Some(edges) = results.component_batch::() { - log::debug!("Edges: {:?}", edges); + // log::debug!("Edges: {:?}", edges); self.edges.push(( data_result.entity_path.clone(), edges .iter() - .map(|&edge | EdgeWithInstance { - edge, - label: None, - }) + .map(|&edge| EdgeWithInstance { edge, label: None }) .collect(), )); } - } // We're not using `re_renderer` here, so return an empty vector. diff --git a/examples/rust/node_link_graph/Cargo.toml b/examples/rust/node_link_graph/Cargo.toml index 976cf9280003..811c91b1c6bc 100644 --- a/examples/rust/node_link_graph/Cargo.toml +++ b/examples/rust/node_link_graph/Cargo.toml @@ -7,11 +7,8 @@ license = "MIT OR Apache-2.0" publish = false [dependencies] -rerun = { path = "../../../crates/top/rerun", features = [ - "clap", -] } +rerun = { path = "../../../crates/top/rerun", features = ["clap"] } anyhow = "1.0" clap = { version = "4.0", features = ["derive"] } glam = "0.28" - diff --git a/examples/rust/node_link_graph/README.md b/examples/rust/node_link_graph/README.md index 1333ed77b7e1..9c5ecd46ad9f 100644 --- a/examples/rust/node_link_graph/README.md +++ b/examples/rust/node_link_graph/README.md @@ -1 +1 @@ -TODO +# node_link_graph diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 455b9d4d96af..8fca66435eaa 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -35,14 +35,14 @@ fn main() -> anyhow::Result<()> { fn run(rec: &rerun::RecordingStream, args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); - rec.log( + _ = rec.log( "graph", &rerun::GraphNodes::new([1, 2, 3]).with_labels(["a", "b", "c"]), ); - rec.log( + _ = rec.log( "graph", &rerun::GraphEdges::new([ - // TODO: Provide a nicer way to create these. + // TODO(grtlr): Provide a nicer way to create these. [GraphNodeId(1), GraphNodeId(2)], [GraphNodeId(2), GraphNodeId(3)], [GraphNodeId(1), GraphNodeId(3)], @@ -50,11 +50,11 @@ fn run(rec: &rerun::RecordingStream, args: &Args) -> anyhow::Result<()> { ); rec.set_time_sequence("frame", 1); - rec.log( + _ = rec.log( "graph/level-1", &rerun::GraphNodes::new([4, 5, 6]).with_labels(["d", "e", "f"]), ); - rec.log( + _ = rec.log( "graph/level-1", &rerun::GraphEdges::new([ [GraphNodeId(3), GraphNodeId(4)], From b39c35aa3486edf10f197e221b899a4973f50feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 25 Sep 2024 12:31:05 +0200 Subject: [PATCH 003/159] WIP: revise data model --- .../rerun/components/graph_edge.fbs | 10 +- .../rerun/components/graph_node_id.fbs | 11 +- .../re_types/definitions/rerun/datatypes.fbs | 1 + .../rerun/datatypes/graph_edge.fbs | 25 + .../rerun/datatypes/graph_node_id.fbs | 12 +- .../re_types/src/components/graph_edge.rs | 188 ++---- .../re_types/src/components/graph_edge_ext.rs | 28 + .../re_types/src/components/graph_node_id.rs | 22 +- crates/store/re_types/src/components/mod.rs | 1 + .../re_types/src/datatypes/.gitattributes | 1 + .../re_types/src/datatypes/graph_edge.rs | 553 ++++++++++++++++++ .../re_types/src/datatypes/graph_edge_ext.rs | 12 + .../re_types/src/datatypes/graph_node_id.rs | 133 ++--- .../src/datatypes/graph_node_id_ext.rs | 5 + crates/store/re_types/src/datatypes/mod.rs | 4 + .../reference/types/components/graph_edge.md | 2 +- docs/content/reference/types/datatypes.md | 1 + .../reference/types/datatypes/.gitattributes | 1 + .../reference/types/datatypes/entity_path.md | 1 + .../reference/types/datatypes/graph_edge.md | 25 + .../types/datatypes/graph_node_id.md | 4 +- .../rust/graph_view/src/graph_space_view.rs | 2 + .../graph_view/src/graph_visualizer_system.rs | 20 +- examples/rust/node_link_graph/src/main.rs | 64 +- rerun_cpp/src/rerun/components/graph_edge.cpp | 34 +- rerun_cpp/src/rerun/components/graph_edge.hpp | 18 +- .../src/rerun/components/graph_node_id.hpp | 12 +- rerun_cpp/src/rerun/datatypes.hpp | 1 + rerun_cpp/src/rerun/datatypes/.gitattributes | 2 + rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 132 +++++ rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 64 ++ .../src/rerun/datatypes/graph_node_id.cpp | 13 +- .../src/rerun/datatypes/graph_node_id.hpp | 19 +- .../rerun_sdk/rerun/components/graph_edge.py | 26 +- .../rerun_sdk/rerun/datatypes/.gitattributes | 1 + .../rerun_sdk/rerun/datatypes/__init__.py | 6 + .../rerun_sdk/rerun/datatypes/graph_edge.py | 158 +++++ .../rerun/datatypes/graph_node_id.py | 26 +- 38 files changed, 1282 insertions(+), 356 deletions(-) create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs create mode 100644 crates/store/re_types/src/components/graph_edge_ext.rs create mode 100644 crates/store/re_types/src/datatypes/graph_edge.rs create mode 100644 crates/store/re_types/src/datatypes/graph_edge_ext.rs create mode 100644 crates/store/re_types/src/datatypes/graph_node_id_ext.rs create mode 100644 docs/content/reference/types/datatypes/graph_edge.md create mode 100644 rerun_cpp/src/rerun/datatypes/graph_edge.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/graph_edge.hpp create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 6cb3adfcbcdc..8e356d19dc6b 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -5,15 +5,11 @@ namespace rerun.components; /// An edge in a graph connecting two nodes. /// /// Depending on the context this could represent a directed or undirected edge. -// -// TODO(grtlr): Why do we need `Default` here? -struct GraphEdge ( - "attr.arrow.transparent", - "attr.python.aliases": "Tuple(int, int)", - "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", +table GraphEdge ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - edge: [rerun.datatypes.GraphNodeId: 2] (order: 100); + edge: [rerun.datatypes.GraphEdge] (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs index 72b623d4c0c3..7080453f25c1 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs @@ -3,13 +3,10 @@ namespace rerun.components; // --- /// A 32-bit ID representing a node in a graph. -// -// TODO(grtlr): Why do we need `Default` here? -struct GraphNodeId ( - "attr.arrow.transparent", - "attr.python.aliases": "int", - "attr.python.array_aliases": "int, npt.NDArray[np.uint8], npt.NDArray[np.uint16], npt.NDArray[np.uint32], npt.NDArray[np.uint64]", - "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", +table GraphNodeId ( + "attr.python.aliases": "str", + "attr.python.array_aliases": "str, Sequence[str]", + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index ec757355739b..3bdc8d3422f2 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -12,6 +12,7 @@ include "./datatypes/color_model.fbs"; include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; +include "./datatypes/graph_edge.fbs"; include "./datatypes/graph_node_id.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs new file mode 100644 index 000000000000..f8a1763229b4 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -0,0 +1,25 @@ +include "entity_path.fbs"; +include "graph_node_id.fbs"; + +namespace rerun.datatypes; + +/// Represents an edge in a graph connecting two nodes (possible in different entities). +/// +/// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. +table GraphEdge ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// The id of the source node. + source: rerun.datatypes.GraphNodeId (order: 100); + + /// The id of the target node. + dest: rerun.datatypes.GraphNodeId (order: 200); + + /// The entity path of the source node. + source_entity: rerun.datatypes.EntityPath (order: 300, nullable); + + /// The entity path of the target node. + dest_entity: rerun.datatypes.EntityPath (order: 400, nullable); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs index 9e4c6c8f2f91..17cd44af794c 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs @@ -1,17 +1,15 @@ namespace rerun.datatypes; -// --- - /// A 32-bit ID representing a node in a graph. -struct GraphNodeId ( +table GraphNodeId ( "attr.arrow.transparent", - "attr.python.aliases": "int", - "attr.python.array_aliases": "int, npt.ArrayLike", - "attr.rust.derive": "Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, bytemuck::Pod, bytemuck::Zeroable", + "attr.python.aliases": "str", + "attr.python.array_aliases": "Sequence[str]", + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", "attr.rust.repr": "transparent", "attr.rust.tuple_struct", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - id: uint (order: 100); + id: string (order: 100); } diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge.rs index 701eda8f4b7f..b71c3064ede9 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -21,22 +21,10 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: An edge in a graph connecting two nodes. /// /// Depending on the context this could represent a directed or undirected edge. -#[derive( - Clone, - Debug, - Copy, - Default, - PartialEq, - Eq, - PartialOrd, - Ord, - Hash, - bytemuck::Pod, - bytemuck::Zeroable, -)] +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge(pub [crate::datatypes::GraphNodeId; 2usize]); +pub struct GraphEdge(pub Vec); impl ::re_types_core::SizeBytes for GraphEdge { #[inline] @@ -46,36 +34,13 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - <[crate::datatypes::GraphNodeId; 2usize]>::is_pod() + >::is_pod() } } -impl> From for GraphEdge { +impl, T: IntoIterator> From for GraphEdge { fn from(v: T) -> Self { - Self(v.into()) - } -} - -impl std::borrow::Borrow<[crate::datatypes::GraphNodeId; 2usize]> for GraphEdge { - #[inline] - fn borrow(&self) -> &[crate::datatypes::GraphNodeId; 2usize] { - &self.0 - } -} - -impl std::ops::Deref for GraphEdge { - type Target = [crate::datatypes::GraphNodeId; 2usize]; - - #[inline] - fn deref(&self) -> &[crate::datatypes::GraphNodeId; 2usize] { - &self.0 - } -} - -impl std::ops::DerefMut for GraphEdge { - #[inline] - fn deref_mut(&mut self) -> &mut [crate::datatypes::GraphNodeId; 2usize] { - &mut self.0 + Self(v.into_iter().map(|v| v.into()).collect()) } } @@ -93,14 +58,11 @@ impl ::re_types_core::Loggable for GraphEdge { fn arrow_datatype() -> arrow2::datatypes::DataType { #![allow(clippy::wildcard_imports)] use arrow2::datatypes::*; - DataType::FixedSizeList( - std::sync::Arc::new(Field::new( - "item", - ::arrow_datatype(), - false, - )), - 2usize, - ) + DataType::List(std::sync::Arc::new(Field::new( + "item", + ::arrow_datatype(), + false, + ))) } fn to_arrow_opt<'a>( @@ -127,34 +89,25 @@ impl ::re_types_core::Loggable for GraphEdge { }; { use arrow2::{buffer::Buffer, offset::OffsetsBuffer}; - let data0_inner_data: Vec<_> = data0 - .into_iter() - .flat_map(|v| match v { - Some(v) => itertools::Either::Left(v.into_iter()), - None => itertools::Either::Right( - std::iter::repeat(Default::default()).take(2usize), - ), - }) - .collect(); - let data0_inner_bitmap: Option = - data0_bitmap.as_ref().map(|bitmap| { - bitmap - .iter() - .map(|b| std::iter::repeat(b).take(2usize)) - .flatten() - .collect::>() - .into() - }); - FixedSizeListArray::new( + let offsets = arrow2::offset::Offsets::::try_from_lengths( + data0 + .iter() + .map(|opt| opt.as_ref().map_or(0, |datum| datum.len())), + )? + .into(); + let data0_inner_data: Vec<_> = data0.into_iter().flatten().flatten().collect(); + let data0_inner_bitmap: Option = None; + ListArray::try_new( Self::arrow_datatype(), - PrimitiveArray::new( - DataType::UInt32, - data0_inner_data.into_iter().map(|datum| datum.0).collect(), - data0_inner_bitmap, - ) - .boxed(), + offsets, + { + _ = data0_inner_bitmap; + crate::datatypes::GraphEdge::to_arrow_opt( + data0_inner_data.into_iter().map(Some), + )? + }, data0_bitmap, - ) + )? .boxed() } }) @@ -172,7 +125,7 @@ impl ::re_types_core::Loggable for GraphEdge { Ok({ let arrow_data = arrow_data .as_any() - .downcast_ref::() + .downcast_ref::>() .ok_or_else(|| { let expected = Self::arrow_datatype(); let actual = arrow_data.data_type().clone(); @@ -182,32 +135,22 @@ impl ::re_types_core::Loggable for GraphEdge { if arrow_data.is_empty() { Vec::new() } else { - let offsets = (0..) - .step_by(2usize) - .zip((2usize..).step_by(2usize).take(arrow_data.len())); let arrow_data_inner = { let arrow_data_inner = &**arrow_data.values(); - arrow_data_inner - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = DataType::UInt32; - let actual = arrow_data_inner.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) + crate::datatypes::GraphEdge::from_arrow_opt(arrow_data_inner) .with_context("rerun.components.GraphEdge#edge")? .into_iter() - .map(|opt| opt.copied()) - .map(|res_or_opt| res_or_opt.map(crate::datatypes::GraphNodeId)) .collect::>() }; + let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets, + offsets.iter().zip(offsets.lengths()), arrow_data.validity(), ) .map(|elem| { - elem.map(|(start, end): (usize, usize)| { - debug_assert!(end - start == 2usize); + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; if end > arrow_data_inner.len() { return Err(DeserializationError::offset_slice_oob( (start, end), @@ -217,11 +160,12 @@ impl ::re_types_core::Loggable for GraphEdge { #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] let data = unsafe { arrow_data_inner.get_unchecked(start..end) }; - let data = data.iter().cloned().map(Option::unwrap_or_default); - - // NOTE: Unwrapping cannot fail: the length must be correct. - #[allow(clippy::unwrap_used)] - Ok(array_init::from_iter(data).unwrap()) + let data = data + .iter() + .cloned() + .map(Option::unwrap_or_default) + .collect(); + Ok(data) }) .transpose() }) @@ -235,56 +179,4 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.components.GraphEdge#edge") .with_context("rerun.components.GraphEdge")?) } - - #[inline] - fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - if let Some(validity) = arrow_data.validity() { - if validity.unset_bits() != 0 { - return Err(DeserializationError::missing_data()); - } - } - Ok({ - let slice = { - let arrow_data = arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = DataType::FixedSizeList( - std::sync::Arc::new(Field::new( - "item", - ::arrow_datatype(), - false, - )), - 2usize, - ); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.components.GraphEdge#edge")?; - let arrow_data_inner = &**arrow_data.values(); - bytemuck::cast_slice::<_, [_; 2usize]>( - arrow_data_inner - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = DataType::UInt32; - let actual = arrow_data_inner.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.components.GraphEdge#edge")? - .values() - .as_slice(), - ) - }; - { - slice.iter().copied().map(Self).collect::>() - } - }) - } } diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs new file mode 100644 index 000000000000..1d813cfdc03b --- /dev/null +++ b/crates/store/re_types/src/components/graph_edge_ext.rs @@ -0,0 +1,28 @@ +// TODO(grtlr): improve these convenience methods + +use re_types_core::datatypes::EntityPath; + +use crate::datatypes::{GraphEdge, GraphNodeId}; + +impl super::GraphEdge { + pub fn new(source: impl Into, dest: impl Into) -> Self { + Self(vec![GraphEdge { + source: source.into(), + dest: dest.into(), + source_entity: None, + dest_entity: None, + }]) + } + + pub fn new_global( + (source_entity, source): (impl Into, impl Into), + (dest_entity, dest): (impl Into, impl Into), + ) -> Self { + Self(vec![GraphEdge { + source_entity: Some(source_entity.into()), + source: source.into(), + dest_entity: Some(dest_entity.into()), + dest: dest.into(), + }]) + } +} diff --git a/crates/store/re_types/src/components/graph_node_id.rs b/crates/store/re_types/src/components/graph_node_id.rs index 7087c9ea2ad1..9f4a51bf95c5 100644 --- a/crates/store/re_types/src/components/graph_node_id.rs +++ b/crates/store/re_types/src/components/graph_node_id.rs @@ -19,19 +19,7 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: A 32-bit ID representing a node in a graph. -#[derive( - Clone, - Debug, - Copy, - Default, - PartialEq, - Eq, - PartialOrd, - Ord, - Hash, - bytemuck::Pod, - bytemuck::Zeroable, -)] +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphNodeId(pub crate::datatypes::GraphNodeId); @@ -115,12 +103,4 @@ impl ::re_types_core::Loggable for GraphNodeId { crate::datatypes::GraphNodeId::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } - - #[inline] - fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> - where - Self: Sized, - { - crate::datatypes::GraphNodeId::from_arrow(arrow_data).map(bytemuck::cast_vec) - } } diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index 1e127db43b91..bb01ec990aeb 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -25,6 +25,7 @@ mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; mod graph_edge; +mod graph_edge_ext; mod graph_node_id; mod half_size2d; mod half_size2d_ext; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 5bad104b598b..c110e63f174f 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -9,6 +9,7 @@ class_description.rs linguist-generated=true class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true +graph_edge.rs linguist-generated=true graph_node_id.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs new file mode 100644 index 000000000000..a0bbae931f4a --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -0,0 +1,553 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). +/// +/// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphEdge { + /// The id of the source node. + pub source: crate::datatypes::GraphNodeId, + + /// The id of the target node. + pub dest: crate::datatypes::GraphNodeId, + + /// The entity path of the source node. + pub source_entity: Option, + + /// The entity path of the target node. + pub dest_entity: Option, +} + +impl ::re_types_core::SizeBytes for GraphEdge { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.source.heap_size_bytes() + + self.dest.heap_size_bytes() + + self.source_entity.heap_size_bytes() + + self.dest_entity.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() + && ::is_pod() + && >::is_pod() + && >::is_pod() + } +} + +::re_types_core::macros::impl_into_cow!(GraphEdge); + +impl ::re_types_core::Loggable for GraphEdge { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphEdge".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::Struct(std::sync::Arc::new(vec![ + Field::new( + "source", + ::arrow_datatype(), + false, + ), + Field::new( + "dest", + ::arrow_datatype(), + false, + ), + Field::new( + "source_entity", + ::arrow_datatype(), + true, + ), + Field::new( + "dest_entity", + ::arrow_datatype(), + true, + ), + ])) + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + (datum.is_some(), datum) + }) + .unzip(); + let bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + StructArray::new( + Self::arrow_datatype(), + vec![ + { + let (somes, source): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.source.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let source_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + source.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = source + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + source_bitmap, + ) + } + .boxed() + } + }, + { + let (somes, dest): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.dest.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let dest_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + dest.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = dest + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + dest_bitmap, + ) + } + .boxed() + } + }, + { + let (somes, source_entity): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum + .as_ref() + .map(|datum| datum.source_entity.clone()) + .flatten(); + (datum.is_some(), datum) + }) + .unzip(); + let source_entity_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + source_entity.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = source_entity + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + source_entity_bitmap, + ) + } + .boxed() + } + }, + { + let (somes, dest_entity): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum + .as_ref() + .map(|datum| datum.dest_entity.clone()) + .flatten(); + (datum.is_some(), datum) + }) + .unzip(); + let dest_entity_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + dest_entity.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = dest_entity + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + dest_entity_bitmap, + ) + } + .boxed() + } + }, + ], + bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok({ + let arrow_data = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge")?; + if arrow_data.is_empty() { + Vec::new() + } else { + let (arrow_data_fields, arrow_data_arrays) = + (arrow_data.fields(), arrow_data.values()); + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields + .iter() + .map(|field| field.name.as_str()) + .zip(arrow_data_arrays) + .collect(); + let source = { + if !arrays_by_name.contains_key("source") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "source", + )) + .with_context("rerun.datatypes.GraphEdge"); + } + let arrow_data = &**arrays_by_name["source"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#source")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphEdge#source")? + .into_iter() + } + }; + let dest = { + if !arrays_by_name.contains_key("dest") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "dest", + )) + .with_context("rerun.datatypes.GraphEdge"); + } + let arrow_data = &**arrays_by_name["dest"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#dest")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphEdge#dest")? + .into_iter() + } + }; + let source_entity = { + if !arrays_by_name.contains_key("source_entity") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "source_entity", + )) + .with_context("rerun.datatypes.GraphEdge"); + } + let arrow_data = &**arrays_by_name["source_entity"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#source_entity")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphEdge#source_entity")? + .into_iter() + } + }; + let dest_entity = { + if !arrays_by_name.contains_key("dest_entity") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "dest_entity", + )) + .with_context("rerun.datatypes.GraphEdge"); + } + let arrow_data = &**arrays_by_name["dest_entity"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#dest_entity")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphEdge#dest_entity")? + .into_iter() + } + }; + arrow2::bitmap::utils::ZipValidity::new_with_validity( + ::itertools::izip!(source, dest, source_entity, dest_entity), + arrow_data.validity(), + ) + .map(|opt| { + opt.map(|(source, dest, source_entity, dest_entity)| { + Ok(Self { + source: source + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphEdge#source")?, + dest: dest + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphEdge#dest")?, + source_entity, + dest_entity, + }) + }) + .transpose() + }) + .collect::>>() + .with_context("rerun.datatypes.GraphEdge")? + } + }) + } +} diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs new file mode 100644 index 000000000000..908e810eccd4 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_edge_ext.rs @@ -0,0 +1,12 @@ +use super::GraphNodeId; + +impl> From<(T, T)> for super::GraphEdge { + fn from(value: (T, T)) -> Self { + Self { + source: value.0.into(), + dest: value.1.into(), + source_entity: None, + dest_entity: None, + } + } +} diff --git a/crates/store/re_types/src/datatypes/graph_node_id.rs b/crates/store/re_types/src/datatypes/graph_node_id.rs index 7a7a41125d3f..9d564631745a 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id.rs @@ -19,22 +19,10 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Datatype**: A 32-bit ID representing a node in a graph. -#[derive( - Clone, - Debug, - Copy, - Default, - PartialEq, - Eq, - PartialOrd, - Ord, - Hash, - bytemuck::Pod, - bytemuck::Zeroable, -)] +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNodeId(pub u32); +pub struct GraphNodeId(pub ::re_types_core::ArrowString); impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] @@ -44,18 +32,18 @@ impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] fn is_pod() -> bool { - ::is_pod() + <::re_types_core::ArrowString>::is_pod() } } -impl From for GraphNodeId { +impl From<::re_types_core::ArrowString> for GraphNodeId { #[inline] - fn from(id: u32) -> Self { + fn from(id: ::re_types_core::ArrowString) -> Self { Self(id) } } -impl From for u32 { +impl From for ::re_types_core::ArrowString { #[inline] fn from(value: GraphNodeId) -> Self { value.0 @@ -76,7 +64,7 @@ impl ::re_types_core::Loggable for GraphNodeId { fn arrow_datatype() -> arrow2::datatypes::DataType { #![allow(clippy::wildcard_imports)] use arrow2::datatypes::*; - DataType::UInt32 + DataType::Utf8 } fn to_arrow_opt<'a>( @@ -101,12 +89,27 @@ impl ::re_types_core::Loggable for GraphNodeId { let any_nones = somes.iter().any(|some| !*some); any_nones.then(|| somes.into()) }; - PrimitiveArray::new( - Self::arrow_datatype(), - data0.into_iter().map(|v| v.unwrap_or_default()).collect(), - data0_bitmap, - ) - .boxed() + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + data0 + .iter() + .map(|opt| opt.as_ref().map(|datum| datum.len()).unwrap_or_default()), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = + data0.into_iter().flatten().flat_map(|s| s.0).collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + Self::arrow_datatype(), + offsets, + inner_data, + data0_bitmap, + ) + } + .boxed() + } }) } @@ -119,52 +122,50 @@ impl ::re_types_core::Loggable for GraphNodeId { #![allow(clippy::wildcard_imports)] use ::re_types_core::{Loggable as _, ResultExt as _}; use arrow2::{array::*, buffer::*, datatypes::*}; - Ok(arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphNodeId#id")? - .into_iter() - .map(|opt| opt.copied()) - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .map(|res| res.map(|v| Some(Self(v)))) - .collect::>>>() - .with_context("rerun.datatypes.GraphNodeId#id") - .with_context("rerun.datatypes.GraphNodeId")?) - } - - #[inline] - fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - if let Some(validity) = arrow_data.validity() { - if validity.unset_bits() != 0 { - return Err(DeserializationError::missing_data()); - } - } Ok({ - let slice = arrow_data + let arrow_data = arrow_data .as_any() - .downcast_ref::() + .downcast_ref::>() .ok_or_else(|| { - let expected = DataType::UInt32; + let expected = Self::arrow_datatype(); let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphNodeId#id")? - .values() - .as_slice(); - { - slice.iter().copied().map(Self).collect::>() - } - }) + .with_context("rerun.datatypes.GraphNodeId#id")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| res_or_opt.map(|v| ::re_types_core::ArrowString(v))) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphNodeId#id")? + .into_iter() + } + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .map(|res| res.map(|v| Some(Self(v)))) + .collect::>>>() + .with_context("rerun.datatypes.GraphNodeId#id") + .with_context("rerun.datatypes.GraphNodeId")?) } } diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs new file mode 100644 index 000000000000..90d434048108 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs @@ -0,0 +1,5 @@ +impl std::convert::From<&str> for super::GraphNodeId { + fn from(s: &str) -> Self { + Self(s.into()) + } +} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 9d0b65963498..ae7ba1d40427 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -16,7 +16,10 @@ mod class_id; mod class_id_ext; mod color_model; mod color_model_ext; +mod graph_edge; +mod graph_edge_ext; mod graph_node_id; +mod graph_node_id_ext; mod image_format; mod image_format_ext; mod keypoint_id; @@ -75,6 +78,7 @@ pub use self::class_description::ClassDescription; pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; +pub use self::graph_edge::GraphEdge; pub use self::graph_node_id::GraphNodeId; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md index cccef4e17797..a7edcf4993f6 100644 --- a/docs/content/reference/types/components/graph_edge.md +++ b/docs/content/reference/types/components/graph_edge.md @@ -9,7 +9,7 @@ Depending on the context this could represent a directed or undirected edge. ## Fields -* edge: 2x [`GraphNodeId`](../datatypes/graph_node_id.md) +* edge: list of [`GraphEdge`](../datatypes/graph_edge.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index b4b58cafff1b..b27e0c5eee24 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -19,6 +19,7 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`EntityPath`](datatypes/entity_path.md): A path to an entity in the `ChunkStore`. * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. +* [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possible in different entities). * [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index ece07faa8407..ea39b47a81e6 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -13,6 +13,7 @@ color_model.md linguist-generated=true entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true +graph_edge.md linguist-generated=true graph_node_id.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/entity_path.md b/docs/content/reference/types/datatypes/entity_path.md index 14306137c330..d5e56de00fa6 100644 --- a/docs/content/reference/types/datatypes/entity_path.md +++ b/docs/content/reference/types/datatypes/entity_path.md @@ -18,3 +18,4 @@ A path to an entity in the `ChunkStore`. ## Used by * [`EntityPath`](../components/entity_path.md?speculative-link) +* [`GraphEdge`](../datatypes/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md new file mode 100644 index 000000000000..fe126992d0d6 --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -0,0 +1,25 @@ +--- +title: "GraphEdge" +--- + + +Represents an edge in a graph connecting two nodes (possible in different entities). + +If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. + +## Fields + +* source: [`GraphNodeId`](../datatypes/graph_node_id.md) +* dest: [`GraphNodeId`](../datatypes/graph_node_id.md) +* source_entity: [`EntityPath`](../datatypes/entity_path.md) +* dest_entity: [`EntityPath`](../datatypes/entity_path.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) + * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphEdge) + * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphEdge.html) + + +## Used by + +* [`GraphEdge`](../components/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md index ddd83af883c8..3d947f1a6f05 100644 --- a/docs/content/reference/types/datatypes/graph_node_id.md +++ b/docs/content/reference/types/datatypes/graph_node_id.md @@ -7,7 +7,7 @@ A 32-bit ID representing a node in a graph. ## Fields -* id: `u32` +* id: `string` ## API reference links * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNodeId.html) @@ -17,5 +17,5 @@ A 32-bit ID representing a node in a graph. ## Used by -* [`GraphEdge`](../components/graph_edge.md) +* [`GraphEdge`](../datatypes/graph_edge.md) * [`GraphNodeId`](../components/graph_node_id.md) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index cd603c1f17e5..752b3e1416e2 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,6 +1,7 @@ use egui_graphs::SettingsInteraction; use re_viewer::external::{ egui::{self, Label, Stroke}, + re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, re_ui, @@ -80,6 +81,7 @@ impl SpaceViewClass for GraphSpaceView { } fn new_state(&self) -> Box { + log::debug!("Creating new GraphSpaceViewState"); Box::::default() } diff --git a/examples/rust/graph_view/src/graph_visualizer_system.rs b/examples/rust/graph_view/src/graph_visualizer_system.rs index 98ad7aae1875..a4260027a0b3 100644 --- a/examples/rust/graph_view/src/graph_visualizer_system.rs +++ b/examples/rust/graph_view/src/graph_visualizer_system.rs @@ -1,4 +1,5 @@ use re_viewer::external::{ + re_log::external::log, re_log_types::EntityPath, re_renderer, re_types::{ @@ -40,7 +41,14 @@ impl IdentifiedViewSystem for GraphNodeSystem { impl VisualizerSystem for GraphNodeSystem { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() + use re_types::Archetype; + let mut info = VisualizerQueryInfo::from_archetype::(); + info.indicators.insert( + re_types::archetypes::GraphEdges::indicator() + .name() + .to_owned(), + ); + info } /// Populates the scene part with data from the store. @@ -50,6 +58,7 @@ impl VisualizerSystem for GraphNodeSystem { query: &ViewQuery<'_>, _context_systems: &ViewContextCollection, ) -> Result, SpaceViewSystemExecutionError> { + log::debug!("Called execute"); for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { let results = ctx.recording().query_caches().latest_at( ctx.recording_store(), @@ -65,8 +74,8 @@ impl VisualizerSystem for GraphNodeSystem { data_result.entity_path.clone(), node_ids .iter() - .map(|&node_id| NodeIdWithInstance { - node_id, + .map(|node_id| NodeIdWithInstance { + node_id: node_id.to_owned(), label: None, }) .collect(), @@ -80,7 +89,10 @@ impl VisualizerSystem for GraphNodeSystem { data_result.entity_path.clone(), edges .iter() - .map(|&edge| EdgeWithInstance { edge, label: None }) + .map(|edge| EdgeWithInstance { + edge: edge.to_owned(), + label: None, + }) .collect(), )); } diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 8fca66435eaa..aba36d5ece70 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -5,10 +5,11 @@ //! cargo run -p minimal_options -- --help //! ``` -use rerun::datatypes::GraphNodeId; use rerun::external::re_log; +use rerun::{components, datatypes, EntityPath}; use rerun::demo_util::grid; +use rerun::{GraphEdges, GraphNodes}; #[derive(Debug, clap::Parser)] #[clap(author, version, about)] @@ -33,35 +34,46 @@ fn main() -> anyhow::Result<()> { run(&rec, &args) } -fn run(rec: &rerun::RecordingStream, args: &Args) -> anyhow::Result<()> { +fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); - _ = rec.log( - "graph", - &rerun::GraphNodes::new([1, 2, 3]).with_labels(["a", "b", "c"]), - ); - _ = rec.log( - "graph", - &rerun::GraphEdges::new([ - // TODO(grtlr): Provide a nicer way to create these. - [GraphNodeId(1), GraphNodeId(2)], - [GraphNodeId(2), GraphNodeId(3)], - [GraphNodeId(1), GraphNodeId(3)], - ]), - ); + rec.log("kitchen/objects", &GraphNodes::new(["sink", "fridge"]))?; + rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; + rec.log( + "kitchen/areas", + &GraphEdges::new([components::GraphEdge::new("area0", "area1")]), + )?; rec.set_time_sequence("frame", 1); - _ = rec.log( - "graph/level-1", - &rerun::GraphNodes::new([4, 5, 6]).with_labels(["d", "e", "f"]), - ); - _ = rec.log( - "graph/level-1", - &rerun::GraphEdges::new([ - [GraphNodeId(3), GraphNodeId(4)], - [GraphNodeId(4), GraphNodeId(5)], - [GraphNodeId(5), GraphNodeId(6)], + rec.log("hallway/areas", &GraphNodes::new(["area0"]))?; + + rec.set_time_sequence("frame", 2); + rec.log("living/objects", &GraphNodes::new(["table"]))?; + rec.log( + "living/areas", + &GraphNodes::new(["area0", "area1", "area2"]), + )?; + rec.log( + "living/areas", + &GraphEdges::new([ + components::GraphEdge::new("area0", "area1"), + components::GraphEdge::new("area0", "area2"), + components::GraphEdge::new("area1", "area2"), ]), - ); + )?; + + rec.log( + "doors", + &GraphEdges::new([components::GraphEdge::new_global( + ( + datatypes::EntityPath::from("kitchen/areas"), + datatypes::GraphNodeId::from("area1"), + ), + ( + datatypes::EntityPath::from("kitchen/areas"), + datatypes::GraphNodeId::from("area1"), + ), + )]), + )?; Ok(()) } diff --git a/rerun_cpp/src/rerun/components/graph_edge.cpp b/rerun_cpp/src/rerun/components/graph_edge.cpp index 5d5115faa1f8..9343a9584788 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.cpp +++ b/rerun_cpp/src/rerun/components/graph_edge.cpp @@ -3,7 +3,7 @@ #include "graph_edge.hpp" -#include "../datatypes/graph_node_id.hpp" +#include "../datatypes/graph_edge.hpp" #include #include @@ -12,9 +12,8 @@ namespace rerun::components {} namespace rerun { const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::fixed_size_list( - arrow::field("item", Loggable::arrow_datatype(), false), - 2 + static const auto datatype = arrow::list( + arrow::field("item", Loggable::arrow_datatype(), false) ); return datatype; } @@ -29,7 +28,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), + static_cast(builder.get()), instances, num_instances )); @@ -40,8 +39,7 @@ namespace rerun { } rerun::Error Loggable::fill_arrow_array_builder( - arrow::FixedSizeListBuilder* builder, const components::GraphEdge* elements, - size_t num_elements + arrow::ListBuilder* builder, const components::GraphEdge* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); @@ -53,15 +51,21 @@ namespace rerun { ); } - auto value_builder = static_cast(builder->value_builder()); + auto value_builder = static_cast(builder->value_builder()); + ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); + ARROW_RETURN_NOT_OK(value_builder->Reserve(static_cast(num_elements * 2))); - ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements))); - static_assert(sizeof(elements[0].edge) == sizeof(elements[0])); - ARROW_RETURN_NOT_OK(value_builder->AppendValues( - elements[0].edge.data(), - static_cast(num_elements * 2), - nullptr - )); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + const auto& element = elements[elem_idx]; + ARROW_RETURN_NOT_OK(builder->Append()); + if (element.edge.data()) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + value_builder, + element.edge.data(), + element.edge.size() + )); + } + } return Error::ok(); } diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp index 69c8dcc4161f..1e513494bb54 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -3,17 +3,18 @@ #pragma once -#include "../datatypes/graph_node_id.hpp" +#include "../collection.hpp" +#include "../datatypes/graph_edge.hpp" #include "../result.hpp" -#include #include #include +#include namespace arrow { class Array; class DataType; - class FixedSizeListBuilder; + class ListBuilder; } // namespace arrow namespace rerun::components { @@ -21,15 +22,15 @@ namespace rerun::components { /// /// Depending on the context this could represent a directed or undirected edge. struct GraphEdge { - std::array edge; + rerun::Collection edge; public: GraphEdge() = default; - GraphEdge(std::array edge_) : edge(edge_) {} + GraphEdge(rerun::Collection edge_) : edge(std::move(edge_)) {} - GraphEdge& operator=(std::array edge_) { - edge = edge_; + GraphEdge& operator=(rerun::Collection edge_) { + edge = std::move(edge_); return *this; } }; @@ -54,8 +55,7 @@ namespace rerun { /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::FixedSizeListBuilder* builder, const components::GraphEdge* elements, - size_t num_elements + arrow::ListBuilder* builder, const components::GraphEdge* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/components/graph_node_id.hpp b/rerun_cpp/src/rerun/components/graph_node_id.hpp index 8cf47a054c39..d63ad98bda84 100644 --- a/rerun_cpp/src/rerun/components/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/components/graph_node_id.hpp @@ -8,6 +8,8 @@ #include #include +#include +#include namespace rerun::components { /// **Component**: A 32-bit ID representing a node in a graph. @@ -17,17 +19,17 @@ namespace rerun::components { public: GraphNodeId() = default; - GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(id_) {} + GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(std::move(id_)) {} GraphNodeId& operator=(rerun::datatypes::GraphNodeId id_) { - id = id_; + id = std::move(id_); return *this; } - GraphNodeId(uint32_t id_) : id(id_) {} + GraphNodeId(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(uint32_t id_) { - id = id_; + GraphNodeId& operator=(std::string id_) { + id = std::move(id_); return *this; } diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index 45c128a3a3d1..d690f1863482 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -14,6 +14,7 @@ #include "datatypes/entity_path.hpp" #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" +#include "datatypes/graph_edge.hpp" #include "datatypes/graph_node_id.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 135e67d5d0fe..719f27e27a45 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -25,6 +25,8 @@ float32.cpp linguist-generated=true float32.hpp linguist-generated=true float64.cpp linguist-generated=true float64.hpp linguist-generated=true +graph_edge.cpp linguist-generated=true +graph_edge.hpp linguist-generated=true graph_node_id.cpp linguist-generated=true graph_node_id.hpp linguist-generated=true image_format.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp new file mode 100644 index 000000000000..6f1567f1a104 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -0,0 +1,132 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". + +#include "graph_edge.hpp" + +#include "entity_path.hpp" +#include "graph_node_id.hpp" + +#include +#include + +namespace rerun::datatypes {} + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::struct_({ + arrow::field( + "source", + Loggable::arrow_datatype(), + false + ), + arrow::field("dest", Loggable::arrow_datatype(), false), + arrow::field( + "source_entity", + Loggable::arrow_datatype(), + true + ), + arrow::field( + "dest_entity", + Loggable::arrow_datatype(), + true + ), + }); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphEdge* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::GraphEdge* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + { + auto field_builder = static_cast(builder->field_builder(0)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].source, + 1 + )); + } + } + { + auto field_builder = static_cast(builder->field_builder(1)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].dest, + 1 + )); + } + } + { + auto field_builder = static_cast(builder->field_builder(2)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + const auto& element = elements[elem_idx]; + if (element.source_entity.has_value()) { + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &element.source_entity.value(), + 1 + ) + ); + } else { + ARROW_RETURN_NOT_OK(field_builder->AppendNull()); + } + } + } + { + auto field_builder = static_cast(builder->field_builder(3)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + const auto& element = elements[elem_idx]; + if (element.dest_entity.has_value()) { + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &element.dest_entity.value(), + 1 + ) + ); + } else { + ARROW_RETURN_NOT_OK(field_builder->AppendNull()); + } + } + } + ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp new file mode 100644 index 000000000000..ed47fdac87cf --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -0,0 +1,64 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". + +#pragma once + +#include "../result.hpp" +#include "entity_path.hpp" +#include "graph_node_id.hpp" + +#include +#include +#include + +namespace arrow { + class Array; + class DataType; + class StructBuilder; +} // namespace arrow + +namespace rerun::datatypes { + /// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). + /// + /// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. + struct GraphEdge { + /// The id of the source node. + rerun::datatypes::GraphNodeId source; + + /// The id of the target node. + rerun::datatypes::GraphNodeId dest; + + /// The entity path of the source node. + std::optional source_entity; + + /// The entity path of the target node. + std::optional dest_entity; + + public: + GraphEdge() = default; + }; +} // namespace rerun::datatypes + +namespace rerun { + template + struct Loggable; + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphEdge"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype(); + + /// Serializes an array of `rerun::datatypes::GraphEdge` into an arrow array. + static Result> to_arrow( + const datatypes::GraphEdge* instances, size_t num_instances + ); + + /// Fills an arrow array builder with an array of this type. + static rerun::Error fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::GraphEdge* elements, size_t num_elements + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp index 62a9a4faa288..3fc45d4d8926 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp @@ -10,7 +10,7 @@ namespace rerun::datatypes {} namespace rerun { const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::uint32(); + static const auto datatype = arrow::utf8(); return datatype; } @@ -24,7 +24,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), + static_cast(builder.get()), instances, num_instances )); @@ -35,7 +35,7 @@ namespace rerun { } rerun::Error Loggable::fill_arrow_array_builder( - arrow::UInt32Builder* builder, const datatypes::GraphNodeId* elements, size_t num_elements + arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); @@ -47,9 +47,10 @@ namespace rerun { ); } - static_assert(sizeof(*elements) == sizeof(elements->id)); - ARROW_RETURN_NOT_OK(builder->AppendValues(&elements->id, static_cast(num_elements)) - ); + ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + ARROW_RETURN_NOT_OK(builder->Append(elements[elem_idx].id)); + } return Error::ok(); } diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp index 4e1fadfc86e5..3a29ab76e9cd 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp @@ -7,30 +7,27 @@ #include #include +#include +#include namespace arrow { - /// \private - template - class NumericBuilder; - class Array; class DataType; - class UInt32Type; - using UInt32Builder = NumericBuilder; + class StringBuilder; } // namespace arrow namespace rerun::datatypes { /// **Datatype**: A 32-bit ID representing a node in a graph. struct GraphNodeId { - uint32_t id; + std::string id; public: GraphNodeId() = default; - GraphNodeId(uint32_t id_) : id(id_) {} + GraphNodeId(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(uint32_t id_) { - id = id_; + GraphNodeId& operator=(std::string id_) { + id = std::move(id_); return *this; } }; @@ -55,7 +52,7 @@ namespace rerun { /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::UInt32Builder* builder, const datatypes::GraphNodeId* elements, + arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, size_t num_elements ); }; diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py index 4fc456f91e1c..001116d51b2d 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -5,7 +5,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Sequence, Tuple, Union +from typing import Any, Sequence, Union import pyarrow as pa from attrs import define, field @@ -37,14 +37,10 @@ def __init__(self: Any, edge: GraphEdgeLike): # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py self.__attrs_init__(edge=edge) - edge: list[datatypes.GraphNodeId] = field() + edge: list[datatypes.GraphEdge] = field() -if TYPE_CHECKING: - GraphEdgeLike = Union[GraphEdge, Tuple(int, int)] -else: - GraphEdgeLike = Any - +GraphEdgeLike = GraphEdge GraphEdgeArrayLike = Union[ GraphEdge, Sequence[GraphEdgeLike], @@ -56,7 +52,21 @@ class GraphEdgeType(BaseExtensionType): def __init__(self) -> None: pa.ExtensionType.__init__( - self, pa.list_(pa.field("item", pa.uint32(), nullable=False, metadata={}), 2), self._TYPE_NAME + self, + pa.list_( + pa.field( + "item", + pa.struct([ + pa.field("source", pa.utf8(), nullable=False, metadata={}), + pa.field("dest", pa.utf8(), nullable=False, metadata={}), + pa.field("source_entity", pa.utf8(), nullable=True, metadata={}), + pa.field("dest_entity", pa.utf8(), nullable=True, metadata={}), + ]), + nullable=False, + metadata={}, + ) + ), + self._TYPE_NAME, ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index d3f74a2e3182..9b375033b7da 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -14,6 +14,7 @@ color_model.py linguist-generated=true entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true +graph_edge.py linguist-generated=true graph_node_id.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 469b46d5f505..78cb9151e458 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -38,6 +38,7 @@ from .entity_path import EntityPath, EntityPathArrayLike, EntityPathBatch, EntityPathLike, EntityPathType from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type +from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType @@ -182,6 +183,11 @@ "Float64Batch", "Float64Like", "Float64Type", + "GraphEdge", + "GraphEdgeArrayLike", + "GraphEdgeBatch", + "GraphEdgeLike", + "GraphEdgeType", "GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py new file mode 100644 index 000000000000..faff7395492a --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -0,0 +1,158 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". + +# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". + +from __future__ import annotations + +from typing import Any, Sequence, Union + +import pyarrow as pa +from attrs import define, field + +from .. import datatypes +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] + + +def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: + if isinstance(x, datatypes.GraphNodeId): + return x + else: + return datatypes.GraphNodeId(x) + + +def _graph_edge__dest__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: + if isinstance(x, datatypes.GraphNodeId): + return x + else: + return datatypes.GraphNodeId(x) + + +def _graph_edge__source_entity__special_field_converter_override( + x: datatypes.EntityPathLike | None, +) -> datatypes.EntityPath | None: + if x is None: + return None + elif isinstance(x, datatypes.EntityPath): + return x + else: + return datatypes.EntityPath(x) + + +def _graph_edge__dest_entity__special_field_converter_override( + x: datatypes.EntityPathLike | None, +) -> datatypes.EntityPath | None: + if x is None: + return None + elif isinstance(x, datatypes.EntityPath): + return x + else: + return datatypes.EntityPath(x) + + +@define(init=False) +class GraphEdge: + """ + **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). + + If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. + """ + + def __init__( + self: Any, + source: datatypes.GraphNodeIdLike, + dest: datatypes.GraphNodeIdLike, + source_entity: datatypes.EntityPathLike | None = None, + dest_entity: datatypes.EntityPathLike | None = None, + ): + """ + Create a new instance of the GraphEdge datatype. + + Parameters + ---------- + source: + The id of the source node. + dest: + The id of the target node. + source_entity: + The entity path of the source node. + dest_entity: + The entity path of the target node. + + """ + + # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py + self.__attrs_init__(source=source, dest=dest, source_entity=source_entity, dest_entity=dest_entity) + + source: datatypes.GraphNodeId = field(converter=_graph_edge__source__special_field_converter_override) + # The id of the source node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + dest: datatypes.GraphNodeId = field(converter=_graph_edge__dest__special_field_converter_override) + # The id of the target node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + source_entity: datatypes.EntityPath | None = field( + default=None, converter=_graph_edge__source_entity__special_field_converter_override + ) + # The entity path of the source node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + dest_entity: datatypes.EntityPath | None = field( + default=None, converter=_graph_edge__dest_entity__special_field_converter_override + ) + # The entity path of the target node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + +GraphEdgeLike = GraphEdge +GraphEdgeArrayLike = Union[ + GraphEdge, + Sequence[GraphEdgeLike], +] + + +class GraphEdgeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphEdge" + + def __init__(self) -> None: + pa.ExtensionType.__init__( + self, + pa.struct([ + pa.field("source", pa.utf8(), nullable=False, metadata={}), + pa.field("dest", pa.utf8(), nullable=False, metadata={}), + pa.field("source_entity", pa.utf8(), nullable=True, metadata={}), + pa.field("dest_entity", pa.utf8(), nullable=True, metadata={}), + ]), + self._TYPE_NAME, + ) + + +class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): + _ARROW_TYPE = GraphEdgeType() + + @staticmethod + def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: + from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch + + if isinstance(data, GraphEdge): + data = [data] + + return pa.StructArray.from_arrays( + [ + GraphNodeIdBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeIdBatch([x.dest for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + EntityPathBatch([x.source_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + EntityPathBatch([x.dest_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + ], + fields=list(data_type), + ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py index f7f1c469f988..68af8f033bbe 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py @@ -7,8 +7,6 @@ from typing import TYPE_CHECKING, Any, Sequence, Union -import numpy as np -import numpy.typing as npt import pyarrow as pa from attrs import define, field @@ -30,32 +28,28 @@ def __init__(self: Any, id: GraphNodeIdLike): # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py self.__attrs_init__(id=id) - id: int = field(converter=int) + id: str = field(converter=str) - def __array__(self, dtype: npt.DTypeLike = None) -> npt.NDArray[Any]: - # You can define your own __array__ function as a member of GraphNodeIdExt in graph_node_id_ext.py - return np.asarray(self.id, dtype=dtype) - - def __int__(self) -> int: - return int(self.id) + def __str__(self) -> str: + return str(self.id) def __hash__(self) -> int: return hash(self.id) if TYPE_CHECKING: - GraphNodeIdLike = Union[GraphNodeId, int] + GraphNodeIdLike = Union[GraphNodeId, str] else: GraphNodeIdLike = Any -GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], int, npt.ArrayLike] +GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], Sequence[str]] class GraphNodeIdType(BaseExtensionType): _TYPE_NAME: str = "rerun.datatypes.GraphNodeId" def __init__(self) -> None: - pa.ExtensionType.__init__(self, pa.uint32(), self._TYPE_NAME) + pa.ExtensionType.__init__(self, pa.utf8(), self._TYPE_NAME) class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): @@ -63,5 +57,11 @@ class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): @staticmethod def _native_to_pa_array(data: GraphNodeIdArrayLike, data_type: pa.DataType) -> pa.Array: - array = np.asarray(data, dtype=np.uint32).flatten() + if isinstance(data, str): + array = [data] + elif isinstance(data, Sequence): + array = [str(datum) for datum in data] + else: + array = [str(data)] + return pa.array(array, type=data_type) From 74f1aebfcb38b4930bc5e024743631ed1fd6d2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 25 Sep 2024 17:10:06 +0200 Subject: [PATCH 004/159] WIP: improve data model by making node ids non-global --- Cargo.lock | 13 -- .../rerun/components/graph_edge.fbs | 2 +- .../rerun/datatypes/graph_edge.fbs | 7 +- .../re_types/src/components/graph_edge.rs | 146 +++++------------- .../re_types/src/components/graph_edge_ext.rs | 34 ++-- .../re_types/src/datatypes/graph_edge.rs | 73 +++++---- .../re_types/src/datatypes/graph_edge_ext.rs | 4 +- .../src/datatypes/graph_node_id_ext.rs | 6 + .../reference/types/components/graph_edge.md | 2 +- .../reference/types/datatypes/graph_edge.md | 6 +- examples/rust/graph_view/Cargo.toml | 1 - ...er_system.rs => edge_visualizer_system.rs} | 47 +----- .../rust/graph_view/src/graph_space_view.rs | 90 ++++------- examples/rust/graph_view/src/main.rs | 3 +- .../graph_view/src/node_visualizer_system.rs | 74 +++++++++ examples/rust/node_link_graph/src/main.rs | 32 ++-- rerun_cpp/src/rerun/components/.gitattributes | 1 - rerun_cpp/src/rerun/components/graph_edge.cpp | 72 --------- rerun_cpp/src/rerun/components/graph_edge.hpp | 46 +++--- rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 14 +- rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 6 +- .../rerun_sdk/rerun/archetypes/graph_edges.py | 2 +- .../rerun_sdk/rerun/components/__init__.py | 4 +- .../rerun_sdk/rerun/components/graph_edge.py | 58 +------ .../rerun_sdk/rerun/datatypes/graph_edge.py | 30 ++-- 25 files changed, 297 insertions(+), 476 deletions(-) rename examples/rust/graph_view/src/{graph_visualizer_system.rs => edge_visualizer_system.rs} (60%) create mode 100644 examples/rust/graph_view/src/node_visualizer_system.rs delete mode 100644 rerun_cpp/src/rerun/components/graph_edge.cpp diff --git a/Cargo.lock b/Cargo.lock index ab40e9a7c3e3..b3fd63331f35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1992,18 +1992,6 @@ dependencies = [ "winit", ] -[[package]] -name = "egui_graphs" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1908479c6946869bd37be4948545fef74b1a5a86c60e9e693c19e0987839f8d5" -dependencies = [ - "egui", - "petgraph", - "rand", - "serde", -] - [[package]] name = "egui_plot" version = "0.29.0" @@ -2741,7 +2729,6 @@ dependencies = [ name = "graph_view" version = "0.0.0" dependencies = [ - "egui_graphs", "mimalloc", "petgraph", "re_crash_handler", diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 8e356d19dc6b..0c3f75f386f5 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -11,5 +11,5 @@ table GraphEdge ( "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - edge: [rerun.datatypes.GraphEdge] (order: 100); + edge: rerun.datatypes.GraphEdge (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs index f8a1763229b4..4ab2d797c3df 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -5,7 +5,7 @@ namespace rerun.datatypes; /// Represents an edge in a graph connecting two nodes (possible in different entities). /// -/// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. +/// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. table GraphEdge ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.custom_clause": @@ -15,11 +15,12 @@ table GraphEdge ( source: rerun.datatypes.GraphNodeId (order: 100); /// The id of the target node. - dest: rerun.datatypes.GraphNodeId (order: 200); + target: rerun.datatypes.GraphNodeId (order: 200); /// The entity path of the source node. + // TODO(grtlr): Consider making this a separate datatype that has its own component. source_entity: rerun.datatypes.EntityPath (order: 300, nullable); /// The entity path of the target node. - dest_entity: rerun.datatypes.EntityPath (order: 400, nullable); + target_entity: rerun.datatypes.EntityPath (order: 400, nullable); } diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge.rs index b71c3064ede9..d147b41cb852 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -24,7 +24,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge(pub Vec); +pub struct GraphEdge(pub crate::datatypes::GraphEdge); impl ::re_types_core::SizeBytes for GraphEdge { #[inline] @@ -34,13 +34,36 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - >::is_pod() + ::is_pod() } } -impl, T: IntoIterator> From for GraphEdge { +impl> From for GraphEdge { fn from(v: T) -> Self { - Self(v.into_iter().map(|v| v.into()).collect()) + Self(v.into()) + } +} + +impl std::borrow::Borrow for GraphEdge { + #[inline] + fn borrow(&self) -> &crate::datatypes::GraphEdge { + &self.0 + } +} + +impl std::ops::Deref for GraphEdge { + type Target = crate::datatypes::GraphEdge; + + #[inline] + fn deref(&self) -> &crate::datatypes::GraphEdge { + &self.0 + } +} + +impl std::ops::DerefMut for GraphEdge { + #[inline] + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { + &mut self.0 } } @@ -56,13 +79,7 @@ impl ::re_types_core::Loggable for GraphEdge { #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::List(std::sync::Arc::new(Field::new( - "item", - ::arrow_datatype(), - false, - ))) + crate::datatypes::GraphEdge::arrow_datatype() } fn to_arrow_opt<'a>( @@ -71,46 +88,12 @@ impl ::re_types_core::Loggable for GraphEdge { where Self: Clone + 'a, { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data0): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - let datum = datum.map(|datum| datum.into_owned().0); - (datum.is_some(), datum) - }) - .unzip(); - let data0_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - use arrow2::{buffer::Buffer, offset::OffsetsBuffer}; - let offsets = arrow2::offset::Offsets::::try_from_lengths( - data0 - .iter() - .map(|opt| opt.as_ref().map_or(0, |datum| datum.len())), - )? - .into(); - let data0_inner_data: Vec<_> = data0.into_iter().flatten().flatten().collect(); - let data0_inner_bitmap: Option = None; - ListArray::try_new( - Self::arrow_datatype(), - offsets, - { - _ = data0_inner_bitmap; - crate::datatypes::GraphEdge::to_arrow_opt( - data0_inner_data.into_iter().map(Some), - )? - }, - data0_bitmap, - )? - .boxed() - } - }) + crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { + datum.map(|datum| match datum.into() { + ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), + ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), + }) + })) } fn from_arrow_opt( @@ -119,64 +102,7 @@ impl ::re_types_core::Loggable for GraphEdge { where Self: Sized, { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok({ - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.components.GraphEdge#edge")?; - if arrow_data.is_empty() { - Vec::new() - } else { - let arrow_data_inner = { - let arrow_data_inner = &**arrow_data.values(); - crate::datatypes::GraphEdge::from_arrow_opt(arrow_data_inner) - .with_context("rerun.components.GraphEdge#edge")? - .into_iter() - .collect::>() - }; - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_inner.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_inner.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = unsafe { arrow_data_inner.get_unchecked(start..end) }; - let data = data - .iter() - .cloned() - .map(Option::unwrap_or_default) - .collect(); - Ok(data) - }) - .transpose() - }) - .collect::>>>()? - } - .into_iter() - } - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .map(|res| res.map(|v| Some(Self(v)))) - .collect::>>>() - .with_context("rerun.components.GraphEdge#edge") - .with_context("rerun.components.GraphEdge")?) + crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) + .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs index 1d813cfdc03b..eff250a542a5 100644 --- a/crates/store/re_types/src/components/graph_edge_ext.rs +++ b/crates/store/re_types/src/components/graph_edge_ext.rs @@ -1,28 +1,26 @@ -// TODO(grtlr): improve these convenience methods - use re_types_core::datatypes::EntityPath; use crate::datatypes::{GraphEdge, GraphNodeId}; impl super::GraphEdge { - pub fn new(source: impl Into, dest: impl Into) -> Self { - Self(vec![GraphEdge { + /// Creates a new edge between two nodes. + pub fn new(source: impl Into, target: impl Into) -> Self { + Self(GraphEdge{ source: source.into(), - dest: dest.into(), - source_entity: None, - dest_entity: None, - }]) + target: target.into(), + ..Default::default() + }) } - pub fn new_global( - (source_entity, source): (impl Into, impl Into), - (dest_entity, dest): (impl Into, impl Into), - ) -> Self { - Self(vec![GraphEdge { - source_entity: Some(source_entity.into()), - source: source.into(), - dest_entity: Some(dest_entity.into()), - dest: dest.into(), - }]) + /// Specifies the entity in which the edge originates. + pub fn with_source_in(mut self, path: impl Into) -> Self { + self.0.source_entity = Some(path.into()); + self + } + + /// Specifies the entity in which the edge terminates. + pub fn with_target_in(mut self, path: impl Into) -> Self { + self.0.target_entity = Some(path.into()); + self } } diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index a0bbae931f4a..62d3ed3b35a6 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -20,7 +20,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). /// -/// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. +/// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge { @@ -28,22 +28,22 @@ pub struct GraphEdge { pub source: crate::datatypes::GraphNodeId, /// The id of the target node. - pub dest: crate::datatypes::GraphNodeId, + pub target: crate::datatypes::GraphNodeId, /// The entity path of the source node. pub source_entity: Option, /// The entity path of the target node. - pub dest_entity: Option, + pub target_entity: Option, } impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn heap_size_bytes(&self) -> u64 { self.source.heap_size_bytes() - + self.dest.heap_size_bytes() + + self.target.heap_size_bytes() + self.source_entity.heap_size_bytes() - + self.dest_entity.heap_size_bytes() + + self.target_entity.heap_size_bytes() } #[inline] @@ -76,7 +76,7 @@ impl ::re_types_core::Loggable for GraphEdge { false, ), Field::new( - "dest", + "target", ::arrow_datatype(), false, ), @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphEdge { true, ), Field::new( - "dest_entity", + "target_entity", ::arrow_datatype(), true, ), @@ -155,25 +155,25 @@ impl ::re_types_core::Loggable for GraphEdge { } }, { - let (somes, dest): (Vec<_>, Vec<_>) = data + let (somes, target): (Vec<_>, Vec<_>) = data .iter() .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.dest.clone()); + let datum = datum.as_ref().map(|datum| datum.target.clone()); (datum.is_some(), datum) }) .unzip(); - let dest_bitmap: Option = { + let target_bitmap: Option = { let any_nones = somes.iter().any(|some| !*some); any_nones.then(|| somes.into()) }; { let offsets = arrow2::offset::Offsets::::try_from_lengths( - dest.iter().map(|opt| { + target.iter().map(|opt| { opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() }), )? .into(); - let inner_data: arrow2::buffer::Buffer = dest + let inner_data: arrow2::buffer::Buffer = target .into_iter() .flatten() .flat_map(|datum| datum.0 .0) @@ -185,7 +185,7 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Utf8, offsets, inner_data, - dest_bitmap, + target_bitmap, ) } .boxed() @@ -231,40 +231,39 @@ impl ::re_types_core::Loggable for GraphEdge { } }, { - let (somes, dest_entity): (Vec<_>, Vec<_>) = data + let (somes, target_entity): (Vec<_>, Vec<_>) = data .iter() .map(|datum| { let datum = datum .as_ref() - .map(|datum| datum.dest_entity.clone()) + .map(|datum| datum.target_entity.clone()) .flatten(); (datum.is_some(), datum) }) .unzip(); - let dest_entity_bitmap: Option = { + let target_entity_bitmap: Option = { let any_nones = somes.iter().any(|some| !*some); any_nones.then(|| somes.into()) }; { let offsets = arrow2::offset::Offsets::::try_from_lengths( - dest_entity.iter().map(|opt| { + target_entity.iter().map(|opt| { opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() }), )? .into(); - let inner_data: arrow2::buffer::Buffer = dest_entity + let inner_data: arrow2::buffer::Buffer = target_entity .into_iter() .flatten() .flat_map(|datum| datum.0 .0) .collect(); - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] unsafe { Utf8Array::::new_unchecked( DataType::Utf8, offsets, inner_data, - dest_entity_bitmap, + target_entity_bitmap, ) } .boxed() @@ -361,15 +360,15 @@ impl ::re_types_core::Loggable for GraphEdge { .into_iter() } }; - let dest = { - if !arrays_by_name.contains_key("dest") { + let target = { + if !arrays_by_name.contains_key("target") { return Err(DeserializationError::missing_struct_field( Self::arrow_datatype(), - "dest", + "target", )) .with_context("rerun.datatypes.GraphEdge"); } - let arrow_data = &**arrays_by_name["dest"]; + let arrow_data = &**arrays_by_name["target"]; { let arrow_data = arrow_data .as_any() @@ -379,7 +378,7 @@ impl ::re_types_core::Loggable for GraphEdge { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphEdge#dest")?; + .with_context("rerun.datatypes.GraphEdge#target")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -412,7 +411,7 @@ impl ::re_types_core::Loggable for GraphEdge { }) }) .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#dest")? + .with_context("rerun.datatypes.GraphEdge#target")? .into_iter() } }; @@ -471,15 +470,15 @@ impl ::re_types_core::Loggable for GraphEdge { .into_iter() } }; - let dest_entity = { - if !arrays_by_name.contains_key("dest_entity") { + let target_entity = { + if !arrays_by_name.contains_key("target_entity") { return Err(DeserializationError::missing_struct_field( Self::arrow_datatype(), - "dest_entity", + "target_entity", )) .with_context("rerun.datatypes.GraphEdge"); } - let arrow_data = &**arrays_by_name["dest_entity"]; + let arrow_data = &**arrays_by_name["target_entity"]; { let arrow_data = arrow_data .as_any() @@ -489,7 +488,7 @@ impl ::re_types_core::Loggable for GraphEdge { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphEdge#dest_entity")?; + .with_context("rerun.datatypes.GraphEdge#target_entity")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -522,25 +521,25 @@ impl ::re_types_core::Loggable for GraphEdge { }) }) .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#dest_entity")? + .with_context("rerun.datatypes.GraphEdge#target_entity")? .into_iter() } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( - ::itertools::izip!(source, dest, source_entity, dest_entity), + ::itertools::izip!(source, target, source_entity, target_entity), arrow_data.validity(), ) .map(|opt| { - opt.map(|(source, dest, source_entity, dest_entity)| { + opt.map(|(source, target, source_entity, target_entity)| { Ok(Self { source: source .ok_or_else(DeserializationError::missing_data) .with_context("rerun.datatypes.GraphEdge#source")?, - dest: dest + target: target .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphEdge#dest")?, + .with_context("rerun.datatypes.GraphEdge#target")?, source_entity, - dest_entity, + target_entity, }) }) .transpose() diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs index 908e810eccd4..d0106cf60bc1 100644 --- a/crates/store/re_types/src/datatypes/graph_edge_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_edge_ext.rs @@ -4,9 +4,9 @@ impl> From<(T, T)> for super::GraphEdge { fn from(value: (T, T)) -> Self { Self { source: value.0.into(), - dest: value.1.into(), + target: value.1.into(), source_entity: None, - dest_entity: None, + target_entity: None, } } } diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs index 90d434048108..ccf4643d2c2e 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs @@ -3,3 +3,9 @@ impl std::convert::From<&str> for super::GraphNodeId { Self(s.into()) } } + +impl std::fmt::Display for super::GraphNodeId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md index a7edcf4993f6..37f3ad9acf41 100644 --- a/docs/content/reference/types/components/graph_edge.md +++ b/docs/content/reference/types/components/graph_edge.md @@ -9,7 +9,7 @@ Depending on the context this could represent a directed or undirected edge. ## Fields -* edge: list of [`GraphEdge`](../datatypes/graph_edge.md) +* edge: [`GraphEdge`](../datatypes/graph_edge.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md index fe126992d0d6..7d2d9e954ce1 100644 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -5,14 +5,14 @@ title: "GraphEdge" Represents an edge in a graph connecting two nodes (possible in different entities). -If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. +If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. ## Fields * source: [`GraphNodeId`](../datatypes/graph_node_id.md) -* dest: [`GraphNodeId`](../datatypes/graph_node_id.md) +* target: [`GraphNodeId`](../datatypes/graph_node_id.md) * source_entity: [`EntityPath`](../datatypes/entity_path.md) -* dest_entity: [`EntityPath`](../datatypes/entity_path.md) +* target_entity: [`EntityPath`](../datatypes/entity_path.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index ed4851419061..807857d46a61 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -24,4 +24,3 @@ re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ mimalloc = "0.1" petgraph = "0.6.5" -egui_graphs = { version = "0.21.1", features = ["egui_persistence"] } diff --git a/examples/rust/graph_view/src/graph_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs similarity index 60% rename from examples/rust/graph_view/src/graph_visualizer_system.rs rename to examples/rust/graph_view/src/edge_visualizer_system.rs index a4260027a0b3..71d9b3e690a6 100644 --- a/examples/rust/graph_view/src/graph_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -1,5 +1,4 @@ use re_viewer::external::{ - re_log::external::log, re_log_types::EntityPath, re_renderer, re_types::{ @@ -14,17 +13,10 @@ use re_viewer::external::{ }, }; -/// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] -pub struct GraphNodeSystem { - pub nodes: Vec<(EntityPath, Vec)>, +pub struct GraphEdgeSystem { pub edges: Vec<(EntityPath, Vec)>, -} - -pub struct NodeIdWithInstance { - pub node_id: GraphNodeId, - // pub instance: Instance, - pub label: Option, + pub globals: Vec<(EntityPath, Vec)>, } pub struct EdgeWithInstance { @@ -33,22 +25,15 @@ pub struct EdgeWithInstance { pub label: Option, } -impl IdentifiedViewSystem for GraphNodeSystem { +impl IdentifiedViewSystem for GraphEdgeSystem { fn identifier() -> ViewSystemIdentifier { - "Graph Nodes".into() + "GraphEdges".into() } } -impl VisualizerSystem for GraphNodeSystem { +impl VisualizerSystem for GraphEdgeSystem { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - use re_types::Archetype; - let mut info = VisualizerQueryInfo::from_archetype::(); - info.indicators.insert( - re_types::archetypes::GraphEdges::indicator() - .name() - .to_owned(), - ); - info + VisualizerQueryInfo::from_archetype::() } /// Populates the scene part with data from the store. @@ -58,30 +43,14 @@ impl VisualizerSystem for GraphNodeSystem { query: &ViewQuery<'_>, _context_systems: &ViewContextCollection, ) -> Result, SpaceViewSystemExecutionError> { - log::debug!("Called execute"); for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { let results = ctx.recording().query_caches().latest_at( ctx.recording_store(), &ctx.current_query(), &data_result.entity_path, - [GraphNodeId::name(), GraphEdge::name()], + [GraphEdge::name()], ); - if let Some(node_ids) = results.component_batch::() { - // log::debug!("Node ids: {:?}", node_ids); - - self.nodes.push(( - data_result.entity_path.clone(), - node_ids - .iter() - .map(|node_id| NodeIdWithInstance { - node_id: node_id.to_owned(), - label: None, - }) - .collect(), - )); - } - if let Some(edges) = results.component_batch::() { // log::debug!("Edges: {:?}", edges); @@ -112,4 +81,4 @@ impl VisualizerSystem for GraphNodeSystem { } } -re_viewer_context::impl_component_fallback_provider!(GraphNodeSystem => []); +re_viewer_context::impl_component_fallback_provider!(GraphEdgeSystem => []); diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 752b3e1416e2..776e2865f14b 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,6 +1,5 @@ -use egui_graphs::SettingsInteraction; use re_viewer::external::{ - egui::{self, Label, Stroke}, + egui::{self, Label}, re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, @@ -13,32 +12,14 @@ use re_viewer::external::{ }, }; -use crate::graph_visualizer_system::GraphNodeSystem; +use crate::edge_visualizer_system::GraphEdgeSystem; +use crate::node_visualizer_system::GraphNodeSystem; /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. -pub struct GraphSpaceViewState { - graph: egui_graphs::Graph<(), ()>, -} - -impl Default for GraphSpaceViewState { - fn default() -> Self { - let mut g = petgraph::stable_graph::StableGraph::new(); - - let a = g.add_node(()); - let b = g.add_node(()); - let c = g.add_node(()); - - g.add_edge(a, b, ()); - g.add_edge(b, c, ()); - g.add_edge(c, a, ()); - - Self { - graph: egui_graphs::Graph::from(&g), - } - } -} +#[derive(Default)] +pub struct GraphSpaceViewState; impl SpaceViewState for GraphSpaceViewState { fn as_any(&self) -> &dyn std::any::Any { @@ -77,7 +58,8 @@ impl SpaceViewClass for GraphSpaceView { &self, system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { - system_registry.register_visualizer::() + system_registry.register_visualizer::()?; + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -145,25 +127,10 @@ impl SpaceViewClass for GraphSpaceView { _query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { - let graph_nodes = system_output.view_systems.get::()?; + let node_system = system_output.view_systems.get::()?; + let edge_system = system_output.view_systems.get::()?; let state = state.downcast_mut::()?; - let interaction_settings = &SettingsInteraction::new() - .with_dragging_enabled(true) - .with_node_clicking_enabled(true) - .with_node_selection_enabled(true) - .with_node_selection_multi_enabled(true) - .with_edge_clicking_enabled(true) - .with_edge_selection_enabled(true) - .with_edge_selection_multi_enabled(true); - - let navigation_settings = - &egui_graphs::SettingsNavigation::new().with_fit_to_screen_enabled(true); - - let mut graph_view = egui_graphs::GraphView::new(&mut state.graph) - .with_interactions(interaction_settings) - .with_navigations(navigation_settings); - egui::Frame { inner_margin: re_ui::DesignTokens::view_padding().into(), ..egui::Frame::default() @@ -171,25 +138,36 @@ impl SpaceViewClass for GraphSpaceView { .show(ui, |ui| { ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { egui::ScrollArea::both().show(ui, |ui| { - for (entity, nodes) in graph_nodes.nodes.iter() { - let text = egui::RichText::new(entity.to_owned()); - ui.add(Label::new(text)); - for n in nodes { - let text = egui::RichText::new(format!("{:?}", n.node_id.0 .0)); + ui.label(egui::RichText::new("Nodes").underline()); + + for nodes in node_system.nodes.iter() { + for n in nodes.nodes_batch.iter() { + let text = egui::RichText::new(format!( + "{}: {}", + nodes.entity_path.to_owned(), + n.0 + )); ui.add(Label::new(text)); } } - }) - }); - egui::Frame::none() - .stroke(Stroke { - width: 1.0, - color: egui::Color32::RED, + ui.label(egui::RichText::new("Edges").underline()); + + for (entity, edges) in edge_system.edges.iter() { + for e in edges { + let text = egui::RichText::new(format!( + "{}: {:?}:{} -> {:?}:{}", + entity.to_owned(), + e.edge.0.source_entity.clone().map(EntityPath::from), + e.edge.0.source, + e.edge.0.target_entity.clone().map(EntityPath::from), + e.edge.0.target + )); + ui.add(Label::new(text)); + } + } }) - .show(ui, |ui| { - ui.add(&mut graph_view); - }); + }); }); Ok(()) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 1c682b97c6c9..ae59c92695c9 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -3,7 +3,8 @@ use re_viewer::external::{re_log, re_memory}; mod graph_space_view; -mod graph_visualizer_system; +mod node_visualizer_system; +mod edge_visualizer_system; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs new file mode 100644 index 000000000000..7f4cedab8e95 --- /dev/null +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -0,0 +1,74 @@ +use re_viewer::external::{ + re_chunk::LatestAtQuery, re_log_types::{EntityPath, Instance}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, re_types::{ + self, archetypes::GraphNodes, components::{self, GraphEdge, GraphNodeId}, Loggable as _ + }, re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, + ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, + VisualizerSystem, + } +}; + +/// Our space view consist of single part which holds a list of egui colors for each entity path. +#[derive(Default)] +pub struct GraphNodeSystem { + pub nodes: Vec, +} + +pub struct GraphNodesEntry { + pub entity_path: EntityPath, + pub nodes_batch: Vec, +} + + +impl IdentifiedViewSystem for GraphNodeSystem { + fn identifier() -> ViewSystemIdentifier { + "GraphNodes".into() + } +} + +impl VisualizerSystem for GraphNodeSystem { + fn visualizer_query_info(&self) -> VisualizerQueryInfo { + VisualizerQueryInfo::from_archetype::() + } + + /// Populates the scene part with data from the store. + fn execute( + &mut self, + ctx: &ViewContext<'_>, + view_query: &ViewQuery<'_>, + _context_systems: &ViewContextCollection, + ) -> Result, SpaceViewSystemExecutionError> { + let timeline_query = LatestAtQuery::new(view_query.timeline, view_query.latest_at); + + for data_result in view_query.iter_visible_data_results(ctx, Self::identifier()) { + let results = data_result + .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); + + let Some(all_node_ids) = results.results.component_batch::() else { + continue; + }; + + self.nodes.push(GraphNodesEntry{ + nodes_batch: all_node_ids, + entity_path: data_result.entity_path.clone(), + }); + + + + } + + // We're not using `re_renderer` here, so return an empty vector. + // If you want to draw additional primitives here, you can emit re_renderer draw data here directly. + Ok(Vec::new()) + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { + self + } +} + +re_viewer_context::impl_component_fallback_provider!(GraphNodeSystem => []); diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index aba36d5ece70..e49f2abc2fc0 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -5,10 +5,9 @@ //! cargo run -p minimal_options -- --help //! ``` +use rerun::components::GraphEdge; use rerun::external::re_log; -use rerun::{components, datatypes, EntityPath}; -use rerun::demo_util::grid; use rerun::{GraphEdges, GraphNodes}; #[derive(Debug, clap::Parser)] @@ -38,10 +37,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); rec.log("kitchen/objects", &GraphNodes::new(["sink", "fridge"]))?; rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; - rec.log( - "kitchen/areas", - &GraphEdges::new([components::GraphEdge::new("area0", "area1")]), - )?; + rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; rec.set_time_sequence("frame", 1); rec.log("hallway/areas", &GraphNodes::new(["area0"]))?; @@ -54,25 +50,19 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { )?; rec.log( "living/areas", - &GraphEdges::new([ - components::GraphEdge::new("area0", "area1"), - components::GraphEdge::new("area0", "area2"), - components::GraphEdge::new("area1", "area2"), - ]), + &GraphEdges::new([("area0", "area1"), ("area0", "area2"), ("area1", "area2")]), )?; rec.log( "doors", - &GraphEdges::new([components::GraphEdge::new_global( - ( - datatypes::EntityPath::from("kitchen/areas"), - datatypes::GraphNodeId::from("area1"), - ), - ( - datatypes::EntityPath::from("kitchen/areas"), - datatypes::GraphNodeId::from("area1"), - ), - )]), + &GraphEdges::new([ + GraphEdge::new("area1", "area0") + .with_source_in("kitchen/areas") + .with_target_in("hallway/areas"), + GraphEdge::new("area1", "area2") + .with_source_in("hallway/areas") + .with_target_in("living/areas"), + ]), )?; Ok(()) diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 2317e71e1463..4dc159087f01 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,7 +21,6 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true -graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true graph_node_id.hpp linguist-generated=true half_size2d.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge.cpp b/rerun_cpp/src/rerun/components/graph_edge.cpp deleted file mode 100644 index 9343a9584788..000000000000 --- a/rerun_cpp/src/rerun/components/graph_edge.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". - -#include "graph_edge.hpp" - -#include "../datatypes/graph_edge.hpp" - -#include -#include - -namespace rerun::components {} - -namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::list( - arrow::field("item", Loggable::arrow_datatype(), false) - ); - return datatype; - } - - Result> Loggable::to_arrow( - const components::GraphEdge* instances, size_t num_instances - ) { - // TODO(andreas): Allow configuring the memory pool. - arrow::MemoryPool* pool = arrow::default_memory_pool(); - auto datatype = arrow_datatype(); - - ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) - if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), - instances, - num_instances - )); - } - std::shared_ptr array; - ARROW_RETURN_NOT_OK(builder->Finish(&array)); - return array; - } - - rerun::Error Loggable::fill_arrow_array_builder( - arrow::ListBuilder* builder, const components::GraphEdge* elements, size_t num_elements - ) { - if (builder == nullptr) { - return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); - } - if (elements == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Cannot serialize null pointer to arrow array." - ); - } - - auto value_builder = static_cast(builder->value_builder()); - ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); - ARROW_RETURN_NOT_OK(value_builder->Reserve(static_cast(num_elements * 2))); - - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - const auto& element = elements[elem_idx]; - ARROW_RETURN_NOT_OK(builder->Append()); - if (element.edge.data()) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - value_builder, - element.edge.data(), - element.edge.size() - )); - } - } - - return Error::ok(); - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp index 1e513494bb54..552f89ef2f46 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -3,7 +3,6 @@ #pragma once -#include "../collection.hpp" #include "../datatypes/graph_edge.hpp" #include "../result.hpp" @@ -11,34 +10,32 @@ #include #include -namespace arrow { - class Array; - class DataType; - class ListBuilder; -} // namespace arrow - namespace rerun::components { /// **Component**: An edge in a graph connecting two nodes. /// /// Depending on the context this could represent a directed or undirected edge. struct GraphEdge { - rerun::Collection edge; + rerun::datatypes::GraphEdge edge; public: GraphEdge() = default; - GraphEdge(rerun::Collection edge_) : edge(std::move(edge_)) {} + GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphEdge& operator=(rerun::Collection edge_) { + GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { edge = std::move(edge_); return *this; } + + /// Cast to the underlying GraphEdge datatype + operator rerun::datatypes::GraphEdge() const { + return edge; + } }; } // namespace rerun::components namespace rerun { - template - struct Loggable; + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); /// \private template <> @@ -46,16 +43,27 @@ namespace rerun { static constexpr const char Name[] = "rerun.components.GraphEdge"; /// Returns the arrow data type this type corresponds to. - static const std::shared_ptr& arrow_datatype(); + static const std::shared_ptr& arrow_datatype() { + return Loggable::arrow_datatype(); + } /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. static Result> to_arrow( const components::GraphEdge* instances, size_t num_instances - ); - - /// Fills an arrow array builder with an array of this type. - static rerun::Error fill_arrow_array_builder( - arrow::ListBuilder* builder, const components::GraphEdge* elements, size_t num_elements - ); + ) { + if (num_instances == 0) { + return Loggable::to_arrow(nullptr, 0); + } else if (instances == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Passed array instances is null when num_elements> 0." + ); + } else { + return Loggable::to_arrow( + &instances->edge, + num_instances + ); + } + } }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp index 6f1567f1a104..54308af4ae91 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -19,14 +19,18 @@ namespace rerun { Loggable::arrow_datatype(), false ), - arrow::field("dest", Loggable::arrow_datatype(), false), + arrow::field( + "target", + Loggable::arrow_datatype(), + false + ), arrow::field( "source_entity", Loggable::arrow_datatype(), true ), arrow::field( - "dest_entity", + "target_entity", Loggable::arrow_datatype(), true ), @@ -84,7 +88,7 @@ namespace rerun { for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( field_builder, - &elements[elem_idx].dest, + &elements[elem_idx].target, 1 )); } @@ -112,11 +116,11 @@ namespace rerun { ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { const auto& element = elements[elem_idx]; - if (element.dest_entity.has_value()) { + if (element.target_entity.has_value()) { RR_RETURN_NOT_OK( Loggable::fill_arrow_array_builder( field_builder, - &element.dest_entity.value(), + &element.target_entity.value(), 1 ) ); diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp index ed47fdac87cf..a4ebe2383412 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -20,19 +20,19 @@ namespace arrow { namespace rerun::datatypes { /// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). /// - /// If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. + /// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. struct GraphEdge { /// The id of the source node. rerun::datatypes::GraphNodeId source; /// The id of the target node. - rerun::datatypes::GraphNodeId dest; + rerun::datatypes::GraphNodeId target; /// The entity path of the source node. std::optional source_entity; /// The entity path of the target node. - std::optional dest_entity; + std::optional target_entity; public: GraphEdge() = default; diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py index f198974133e5..99d7f6a18624 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -24,7 +24,7 @@ class GraphEdges(Archetype): def __init__( self: Any, - edges: components.GraphEdgeArrayLike, + edges: datatypes.GraphEdgeArrayLike, *, colors: datatypes.Rgba32ArrayLike | None = None, labels: datatypes.Utf8ArrayLike | None = None, diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index 4b0270d9f4cd..cee2c0ff17e7 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,7 +30,7 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType -from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType +from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType @@ -154,9 +154,7 @@ "GammaCorrectionBatch", "GammaCorrectionType", "GraphEdge", - "GraphEdgeArrayLike", "GraphEdgeBatch", - "GraphEdgeLike", "GraphEdgeType", "GraphNodeId", "GraphNodeIdBatch", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py index 001116d51b2d..19c74c1f346c 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -5,24 +5,16 @@ from __future__ import annotations -from typing import Any, Sequence, Union - -import pyarrow as pa -from attrs import define, field - from .. import datatypes from .._baseclasses import ( - BaseBatch, - BaseExtensionType, ComponentBatchMixin, ComponentMixin, ) -__all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] +__all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] -@define(init=False) -class GraphEdge(ComponentMixin): +class GraphEdge(datatypes.GraphEdge, ComponentMixin): """ **Component**: An edge in a graph connecting two nodes. @@ -30,55 +22,19 @@ class GraphEdge(ComponentMixin): """ _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - def __init__(self: Any, edge: GraphEdgeLike): - """Create a new instance of the GraphEdge component.""" - - # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - self.__attrs_init__(edge=edge) - - edge: list[datatypes.GraphEdge] = field() + # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge + pass -GraphEdgeLike = GraphEdge -GraphEdgeArrayLike = Union[ - GraphEdge, - Sequence[GraphEdgeLike], -] - - -class GraphEdgeType(BaseExtensionType): +class GraphEdgeType(datatypes.GraphEdgeType): _TYPE_NAME: str = "rerun.components.GraphEdge" - def __init__(self) -> None: - pa.ExtensionType.__init__( - self, - pa.list_( - pa.field( - "item", - pa.struct([ - pa.field("source", pa.utf8(), nullable=False, metadata={}), - pa.field("dest", pa.utf8(), nullable=False, metadata={}), - pa.field("source_entity", pa.utf8(), nullable=True, metadata={}), - pa.field("dest_entity", pa.utf8(), nullable=True, metadata={}), - ]), - nullable=False, - metadata={}, - ) - ), - self._TYPE_NAME, - ) - -class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike], ComponentBatchMixin): +class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): _ARROW_TYPE = GraphEdgeType() - @staticmethod - def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - raise NotImplementedError( - "Arrow serialization of GraphEdge not implemented: We lack codegen for arrow-serialization of general structs" - ) # You need to implement native_to_pa_array_override in graph_edge_ext.py - # This is patched in late to avoid circular dependencies. GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py index faff7395492a..6d287ea3ff5f 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -26,7 +26,7 @@ def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNode return datatypes.GraphNodeId(x) -def _graph_edge__dest__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: +def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: if isinstance(x, datatypes.GraphNodeId): return x else: @@ -44,7 +44,7 @@ def _graph_edge__source_entity__special_field_converter_override( return datatypes.EntityPath(x) -def _graph_edge__dest_entity__special_field_converter_override( +def _graph_edge__target_entity__special_field_converter_override( x: datatypes.EntityPathLike | None, ) -> datatypes.EntityPath | None: if x is None: @@ -60,15 +60,15 @@ class GraphEdge: """ **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). - If `source_entity` or `dest_entity` is left out then the node id is assumed to be within the current entity. + If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. """ def __init__( self: Any, source: datatypes.GraphNodeIdLike, - dest: datatypes.GraphNodeIdLike, + target: datatypes.GraphNodeIdLike, source_entity: datatypes.EntityPathLike | None = None, - dest_entity: datatypes.EntityPathLike | None = None, + target_entity: datatypes.EntityPathLike | None = None, ): """ Create a new instance of the GraphEdge datatype. @@ -77,24 +77,24 @@ def __init__( ---------- source: The id of the source node. - dest: + target: The id of the target node. source_entity: The entity path of the source node. - dest_entity: + target_entity: The entity path of the target node. """ # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - self.__attrs_init__(source=source, dest=dest, source_entity=source_entity, dest_entity=dest_entity) + self.__attrs_init__(source=source, target=target, source_entity=source_entity, target_entity=target_entity) source: datatypes.GraphNodeId = field(converter=_graph_edge__source__special_field_converter_override) # The id of the source node. # # (Docstring intentionally commented out to hide this field from the docs) - dest: datatypes.GraphNodeId = field(converter=_graph_edge__dest__special_field_converter_override) + target: datatypes.GraphNodeId = field(converter=_graph_edge__target__special_field_converter_override) # The id of the target node. # # (Docstring intentionally commented out to hide this field from the docs) @@ -106,8 +106,8 @@ def __init__( # # (Docstring intentionally commented out to hide this field from the docs) - dest_entity: datatypes.EntityPath | None = field( - default=None, converter=_graph_edge__dest_entity__special_field_converter_override + target_entity: datatypes.EntityPath | None = field( + default=None, converter=_graph_edge__target_entity__special_field_converter_override ) # The entity path of the target node. # @@ -129,9 +129,9 @@ def __init__(self) -> None: self, pa.struct([ pa.field("source", pa.utf8(), nullable=False, metadata={}), - pa.field("dest", pa.utf8(), nullable=False, metadata={}), + pa.field("target", pa.utf8(), nullable=False, metadata={}), pa.field("source_entity", pa.utf8(), nullable=True, metadata={}), - pa.field("dest_entity", pa.utf8(), nullable=True, metadata={}), + pa.field("target_entity", pa.utf8(), nullable=True, metadata={}), ]), self._TYPE_NAME, ) @@ -150,9 +150,9 @@ def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa. return pa.StructArray.from_arrays( [ GraphNodeIdBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeIdBatch([x.dest for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeIdBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] EntityPathBatch([x.source_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - EntityPathBatch([x.dest_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + EntityPathBatch([x.target_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] ], fields=list(data_type), ) From 8102a959687a3cb1a7955629a1cfc2010321fa13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 25 Sep 2024 17:11:54 +0200 Subject: [PATCH 005/159] WIP: fmt --- .../re_types/src/components/graph_edge_ext.rs | 2 +- examples/rust/graph_view/src/main.rs | 2 +- .../graph_view/src/node_visualizer_system.rs | 34 +++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs index eff250a542a5..7450cbf11e2f 100644 --- a/crates/store/re_types/src/components/graph_edge_ext.rs +++ b/crates/store/re_types/src/components/graph_edge_ext.rs @@ -5,7 +5,7 @@ use crate::datatypes::{GraphEdge, GraphNodeId}; impl super::GraphEdge { /// Creates a new edge between two nodes. pub fn new(source: impl Into, target: impl Into) -> Self { - Self(GraphEdge{ + Self(GraphEdge { source: source.into(), target: target.into(), ..Default::default() diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index ae59c92695c9..7ce082a40d80 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,9 +2,9 @@ use re_viewer::external::{re_log, re_memory}; +mod edge_visualizer_system; mod graph_space_view; mod node_visualizer_system; -mod edge_visualizer_system; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 7f4cedab8e95..f8ad1183c693 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,11 +1,19 @@ use re_viewer::external::{ - re_chunk::LatestAtQuery, re_log_types::{EntityPath, Instance}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, re_types::{ - self, archetypes::GraphNodes, components::{self, GraphEdge, GraphNodeId}, Loggable as _ - }, re_viewer_context::{ + re_chunk::LatestAtQuery, + re_log_types::{EntityPath, Instance}, + re_renderer, + re_space_view::{DataResultQuery, RangeResultsExt}, + re_types::{ + self, + archetypes::GraphNodes, + components::{self, GraphEdge, GraphNodeId}, + Loggable as _, + }, + re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, - } + }, }; /// Our space view consist of single part which holds a list of egui colors for each entity path. @@ -19,7 +27,6 @@ pub struct GraphNodesEntry { pub nodes_batch: Vec, } - impl IdentifiedViewSystem for GraphNodeSystem { fn identifier() -> ViewSystemIdentifier { "GraphNodes".into() @@ -44,17 +51,14 @@ impl VisualizerSystem for GraphNodeSystem { let results = data_result .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); - let Some(all_node_ids) = results.results.component_batch::() else { - continue; - }; - - self.nodes.push(GraphNodesEntry{ - nodes_batch: all_node_ids, - entity_path: data_result.entity_path.clone(), - }); - - + let Some(all_node_ids) = results.results.component_batch::() else { + continue; + }; + self.nodes.push(GraphNodesEntry { + nodes_batch: all_node_ids, + entity_path: data_result.entity_path.clone(), + }); } // We're not using `re_renderer` here, so return an empty vector. From 10339c18ea37795afed2c362aab00d53dfb40af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 26 Sep 2024 16:49:18 +0200 Subject: [PATCH 006/159] WIP: Basic color component working with clamping --- Cargo.lock | 2 + .../rerun/archetypes/graph_edges.fbs | 2 +- .../re_types/src/archetypes/graph_edges.rs | 2 +- examples/rust/graph_view/Cargo.toml | 4 +- .../graph_view/src/edge_visualizer_system.rs | 1 - .../rust/graph_view/src/graph_space_view.rs | 27 +++++--- .../graph_view/src/node_visualizer_system.rs | 66 +++++++++++++++---- examples/rust/node_link_graph/src/main.rs | 4 +- 8 files changed, 79 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b3fd63331f35..267a1e7d626f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2729,6 +2729,8 @@ dependencies = [ name = "graph_view" version = "0.0.0" dependencies = [ + "bytemuck", + "itertools 0.13.0", "mimalloc", "petgraph", "re_crash_handler", diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index 82227d289bb8..c304b985ca0d 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -4,7 +4,7 @@ namespace rerun.archetypes; /// A list of nodes in a graph with optional labels, colors, etc. table GraphEdges ( - "attr.rust.derive": "PartialEq", + "attr.rust.derive": "PartialEq, Eq", "attr.docs.category": "Graph", "attr.docs.view_types": "Graph View" ) { diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs index 47a59c16bf0f..385106c68626 100644 --- a/crates/store/re_types/src/archetypes/graph_edges.rs +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -19,7 +19,7 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct GraphEdges { /// A list of node IDs. pub edges: Vec, diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 807857d46a61..6b6e8470e9d4 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -23,4 +23,6 @@ re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ # mimalloc is a much faster allocator: mimalloc = "0.1" -petgraph = "0.6.5" +petgraph = "0.6" +itertools = "0.13" +bytemuck = "1.18" diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index 71d9b3e690a6..ecffb819e8d0 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -21,7 +21,6 @@ pub struct GraphEdgeSystem { pub struct EdgeWithInstance { pub edge: GraphEdge, - // pub instance: Instance, pub label: Option, } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 776e2865f14b..1bd47b2309fe 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -13,7 +13,7 @@ use re_viewer::external::{ }; use crate::edge_visualizer_system::GraphEdgeSystem; -use crate::node_visualizer_system::GraphNodeSystem; +use crate::node_visualizer_system::GraphNodeVisualizer; /// Space view state for the custom space view. /// @@ -58,7 +58,7 @@ impl SpaceViewClass for GraphSpaceView { &self, system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { - system_registry.register_visualizer::()?; + system_registry.register_visualizer::()?; system_registry.register_visualizer::() } @@ -80,7 +80,7 @@ impl SpaceViewClass for GraphSpaceView { // By default spawn a single view at the root if there's anything the visualizer is applicable to. if ctx .applicable_entities_per_visualizer - .get(&GraphNodeSystem::identifier()) + .get(&GraphNodeVisualizer::identifier()) .map_or(true, |entities| entities.is_empty()) { SpaceViewSpawnHeuristics::default() @@ -127,8 +127,9 @@ impl SpaceViewClass for GraphSpaceView { _query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { - let node_system = system_output.view_systems.get::()?; + let node_system = system_output.view_systems.get::()?; let edge_system = system_output.view_systems.get::()?; + let state = state.downcast_mut::()?; egui::Frame { @@ -140,14 +141,22 @@ impl SpaceViewClass for GraphSpaceView { egui::ScrollArea::both().show(ui, |ui| { ui.label(egui::RichText::new("Nodes").underline()); - for nodes in node_system.nodes.iter() { - for n in nodes.nodes_batch.iter() { + for data in node_system.data.iter() { + for (node_id, maybe_color) in data.nodes.iter() { let text = egui::RichText::new(format!( "{}: {}", - nodes.entity_path.to_owned(), - n.0 + data.entity_path.to_owned(), + node_id.0 )); - ui.add(Label::new(text)); + + if let Some(color) = maybe_color { + let c = egui::Color32::from(color.0); + ui.add(Label::new( + text.color(c)), + ); + } else { + ui.add(Label::new(text)); + } } } diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index f8ad1183c693..83ab8cb5b64e 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,12 +1,12 @@ use re_viewer::external::{ re_chunk::LatestAtQuery, - re_log_types::{EntityPath, Instance}, - re_renderer, + re_log_types::EntityPath, + re_query, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, re_types::{ self, archetypes::GraphNodes, - components::{self, GraphEdge, GraphNodeId}, + components::{self, Color, GraphNodeId}, Loggable as _, }, re_viewer_context::{ @@ -18,22 +18,37 @@ use re_viewer::external::{ /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] -pub struct GraphNodeSystem { - pub nodes: Vec, +pub struct GraphNodeVisualizer { + pub data: Vec, } -pub struct GraphNodesEntry { +pub struct GraphViewVisualizerData { pub entity_path: EntityPath, - pub nodes_batch: Vec, + pub nodes: Vec<(GraphNodeId, Option)>, } -impl IdentifiedViewSystem for GraphNodeSystem { +impl IdentifiedViewSystem for GraphNodeVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphNodes".into() } } -impl VisualizerSystem for GraphNodeSystem { +impl GraphNodeVisualizer { + fn process_data( + &mut self, + entity_path: &EntityPath, + data: impl Iterator)>>, + ) { + for nodes in data { + self.data.push(GraphViewVisualizerData { + entity_path: entity_path.to_owned(), + nodes, + }); + } + } +} + +impl VisualizerSystem for GraphNodeVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { VisualizerQueryInfo::from_archetype::() } @@ -51,14 +66,37 @@ impl VisualizerSystem for GraphNodeSystem { let results = data_result .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); - let Some(all_node_ids) = results.results.component_batch::() else { + let Some(all_node_ids) = results.get_required_chunks(&components::GraphNodeId::name()) + else { continue; }; - self.nodes.push(GraphNodesEntry { - nodes_batch: all_node_ids, - entity_path: data_result.entity_path.clone(), + let all_nodes_indexed = all_node_ids.iter().flat_map(move |chunk| { + itertools::izip!( + chunk.iter_component_indices( + &view_query.timeline, + &components::GraphNodeId::name() + ), + chunk.iter_component::() + ) + }); + let all_colors = results.iter_as(view_query.timeline, components::Color::name()); + + let data = re_query::range_zip_1x1( + all_nodes_indexed, + all_colors.component::(), + ) + .map(|(_index, node_ids, colors)| { + // TODO: Use an iterator here: + re_query::clamped_zip_1x1( + node_ids.iter().cloned(), + colors.unwrap_or_default().iter().map(|&c| Some(c)), + Option::::default, + ) + .collect::>() }); + + self.process_data(&data_result.entity_path, data); } // We're not using `re_renderer` here, so return an empty vector. @@ -75,4 +113,4 @@ impl VisualizerSystem for GraphNodeSystem { } } -re_viewer_context::impl_component_fallback_provider!(GraphNodeSystem => []); +re_viewer_context::impl_component_fallback_provider!(GraphNodeVisualizer => []); diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index e49f2abc2fc0..05a8444dc28d 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -8,7 +8,7 @@ use rerun::components::GraphEdge; use rerun::external::re_log; -use rerun::{GraphEdges, GraphNodes}; +use rerun::{Color, GraphEdges, GraphNodes}; #[derive(Debug, clap::Parser)] #[clap(author, version, about)] @@ -35,7 +35,7 @@ fn main() -> anyhow::Result<()> { fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); - rec.log("kitchen/objects", &GraphNodes::new(["sink", "fridge"]))?; + rec.log("kitchen/objects", &GraphNodes::new(["sink", "fridge"]).with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]))?; rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; From 6c6519bc24de45bcf8009b4fc3c2b3be63fc66fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 08:18:14 +0200 Subject: [PATCH 007/159] WIP: streamline visualizer data processing --- .../graph_view/src/edge_visualizer_system.rs | 79 ++++++++------ .../rust/graph_view/src/graph_space_view.rs | 40 +++---- .../graph_view/src/node_visualizer_system.rs | 101 +++++++----------- examples/rust/node_link_graph/src/main.rs | 6 +- 4 files changed, 114 insertions(+), 112 deletions(-) diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index ecffb819e8d0..99e3d443615c 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -1,11 +1,10 @@ use re_viewer::external::{ + re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_log_types::EntityPath, + re_query::{clamped_zip_1x1, range_zip_1x1}, re_renderer, - re_types::{ - self, - components::{GraphEdge, GraphNodeId}, - Loggable as _, - }, + re_space_view::{DataResultQuery, RangeResultsExt}, + re_types::{self, archetypes, components, Loggable as _}, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -14,25 +13,37 @@ use re_viewer::external::{ }; #[derive(Default)] -pub struct GraphEdgeSystem { - pub edges: Vec<(EntityPath, Vec)>, - pub globals: Vec<(EntityPath, Vec)>, +pub struct GraphEdgeVisualizer { + pub(crate) data: Vec, +} + +pub struct GraphEdgeVisualizerData { + pub(crate) entity_path: EntityPath, + pub(crate) edges: ChunkComponentIterItem, + pub(crate) colors: ChunkComponentIterItem, } -pub struct EdgeWithInstance { - pub edge: GraphEdge, - pub label: Option, +impl GraphEdgeVisualizerData { + pub(crate) fn edges( + &self, + ) -> impl Iterator)> { + clamped_zip_1x1( + self.edges.iter(), + self.colors.iter().map(Option::Some), + Option::<&components::Color>::default, + ) + } } -impl IdentifiedViewSystem for GraphEdgeSystem { +impl IdentifiedViewSystem for GraphEdgeVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphEdges".into() } } -impl VisualizerSystem for GraphEdgeSystem { +impl VisualizerSystem for GraphEdgeVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() + VisualizerQueryInfo::from_archetype::() } /// Populates the scene part with data from the store. @@ -42,27 +53,29 @@ impl VisualizerSystem for GraphEdgeSystem { query: &ViewQuery<'_>, _context_systems: &ViewContextCollection, ) -> Result, SpaceViewSystemExecutionError> { + let timeline_query = LatestAtQuery::new(query.timeline, query.latest_at); + for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { - let results = ctx.recording().query_caches().latest_at( - ctx.recording_store(), - &ctx.current_query(), - &data_result.entity_path, - [GraphEdge::name()], - ); + let results = data_result + .latest_at_with_blueprint_resolved_data::( + ctx, + &timeline_query, + ); - if let Some(edges) = results.component_batch::() { - // log::debug!("Edges: {:?}", edges); + let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdge::name()); + let all_colors = results.iter_as(query.timeline, components::Color::name()); + + let data = range_zip_1x1( + all_indexed_edges.component::(), + all_colors.component::(), + ); - self.edges.push(( - data_result.entity_path.clone(), - edges - .iter() - .map(|edge| EdgeWithInstance { - edge: edge.to_owned(), - label: None, - }) - .collect(), - )); + for (_index, edges, colors) in data { + self.data.push(GraphEdgeVisualizerData { + entity_path: data_result.entity_path.clone(), + edges, + colors: colors.unwrap_or_default(), + }); } } @@ -80,4 +93,4 @@ impl VisualizerSystem for GraphEdgeSystem { } } -re_viewer_context::impl_component_fallback_provider!(GraphEdgeSystem => []); +re_viewer_context::impl_component_fallback_provider!(GraphEdgeVisualizer => []); diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 1bd47b2309fe..853b9114f2fd 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,5 +1,5 @@ use re_viewer::external::{ - egui::{self, Label}, + egui::{self, Color32, Label}, re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, @@ -12,7 +12,7 @@ use re_viewer::external::{ }, }; -use crate::edge_visualizer_system::GraphEdgeSystem; +use crate::edge_visualizer_system::GraphEdgeVisualizer; use crate::node_visualizer_system::GraphNodeVisualizer; /// Space view state for the custom space view. @@ -59,7 +59,7 @@ impl SpaceViewClass for GraphSpaceView { system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_visualizer::()?; - system_registry.register_visualizer::() + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -128,9 +128,9 @@ impl SpaceViewClass for GraphSpaceView { system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let node_system = system_output.view_systems.get::()?; - let edge_system = system_output.view_systems.get::()?; + let edge_system = system_output.view_systems.get::()?; - let state = state.downcast_mut::()?; + let _state = state.downcast_mut::()?; egui::Frame { inner_margin: re_ui::DesignTokens::view_padding().into(), @@ -142,7 +142,7 @@ impl SpaceViewClass for GraphSpaceView { ui.label(egui::RichText::new("Nodes").underline()); for data in node_system.data.iter() { - for (node_id, maybe_color) in data.nodes.iter() { + for (node_id, maybe_color) in data.nodes() { let text = egui::RichText::new(format!( "{}: {}", data.entity_path.to_owned(), @@ -150,10 +150,8 @@ impl SpaceViewClass for GraphSpaceView { )); if let Some(color) = maybe_color { - let c = egui::Color32::from(color.0); - ui.add(Label::new( - text.color(c)), - ); + let c = Color32::from(color.0); + ui.add(Label::new(text.color(c))); } else { ui.add(Label::new(text)); } @@ -162,17 +160,23 @@ impl SpaceViewClass for GraphSpaceView { ui.label(egui::RichText::new("Edges").underline()); - for (entity, edges) in edge_system.edges.iter() { - for e in edges { + for data in edge_system.data.iter() { + for (edge, maybe_color) in data.edges() { let text = egui::RichText::new(format!( "{}: {:?}:{} -> {:?}:{}", - entity.to_owned(), - e.edge.0.source_entity.clone().map(EntityPath::from), - e.edge.0.source, - e.edge.0.target_entity.clone().map(EntityPath::from), - e.edge.0.target + data.entity_path, + edge.0.source_entity.clone().map(EntityPath::from), + edge.0.source, + edge.0.target_entity.clone().map(EntityPath::from), + edge.0.target )); - ui.add(Label::new(text)); + + if let Some(color) = maybe_color { + let c = Color32::from(color.0); + ui.add(Label::new(text.color(c))); + } else { + ui.add(Label::new(text)); + } } } }) diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 83ab8cb5b64e..56f3f649ea6a 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,14 +1,10 @@ use re_viewer::external::{ - re_chunk::LatestAtQuery, + re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_log_types::EntityPath, - re_query, re_renderer, + re_query::{clamped_zip_1x1, range_zip_1x1}, + re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{ - self, - archetypes::GraphNodes, - components::{self, Color, GraphNodeId}, - Loggable as _, - }, + re_types::{self, archetypes, components, Loggable as _}, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -19,84 +15,69 @@ use re_viewer::external::{ /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct GraphNodeVisualizer { - pub data: Vec, + pub(crate) data: Vec, } -pub struct GraphViewVisualizerData { - pub entity_path: EntityPath, - pub nodes: Vec<(GraphNodeId, Option)>, +pub struct GraphNodeVisualizerData { + pub(crate) entity_path: EntityPath, + pub(crate) node_ids: ChunkComponentIterItem, + pub(crate) colors: ChunkComponentIterItem, } -impl IdentifiedViewSystem for GraphNodeVisualizer { - fn identifier() -> ViewSystemIdentifier { - "GraphNodes".into() +impl GraphNodeVisualizerData { + pub(crate) fn nodes( + &self, + ) -> impl Iterator)> { + clamped_zip_1x1( + self.node_ids.iter(), + self.colors.iter().map(Option::Some), + Option::<&components::Color>::default, + ) } } -impl GraphNodeVisualizer { - fn process_data( - &mut self, - entity_path: &EntityPath, - data: impl Iterator)>>, - ) { - for nodes in data { - self.data.push(GraphViewVisualizerData { - entity_path: entity_path.to_owned(), - nodes, - }); - } +impl IdentifiedViewSystem for GraphNodeVisualizer { + fn identifier() -> ViewSystemIdentifier { + "GraphNodes".into() } } impl VisualizerSystem for GraphNodeVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() + VisualizerQueryInfo::from_archetype::() } /// Populates the scene part with data from the store. fn execute( &mut self, ctx: &ViewContext<'_>, - view_query: &ViewQuery<'_>, + query: &ViewQuery<'_>, _context_systems: &ViewContextCollection, ) -> Result, SpaceViewSystemExecutionError> { - let timeline_query = LatestAtQuery::new(view_query.timeline, view_query.latest_at); + let timeline_query = LatestAtQuery::new(query.timeline, query.latest_at); - for data_result in view_query.iter_visible_data_results(ctx, Self::identifier()) { + for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { let results = data_result - .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); - - let Some(all_node_ids) = results.get_required_chunks(&components::GraphNodeId::name()) - else { - continue; - }; + .latest_at_with_blueprint_resolved_data::( + ctx, + &timeline_query, + ); - let all_nodes_indexed = all_node_ids.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices( - &view_query.timeline, - &components::GraphNodeId::name() - ), - chunk.iter_component::() - ) - }); - let all_colors = results.iter_as(view_query.timeline, components::Color::name()); + let all_indexed_nodes = results.iter_as(query.timeline, components::GraphEdge::name()); + let all_colors = results.iter_as(query.timeline, components::Color::name()); - let data = re_query::range_zip_1x1( - all_nodes_indexed, + let data = range_zip_1x1( + all_indexed_nodes.component::(), all_colors.component::(), - ) - .map(|(_index, node_ids, colors)| { - // TODO: Use an iterator here: - re_query::clamped_zip_1x1( - node_ids.iter().cloned(), - colors.unwrap_or_default().iter().map(|&c| Some(c)), - Option::::default, - ) - .collect::>() - }); + ); - self.process_data(&data_result.entity_path, data); + for (_index, node_ids, colors) in data { + self.data.push(GraphNodeVisualizerData { + entity_path: data_result.entity_path.clone(), + node_ids, + colors: colors.unwrap_or_default(), + }); + } } // We're not using `re_renderer` here, so return an empty vector. diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 05a8444dc28d..3dcbe03604dd 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -35,7 +35,11 @@ fn main() -> anyhow::Result<()> { fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); - rec.log("kitchen/objects", &GraphNodes::new(["sink", "fridge"]).with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]))?; + rec.log( + "kitchen/objects", + &GraphNodes::new(["sink", "fridge"]) + .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), + )?; rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; From c2a2d4ef0b8ed35deacad05f2d5eb9c2f3f83f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 08:22:31 +0200 Subject: [PATCH 008/159] WIP: fix component aggregation --- examples/rust/graph_view/src/node_visualizer_system.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 56f3f649ea6a..4d10880447bd 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -63,7 +63,7 @@ impl VisualizerSystem for GraphNodeVisualizer { &timeline_query, ); - let all_indexed_nodes = results.iter_as(query.timeline, components::GraphEdge::name()); + let all_indexed_nodes = results.iter_as(query.timeline, components::GraphNodeId::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); let data = range_zip_1x1( From b2c9a732b4878789214098512df0fded73ca044a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 09:49:55 +0200 Subject: [PATCH 009/159] WIP: build an internal `petgraph` representation --- Cargo.lock | 1 + examples/rust/graph_view/Cargo.toml | 1 + examples/rust/graph_view/src/common.rs | 12 ++++ .../graph_view/src/edge_visualizer_system.rs | 31 ++++++++--- .../rust/graph_view/src/graph_space_view.rs | 55 +++++++++++++++---- examples/rust/graph_view/src/main.rs | 1 + .../graph_view/src/node_visualizer_system.rs | 12 +++- 7 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 examples/rust/graph_view/src/common.rs diff --git a/Cargo.lock b/Cargo.lock index 267a1e7d626f..9ccf828e7316 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2734,6 +2734,7 @@ dependencies = [ "mimalloc", "petgraph", "re_crash_handler", + "re_log_types", "re_sdk_comms", "re_viewer", ] diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 6b6e8470e9d4..6e0c2d82fbae 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -14,6 +14,7 @@ analytics = ["re_crash_handler/analytics", "re_viewer/analytics"] [dependencies] re_crash_handler = { path = "../../../crates/utils/re_crash_handler" } re_viewer = { path = "../../../crates/viewer/re_viewer", default-features = false } +re_log_types = { path = "../../../crates/store/re_log_types" } # We need re_sdk_comms to receive log events from and SDK: re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs new file mode 100644 index 000000000000..c3585eea9fe0 --- /dev/null +++ b/examples/rust/graph_view/src/common.rs @@ -0,0 +1,12 @@ +use re_viewer::external::re_types::datatypes; + +#[derive(PartialEq, Eq, Hash)] +pub(crate) struct QualifiedNode { + pub entity_path: re_log_types::EntityPath, + pub node_id: datatypes::GraphNodeId, +} + +pub(crate) struct QualifiedEdge { + pub source: QualifiedNode, + pub target: QualifiedNode, +} diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index 99e3d443615c..2aff37d31e9c 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -1,6 +1,5 @@ use re_viewer::external::{ re_chunk::{ChunkComponentIterItem, LatestAtQuery}, - re_log_types::EntityPath, re_query::{clamped_zip_1x1, range_zip_1x1}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, @@ -12,23 +11,41 @@ use re_viewer::external::{ }, }; +use crate::common::{QualifiedEdge, QualifiedNode}; + #[derive(Default)] pub struct GraphEdgeVisualizer { pub(crate) data: Vec, } -pub struct GraphEdgeVisualizerData { - pub(crate) entity_path: EntityPath, - pub(crate) edges: ChunkComponentIterItem, - pub(crate) colors: ChunkComponentIterItem, +pub(crate) struct GraphEdgeVisualizerData { + pub entity_path: re_log_types::EntityPath, + pub edges: ChunkComponentIterItem, + pub colors: ChunkComponentIterItem, } impl GraphEdgeVisualizerData { pub(crate) fn edges( &self, - ) -> impl Iterator)> { + ) -> impl Iterator)> { clamped_zip_1x1( - self.edges.iter(), + // TODO(grtlr): Avoid all this cloning! + self.edges.iter().map(|e| QualifiedEdge { + source: QualifiedNode { + entity_path: e + .source_entity + .clone() + .map_or(self.entity_path.clone(), From::from), + node_id: e.source.clone(), + }, + target: QualifiedNode { + entity_path: e + .target_entity + .clone() + .map_or(self.entity_path.clone(), From::from), + node_id: e.target.clone(), + }, + }), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, ) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 853b9114f2fd..ed212e63565b 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use re_viewer::external::{ egui::{self, Color32, Label}, re_log::external::log, @@ -12,14 +14,23 @@ use re_viewer::external::{ }, }; -use crate::edge_visualizer_system::GraphEdgeVisualizer; use crate::node_visualizer_system::GraphNodeVisualizer; +use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; + +// We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. +enum NodeKind { + Regular, + Dummy, +} /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] -pub struct GraphSpaceViewState; +pub struct GraphSpaceViewState { + graph: petgraph::stable_graph::StableGraph, + node_to_index: HashMap, +} impl SpaceViewState for GraphSpaceViewState { fn as_any(&self) -> &dyn std::any::Any { @@ -130,7 +141,32 @@ impl SpaceViewClass for GraphSpaceView { let node_system = system_output.view_systems.get::()?; let edge_system = system_output.view_systems.get::()?; - let _state = state.downcast_mut::()?; + let state = state.downcast_mut::()?; + + // TODO(grtlr): Once we settle on a design, we should update the graph instead of constructing it from scratch. + state.graph.clear(); + state.node_to_index.clear(); + + for data in node_system.data.iter() { + for (node_id, _) in data.nodes() { + let node_index = state.graph.add_node(NodeKind::Regular); + state.node_to_index.insert(node_id, node_index); + } + } + + for data in edge_system.data.iter() { + for (edge, _) in data.edges() { + let source_index = *state + .node_to_index + .entry(edge.source) + .or_insert(state.graph.add_node(NodeKind::Dummy)); + let target_index = *state + .node_to_index + .entry(edge.target) + .or_insert(state.graph.add_node(NodeKind::Dummy)); + state.graph.add_edge(source_index, target_index, ()); + } + } egui::Frame { inner_margin: re_ui::DesignTokens::view_padding().into(), @@ -142,11 +178,10 @@ impl SpaceViewClass for GraphSpaceView { ui.label(egui::RichText::new("Nodes").underline()); for data in node_system.data.iter() { - for (node_id, maybe_color) in data.nodes() { + for (node, maybe_color) in data.nodes() { let text = egui::RichText::new(format!( "{}: {}", - data.entity_path.to_owned(), - node_id.0 + node.entity_path, node.node_id, )); if let Some(color) = maybe_color { @@ -165,10 +200,10 @@ impl SpaceViewClass for GraphSpaceView { let text = egui::RichText::new(format!( "{}: {:?}:{} -> {:?}:{}", data.entity_path, - edge.0.source_entity.clone().map(EntityPath::from), - edge.0.source, - edge.0.target_entity.clone().map(EntityPath::from), - edge.0.target + edge.source.entity_path, + edge.source.node_id, + edge.target.entity_path, + edge.target.node_id, )); if let Some(color) = maybe_color { diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 7ce082a40d80..e5cb44f679e8 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,6 +2,7 @@ use re_viewer::external::{re_log, re_memory}; +mod common; mod edge_visualizer_system; mod graph_space_view; mod node_visualizer_system; diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 4d10880447bd..44fd1b2089bd 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -12,6 +12,8 @@ use re_viewer::external::{ }, }; +use crate::common::QualifiedNode; + /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct GraphNodeVisualizer { @@ -27,9 +29,12 @@ pub struct GraphNodeVisualizerData { impl GraphNodeVisualizerData { pub(crate) fn nodes( &self, - ) -> impl Iterator)> { + ) -> impl Iterator)> { clamped_zip_1x1( - self.node_ids.iter(), + self.node_ids.iter().map(|node_id| QualifiedNode { + entity_path: self.entity_path.clone(), + node_id: node_id.0.clone(), + }), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, ) @@ -63,7 +68,8 @@ impl VisualizerSystem for GraphNodeVisualizer { &timeline_query, ); - let all_indexed_nodes = results.iter_as(query.timeline, components::GraphNodeId::name()); + let all_indexed_nodes = + results.iter_as(query.timeline, components::GraphNodeId::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); let data = range_zip_1x1( From 0f78d8b10d818e4c0162a303939434d21f734c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 10:33:15 +0200 Subject: [PATCH 010/159] WIP: Implement basic highlights --- .../graph_view/src/edge_visualizer_system.rs | 8 ++-- .../rust/graph_view/src/graph_space_view.rs | 48 ++++++++++++++----- .../graph_view/src/node_visualizer_system.rs | 8 ++-- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index 2aff37d31e9c..99be48bbc9a3 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -1,6 +1,7 @@ +use re_log_types::Instance; use re_viewer::external::{ re_chunk::{ChunkComponentIterItem, LatestAtQuery}, - re_query::{clamped_zip_1x1, range_zip_1x1}, + re_query::{clamped_zip_2x1, range_zip_1x1}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, re_types::{self, archetypes, components, Loggable as _}, @@ -27,8 +28,8 @@ pub(crate) struct GraphEdgeVisualizerData { impl GraphEdgeVisualizerData { pub(crate) fn edges( &self, - ) -> impl Iterator)> { - clamped_zip_1x1( + ) -> impl Iterator)> { + clamped_zip_2x1( // TODO(grtlr): Avoid all this cloning! self.edges.iter().map(|e| QualifiedEdge { source: QualifiedNode { @@ -46,6 +47,7 @@ impl GraphEdgeVisualizerData { node_id: e.target.clone(), }, }), + (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, ) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index ed212e63565b..cc8e3f9d19fa 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -7,10 +7,7 @@ use re_viewer::external::{ re_types::SpaceViewClassIdentifier, re_ui, re_viewer_context::{ - IdentifiedViewSystem as _, SpaceViewClass, SpaceViewClassLayoutPriority, - SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, - SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, - SystemExecutionOutput, ViewQuery, ViewerContext, + HoverHighlight, IdentifiedViewSystem as _, SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext }, }; @@ -135,7 +132,7 @@ impl SpaceViewClass for GraphSpaceView { _ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, - _query: &ViewQuery<'_>, + query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let node_system = system_output.view_systems.get::()?; @@ -148,14 +145,14 @@ impl SpaceViewClass for GraphSpaceView { state.node_to_index.clear(); for data in node_system.data.iter() { - for (node_id, _) in data.nodes() { + for (node_id, _, _) in data.nodes() { let node_index = state.graph.add_node(NodeKind::Regular); state.node_to_index.insert(node_id, node_index); } } for data in edge_system.data.iter() { - for (edge, _) in data.edges() { + for (edge, _, _) in data.edges() { let source_index = *state .node_to_index .entry(edge.source) @@ -178,7 +175,20 @@ impl SpaceViewClass for GraphSpaceView { ui.label(egui::RichText::new("Nodes").underline()); for data in node_system.data.iter() { - for (node, maybe_color) in data.nodes() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for (node, instance, maybe_color) in data.nodes() { + let highlight = ent_highlight.index_highlight(instance); + + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => egui::Color32::BLACK, + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + let text = egui::RichText::new(format!( "{}: {}", node.entity_path, node.node_id, @@ -186,9 +196,9 @@ impl SpaceViewClass for GraphSpaceView { if let Some(color) = maybe_color { let c = Color32::from(color.0); - ui.add(Label::new(text.color(c))); + ui.add(Label::new(text.color(c).background_color(hcolor))); } else { - ui.add(Label::new(text)); + ui.add(Label::new(text.background_color(hcolor))); } } } @@ -196,7 +206,19 @@ impl SpaceViewClass for GraphSpaceView { ui.label(egui::RichText::new("Edges").underline()); for data in edge_system.data.iter() { - for (edge, maybe_color) in data.edges() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + for (edge, instance, maybe_color) in data.edges() { + let highlight = ent_highlight.index_highlight(instance); + + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => egui::Color32::BLACK, + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + let text = egui::RichText::new(format!( "{}: {:?}:{} -> {:?}:{}", data.entity_path, @@ -208,9 +230,9 @@ impl SpaceViewClass for GraphSpaceView { if let Some(color) = maybe_color { let c = Color32::from(color.0); - ui.add(Label::new(text.color(c))); + ui.add(Label::new(text.color(c).background_color(hcolor))); } else { - ui.add(Label::new(text)); + ui.add(Label::new(text.background_color(hcolor))); } } } diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 44fd1b2089bd..bbd90e73dbb0 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,7 +1,8 @@ +use re_log_types::Instance; use re_viewer::external::{ re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_log_types::EntityPath, - re_query::{clamped_zip_1x1, range_zip_1x1}, + re_query::{clamped_zip_2x1, range_zip_1x1}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, re_types::{self, archetypes, components, Loggable as _}, @@ -29,12 +30,13 @@ pub struct GraphNodeVisualizerData { impl GraphNodeVisualizerData { pub(crate) fn nodes( &self, - ) -> impl Iterator)> { - clamped_zip_1x1( + ) -> impl Iterator)> { + clamped_zip_2x1( self.node_ids.iter().map(|node_id| QualifiedNode { entity_path: self.entity_path.clone(), node_id: node_id.0.clone(), }), + (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, ) From 8823513421d34a9eae2d651db1fbf9c2af73b451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 13:34:49 +0200 Subject: [PATCH 011/159] WIP: basic node drawing --- .../rust/graph_view/src/graph_space_view.rs | 239 ++++++++++++------ .../graph_view/src/node_visualizer_system.rs | 2 - 2 files changed, 164 insertions(+), 77 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index cc8e3f9d19fa..621c2362d1ec 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,13 +1,18 @@ use std::collections::HashMap; +use re_log_types::Instance; use re_viewer::external::{ - egui::{self, Color32, Label}, + egui::{self, emath::TSTransform, Color32, Label, RichText, TextWrapMode}, re_log::external::log, re_log_types::EntityPath, - re_types::SpaceViewClassIdentifier, + re_types::{components, SpaceViewClassIdentifier}, re_ui, re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext + HoverHighlight, IdentifiedViewSystem as _, OptionalSpaceViewEntityHighlight, + SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, + SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, + SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, + SystemExecutionOutput, ViewQuery, ViewerContext, }, }; @@ -20,6 +25,34 @@ enum NodeKind { Dummy, } +fn draw_node( + ui: &mut egui::Ui, + ent_highlight: OptionalSpaceViewEntityHighlight, + node: QualifiedNode, + instance: Instance, + maybe_color: Option<&components::Color>, +) -> egui::Response { + let highlight = ent_highlight.index_highlight(instance); + + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => egui::Color32::BLACK, + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + + let text = egui::RichText::new(format!("{}: {}", node.entity_path, node.node_id,)); + + if let Some(color) = maybe_color { + let c = Color32::from(color.0); + ui.button(text.color(c).background_color(hcolor)) + } else { + ui.button(text.background_color(hcolor)) + } +} + /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. @@ -27,6 +60,8 @@ enum NodeKind { pub struct GraphSpaceViewState { graph: petgraph::stable_graph::StableGraph, node_to_index: HashMap, + // graph viewer + transform: TSTransform, } impl SpaceViewState for GraphSpaceViewState { @@ -165,80 +200,134 @@ impl SpaceViewClass for GraphSpaceView { } } - egui::Frame { - inner_margin: re_ui::DesignTokens::view_padding().into(), - ..egui::Frame::default() + // egui::Frame { + // inner_margin: re_ui::DesignTokens::view_padding().into(), + // ..egui::Frame::default() + // } + // .show(ui, |ui| { + // ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { + // egui::ScrollArea::both().show(ui, |ui| { + // ui.label(egui::RichText::new("Nodes").underline()); + + // for data in node_system.data.iter() { + // let ent_highlight = + // query.highlights.entity_highlight(data.entity_path.hash()); + + // for (node, instance, maybe_color) in data.nodes() { + // // draw node + // } + // } + + // ui.label(egui::RichText::new("Edges").underline()); + + // for data in edge_system.data.iter() { + // let ent_highlight = + // query.highlights.entity_highlight(data.entity_path.hash()); + // for (edge, instance, maybe_color) in data.edges() { + // let highlight = ent_highlight.index_highlight(instance); + + // let hcolor = match ( + // highlight.hover, + // highlight.selection != SelectionHighlight::None, + // ) { + // (HoverHighlight::None, false) => egui::Color32::BLACK, + // (HoverHighlight::None, true) => { + // ui.style().visuals.selection.bg_fill + // } + // (HoverHighlight::Hovered, ..) => { + // ui.style().visuals.widgets.hovered.bg_fill + // } + // }; + + // let text = egui::RichText::new(format!( + // "{}: {:?}:{} -> {:?}:{}", + // data.entity_path, + // edge.source.entity_path, + // edge.source.node_id, + // edge.target.entity_path, + // edge.target.node_id, + // )); + + // if let Some(color) = maybe_color { + // let c = Color32::from(color.0); + // ui.add(Label::new(text.color(c).background_color(hcolor))); + // } else { + // ui.add(Label::new(text.background_color(hcolor))); + // } + // } + // } + // }) + // }); + // }); + + let data = node_system.data.iter().flat_map(|data| { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + data.nodes().map(move |(node, instance, maybe_color)| { + move |ui: &mut egui::Ui| draw_node(ui, ent_highlight, node, instance, maybe_color) + }) + }); + + // Graph viewer + let (id, rect) = ui.allocate_space(ui.available_size()); + let response = ui.interact(rect, id, egui::Sense::click_and_drag()); + + // Allow dragging the background as well. + if response.dragged() { + state.transform.translation += response.drag_delta(); } - .show(ui, |ui| { - ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { - egui::ScrollArea::both().show(ui, |ui| { - ui.label(egui::RichText::new("Nodes").underline()); - - for data in node_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - for (node, instance, maybe_color) in data.nodes() { - let highlight = ent_highlight.index_highlight(instance); - - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => egui::Color32::BLACK, - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, - }; - - let text = egui::RichText::new(format!( - "{}: {}", - node.entity_path, node.node_id, - )); - - if let Some(color) = maybe_color { - let c = Color32::from(color.0); - ui.add(Label::new(text.color(c).background_color(hcolor))); - } else { - ui.add(Label::new(text.background_color(hcolor))); - } - } - } - - ui.label(egui::RichText::new("Edges").underline()); - - for data in edge_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - for (edge, instance, maybe_color) in data.edges() { - let highlight = ent_highlight.index_highlight(instance); - - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => egui::Color32::BLACK, - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, - }; - - let text = egui::RichText::new(format!( - "{}: {:?}:{} -> {:?}:{}", - data.entity_path, - edge.source.entity_path, - edge.source.node_id, - edge.target.entity_path, - edge.target.node_id, - )); - - if let Some(color) = maybe_color { - let c = Color32::from(color.0); - ui.add(Label::new(text.color(c).background_color(hcolor))); - } else { - ui.add(Label::new(text.background_color(hcolor))); - } - } - } + + // Plot-like reset + if response.double_clicked() { + state.transform = TSTransform::default(); + } + + let transform = + TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) * state.transform; + + if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { + // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. + if response.hovered() { + let pointer_in_layer = transform.inverse() * pointer; + let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); + let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); + + // Zoom in on pointer: + state.transform = state.transform + * TSTransform::from_translation(pointer_in_layer.to_vec2()) + * TSTransform::from_scaling(zoom_delta) + * TSTransform::from_translation(-pointer_in_layer.to_vec2()); + + // Pan: + state.transform = TSTransform::from_translation(pan_delta) * state.transform; + } + } + + let positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 20.0)); + + for (i, (pos, callback)) in positions.into_iter().zip(data).enumerate() { + let window_layer = ui.layer_id(); + let id = egui::Area::new(id.with(("subarea", i))) + .default_pos(pos) + .order(egui::Order::Middle) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(transform.inverse() * rect); + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .inner_margin(egui::Margin::same(8.0)) + .stroke(ui.ctx().style().visuals.window_stroke) + .fill(ui.style().visuals.panel_fill) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + callback(ui) + }); }) - }); - }); + .response + .layer_id; + ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_sublayer(window_layer, id); + } Ok(()) } diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index bbd90e73dbb0..6aa56dc67360 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -88,8 +88,6 @@ impl VisualizerSystem for GraphNodeVisualizer { } } - // We're not using `re_renderer` here, so return an empty vector. - // If you want to draw additional primitives here, you can emit re_renderer draw data here directly. Ok(Vec::new()) } From c0900c9a3f7051e4840058498a28eb694d4ed094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 27 Sep 2024 14:29:50 +0200 Subject: [PATCH 012/159] WIP: fix lints --- crates/store/re_types/src/components/graph_edge_ext.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs index 7450cbf11e2f..d8cdd71db750 100644 --- a/crates/store/re_types/src/components/graph_edge_ext.rs +++ b/crates/store/re_types/src/components/graph_edge_ext.rs @@ -13,12 +13,14 @@ impl super::GraphEdge { } /// Specifies the entity in which the edge originates. + #[inline] pub fn with_source_in(mut self, path: impl Into) -> Self { self.0.source_entity = Some(path.into()); self } /// Specifies the entity in which the edge terminates. + #[inline] pub fn with_target_in(mut self, path: impl Into) -> Self { self.0.target_entity = Some(path.into()); self From 34032ebcd61cdc31f4fc1565b2195d0630738d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 08:08:55 +0200 Subject: [PATCH 013/159] WIP: try to get edges working --- examples/rust/graph_view/src/common.rs | 2 +- .../graph_view/src/edge_visualizer_system.rs | 2 +- .../rust/graph_view/src/graph_space_view.rs | 63 ++++++++++++++----- .../graph_view/src/node_visualizer_system.rs | 2 +- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index c3585eea9fe0..81a604876884 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -1,6 +1,6 @@ use re_viewer::external::re_types::datatypes; -#[derive(PartialEq, Eq, Hash)] +#[derive(Clone, PartialEq, Eq, Hash)] pub(crate) struct QualifiedNode { pub entity_path: re_log_types::EntityPath, pub node_id: datatypes::GraphNodeId, diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index 99be48bbc9a3..c14e9c8c9c08 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -107,7 +107,7 @@ impl VisualizerSystem for GraphEdgeVisualizer { self } - fn as_fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { + fn fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { self } } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 621c2362d1ec..747f9b379364 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::{collections::HashMap, hash::Hash}; use re_log_types::Instance; use re_viewer::external::{ @@ -21,8 +21,8 @@ use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; // We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. enum NodeKind { - Regular, - Dummy, + Regular(QualifiedNode), + Dummy(QualifiedNode), } fn draw_node( @@ -62,6 +62,8 @@ pub struct GraphSpaceViewState { node_to_index: HashMap, // graph viewer transform: TSTransform, + dragging: Option, + node_positions: HashMap, } impl SpaceViewState for GraphSpaceViewState { @@ -181,7 +183,7 @@ impl SpaceViewClass for GraphSpaceView { for data in node_system.data.iter() { for (node_id, _, _) in data.nodes() { - let node_index = state.graph.add_node(NodeKind::Regular); + let node_index = state.graph.add_node(NodeKind::Regular(node_id.clone())); state.node_to_index.insert(node_id, node_index); } } @@ -190,12 +192,12 @@ impl SpaceViewClass for GraphSpaceView { for (edge, _, _) in data.edges() { let source_index = *state .node_to_index - .entry(edge.source) - .or_insert(state.graph.add_node(NodeKind::Dummy)); + .entry(edge.source.clone()) + .or_insert(state.graph.add_node(NodeKind::Dummy(edge.source))); let target_index = *state .node_to_index - .entry(edge.target) - .or_insert(state.graph.add_node(NodeKind::Dummy)); + .entry(edge.target.clone()) + .or_insert(state.graph.add_node(NodeKind::Dummy(edge.target))); state.graph.add_edge(source_index, target_index, ()); } } @@ -260,11 +262,13 @@ impl SpaceViewClass for GraphSpaceView { // }); // }); - let data = node_system.data.iter().flat_map(|data| { + let node_data = node_system.data.iter().flat_map(|data| { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); data.nodes().map(move |(node, instance, maybe_color)| { - move |ui: &mut egui::Ui| draw_node(ui, ent_highlight, node, instance, maybe_color) + (node.clone(), move |ui: &mut egui::Ui| { + draw_node(ui, ent_highlight, node, instance, maybe_color) + }) }) }); @@ -305,9 +309,9 @@ impl SpaceViewClass for GraphSpaceView { let positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 20.0)); - for (i, (pos, callback)) in positions.into_iter().zip(data).enumerate() { + for (i, (pos, (node, callback))) in positions.into_iter().zip(node_data).enumerate() { let window_layer = ui.layer_id(); - let id = egui::Area::new(id.with(("subarea", i))) + let response = egui::Area::new(id.with(("node", i))) .default_pos(pos) .order(egui::Order::Middle) .constrain(false) @@ -323,12 +327,43 @@ impl SpaceViewClass for GraphSpaceView { callback(ui) }); }) - .response - .layer_id; + .response; + + let id = response.layer_id; + state.node_positions.insert(node, pos); ui.ctx().set_transform_layer(id, transform); ui.ctx().set_sublayer(window_layer, id); } + for data in edge_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for (i, (edge, instance, color)) in data.edges().enumerate() { + // TODO(grtlr): This does not handle dummy nodes correctly. + if let (Some(source_pos), Some(target_pos)) = ( + state.node_positions.get(&edge.source), + state.node_positions.get(&edge.target), + ) { + let window_layer = ui.layer_id(); + let response = egui::Area::new(id.with(("edge", i))) + .default_pos(egui::Pos2::new(100., 100.)) + .order(egui::Order::Middle) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(transform.inverse() * rect); + let painter = ui.painter(); + painter.line_segment( + [*source_pos, *target_pos], + egui::Stroke::new(2.0, egui::Color32::WHITE), + ) + }) + .response; + + log::debug!("Line: {} {}", source_pos, target_pos); + } + } + } + Ok(()) } } diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 6aa56dc67360..07295bffc09a 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -95,7 +95,7 @@ impl VisualizerSystem for GraphNodeVisualizer { self } - fn as_fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { + fn fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { self } } From aaa8733e7b9f0b2910e6c8b0e173a46ebd225f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 08:57:21 +0200 Subject: [PATCH 014/159] WIP: implement node labels --- .../rust/graph_view/src/graph_space_view.rs | 21 ++++++---- .../graph_view/src/node_visualizer_system.rs | 40 ++++++++++++++++--- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 747f9b379364..622fba15d758 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -5,7 +5,7 @@ use re_viewer::external::{ egui::{self, emath::TSTransform, Color32, Label, RichText, TextWrapMode}, re_log::external::log, re_log_types::EntityPath, - re_types::{components, SpaceViewClassIdentifier}, + re_types::{components, ArrowString, SpaceViewClassIdentifier}, re_ui, re_viewer_context::{ HoverHighlight, IdentifiedViewSystem as _, OptionalSpaceViewEntityHighlight, @@ -25,12 +25,14 @@ enum NodeKind { Dummy(QualifiedNode), } +// TODO(grtlr): use node instance here. fn draw_node( ui: &mut egui::Ui, ent_highlight: OptionalSpaceViewEntityHighlight, node: QualifiedNode, instance: Instance, maybe_color: Option<&components::Color>, + maybe_label: Option<&ArrowString>, ) -> egui::Response { let highlight = ent_highlight.index_highlight(instance); @@ -43,7 +45,11 @@ fn draw_node( (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, }; - let text = egui::RichText::new(format!("{}: {}", node.entity_path, node.node_id,)); + let text = if let Some(label) = maybe_label { + egui::RichText::new(format!("{}", label)) + } else { + egui::RichText::new(format!("{}:{}", node.entity_path, node.node_id,)) + }; if let Some(color) = maybe_color { let c = Color32::from(color.0); @@ -182,7 +188,7 @@ impl SpaceViewClass for GraphSpaceView { state.node_to_index.clear(); for data in node_system.data.iter() { - for (node_id, _, _) in data.nodes() { + for (node_id, _, _, _) in data.nodes() { let node_index = state.graph.add_node(NodeKind::Regular(node_id.clone())); state.node_to_index.insert(node_id, node_index); } @@ -265,11 +271,12 @@ impl SpaceViewClass for GraphSpaceView { let node_data = node_system.data.iter().flat_map(|data| { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - data.nodes().map(move |(node, instance, maybe_color)| { - (node.clone(), move |ui: &mut egui::Ui| { - draw_node(ui, ent_highlight, node, instance, maybe_color) + data.nodes() + .map(move |(node, instance, maybe_color, maybe_label)| { + (node.clone(), move |ui: &mut egui::Ui| { + draw_node(ui, ent_highlight, node, instance, maybe_color, maybe_label) + }) }) - }) }); // Graph viewer diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 07295bffc09a..099bbdeb0892 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -2,10 +2,10 @@ use re_log_types::Instance; use re_viewer::external::{ re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_log_types::EntityPath, - re_query::{clamped_zip_2x1, range_zip_1x1}, + re_query::{clamped_zip_2x2, range_zip_1x3}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{self, archetypes, components, Loggable as _}, + re_types::{self, archetypes, components, ArrowString, Loggable as _}, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -24,14 +24,28 @@ pub struct GraphNodeVisualizer { pub struct GraphNodeVisualizerData { pub(crate) entity_path: EntityPath, pub(crate) node_ids: ChunkComponentIterItem, + + // Clamped pub(crate) colors: ChunkComponentIterItem, + pub(crate) labels: Vec, + + // Non-repeated + pub(crate) show_labels: Option, } impl GraphNodeVisualizerData { pub(crate) fn nodes( &self, - ) -> impl Iterator)> { - clamped_zip_2x1( + ) -> impl Iterator< + Item = ( + QualifiedNode, + Instance, + Option<&components::Color>, + Option<&ArrowString>, + ), + > { + // TODO(grtlr): create proper node instance! + clamped_zip_2x2( self.node_ids.iter().map(|node_id| QualifiedNode { entity_path: self.entity_path.clone(), node_id: node_id.0.clone(), @@ -39,6 +53,14 @@ impl GraphNodeVisualizerData { (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, + self.labels.iter().map(|l| { + if self.show_labels.is_some() { + Some(l) + } else { + None + } + }), + Option::<&ArrowString>::default, ) } } @@ -73,17 +95,23 @@ impl VisualizerSystem for GraphNodeVisualizer { let all_indexed_nodes = results.iter_as(query.timeline, components::GraphNodeId::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); + let all_labels = results.iter_as(query.timeline, components::Text::name()); + let all_show_labels = results.iter_as(query.timeline, components::ShowLabels::name()); - let data = range_zip_1x1( + let data = range_zip_1x3( all_indexed_nodes.component::(), all_colors.component::(), + all_labels.string(), + all_show_labels.component::(), ); - for (_index, node_ids, colors) in data { + for (_index, node_ids, colors, labels, show_labels) in data { self.data.push(GraphNodeVisualizerData { entity_path: data_result.entity_path.clone(), node_ids, colors: colors.unwrap_or_default(), + labels: labels.unwrap_or_default(), + show_labels: show_labels.unwrap_or_default().first().copied(), }); } } From 30ec59d22580496ba73eb977030c6d8b9fef4186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 12:23:31 +0200 Subject: [PATCH 015/159] WIP: basic edge drawing working --- examples/rust/graph_view/src/common.rs | 9 +++ .../rust/graph_view/src/graph_space_view.rs | 73 +++++++++++-------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index 81a604876884..d2abeeea9358 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -1,3 +1,5 @@ +use std::hash::Hash; + use re_viewer::external::re_types::datatypes; #[derive(Clone, PartialEq, Eq, Hash)] @@ -6,6 +8,13 @@ pub(crate) struct QualifiedNode { pub node_id: datatypes::GraphNodeId, } +impl std::fmt::Debug for QualifiedNode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{}", self.node_id, self.entity_path) + } +} + +#[derive(Debug, Hash)] pub(crate) struct QualifiedEdge { pub source: QualifiedNode, pub target: QualifiedNode, diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 622fba15d758..386fa9872b3d 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, hash::Hash}; use re_log_types::Instance; use re_viewer::external::{ - egui::{self, emath::TSTransform, Color32, Label, RichText, TextWrapMode}, + egui::{self, emath::TSTransform, emath::Vec2, Color32, Label, RichText, TextWrapMode}, re_log::external::log, re_log_types::EntityPath, re_types::{components, ArrowString, SpaceViewClassIdentifier}, @@ -67,8 +67,9 @@ pub struct GraphSpaceViewState { graph: petgraph::stable_graph::StableGraph, node_to_index: HashMap, // graph viewer - transform: TSTransform, + screen_to_world: TSTransform, dragging: Option, + /// Positions of the nodes in world space. node_positions: HashMap, } @@ -114,7 +115,6 @@ impl SpaceViewClass for GraphSpaceView { } fn new_state(&self) -> Box { - log::debug!("Creating new GraphSpaceViewState"); Box::::default() } @@ -285,41 +285,42 @@ impl SpaceViewClass for GraphSpaceView { // Allow dragging the background as well. if response.dragged() { - state.transform.translation += response.drag_delta(); + state.screen_to_world.translation += response.drag_delta(); } // Plot-like reset if response.double_clicked() { - state.transform = TSTransform::default(); + state.screen_to_world = TSTransform::default(); } let transform = - TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) * state.transform; + TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) * state.screen_to_world; if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. if response.hovered() { - let pointer_in_layer = transform.inverse() * pointer; + let pointer_in_world = transform.inverse() * pointer; let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); // Zoom in on pointer: - state.transform = state.transform - * TSTransform::from_translation(pointer_in_layer.to_vec2()) + state.screen_to_world = state.screen_to_world + * TSTransform::from_translation(pointer_in_world.to_vec2()) * TSTransform::from_scaling(zoom_delta) - * TSTransform::from_translation(-pointer_in_layer.to_vec2()); + * TSTransform::from_translation(-pointer_in_world.to_vec2()); // Pan: - state.transform = TSTransform::from_translation(pan_delta) * state.transform; + state.screen_to_world = TSTransform::from_translation(pan_delta) * state.screen_to_world; } } - let positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 20.0)); + // initial layout + let positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 30.0)); + let window_layer = ui.layer_id(); - for (i, (pos, (node, callback))) in positions.into_iter().zip(node_data).enumerate() { - let window_layer = ui.layer_id(); + for (i, (init_pos, (node, callback))) in positions.into_iter().zip(node_data).enumerate() { let response = egui::Area::new(id.with(("node", i))) - .default_pos(pos) + .current_pos(*state.node_positions.entry(node.clone()).or_insert(init_pos)) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { @@ -336,8 +337,15 @@ impl SpaceViewClass for GraphSpaceView { }) .response; + if response.dragged() { + if let Some(pos) = state.node_positions.get_mut(&node) { + let world_translation = state.screen_to_world * TSTransform::from_translation(response.drag_delta()); + *pos = world_translation * *pos; + } + } + let id = response.layer_id; - state.node_positions.insert(node, pos); + ui.ctx().set_transform_layer(id, transform); ui.ctx().set_sublayer(window_layer, id); } @@ -351,23 +359,30 @@ impl SpaceViewClass for GraphSpaceView { state.node_positions.get(&edge.source), state.node_positions.get(&edge.target), ) { - let window_layer = ui.layer_id(); - let response = egui::Area::new(id.with(("edge", i))) - .default_pos(egui::Pos2::new(100., 100.)) + let response = egui::Area::new(id.with((edge, i))) + .current_pos(*source_pos) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { - ui.set_clip_rect(transform.inverse() * rect); - let painter = ui.painter(); - painter.line_segment( - [*source_pos, *target_pos], - egui::Stroke::new(2.0, egui::Color32::WHITE), - ) - }) - .response; - - log::debug!("Line: {} {}", source_pos, target_pos); + // TODO(grtlr): reintroduce clipping: `ui.set_clip_rect(transform.inverse() * rect);` + egui::Frame::default().show(ui, |ui| { + let painter = ui.painter(); + painter.line_segment( + [*source_pos, *target_pos], + egui::Stroke::new(2.0, egui::Color32::WHITE), + ); + }); + + // log::debug!("Line: {} {}", source_pos, target_pos); + }).response; + + let id = response.layer_id; + + ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_sublayer(window_layer, id); } + + } } From 36d4c8f4280da712d3225afe570c5bfccb0af3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 12:37:04 +0200 Subject: [PATCH 016/159] WIP: highlight edges --- .../rust/graph_view/src/graph_space_view.rs | 34 +++++++++++++------ examples/rust/node_link_graph/src/main.rs | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 386fa9872b3d..41a4e207f7df 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -293,8 +293,8 @@ impl SpaceViewClass for GraphSpaceView { state.screen_to_world = TSTransform::default(); } - let transform = - TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) * state.screen_to_world; + let transform = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) + * state.screen_to_world; if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. @@ -310,7 +310,8 @@ impl SpaceViewClass for GraphSpaceView { * TSTransform::from_translation(-pointer_in_world.to_vec2()); // Pan: - state.screen_to_world = TSTransform::from_translation(pan_delta) * state.screen_to_world; + state.screen_to_world = + TSTransform::from_translation(pan_delta) * state.screen_to_world; } } @@ -339,7 +340,8 @@ impl SpaceViewClass for GraphSpaceView { if response.dragged() { if let Some(pos) = state.node_positions.get_mut(&node) { - let world_translation = state.screen_to_world * TSTransform::from_translation(response.drag_delta()); + let world_translation = state.screen_to_world + * TSTransform::from_translation(response.drag_delta()); *pos = world_translation * *pos; } } @@ -359,6 +361,17 @@ impl SpaceViewClass for GraphSpaceView { state.node_positions.get(&edge.source), state.node_positions.get(&edge.target), ) { + let highlight = ent_highlight.index_highlight(instance); + + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => ui.style().visuals.text_color(), + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + let response = egui::Area::new(id.with((edge, i))) .current_pos(*source_pos) .order(egui::Order::Middle) @@ -369,20 +382,19 @@ impl SpaceViewClass for GraphSpaceView { let painter = ui.painter(); painter.line_segment( [*source_pos, *target_pos], - egui::Stroke::new(2.0, egui::Color32::WHITE), + egui::Stroke::new(2.0, hcolor), ); }); // log::debug!("Line: {} {}", source_pos, target_pos); - }).response; + }) + .response; - let id = response.layer_id; + let id = response.layer_id; - ui.ctx().set_transform_layer(id, transform); - ui.ctx().set_sublayer(window_layer, id); + ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_sublayer(window_layer, id); } - - } } diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 3dcbe03604dd..766a0717fc0a 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -63,7 +63,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { GraphEdge::new("area1", "area0") .with_source_in("kitchen/areas") .with_target_in("hallway/areas"), - GraphEdge::new("area1", "area2") + GraphEdge::new("area0", "area2") .with_source_in("hallway/areas") .with_target_in("living/areas"), ]), From 5c0284fe1499807502d44e11c486fe657859d4df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 14:09:23 +0200 Subject: [PATCH 017/159] WIP: improve style --- examples/rust/graph_view/src/graph_space_view.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 41a4e207f7df..d304c99ad5a3 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -329,8 +329,8 @@ impl SpaceViewClass for GraphSpaceView { egui::Frame::default() .rounding(egui::Rounding::same(4.0)) .inner_margin(egui::Margin::same(8.0)) - .stroke(ui.ctx().style().visuals.window_stroke) - .fill(ui.style().visuals.panel_fill) + .stroke(egui::Stroke::new(1.0, ui.ctx().style().visuals.text_color())) + .fill(ui.style().visuals.faint_bg_color) .show(ui, |ui| { ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); callback(ui) From aeb518efe107dcbbfa2bbebf94eb222f99223cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 16:26:35 +0200 Subject: [PATCH 018/159] WIP: drag and drop working --- .../rust/graph_view/src/graph_space_view.rs | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index d304c99ad5a3..8ef258ffe38a 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,10 +2,17 @@ use std::{collections::HashMap, hash::Hash}; use re_log_types::Instance; use re_viewer::external::{ - egui::{self, emath::TSTransform, emath::Vec2, Color32, Label, RichText, TextWrapMode}, + egui::{ + self, + emath::{TSTransform, Vec2}, + Color32, Label, Rect, RichText, TextWrapMode, + }, re_log::external::log, re_log_types::EntityPath, - re_types::{components, ArrowString, SpaceViewClassIdentifier}, + re_types::{ + components::{self, PoseRotationAxisAngle}, + ArrowString, SpaceViewClassIdentifier, + }, re_ui, re_viewer_context::{ HoverHighlight, IdentifiedViewSystem as _, OptionalSpaceViewEntityHighlight, @@ -70,7 +77,8 @@ pub struct GraphSpaceViewState { screen_to_world: TSTransform, dragging: Option, /// Positions of the nodes in world space. - node_positions: HashMap, + // We currently store position and size, but should maybe store the actual rectangle in the future. + node_positions: HashMap, } impl SpaceViewState for GraphSpaceViewState { @@ -321,7 +329,7 @@ impl SpaceViewClass for GraphSpaceView { for (i, (init_pos, (node, callback))) in positions.into_iter().zip(node_data).enumerate() { let response = egui::Area::new(id.with(("node", i))) - .current_pos(*state.node_positions.entry(node.clone()).or_insert(init_pos)) + .current_pos(state.node_positions.get(&node).map_or(init_pos, |r| r.min)) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { @@ -329,7 +337,10 @@ impl SpaceViewClass for GraphSpaceView { egui::Frame::default() .rounding(egui::Rounding::same(4.0)) .inner_margin(egui::Margin::same(8.0)) - .stroke(egui::Stroke::new(1.0, ui.ctx().style().visuals.text_color())) + .stroke(egui::Stroke::new( + 1.0, + ui.ctx().style().visuals.text_color(), + )) .fill(ui.style().visuals.faint_bg_color) .show(ui, |ui| { ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); @@ -338,16 +349,8 @@ impl SpaceViewClass for GraphSpaceView { }) .response; - if response.dragged() { - if let Some(pos) = state.node_positions.get_mut(&node) { - let world_translation = state.screen_to_world - * TSTransform::from_translation(response.drag_delta()); - *pos = world_translation * *pos; - } - } - + state.node_positions.insert(node.clone(), response.rect); let id = response.layer_id; - ui.ctx().set_transform_layer(id, transform); ui.ctx().set_sublayer(window_layer, id); } @@ -373,7 +376,7 @@ impl SpaceViewClass for GraphSpaceView { }; let response = egui::Area::new(id.with((edge, i))) - .current_pos(*source_pos) + .current_pos(source_pos.center()) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { @@ -381,7 +384,7 @@ impl SpaceViewClass for GraphSpaceView { egui::Frame::default().show(ui, |ui| { let painter = ui.painter(); painter.line_segment( - [*source_pos, *target_pos], + [source_pos.center(), target_pos.center()], egui::Stroke::new(2.0, hcolor), ); }); From 58328fb9c095ac3bb60f2c14a2044e936cc8271a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 17:01:50 +0200 Subject: [PATCH 019/159] WIP: clean up drawing code --- .../rust/graph_view/src/graph_space_view.rs | 219 ++++++------------ 1 file changed, 76 insertions(+), 143 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 8ef258ffe38a..10f8ad1e6e45 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -7,6 +7,7 @@ use re_viewer::external::{ emath::{TSTransform, Vec2}, Color32, Label, Rect, RichText, TextWrapMode, }, + re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, re_types::{ @@ -32,40 +33,6 @@ enum NodeKind { Dummy(QualifiedNode), } -// TODO(grtlr): use node instance here. -fn draw_node( - ui: &mut egui::Ui, - ent_highlight: OptionalSpaceViewEntityHighlight, - node: QualifiedNode, - instance: Instance, - maybe_color: Option<&components::Color>, - maybe_label: Option<&ArrowString>, -) -> egui::Response { - let highlight = ent_highlight.index_highlight(instance); - - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => egui::Color32::BLACK, - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, - }; - - let text = if let Some(label) = maybe_label { - egui::RichText::new(format!("{}", label)) - } else { - egui::RichText::new(format!("{}:{}", node.entity_path, node.node_id,)) - }; - - if let Some(color) = maybe_color { - let c = Color32::from(color.0); - ui.button(text.color(c).background_color(hcolor)) - } else { - ui.button(text.background_color(hcolor)) - } -} - /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. @@ -154,23 +121,16 @@ impl SpaceViewClass for GraphSpaceView { fn selection_ui( &self, _ctx: &ViewerContext<'_>, - _ui: &mut egui::Ui, + ui: &mut egui::Ui, state: &mut dyn SpaceViewState, _space_origin: &EntityPath, _space_view_id: SpaceViewId, ) -> Result<(), SpaceViewSystemExecutionError> { let _state = state.downcast_mut::()?; - // ui.horizontal(|ui| { - // ui.label("Coordinates mode"); - // egui::ComboBox::from_id_salt("color_coordinates_mode") - // .selected_text(state.mode.to_string()) - // .show_ui(ui, |ui| { - // for mode in &ColorCoordinatesMode::ALL { - // ui.selectable_value(&mut state.mode, *mode, mode.to_string()); - // } - // }); - // }); + ui.horizontal(|ui| { + ui.label("HEEEEELLLLLLOOOOO"); + }); Ok(()) } @@ -216,77 +176,6 @@ impl SpaceViewClass for GraphSpaceView { } } - // egui::Frame { - // inner_margin: re_ui::DesignTokens::view_padding().into(), - // ..egui::Frame::default() - // } - // .show(ui, |ui| { - // ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { - // egui::ScrollArea::both().show(ui, |ui| { - // ui.label(egui::RichText::new("Nodes").underline()); - - // for data in node_system.data.iter() { - // let ent_highlight = - // query.highlights.entity_highlight(data.entity_path.hash()); - - // for (node, instance, maybe_color) in data.nodes() { - // // draw node - // } - // } - - // ui.label(egui::RichText::new("Edges").underline()); - - // for data in edge_system.data.iter() { - // let ent_highlight = - // query.highlights.entity_highlight(data.entity_path.hash()); - // for (edge, instance, maybe_color) in data.edges() { - // let highlight = ent_highlight.index_highlight(instance); - - // let hcolor = match ( - // highlight.hover, - // highlight.selection != SelectionHighlight::None, - // ) { - // (HoverHighlight::None, false) => egui::Color32::BLACK, - // (HoverHighlight::None, true) => { - // ui.style().visuals.selection.bg_fill - // } - // (HoverHighlight::Hovered, ..) => { - // ui.style().visuals.widgets.hovered.bg_fill - // } - // }; - - // let text = egui::RichText::new(format!( - // "{}: {:?}:{} -> {:?}:{}", - // data.entity_path, - // edge.source.entity_path, - // edge.source.node_id, - // edge.target.entity_path, - // edge.target.node_id, - // )); - - // if let Some(color) = maybe_color { - // let c = Color32::from(color.0); - // ui.add(Label::new(text.color(c).background_color(hcolor))); - // } else { - // ui.add(Label::new(text.background_color(hcolor))); - // } - // } - // } - // }) - // }); - // }); - - let node_data = node_system.data.iter().flat_map(|data| { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - data.nodes() - .map(move |(node, instance, maybe_color, maybe_label)| { - (node.clone(), move |ui: &mut egui::Ui| { - draw_node(ui, ent_highlight, node, instance, maybe_color, maybe_label) - }) - }) - }); - // Graph viewer let (id, rect) = ui.allocate_space(ui.available_size()); let response = ui.interact(rect, id, egui::Sense::click_and_drag()); @@ -324,35 +213,79 @@ impl SpaceViewClass for GraphSpaceView { } // initial layout - let positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 30.0)); + let mut positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 30.0)); let window_layer = ui.layer_id(); - for (i, (init_pos, (node, callback))) in positions.into_iter().zip(node_data).enumerate() { - let response = egui::Area::new(id.with(("node", i))) - .current_pos(state.node_positions.get(&node).map_or(init_pos, |r| r.min)) - .order(egui::Order::Middle) - .constrain(false) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(transform.inverse() * rect); - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .inner_margin(egui::Margin::same(8.0)) - .stroke(egui::Stroke::new( - 1.0, - ui.ctx().style().visuals.text_color(), - )) - .fill(ui.style().visuals.faint_bg_color) - .show(ui, |ui| { - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - callback(ui) - }); - }) - .response; - - state.node_positions.insert(node.clone(), response.rect); - let id = response.layer_id; - ui.ctx().set_transform_layer(id, transform); - ui.ctx().set_sublayer(window_layer, id); + for data in node_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for (i, (node, instance, maybe_color, maybe_label)) in data.nodes().enumerate() { + let area_id = id.with((node.clone(), i)); + let response = egui::Area::new(area_id) + .current_pos( + state + .node_positions + .get(&node) + .map_or(positions.next().unwrap(), |r| r.min), + ) + .order(egui::Order::Middle) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(transform.inverse() * rect); + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .inner_margin(egui::Margin::same(8.0)) + .stroke(egui::Stroke::new( + 1.0, + ui.ctx().style().visuals.text_color(), + )) + .fill(ui.style().visuals.faint_bg_color) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + + let highlight = ent_highlight.index_highlight(instance); + + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => egui::Color32::BLACK, + (HoverHighlight::None, true) => { + ui.style().visuals.selection.bg_fill + } + (HoverHighlight::Hovered, ..) => { + ui.style().visuals.widgets.hovered.bg_fill + } + }; + + let text = if let Some(label) = maybe_label { + egui::RichText::new(format!("{}", label)) + } else { + egui::RichText::new(format!( + "{}:{}", + node.entity_path, node.node_id, + )) + }; + + if let Some(color) = maybe_color { + let c = Color32::from(color.0); + ui.button(text.color(c).background_color(hcolor)) + } else { + ui.button(text.background_color(hcolor)) + } + }); + }) + .response; + + state.node_positions.insert(node.clone(), response.rect); + + let id = response.layer_id; + + ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_sublayer(window_layer, id); + + // ui.interact(response.rect, area_id, egui::Sense::click()); + } } for data in edge_system.data.iter() { From e41c0fe42d14cdc02cef39135b56b274c5660d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 30 Sep 2024 17:22:32 +0200 Subject: [PATCH 020/159] WIP: add basic entity boxes --- .../rust/graph_view/src/graph_space_view.rs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 10f8ad1e6e45..1a23ea41b82a 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -218,6 +218,7 @@ impl SpaceViewClass for GraphSpaceView { for data in node_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + let mut entity_rect: Option = None; for (i, (node, instance, maybe_color, maybe_label)) in data.nodes().enumerate() { let area_id = id.with((node.clone(), i)); @@ -277,6 +278,8 @@ impl SpaceViewClass for GraphSpaceView { }) .response; + entity_rect = + entity_rect.map_or(Some(response.rect), |r| Some(r.union(response.rect))); state.node_positions.insert(node.clone(), response.rect); let id = response.layer_id; @@ -286,6 +289,33 @@ impl SpaceViewClass for GraphSpaceView { // ui.interact(response.rect, area_id, egui::Sense::click()); } + + let entity_path = data.entity_path.clone(); + if let Some(entity_rect) = entity_rect { + let response = egui::Area::new(id.with(entity_path.clone())) + .current_pos(entity_rect.min) + .order(egui::Order::Background) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(transform.inverse() * rect); + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .inner_margin(egui::Margin::same(8.0)) + .stroke(egui::Stroke::new( + 1.0, + ui.ctx().style().visuals.text_color(), + )) + .fill(ui.style().visuals.faint_bg_color) + .show(ui, |ui| { + ui.label(format!("{}", entity_path)); + ui.allocate_exact_size(entity_rect.size(), egui::Sense::hover()) + }); + }) + .response; + + let layer_id = response.layer_id; + ui.ctx().set_transform_layer(layer_id, transform); + ui.ctx().set_sublayer(window_layer, layer_id); + } } for data in edge_system.data.iter() { From 7558ee399163bd1928d0f4e166a12e525a06f527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 1 Oct 2024 08:33:35 +0200 Subject: [PATCH 021/159] WIP: improve hierarchical labels --- examples/rust/graph_view/src/graph_space_view.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 1a23ea41b82a..5bce0b6a8b2a 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -299,15 +299,14 @@ impl SpaceViewClass for GraphSpaceView { ui.set_clip_rect(transform.inverse() * rect); egui::Frame::default() .rounding(egui::Rounding::same(4.0)) - .inner_margin(egui::Margin::same(8.0)) .stroke(egui::Stroke::new( 1.0, ui.ctx().style().visuals.text_color(), )) .fill(ui.style().visuals.faint_bg_color) .show(ui, |ui| { - ui.label(format!("{}", entity_path)); - ui.allocate_exact_size(entity_rect.size(), egui::Sense::hover()) + ui.allocate_exact_size(entity_rect.size(), egui::Sense::hover()); + ui.label(format!("{}", entity_path)) }); }) .response; From e1965bf6e332cd98062185eb0ac8373db2e0b0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 1 Oct 2024 11:01:45 +0200 Subject: [PATCH 022/159] WIP: reduce cloning --- .../re_types/src/components/graph_edge_ext.rs | 15 ++ examples/rust/graph_view/src/common.rs | 4 +- .../graph_view/src/edge_visualizer_system.rs | 15 +- .../rust/graph_view/src/graph_space_view.rs | 137 +++++++++--------- .../graph_view/src/node_visualizer_system.rs | 39 +++-- 5 files changed, 109 insertions(+), 101 deletions(-) diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs index d8cdd71db750..eb35c9732a9c 100644 --- a/crates/store/re_types/src/components/graph_edge_ext.rs +++ b/crates/store/re_types/src/components/graph_edge_ext.rs @@ -1,3 +1,4 @@ +use re_log_types::EntityPathHash; use re_types_core::datatypes::EntityPath; use crate::datatypes::{GraphEdge, GraphNodeId}; @@ -12,6 +13,20 @@ impl super::GraphEdge { }) } + /// Returns the hash of the source entity, if it exists. + pub fn source_entity_hash(&self) -> Option { + self.source_entity + .as_ref() + .map(|e| re_log_types::EntityPath::from(e.clone()).hash()) + } + + /// Returns the hash of the target entity, if it exists. + pub fn target_entity_hash(&self) -> Option { + self.target_entity + .as_ref() + .map(|e| re_log_types::EntityPath::from(e.clone()).hash()) + } + /// Specifies the entity in which the edge originates. #[inline] pub fn with_source_in(mut self, path: impl Into) -> Self { diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index d2abeeea9358..11d715292c07 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -4,13 +4,13 @@ use re_viewer::external::re_types::datatypes; #[derive(Clone, PartialEq, Eq, Hash)] pub(crate) struct QualifiedNode { - pub entity_path: re_log_types::EntityPath, + pub entity_hash: re_log_types::EntityPathHash, pub node_id: datatypes::GraphNodeId, } impl std::fmt::Debug for QualifiedNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{}", self.node_id, self.entity_path) + write!(f, "{}@{:?}", self.node_id, self.entity_hash) } } diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index c14e9c8c9c08..149ee517cfd3 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -21,8 +21,8 @@ pub struct GraphEdgeVisualizer { pub(crate) struct GraphEdgeVisualizerData { pub entity_path: re_log_types::EntityPath, - pub edges: ChunkComponentIterItem, - pub colors: ChunkComponentIterItem, + edges: ChunkComponentIterItem, + colors: ChunkComponentIterItem, } impl GraphEdgeVisualizerData { @@ -30,20 +30,13 @@ impl GraphEdgeVisualizerData { &self, ) -> impl Iterator)> { clamped_zip_2x1( - // TODO(grtlr): Avoid all this cloning! self.edges.iter().map(|e| QualifiedEdge { source: QualifiedNode { - entity_path: e - .source_entity - .clone() - .map_or(self.entity_path.clone(), From::from), + entity_hash: e.source_entity_hash().unwrap_or(self.entity_path.hash()), node_id: e.source.clone(), }, target: QualifiedNode { - entity_path: e - .target_entity - .clone() - .map_or(self.entity_path.clone(), From::from), + entity_hash: e.target_entity_hash().unwrap_or(self.entity_path.hash()), node_id: e.target.clone(), }, }), diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 5bce0b6a8b2a..e733b426bf4a 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,30 +1,20 @@ -use std::{collections::HashMap, hash::Hash}; +use std::collections::HashMap; -use re_log_types::Instance; use re_viewer::external::{ - egui::{ - self, - emath::{TSTransform, Vec2}, - Color32, Label, Rect, RichText, TextWrapMode, - }, - re_entity_db::InstancePath, - re_log::external::log, + egui::{self, emath::TSTransform, Rect, TextWrapMode}, re_log_types::EntityPath, - re_types::{ - components::{self, PoseRotationAxisAngle}, - ArrowString, SpaceViewClassIdentifier, - }, + re_types::SpaceViewClassIdentifier, re_ui, re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, OptionalSpaceViewEntityHighlight, - SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, - SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, - SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, - SystemExecutionOutput, ViewQuery, ViewerContext, + HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, SelectionHighlight, + SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, + SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, + SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, + ViewQuery, ViewerContext, }, }; -use crate::node_visualizer_system::GraphNodeVisualizer; +use crate::node_visualizer_system::{GraphNodeVisualizer, NodeInstance}; use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; // We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. @@ -33,6 +23,48 @@ enum NodeKind { Dummy(QualifiedNode), } +impl<'a> NodeInstance<'a> { + fn text(&self) -> egui::RichText { + self.label.map_or( + egui::RichText::new(format!("{}@{}", self.node_id.node_id, self.entity_path)), + |label| egui::RichText::new(label.to_string()), + ) + } + + fn draw(&self, ui: &mut egui::Ui, highlight: InteractionHighlight) -> egui::Response { + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => ui.style().visuals.text_color(), + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .stroke(egui::Stroke::new( + 1.0, + if highlight.selection == SelectionHighlight::Selection { + ui.style().visuals.selection.bg_fill + } else { + ui.ctx().style().visuals.text_color() + }, + )) + .fill(ui.style().visuals.faint_bg_color) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + + if let Some(color) = self.color { + ui.button(self.text().color(color)) + } else { + ui.button(self.text()) + } + }) + .response + } +} + /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. @@ -42,9 +74,7 @@ pub struct GraphSpaceViewState { node_to_index: HashMap, // graph viewer screen_to_world: TSTransform, - dragging: Option, /// Positions of the nodes in world space. - // We currently store position and size, but should maybe store the actual rectangle in the future. node_positions: HashMap, } @@ -156,9 +186,11 @@ impl SpaceViewClass for GraphSpaceView { state.node_to_index.clear(); for data in node_system.data.iter() { - for (node_id, _, _, _) in data.nodes() { - let node_index = state.graph.add_node(NodeKind::Regular(node_id.clone())); - state.node_to_index.insert(node_id, node_index); + for instance in data.nodes() { + let node_index = state + .graph + .add_node(NodeKind::Regular(instance.node_id.clone())); + state.node_to_index.insert(instance.node_id, node_index); } } @@ -220,67 +252,28 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); let mut entity_rect: Option = None; - for (i, (node, instance, maybe_color, maybe_label)) in data.nodes().enumerate() { - let area_id = id.with((node.clone(), i)); - let response = egui::Area::new(area_id) + for node in data.nodes() { + let response = egui::Area::new(id.with((node.node_id.clone(), node.instance))) .current_pos( state .node_positions - .get(&node) + .get(&node.node_id) .map_or(positions.next().unwrap(), |r| r.min), ) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { + let highlight = ent_highlight.index_highlight(node.instance); ui.set_clip_rect(transform.inverse() * rect); - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .inner_margin(egui::Margin::same(8.0)) - .stroke(egui::Stroke::new( - 1.0, - ui.ctx().style().visuals.text_color(), - )) - .fill(ui.style().visuals.faint_bg_color) - .show(ui, |ui| { - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - - let highlight = ent_highlight.index_highlight(instance); - - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => egui::Color32::BLACK, - (HoverHighlight::None, true) => { - ui.style().visuals.selection.bg_fill - } - (HoverHighlight::Hovered, ..) => { - ui.style().visuals.widgets.hovered.bg_fill - } - }; - - let text = if let Some(label) = maybe_label { - egui::RichText::new(format!("{}", label)) - } else { - egui::RichText::new(format!( - "{}:{}", - node.entity_path, node.node_id, - )) - }; - - if let Some(color) = maybe_color { - let c = Color32::from(color.0); - ui.button(text.color(c).background_color(hcolor)) - } else { - ui.button(text.background_color(hcolor)) - } - }); + node.draw(ui, highlight) }) .response; entity_rect = entity_rect.map_or(Some(response.rect), |r| Some(r.union(response.rect))); - state.node_positions.insert(node.clone(), response.rect); + state + .node_positions + .insert(node.node_id.clone(), response.rect); let id = response.layer_id; @@ -293,7 +286,7 @@ impl SpaceViewClass for GraphSpaceView { let entity_path = data.entity_path.clone(); if let Some(entity_rect) = entity_rect { let response = egui::Area::new(id.with(entity_path.clone())) - .current_pos(entity_rect.min) + .fixed_pos(entity_rect.min) .order(egui::Order::Background) .show(ui.ctx(), |ui| { ui.set_clip_rect(transform.inverse() * rect); diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 099bbdeb0892..9ffd420d6bcb 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,5 +1,6 @@ use re_log_types::Instance; use re_viewer::external::{ + egui::Color32, re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_log_types::EntityPath, re_query::{clamped_zip_2x2, range_zip_1x3}, @@ -21,33 +22,32 @@ pub struct GraphNodeVisualizer { pub(crate) data: Vec, } -pub struct GraphNodeVisualizerData { +pub(crate) struct GraphNodeVisualizerData { pub(crate) entity_path: EntityPath, - pub(crate) node_ids: ChunkComponentIterItem, + node_ids: ChunkComponentIterItem, // Clamped - pub(crate) colors: ChunkComponentIterItem, - pub(crate) labels: Vec, + colors: ChunkComponentIterItem, + labels: Vec, // Non-repeated - pub(crate) show_labels: Option, + show_labels: Option, +} + +pub(crate) struct NodeInstance<'a> { + pub node_id: QualifiedNode, + pub entity_path: &'a EntityPath, + pub instance: Instance, + pub label: Option<&'a ArrowString>, + pub color: Option, } impl GraphNodeVisualizerData { - pub(crate) fn nodes( - &self, - ) -> impl Iterator< - Item = ( - QualifiedNode, - Instance, - Option<&components::Color>, - Option<&ArrowString>, - ), - > { + pub(crate) fn nodes(&self) -> impl Iterator { // TODO(grtlr): create proper node instance! clamped_zip_2x2( self.node_ids.iter().map(|node_id| QualifiedNode { - entity_path: self.entity_path.clone(), + entity_hash: self.entity_path.hash(), node_id: node_id.0.clone(), }), (0..).map(Instance::from), @@ -62,6 +62,13 @@ impl GraphNodeVisualizerData { }), Option::<&ArrowString>::default, ) + .map(|(node_id, instance, color, label)| NodeInstance { + node_id, + entity_path: &self.entity_path, + instance, + color: color.map(|c| Color32::from(c.0)), + label, + }) } } From d8b16c8f77d547ecc24dac4ef8035700fee16840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 1 Oct 2024 15:13:30 +0200 Subject: [PATCH 023/159] WIP: refactor out layout in separate pass --- .../rust/graph_view/src/graph_space_view.rs | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index e733b426bf4a..2e4544db3cd0 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use re_viewer::external::{ egui::{self, emath::TSTransform, Rect, TextWrapMode}, + re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, re_ui, @@ -54,7 +55,6 @@ impl<'a> NodeInstance<'a> { .fill(ui.style().visuals.faint_bg_color) .show(ui, |ui| { ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - if let Some(color) = self.color { ui.button(self.text().color(color)) } else { @@ -75,7 +75,7 @@ pub struct GraphSpaceViewState { // graph viewer screen_to_world: TSTransform, /// Positions of the nodes in world space. - node_positions: HashMap, + layout: Option>, } impl SpaceViewState for GraphSpaceViewState { @@ -181,6 +181,26 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; + let Some(layout) = &mut state.layout else { + let mut layout = HashMap::new(); + let ctx = ui.ctx(); + log::debug!("Will discard: {:?}", ctx.will_discard()); + ctx.request_discard("measuring node sizes"); + log::debug!("Will discard: {:?}", ctx.will_discard()); + ui.horizontal(|ui| { + for node in node_system + .data + .iter() + .flat_map(|d| d.nodes()) + { + let response = node.draw(ui, InteractionHighlight::default()); + layout.insert(node.node_id, response.rect); + } + }); + state.layout = Some(layout); + return Ok(()); + }; + // TODO(grtlr): Once we settle on a design, we should update the graph instead of constructing it from scratch. state.graph.clear(); state.node_to_index.clear(); @@ -245,7 +265,7 @@ impl SpaceViewClass for GraphSpaceView { } // initial layout - let mut positions = (0..).map(|i| egui::Pos2::new(0.0, 0.0 + i as f32 * 30.0)); + let window_layer = ui.layer_id(); for data in node_system.data.iter() { @@ -255,10 +275,10 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let response = egui::Area::new(id.with((node.node_id.clone(), node.instance))) .current_pos( - state - .node_positions + layout .get(&node.node_id) - .map_or(positions.next().unwrap(), |r| r.min), + .expect("missing layout information for node") + .min, ) .order(egui::Order::Middle) .constrain(false) @@ -271,9 +291,7 @@ impl SpaceViewClass for GraphSpaceView { entity_rect = entity_rect.map_or(Some(response.rect), |r| Some(r.union(response.rect))); - state - .node_positions - .insert(node.node_id.clone(), response.rect); + layout.insert(node.node_id.clone(), response.rect); let id = response.layer_id; @@ -315,10 +333,9 @@ impl SpaceViewClass for GraphSpaceView { for (i, (edge, instance, color)) in data.edges().enumerate() { // TODO(grtlr): This does not handle dummy nodes correctly. - if let (Some(source_pos), Some(target_pos)) = ( - state.node_positions.get(&edge.source), - state.node_positions.get(&edge.target), - ) { + if let (Some(source_pos), Some(target_pos)) = + (layout.get(&edge.source), layout.get(&edge.target)) + { let highlight = ent_highlight.index_highlight(instance); let hcolor = match ( From 803ef6088578a0b13e3ad08c1c8dbb52560ee0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 1 Oct 2024 15:16:14 +0200 Subject: [PATCH 024/159] WIP: fix lints --- examples/rust/graph_view/src/graph_space_view.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 2e4544db3cd0..061eaea52bb4 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -74,6 +74,7 @@ pub struct GraphSpaceViewState { node_to_index: HashMap, // graph viewer screen_to_world: TSTransform, + /// Positions of the nodes in world space. layout: Option>, } @@ -188,11 +189,7 @@ impl SpaceViewClass for GraphSpaceView { ctx.request_discard("measuring node sizes"); log::debug!("Will discard: {:?}", ctx.will_discard()); ui.horizontal(|ui| { - for node in node_system - .data - .iter() - .flat_map(|d| d.nodes()) - { + for node in node_system.data.iter().flat_map(|d| d.nodes()) { let response = node.draw(ui, InteractionHighlight::default()); layout.insert(node.node_id, response.rect); } From b78684512976f0479ca7222289ccb2ec3e982e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 08:07:09 +0200 Subject: [PATCH 025/159] WIP: fix drawing problems --- Cargo.lock | 61 ++++++++++++---- examples/rust/graph_view/Cargo.toml | 2 +- .../rust/graph_view/src/graph_space_view.rs | 72 +++++++++++-------- examples/rust/node_link_graph/src/main.rs | 12 ++++ 4 files changed, 104 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9ccf828e7316..a80394fbd44d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2327,6 +2327,18 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fdg-sim" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2417e237094dfd115a4aa11b2a3dc6cda45e8d36572a7862ba9a48402f7441a3" +dependencies = [ + "glam 0.21.3", + "hashlink", + "petgraph", + "quad-rand", +] + [[package]] name = "filetime" version = "0.2.23" @@ -2585,6 +2597,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" + [[package]] name = "glam" version = "0.28.0" @@ -2730,7 +2748,7 @@ name = "graph_view" version = "0.0.0" dependencies = [ "bytemuck", - "itertools 0.13.0", + "fdg-sim", "mimalloc", "petgraph", "re_crash_handler", @@ -2780,6 +2798,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "hassle-rs" version = "0.11.0" @@ -2838,7 +2865,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "344d5bf5d6b6da1020fcfd4014d44e0cc695356c603db9c774b30bd6d385ad2b" dependencies = [ "constgebra", - "glam", + "glam 0.28.0", ] [[package]] @@ -3374,7 +3401,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", + "glam 0.28.0", "re_tracing", "rerun", ] @@ -3521,7 +3548,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", + "glam 0.28.0", "rerun", ] @@ -3692,7 +3719,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", + "glam 0.28.0", "rerun", ] @@ -4117,7 +4144,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", + "glam 0.28.0", "prost", "prost-build", "protoc-prebuilt", @@ -4693,6 +4720,12 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "quad-rand" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b76f1009795ca44bb5aaae8fd3f18953e209259c33d9b059b1f53d58ab7511db" + [[package]] name = "quick-xml" version = "0.34.0" @@ -5325,7 +5358,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "999db5029a2879efeddb538f2e486aabf33adf7a0b3708c6df5c1cae13b3af49" dependencies = [ - "glam", + "glam 0.28.0", "serde", ] @@ -5411,7 +5444,7 @@ dependencies = [ "ecolor", "enumset", "getrandom", - "glam", + "glam 0.28.0", "gltf", "half 2.3.1", "itertools 0.13.0", @@ -5456,7 +5489,7 @@ dependencies = [ "anyhow", "bytemuck", "console_error_panic_hook", - "glam", + "glam 0.28.0", "image", "itertools 0.13.0", "pollster", @@ -5634,7 +5667,7 @@ dependencies = [ "bytemuck", "criterion", "egui", - "glam", + "glam 0.28.0", "hexasphere", "image", "itertools 0.13.0", @@ -5814,7 +5847,7 @@ dependencies = [ "ecolor", "egui_plot", "emath", - "glam", + "glam 0.28.0", "half 2.3.1", "image", "infer", @@ -6033,7 +6066,7 @@ dependencies = [ "egui_extras", "egui_tiles", "emath", - "glam", + "glam 0.28.0", "half 2.3.1", "image", "indexmap 2.1.0", @@ -6077,7 +6110,7 @@ dependencies = [ "ahash", "egui", "egui_tiles", - "glam", + "glam 0.28.0", "image", "itertools 0.13.0", "nohash-hasher", @@ -7210,7 +7243,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", + "glam 0.28.0", "itertools 0.13.0", "ndarray", "ndarray-rand", diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 6e0c2d82fbae..df879562872c 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -25,5 +25,5 @@ re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ mimalloc = "0.1" petgraph = "0.6" -itertools = "0.13" bytemuck = "1.18" +fdg-sim = "0.9" diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 061eaea52bb4..a6f9c6463ba8 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,3 +1,4 @@ +use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; use std::collections::HashMap; use re_viewer::external::{ @@ -70,9 +71,6 @@ impl<'a> NodeInstance<'a> { /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] pub struct GraphSpaceViewState { - graph: petgraph::stable_graph::StableGraph, - node_to_index: HashMap, - // graph viewer screen_to_world: TSTransform, /// Positions of the nodes in world space. @@ -195,35 +193,53 @@ impl SpaceViewClass for GraphSpaceView { } }); state.layout = Some(layout); - return Ok(()); - }; - // TODO(grtlr): Once we settle on a design, we should update the graph instead of constructing it from scratch. - state.graph.clear(); - state.node_to_index.clear(); + let mut node_to_index = HashMap::new(); + let mut graph: ForceGraph<(), ()> = ForceGraph::default(); - for data in node_system.data.iter() { - for instance in data.nodes() { - let node_index = state - .graph - .add_node(NodeKind::Regular(instance.node_id.clone())); - state.node_to_index.insert(instance.node_id, node_index); + for data in node_system.data.iter() { + for node in data.nodes() { + let node_index = graph.add_force_node(format!("{:?}", node.node_id), ()); + node_to_index.insert(node.node_id, node_index); + } } - } - for data in edge_system.data.iter() { - for (edge, _, _) in data.edges() { - let source_index = *state - .node_to_index - .entry(edge.source.clone()) - .or_insert(state.graph.add_node(NodeKind::Dummy(edge.source))); - let target_index = *state - .node_to_index - .entry(edge.target.clone()) - .or_insert(state.graph.add_node(NodeKind::Dummy(edge.target))); - state.graph.add_edge(source_index, target_index, ()); + for data in edge_system.data.iter() { + for (edge, _, _) in data.edges() { + let source_index = *node_to_index + .entry(edge.source.clone()) + .or_insert(graph.add_force_node(format!("{:?}", edge.source), ())); + let target_index = *node_to_index + .entry(edge.target.clone()) + .or_insert(graph.add_force_node(format!("{:?}", edge.target), ())); + graph.add_edge(source_index, target_index, ()); + } } - } + + // create a simulation from the graph + let mut simulation = Simulation::from_graph(graph, SimulationParameters::default()); + + for frame in 0..1000 { + simulation.update(0.035); + } + + if let Some(layout) = state.layout.as_mut() { + for (node_id, rect) in layout.iter_mut() { + if let Some(n) = node_to_index.get(node_id) { + if let Some(nn) = simulation.get_graph().node_weight(*n) { + let new_center = egui::Pos2::new(nn.location.x, nn.location.y); + *rect = Rect::from_center_size(new_center, rect.size()); + } + } + // let node = simulation.get_graph().get_node(node_index); + // println!("{:?} {:?}", node, node.location); + } + println!("-----------------------"); + } + + + return Ok(()); + }; // Graph viewer let (id, rect) = ui.allocate_space(ui.available_size()); @@ -349,7 +365,7 @@ impl SpaceViewClass for GraphSpaceView { .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { - // TODO(grtlr): reintroduce clipping: `ui.set_clip_rect(transform.inverse() * rect);` + ui.set_clip_rect(transform.inverse() * rect); egui::Frame::default().show(ui, |ui| { let painter = ui.painter(); painter.line_segment( diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 766a0717fc0a..87fdc7f522f6 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -69,5 +69,17 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { ]), )?; + rec.log( + "reachable", + &GraphEdges::new([ + GraphEdge::new("area0", "sink") + .with_source_in("kitchen/areas") + .with_target_in("kitchen/objects"), + GraphEdge::new("area1", "fridge") + .with_source_in("kitchen/areas") + .with_target_in("kitchen/objects"), + ]), + )?; + Ok(()) } From dff335803b6ff370ebee917f036f08f0bd4b1435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 09:26:04 +0200 Subject: [PATCH 026/159] WIP: refactor layout algorithm --- examples/rust/graph_view/src/common.rs | 4 +- .../rust/graph_view/src/graph_space_view.rs | 136 ++++++++++-------- 2 files changed, 81 insertions(+), 59 deletions(-) diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index 11d715292c07..e637f4e88a73 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -2,13 +2,13 @@ use std::hash::Hash; use re_viewer::external::re_types::datatypes; -#[derive(Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) struct QualifiedNode { pub entity_hash: re_log_types::EntityPathHash, pub node_id: datatypes::GraphNodeId, } -impl std::fmt::Debug for QualifiedNode { +impl std::fmt::Display for QualifiedNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}@{:?}", self.node_id, self.entity_hash) } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index a6f9c6463ba8..d12ac973379c 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,6 +2,7 @@ use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; use std::collections::HashMap; use re_viewer::external::{ + arrow2::compute, egui::{self, emath::TSTransform, Rect, TextWrapMode}, re_log::external::log, re_log_types::EntityPath, @@ -16,12 +17,78 @@ use re_viewer::external::{ }, }; -use crate::node_visualizer_system::{GraphNodeVisualizer, NodeInstance}; +use crate::{ + common::QualifiedEdge, + node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, +}; use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; +fn measure_node_sizes<'a>( + ui: &mut egui::Ui, + nodes: impl Iterator>, +) -> Vec<(QualifiedNode, egui::Vec2)> { + let mut sizes = Vec::new(); + let ctx = ui.ctx(); + ctx.request_discard("measuring node sizes"); + ui.horizontal(|ui| { + for node in nodes { + let response = node.draw(ui, InteractionHighlight::default()); + sizes.push((node.node_id.clone(), response.rect.size())); + } + }); + sizes +} + +fn compute_layout( + nodes: impl Iterator, + edges: impl Iterator, +) -> HashMap { + let mut node_to_index = HashMap::new(); + let mut graph: ForceGraph = ForceGraph::default(); + + // TODO(grtlr): `fdg` does not account for node sizes out of the box. + for (node_id, size) in nodes { + let ix = graph.add_force_node( + node_id.to_string(), + NodeKind::Regular(node_id.clone(), size), + ); + node_to_index.insert(node_id, ix); + } + + for QualifiedEdge { source, target } in edges { + let source_ix = *node_to_index + .entry(source.clone()) + .or_insert(graph.add_force_node(source.to_string(), NodeKind::Dummy(source))); + let target_ix = *node_to_index + .entry(target.clone()) + .or_insert(graph.add_force_node(target.to_string(), NodeKind::Dummy(target))); + graph.add_edge(source_ix, target_ix, ()); + } + + // create a simulation from the graph + let mut simulation = Simulation::from_graph(graph, SimulationParameters::default()); + + for frame in 0..1000 { + simulation.update(0.035); + } + + simulation + .get_graph() + .node_weights() + .filter_map(|node| match &node.data { + NodeKind::Regular(node_id, size) => { + let center = egui::Pos2::new(node.location.x, node.location.y); + let rect = egui::Rect::from_center_size(center, *size); + Some((node_id.clone(), rect)) + } + NodeKind::Dummy(_) => None, + }) + .collect() +} + // We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. enum NodeKind { - Regular(QualifiedNode), + Regular(QualifiedNode, egui::Vec2), Dummy(QualifiedNode), } @@ -181,63 +248,18 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; let Some(layout) = &mut state.layout else { - let mut layout = HashMap::new(); - let ctx = ui.ctx(); - log::debug!("Will discard: {:?}", ctx.will_discard()); - ctx.request_discard("measuring node sizes"); - log::debug!("Will discard: {:?}", ctx.will_discard()); - ui.horizontal(|ui| { - for node in node_system.data.iter().flat_map(|d| d.nodes()) { - let response = node.draw(ui, InteractionHighlight::default()); - layout.insert(node.node_id, response.rect); - } - }); + let node_sizes = + measure_node_sizes(ui, node_system.data.iter().flat_map(|d| d.nodes())); + + let layout = compute_layout( + node_sizes.into_iter(), + edge_system + .data + .iter() + .flat_map(|d| d.edges().map(|(edge, _, _)| edge)), + ); state.layout = Some(layout); - let mut node_to_index = HashMap::new(); - let mut graph: ForceGraph<(), ()> = ForceGraph::default(); - - for data in node_system.data.iter() { - for node in data.nodes() { - let node_index = graph.add_force_node(format!("{:?}", node.node_id), ()); - node_to_index.insert(node.node_id, node_index); - } - } - - for data in edge_system.data.iter() { - for (edge, _, _) in data.edges() { - let source_index = *node_to_index - .entry(edge.source.clone()) - .or_insert(graph.add_force_node(format!("{:?}", edge.source), ())); - let target_index = *node_to_index - .entry(edge.target.clone()) - .or_insert(graph.add_force_node(format!("{:?}", edge.target), ())); - graph.add_edge(source_index, target_index, ()); - } - } - - // create a simulation from the graph - let mut simulation = Simulation::from_graph(graph, SimulationParameters::default()); - - for frame in 0..1000 { - simulation.update(0.035); - } - - if let Some(layout) = state.layout.as_mut() { - for (node_id, rect) in layout.iter_mut() { - if let Some(n) = node_to_index.get(node_id) { - if let Some(nn) = simulation.get_graph().node_weight(*n) { - let new_center = egui::Pos2::new(nn.location.x, nn.location.y); - *rect = Rect::from_center_size(new_center, rect.size()); - } - } - // let node = simulation.get_graph().get_node(node_index); - // println!("{:?} {:?}", node, node.location); - } - println!("-----------------------"); - } - - return Ok(()); }; From f6441182181c668602042d895e9efce0df111134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 11:10:02 +0200 Subject: [PATCH 027/159] WIP: fit so screen --- .../rust/graph_view/src/graph_space_view.rs | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index d12ac973379c..36d3568c7fc3 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -86,6 +86,40 @@ fn compute_layout( .collect() } +fn bounding_rect_from_iter<'a>(rects: impl Iterator) -> Option { + // Start with `None` and gradually expand the bounding box. + let mut bounding_rect: Option = None; + + for rect in rects { + bounding_rect = match bounding_rect { + Some(bounding) => Some(bounding.union(*rect)), + None => Some(*rect), + }; + } + + bounding_rect +} + +fn fit_bounding_rect_to_screen( + bounding_rect: egui::Rect, + available_size: egui::Vec2, +) -> TSTransform { + // Compute the scale factor to fit the bounding rectangle into the available screen size. + let scale_x = available_size.x / bounding_rect.width(); + let scale_y = available_size.y / bounding_rect.height(); + + // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. + let scale = scale_x.min(scale_y); + + // Compute the translation to center the bounding rect in the screen. + let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); + let center_world = bounding_rect.center().to_vec2(); + + // Set the transformation to scale and then translate to center. + TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) + * TSTransform::from_scaling(scale) +} + // We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. enum NodeKind { Regular(QualifiedNode, egui::Vec2), @@ -246,6 +280,7 @@ impl SpaceViewClass for GraphSpaceView { let edge_system = system_output.view_systems.get::()?; let state = state.downcast_mut::()?; + let (id, rect) = ui.allocate_space(ui.available_size()); let Some(layout) = &mut state.layout else { let node_sizes = @@ -258,13 +293,16 @@ impl SpaceViewClass for GraphSpaceView { .iter() .flat_map(|d| d.edges().map(|(edge, _, _)| edge)), ); + + if let Some(bbox) = bounding_rect_from_iter(layout.values()) { + state.screen_to_world = fit_bounding_rect_to_screen(bbox, rect.size()); + } + state.layout = Some(layout); return Ok(()); }; - // Graph viewer - let (id, rect) = ui.allocate_space(ui.available_size()); let response = ui.interact(rect, id, egui::Sense::click_and_drag()); // Allow dragging the background as well. From ef3da62fa7023d7bd0febb9d15131d3ed2f4c84f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 12:47:27 +0200 Subject: [PATCH 028/159] WIP: fix bounding box extent --- .../rust/graph_view/src/graph_space_view.rs | 63 +++++++++++++++---- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 36d3568c7fc3..d7e1a2715d8d 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -294,8 +294,9 @@ impl SpaceViewClass for GraphSpaceView { .flat_map(|d| d.edges().map(|(edge, _, _)| edge)), ); - if let Some(bbox) = bounding_rect_from_iter(layout.values()) { - state.screen_to_world = fit_bounding_rect_to_screen(bbox, rect.size()); + if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { + state.screen_to_world = + fit_bounding_rect_to_screen(bounding_box.scale_from_center(1.05), rect.size()); } state.layout = Some(layout); @@ -310,14 +311,20 @@ impl SpaceViewClass for GraphSpaceView { state.screen_to_world.translation += response.drag_delta(); } - // Plot-like reset - if response.double_clicked() { - state.screen_to_world = TSTransform::default(); - } - let transform = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) * state.screen_to_world; + #[cfg(debug_assertions)] + if response.double_clicked() { + if let Some(screen) = response.interact_pointer_pos() { + log::debug!( + "Clicked! Screen: {:?}, World: {:?}", + screen, + transform.inverse() * screen + ); + } + } + if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. if response.hovered() { @@ -341,18 +348,48 @@ impl SpaceViewClass for GraphSpaceView { let window_layer = ui.layer_id(); + #[cfg(debug_assertions)] + { + log::debug!("Displaying coordinate system"); + // paint coordinate system at the world origin + let origin = transform * egui::Pos2::new(0.0, 0.0); + let x_axis = transform * egui::Pos2::new(100.0, 0.0); + let y_axis = transform * egui::Pos2::new(0.0, 100.0); + + // Paint the coordinate system. + let painter = egui::Painter::new( + ui.ctx().clone(), + window_layer, + /* transform.inverse() * */ rect, + ); + painter.line_segment([origin, x_axis], egui::Stroke::new(1.0, egui::Color32::RED)); + painter.line_segment( + [origin, y_axis], + egui::Stroke::new(2.0, egui::Color32::GREEN), + ); + + if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { + log::debug!("Node bounding box: {:?}", bounding_box); + + painter.rect( + transform * bounding_box, + 0.0, + egui::Color32::from_rgba_unmultiplied(255, 0, 255, 32), + egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), + ); + } + } + for data in node_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); let mut entity_rect: Option = None; for node in data.nodes() { + let current_extent = layout + .get(&node.node_id) + .expect("missing layout information for node"); let response = egui::Area::new(id.with((node.node_id.clone(), node.instance))) - .current_pos( - layout - .get(&node.node_id) - .expect("missing layout information for node") - .min, - ) + .current_pos(current_extent.min) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { From 8e4c69dc0268cb049e929586f1802a0bfe49e248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 14:19:11 +0200 Subject: [PATCH 029/159] WIP: debug layers --- .../rust/graph_view/src/graph_space_view.rs | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index d7e1a2715d8d..7f288553000d 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,8 +2,7 @@ use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; use std::collections::HashMap; use re_viewer::external::{ - arrow2::compute, - egui::{self, emath::TSTransform, Rect, TextWrapMode}, + egui::{self, emath::TSTransform, TextWrapMode}, re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, @@ -172,7 +171,7 @@ impl<'a> NodeInstance<'a> { /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] pub struct GraphSpaceViewState { - screen_to_world: TSTransform, + world_to_view: TSTransform, /// Positions of the nodes in world space. layout: Option>, @@ -280,7 +279,8 @@ impl SpaceViewClass for GraphSpaceView { let edge_system = system_output.view_systems.get::()?; let state = state.downcast_mut::()?; - let (id, rect) = ui.allocate_space(ui.available_size()); + let (id, view_rect_in_window) = ui.allocate_space(ui.available_size()); + log::debug!("Created view rect: {:?}", view_rect_in_window); let Some(layout) = &mut state.layout else { let node_sizes = @@ -295,8 +295,10 @@ impl SpaceViewClass for GraphSpaceView { ); if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { - state.screen_to_world = - fit_bounding_rect_to_screen(bounding_box.scale_from_center(1.05), rect.size()); + state.world_to_view = fit_bounding_rect_to_screen( + bounding_box.scale_from_center(1.05), + view_rect_in_window.size(), + ); } state.layout = Some(layout); @@ -304,15 +306,15 @@ impl SpaceViewClass for GraphSpaceView { return Ok(()); }; - let response = ui.interact(rect, id, egui::Sense::click_and_drag()); + let response = ui.interact(view_rect_in_window, id, egui::Sense::click_and_drag()); // Allow dragging the background as well. if response.dragged() { - state.screen_to_world.translation += response.drag_delta(); + state.world_to_view.translation += response.drag_delta(); } - let transform = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()) - * state.screen_to_world; + let view_to_window = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()); + let world_to_window = view_to_window * state.world_to_view; #[cfg(debug_assertions)] if response.double_clicked() { @@ -320,7 +322,7 @@ impl SpaceViewClass for GraphSpaceView { log::debug!( "Clicked! Screen: {:?}, World: {:?}", screen, - transform.inverse() * screen + world_to_window.inverse() * screen ); } } @@ -328,19 +330,19 @@ impl SpaceViewClass for GraphSpaceView { if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. if response.hovered() { - let pointer_in_world = transform.inverse() * pointer; + let pointer_in_world = world_to_window.inverse() * pointer; let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); // Zoom in on pointer: - state.screen_to_world = state.screen_to_world + state.world_to_view = state.world_to_view * TSTransform::from_translation(pointer_in_world.to_vec2()) * TSTransform::from_scaling(zoom_delta) * TSTransform::from_translation(-pointer_in_world.to_vec2()); // Pan: - state.screen_to_world = - TSTransform::from_translation(pan_delta) * state.screen_to_world; + state.world_to_view = + TSTransform::from_translation(pan_delta) * state.world_to_view; } } @@ -350,18 +352,21 @@ impl SpaceViewClass for GraphSpaceView { #[cfg(debug_assertions)] { - log::debug!("Displaying coordinate system"); - // paint coordinate system at the world origin - let origin = transform * egui::Pos2::new(0.0, 0.0); - let x_axis = transform * egui::Pos2::new(100.0, 0.0); - let y_axis = transform * egui::Pos2::new(0.0, 100.0); + let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); + ui.ctx().set_transform_layer(debug_id, world_to_window); // Paint the coordinate system. let painter = egui::Painter::new( ui.ctx().clone(), - window_layer, - /* transform.inverse() * */ rect, + debug_id, + world_to_window.inverse() * view_rect_in_window, ); + + // paint coordinate system at the world origin + let origin = egui::Pos2::new(0.0, 0.0); + let x_axis = egui::Pos2::new(100.0, 0.0); + let y_axis = egui::Pos2::new(0.0, 100.0); + painter.line_segment([origin, x_axis], egui::Stroke::new(1.0, egui::Color32::RED)); painter.line_segment( [origin, y_axis], @@ -372,7 +377,7 @@ impl SpaceViewClass for GraphSpaceView { log::debug!("Node bounding box: {:?}", bounding_box); painter.rect( - transform * bounding_box, + bounding_box, 0.0, egui::Color32::from_rgba_unmultiplied(255, 0, 255, 32), egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), @@ -382,8 +387,6 @@ impl SpaceViewClass for GraphSpaceView { for data in node_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - let mut entity_rect: Option = None; - for node in data.nodes() { let current_extent = layout .get(&node.node_id) @@ -394,30 +397,31 @@ impl SpaceViewClass for GraphSpaceView { .constrain(false) .show(ui.ctx(), |ui| { let highlight = ent_highlight.index_highlight(node.instance); - ui.set_clip_rect(transform.inverse() * rect); + ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); node.draw(ui, highlight) }) .response; - entity_rect = - entity_rect.map_or(Some(response.rect), |r| Some(r.union(response.rect))); layout.insert(node.node_id.clone(), response.rect); let id = response.layer_id; - ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_transform_layer(id, world_to_window); ui.ctx().set_sublayer(window_layer, id); // ui.interact(response.rect, area_id, egui::Sense::click()); } + // TODO(grtlr): Explain `unwrap` + let entity_rect = + bounding_rect_from_iter(data.nodes().map(|r| layout.get(&r.node_id).unwrap())); let entity_path = data.entity_path.clone(); if let Some(entity_rect) = entity_rect { let response = egui::Area::new(id.with(entity_path.clone())) .fixed_pos(entity_rect.min) .order(egui::Order::Background) .show(ui.ctx(), |ui| { - ui.set_clip_rect(transform.inverse() * rect); + ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); egui::Frame::default() .rounding(egui::Rounding::same(4.0)) .stroke(egui::Stroke::new( @@ -433,7 +437,7 @@ impl SpaceViewClass for GraphSpaceView { .response; let layer_id = response.layer_id; - ui.ctx().set_transform_layer(layer_id, transform); + ui.ctx().set_transform_layer(layer_id, world_to_window); ui.ctx().set_sublayer(window_layer, layer_id); } } @@ -462,7 +466,7 @@ impl SpaceViewClass for GraphSpaceView { .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { - ui.set_clip_rect(transform.inverse() * rect); + ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); egui::Frame::default().show(ui, |ui| { let painter = ui.painter(); painter.line_segment( @@ -477,7 +481,7 @@ impl SpaceViewClass for GraphSpaceView { let id = response.layer_id; - ui.ctx().set_transform_layer(id, transform); + ui.ctx().set_transform_layer(id, world_to_window); ui.ctx().set_sublayer(window_layer, id); } } From c50a5084887201d3a07464259d74503aa597cd30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 14:29:10 +0200 Subject: [PATCH 030/159] WIP: More cleanup --- .../rust/graph_view/src/graph_space_view.rs | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 7f288553000d..c3bf27f8f847 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -279,8 +279,7 @@ impl SpaceViewClass for GraphSpaceView { let edge_system = system_output.view_systems.get::()?; let state = state.downcast_mut::()?; - let (id, view_rect_in_window) = ui.allocate_space(ui.available_size()); - log::debug!("Created view rect: {:?}", view_rect_in_window); + let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); let Some(layout) = &mut state.layout else { let node_sizes = @@ -297,7 +296,7 @@ impl SpaceViewClass for GraphSpaceView { if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { state.world_to_view = fit_bounding_rect_to_screen( bounding_box.scale_from_center(1.05), - view_rect_in_window.size(), + clip_rect_window.size(), ); } @@ -306,7 +305,7 @@ impl SpaceViewClass for GraphSpaceView { return Ok(()); }; - let response = ui.interact(view_rect_in_window, id, egui::Sense::click_and_drag()); + let response = ui.interact(clip_rect_window, id, egui::Sense::click_and_drag()); // Allow dragging the background as well. if response.dragged() { @@ -318,11 +317,12 @@ impl SpaceViewClass for GraphSpaceView { #[cfg(debug_assertions)] if response.double_clicked() { - if let Some(screen) = response.interact_pointer_pos() { + if let Some(window) = response.interact_pointer_pos() { log::debug!( - "Clicked! Screen: {:?}, World: {:?}", - screen, - world_to_window.inverse() * screen + "Click event! Window: {:?}, View: {:?} World: {:?}", + window, + view_to_window.inverse() * window, + world_to_window.inverse() * window, ); } } @@ -346,7 +346,7 @@ impl SpaceViewClass for GraphSpaceView { } } - // initial layout + let clip_rect_world = world_to_window.inverse() * clip_rect_window; let window_layer = ui.layer_id(); @@ -356,11 +356,7 @@ impl SpaceViewClass for GraphSpaceView { ui.ctx().set_transform_layer(debug_id, world_to_window); // Paint the coordinate system. - let painter = egui::Painter::new( - ui.ctx().clone(), - debug_id, - world_to_window.inverse() * view_rect_in_window, - ); + let painter = egui::Painter::new(ui.ctx().clone(), debug_id, clip_rect_world); // paint coordinate system at the world origin let origin = egui::Pos2::new(0.0, 0.0); @@ -374,8 +370,6 @@ impl SpaceViewClass for GraphSpaceView { ); if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { - log::debug!("Node bounding box: {:?}", bounding_box); - painter.rect( bounding_box, 0.0, @@ -397,7 +391,7 @@ impl SpaceViewClass for GraphSpaceView { .constrain(false) .show(ui.ctx(), |ui| { let highlight = ent_highlight.index_highlight(node.instance); - ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); + ui.set_clip_rect(clip_rect_world); node.draw(ui, highlight) }) .response; @@ -421,7 +415,7 @@ impl SpaceViewClass for GraphSpaceView { .fixed_pos(entity_rect.min) .order(egui::Order::Background) .show(ui.ctx(), |ui| { - ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); + ui.set_clip_rect(clip_rect_world); egui::Frame::default() .rounding(egui::Rounding::same(4.0)) .stroke(egui::Stroke::new( @@ -466,7 +460,7 @@ impl SpaceViewClass for GraphSpaceView { .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { - ui.set_clip_rect(world_to_window.inverse() * view_rect_in_window); + ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); egui::Frame::default().show(ui, |ui| { let painter = ui.painter(); painter.line_segment( From eac1765b339e21f7056e099ed05c73951dc229e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 16:20:11 +0200 Subject: [PATCH 031/159] WIP: show entity path again --- .../rust/graph_view/src/graph_space_view.rs | 55 +++++++++---------- examples/rust/node_link_graph/src/main.rs | 3 + 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index c3bf27f8f847..6d23066e27dd 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -350,7 +350,8 @@ impl SpaceViewClass for GraphSpaceView { let window_layer = ui.layer_id(); - #[cfg(debug_assertions)] + //#[cfg(debug_assertions)] + #[cfg(any())] { let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); ui.ctx().set_transform_layer(debug_id, world_to_window); @@ -381,6 +382,9 @@ impl SpaceViewClass for GraphSpaceView { for data in node_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + // We keep track of the size of the current entity. + let mut entity_rect: Option = None; + for node in data.nodes() { let current_extent = layout .get(&node.node_id) @@ -397,42 +401,37 @@ impl SpaceViewClass for GraphSpaceView { .response; layout.insert(node.node_id.clone(), response.rect); + entity_rect = + entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); let id = response.layer_id; - ui.ctx().set_transform_layer(id, world_to_window); ui.ctx().set_sublayer(window_layer, id); - - // ui.interact(response.rect, area_id, egui::Sense::click()); } - // TODO(grtlr): Explain `unwrap` - let entity_rect = - bounding_rect_from_iter(data.nodes().map(|r| layout.get(&r.node_id).unwrap())); let entity_path = data.entity_path.clone(); if let Some(entity_rect) = entity_rect { - let response = egui::Area::new(id.with(entity_path.clone())) - .fixed_pos(entity_rect.min) - .order(egui::Order::Background) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(clip_rect_world); - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .stroke(egui::Stroke::new( - 1.0, - ui.ctx().style().visuals.text_color(), - )) - .fill(ui.style().visuals.faint_bg_color) - .show(ui, |ui| { - ui.allocate_exact_size(entity_rect.size(), egui::Sense::hover()); - ui.label(format!("{}", entity_path)) - }); - }) - .response; + let entity_id = egui::LayerId::new( + egui::Order::Background, + id.with(("debug", entity_path.hash())), + ); + ui.ctx().set_transform_layer(entity_id, world_to_window); + let painter = egui::Painter::new(ui.ctx().clone(), entity_id, clip_rect_world); - let layer_id = response.layer_id; - ui.ctx().set_transform_layer(layer_id, world_to_window); - ui.ctx().set_sublayer(window_layer, layer_id); + let padded = entity_rect.expand(5.0); + painter.rect( + padded, + 4.0, + egui::Color32::TRANSPARENT, + egui::Stroke::new(1.0, ui.ctx().style().visuals.text_color()), + ); + painter.text( + padded.left_top(), + egui::Align2::LEFT_BOTTOM, + entity_path.to_string(), + egui::FontId::default(), + ui.ctx().style().visuals.text_color(), + ); } } diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 87fdc7f522f6..f680d7529cc6 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -78,6 +78,9 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { GraphEdge::new("area1", "fridge") .with_source_in("kitchen/areas") .with_target_in("kitchen/objects"), + GraphEdge::new("area1", "table") + .with_source_in("living/areas") + .with_target_in("living/objects"), ]), )?; From 761d81799520d8a26fa30ee38978ab50816a7435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 16:21:47 +0200 Subject: [PATCH 032/159] WIP: fmt --- examples/rust/node_link_graph/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index f680d7529cc6..1f720baae9cc 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -78,7 +78,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { GraphEdge::new("area1", "fridge") .with_source_in("kitchen/areas") .with_target_in("kitchen/objects"), - GraphEdge::new("area1", "table") + GraphEdge::new("area1", "table") .with_source_in("living/areas") .with_target_in("living/objects"), ]), From 4aaac83c74c99d88be45873ebb43bac36d323d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 17:32:13 +0200 Subject: [PATCH 033/159] WIP: introduce `EdgeInstance` --- .../graph_view/src/edge_visualizer_system.rs | 18 ++++++++-- .../rust/graph_view/src/graph_space_view.rs | 36 +++++++++++++------ .../graph_view/src/node_visualizer_system.rs | 1 - 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_visualizer_system.rs index 149ee517cfd3..fb2da7a59e66 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_visualizer_system.rs @@ -1,5 +1,6 @@ use re_log_types::Instance; use re_viewer::external::{ + egui::Color32, re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_query::{clamped_zip_2x1, range_zip_1x1}, re_renderer, @@ -25,10 +26,15 @@ pub(crate) struct GraphEdgeVisualizerData { colors: ChunkComponentIterItem, } +pub(crate) struct EdgeInstance<'a> { + pub edge: QualifiedEdge, + pub entity_path: &'a re_log_types::EntityPath, + pub instance: Instance, + pub color: Option, +} + impl GraphEdgeVisualizerData { - pub(crate) fn edges( - &self, - ) -> impl Iterator)> { + pub(crate) fn edges(&self) -> impl Iterator { clamped_zip_2x1( self.edges.iter().map(|e| QualifiedEdge { source: QualifiedNode { @@ -44,6 +50,12 @@ impl GraphEdgeVisualizerData { self.colors.iter().map(Option::Some), Option::<&components::Color>::default, ) + .map(|(edge, instance, color)| EdgeInstance { + edge, + entity_path: &self.entity_path, + instance, + color: color.map(|c| Color32::from(c.0)), + }) } } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 6d23066e27dd..62e80ee3b227 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -18,6 +18,7 @@ use re_viewer::external::{ use crate::{ common::QualifiedEdge, + edge_visualizer_system::EdgeInstance, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; @@ -290,7 +291,7 @@ impl SpaceViewClass for GraphSpaceView { edge_system .data .iter() - .flat_map(|d| d.edges().map(|(edge, _, _)| edge)), + .flat_map(|d| d.edges().map(|e| e.edge)), ); if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { @@ -438,7 +439,13 @@ impl SpaceViewClass for GraphSpaceView { for data in edge_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - for (i, (edge, instance, color)) in data.edges().enumerate() { + for EdgeInstance { + edge, + instance, + color, + .. + } in data.edges() + { // TODO(grtlr): This does not handle dummy nodes correctly. if let (Some(source_pos), Some(target_pos)) = (layout.get(&edge.source), layout.get(&edge.target)) @@ -449,26 +456,35 @@ impl SpaceViewClass for GraphSpaceView { highlight.hover, highlight.selection != SelectionHighlight::None, ) { - (HoverHighlight::None, false) => ui.style().visuals.text_color(), - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + (HoverHighlight::None, false) => None, + (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), + (HoverHighlight::Hovered, ..) => { + Some(ui.style().visuals.widgets.hovered.bg_fill) + } }; - let response = egui::Area::new(id.with((edge, i))) + let response = egui::Area::new(id.with((edge, instance))) .current_pos(source_pos.center()) - .order(egui::Order::Middle) + .order(egui::Order::Background) .constrain(false) .show(ui.ctx(), |ui| { ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); egui::Frame::default().show(ui, |ui| { let painter = ui.painter(); + if let Some(hcolor) = hcolor { + painter.line_segment( + [source_pos.center(), target_pos.center()], + egui::Stroke::new(4.0, hcolor), + ); + } painter.line_segment( [source_pos.center(), target_pos.center()], - egui::Stroke::new(2.0, hcolor), + egui::Stroke::new( + 1.0, + color.unwrap_or(ui.style().visuals.text_color()), + ), ); }); - - // log::debug!("Line: {} {}", source_pos, target_pos); }) .response; diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index 9ffd420d6bcb..e7c8b1301843 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -44,7 +44,6 @@ pub(crate) struct NodeInstance<'a> { impl GraphNodeVisualizerData { pub(crate) fn nodes(&self) -> impl Iterator { - // TODO(grtlr): create proper node instance! clamped_zip_2x2( self.node_ids.iter().map(|node_id| QualifiedNode { entity_hash: self.entity_path.hash(), From 95bbb99bd39947a1e50f758d2c2667c6c618857a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 2 Oct 2024 17:38:04 +0200 Subject: [PATCH 034/159] WIP: limit scale to 1 --- examples/rust/graph_view/src/graph_space_view.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 62e80ee3b227..e87ca0604261 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -109,7 +109,7 @@ fn fit_bounding_rect_to_screen( let scale_y = available_size.y / bounding_rect.height(); // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. - let scale = scale_x.min(scale_y); + let scale = scale_x.min(scale_y).min(1.0); // Compute the translation to center the bounding rect in the screen. let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); From ff950e046981ba5994dfe399f4190cb4ea94e6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 7 Oct 2024 09:01:20 +0200 Subject: [PATCH 035/159] WIP: improve node styling --- .../rust/graph_view/src/graph_space_view.rs | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index e87ca0604261..e83a6719ed64 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,18 +2,9 @@ use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; use std::collections::HashMap; use re_viewer::external::{ - egui::{self, emath::TSTransform, TextWrapMode}, - re_log::external::log, - re_log_types::EntityPath, - re_types::SpaceViewClassIdentifier, - re_ui, - re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, SelectionHighlight, - SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, - SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, - SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, - ViewQuery, ViewerContext, - }, + egui::{self, emath::TSTransform, TextWrapMode}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, re_ui, re_viewer_context::{ + HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, Item, SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext + } }; use crate::{ @@ -144,23 +135,26 @@ impl<'a> NodeInstance<'a> { (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, }; + let bg = match highlight.hover { + HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, + HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, + }; + // ui.style().visuals.faint_bg_color + egui::Frame::default() .rounding(egui::Rounding::same(4.0)) .stroke(egui::Stroke::new( 1.0, - if highlight.selection == SelectionHighlight::Selection { - ui.style().visuals.selection.bg_fill - } else { - ui.ctx().style().visuals.text_color() - }, + ui.style().visuals.text_color(), )) - .fill(ui.style().visuals.faint_bg_color) + .inner_margin(egui::Vec2::new(6.0, 4.0)) + .fill(bg) .show(ui, |ui| { ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); if let Some(color) = self.color { - ui.button(self.text().color(color)) + ui.add(egui::Button::new(self.text().color(color))); } else { - ui.button(self.text()) + ui.add(egui::Button::new(self.text())); } }) .response @@ -250,7 +244,7 @@ impl SpaceViewClass for GraphSpaceView { /// In this sample we show a combo box to select the color coordinates mode. fn selection_ui( &self, - _ctx: &ViewerContext<'_>, + ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, _space_origin: &EntityPath, @@ -270,7 +264,7 @@ impl SpaceViewClass for GraphSpaceView { /// This is called with freshly created & executed context & part systems. fn ui( &self, - _ctx: &ViewerContext<'_>, + ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, query: &ViewQuery<'_>, @@ -401,6 +395,10 @@ impl SpaceViewClass for GraphSpaceView { }) .response; + let instance = InstancePath::instance(node.entity_path.clone(), node.instance); + ctx.select_hovered_on_click(&response, Item::DataResult(query.space_view_id, instance)); + + layout.insert(node.node_id.clone(), response.rect); entity_rect = entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); @@ -419,20 +417,29 @@ impl SpaceViewClass for GraphSpaceView { ui.ctx().set_transform_layer(entity_id, world_to_window); let painter = egui::Painter::new(ui.ctx().clone(), entity_id, clip_rect_world); - let padded = entity_rect.expand(5.0); + let padded = entity_rect.expand(10.0); + let tc = ui.ctx().style().visuals.text_color(); painter.rect( padded, - 4.0, - egui::Color32::TRANSPARENT, - egui::Stroke::new(1.0, ui.ctx().style().visuals.text_color()), - ); - painter.text( - padded.left_top(), - egui::Align2::LEFT_BOTTOM, - entity_path.to_string(), - egui::FontId::default(), - ui.ctx().style().visuals.text_color(), + ui.style().visuals.window_rounding, + egui::Color32::from_rgba_unmultiplied(tc.r(), tc.g(), tc.b(), 4), + egui::Stroke::NONE, ); + if (query + .highlights + .entity_outline_mask(entity_path.hash()) + .overall + .is_some()) + { + // TODO(grtlr): text should be presented in window space. + painter.text( + padded.left_top(), + egui::Align2::LEFT_BOTTOM, + entity_path.to_string(), + egui::FontId::default(), + ui.ctx().style().visuals.text_color(), + ); + } } } From 5e1cdcb567fe3dfaadbe67b9916655cda2088ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 7 Oct 2024 13:12:00 +0200 Subject: [PATCH 036/159] WIP: refactor edges --- .../rerun/archetypes/graph_edges.fbs | 2 +- .../re_types/definitions/rerun/components.fbs | 3 +- ...graph_edge.fbs => graph_edge_directed.fbs} | 6 +- .../components/graph_edge_undirected.fbs | 13 + .../re_types/definitions/rerun/datatypes.fbs | 1 + .../rerun/datatypes/graph_edge.fbs | 18 +- .../rerun/datatypes/graph_location.fbs | 19 + .../re_types/src/archetypes/graph_edges.rs | 16 +- .../re_types/src/components/.gitattributes | 3 +- .../{graph_edge.rs => graph_edge_directed.rs} | 24 +- .../re_types/src/components/graph_edge_ext.rs | 43 -- .../src/components/graph_edge_undirected.rs | 106 +++++ crates/store/re_types/src/components/mod.rs | 7 +- .../re_types/src/datatypes/.gitattributes | 1 + .../re_types/src/datatypes/graph_edge.rs | 368 +----------------- .../re_types/src/datatypes/graph_edge_ext.rs | 22 +- .../re_types/src/datatypes/graph_location.rs | 340 ++++++++++++++++ .../src/datatypes/graph_location_ext.rs | 16 + crates/store/re_types/src/datatypes/mod.rs | 3 + crates/viewer/re_viewer/src/reflection/mod.rs | 17 +- .../reference/types/archetypes/graph_edges.md | 2 +- docs/content/reference/types/components.md | 3 +- .../reference/types/components/.gitattributes | 3 +- .../reference/types/components/graph_edge.md | 22 -- .../types/components/graph_edge_directed.md | 17 + .../types/components/graph_edge_undirected.md | 20 + docs/content/reference/types/datatypes.md | 3 +- .../reference/types/datatypes/.gitattributes | 1 + .../reference/types/datatypes/entity_path.md | 2 +- .../reference/types/datatypes/graph_edge.md | 13 +- .../types/datatypes/graph_location.md | 23 ++ .../types/datatypes/graph_node_id.md | 2 +- examples/rust/graph_view/src/common.rs | 21 - ...s => edge_undirected_visualizer_system.rs} | 39 +- .../rust/graph_view/src/graph_space_view.rs | 90 +++-- examples/rust/graph_view/src/main.rs | 4 +- .../graph_view/src/node_visualizer_system.rs | 25 +- examples/rust/graph_view/src/types.rs | 23 ++ examples/rust/node_link_graph/src/main.rs | 52 ++- .../src/rerun/archetypes/graph_edges.hpp | 6 +- rerun_cpp/src/rerun/components.hpp | 3 +- rerun_cpp/src/rerun/components/.gitattributes | 3 +- ...graph_edge.hpp => graph_edge_directed.hpp} | 24 +- .../components/graph_edge_undirected.hpp | 67 ++++ rerun_cpp/src/rerun/datatypes.hpp | 1 + rerun_cpp/src/rerun/datatypes/.gitattributes | 2 + rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 81 +--- rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 18 +- .../src/rerun/datatypes/graph_location.cpp | 90 +++++ .../src/rerun/datatypes/graph_location.hpp | 58 +++ .../rerun_sdk/rerun/archetypes/graph_edges.py | 4 +- .../rerun_sdk/rerun/components/.gitattributes | 3 +- .../rerun_sdk/rerun/components/__init__.py | 12 +- .../rerun_sdk/rerun/components/graph_edge.py | 40 -- .../rerun/components/graph_edge_directed.py | 36 ++ .../rerun/components/graph_edge_undirected.py | 36 ++ .../rerun_sdk/rerun/datatypes/.gitattributes | 1 + .../rerun_sdk/rerun/datatypes/__init__.py | 12 + .../rerun_sdk/rerun/datatypes/graph_edge.py | 106 ++--- .../rerun/datatypes/graph_location.py | 108 +++++ 60 files changed, 1274 insertions(+), 830 deletions(-) rename crates/store/re_types/definitions/rerun/components/{graph_edge.fbs => graph_edge_directed.fbs} (67%) create mode 100644 crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs rename crates/store/re_types/src/components/{graph_edge.rs => graph_edge_directed.rs} (84%) delete mode 100644 crates/store/re_types/src/components/graph_edge_ext.rs create mode 100644 crates/store/re_types/src/components/graph_edge_undirected.rs create mode 100644 crates/store/re_types/src/datatypes/graph_location.rs create mode 100644 crates/store/re_types/src/datatypes/graph_location_ext.rs delete mode 100644 docs/content/reference/types/components/graph_edge.md create mode 100644 docs/content/reference/types/components/graph_edge_directed.md create mode 100644 docs/content/reference/types/components/graph_edge_undirected.md create mode 100644 docs/content/reference/types/datatypes/graph_location.md delete mode 100644 examples/rust/graph_view/src/common.rs rename examples/rust/graph_view/src/{edge_visualizer_system.rs => edge_undirected_visualizer_system.rs} (74%) create mode 100644 examples/rust/graph_view/src/types.rs rename rerun_cpp/src/rerun/components/{graph_edge.hpp => graph_edge_directed.hpp} (76%) create mode 100644 rerun_cpp/src/rerun/components/graph_edge_undirected.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/graph_location.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/graph_location.hpp delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_location.py diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index c304b985ca0d..4c6a92de2a54 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -11,7 +11,7 @@ table GraphEdges ( // --- Required --- /// A list of node IDs. - edges: [rerun.components.GraphEdge] ("attr.rerun.component_required", order: 1000); + edges: [rerun.components.GraphEdgeUndirected] ("attr.rerun.component_required", order: 1000); // --- Optional --- diff --git a/crates/store/re_types/definitions/rerun/components.fbs b/crates/store/re_types/definitions/rerun/components.fbs index 950d3cd28ce4..6a5d335c3f25 100644 --- a/crates/store/re_types/definitions/rerun/components.fbs +++ b/crates/store/re_types/definitions/rerun/components.fbs @@ -16,7 +16,8 @@ include "./components/entity_path.fbs"; include "./components/fill_mode.fbs"; include "./components/fill_ratio.fbs"; include "./components/gamma_correction.fbs"; -include "./components/graph_edge.fbs"; +include "./components/graph_edge_directed.fbs"; +include "./components/graph_edge_undirected.fbs"; include "./components/graph_node_id.fbs"; include "./components/half_size2d.fbs"; include "./components/half_size3d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs similarity index 67% rename from crates/store/re_types/definitions/rerun/components/graph_edge.fbs rename to crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs index 0c3f75f386f5..483329867309 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs @@ -2,10 +2,8 @@ namespace rerun.components; // --- -/// An edge in a graph connecting two nodes. -/// -/// Depending on the context this could represent a directed or undirected edge. -table GraphEdge ( +/// An undirected edge in a graph connecting two nodes. +table GraphEdgeDirected ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs new file mode 100644 index 000000000000..6788b8ac6061 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs @@ -0,0 +1,13 @@ +namespace rerun.components; + +// --- + +/// An undirected edge in a graph connecting two nodes. +table GraphEdgeUndirected ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + edge: rerun.datatypes.GraphEdge (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 3bdc8d3422f2..8861f2830e64 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -13,6 +13,7 @@ include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; include "./datatypes/graph_edge.fbs"; +include "./datatypes/graph_location.fbs"; include "./datatypes/graph_node_id.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs index 4ab2d797c3df..170216ea1cde 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -1,26 +1,16 @@ -include "entity_path.fbs"; -include "graph_node_id.fbs"; +include "graph_location.fbs"; namespace rerun.datatypes; -/// Represents an edge in a graph connecting two nodes (possible in different entities). -/// -/// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. +/// Represents an edge in a graph connecting two nodes (possibly in different entities). table GraphEdge ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { /// The id of the source node. - source: rerun.datatypes.GraphNodeId (order: 100); + source: rerun.datatypes.GraphLocation (order: 100); /// The id of the target node. - target: rerun.datatypes.GraphNodeId (order: 200); - - /// The entity path of the source node. - // TODO(grtlr): Consider making this a separate datatype that has its own component. - source_entity: rerun.datatypes.EntityPath (order: 300, nullable); - - /// The entity path of the target node. - target_entity: rerun.datatypes.EntityPath (order: 400, nullable); + target: rerun.datatypes.GraphLocation (order: 200); } diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs new file mode 100644 index 000000000000..fbe9a25da3ce --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs @@ -0,0 +1,19 @@ +include "entity_path.fbs"; +include "graph_node_id.fbs"; + +namespace rerun.datatypes; + +/// Uniquely identifies a node in a graph by its entity path and node id. +/// +/// We require this because the same node id can be used in multiple entities. +table GraphLocation ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// The entity path that specifies where to find the node. + entity_path: rerun.datatypes.EntityPath (order: 100); + + /// The id of the node. + node_id: rerun.datatypes.GraphNodeId (order: 200); +} diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs index 385106c68626..20118e3c9b7a 100644 --- a/crates/store/re_types/src/archetypes/graph_edges.rs +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -22,7 +22,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, PartialEq, Eq)] pub struct GraphEdges { /// A list of node IDs. - pub edges: Vec, + pub edges: Vec, /// Optional colors for the boxes. pub colors: Option>, @@ -51,7 +51,7 @@ impl ::re_types_core::SizeBytes for GraphEdges { #[inline] fn is_pod() -> bool { - >::is_pod() + >::is_pod() && >>::is_pod() && >>::is_pod() && >::is_pod() @@ -60,7 +60,7 @@ impl ::re_types_core::SizeBytes for GraphEdges { } static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdge".into()]); + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeUndirected".into()]); static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = once_cell::sync::Lazy::new(|| { @@ -82,7 +82,7 @@ static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = once_cell::sync::Lazy::new(|| { [ - "rerun.components.GraphEdge".into(), + "rerun.components.GraphEdgeUndirected".into(), "rerun.components.Color".into(), "rerun.components.GraphEdgesIndicator".into(), "rerun.components.Text".into(), @@ -150,10 +150,10 @@ impl ::re_types_core::Archetype for GraphEdges { .collect(); let edges = { let array = arrays_by_name - .get("rerun.components.GraphEdge") + .get("rerun.components.GraphEdgeUndirected") .ok_or_else(DeserializationError::missing_data) .with_context("rerun.archetypes.GraphEdges#edges")?; - ::from_arrow_opt(&**array) + ::from_arrow_opt(&**array) .with_context("rerun.archetypes.GraphEdges#edges")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) @@ -246,7 +246,9 @@ impl ::re_types_core::ArchetypeReflectionMarker for GraphEdges {} impl GraphEdges { /// Create a new `GraphEdges`. #[inline] - pub fn new(edges: impl IntoIterator>) -> Self { + pub fn new( + edges: impl IntoIterator>, + ) -> Self { Self { edges: edges.into_iter().map(Into::into).collect(), colors: None, diff --git a/crates/store/re_types/src/components/.gitattributes b/crates/store/re_types/src/components/.gitattributes index d3a36f04667c..bccd38dfe671 100644 --- a/crates/store/re_types/src/components/.gitattributes +++ b/crates/store/re_types/src/components/.gitattributes @@ -16,7 +16,8 @@ entity_path.rs linguist-generated=true fill_mode.rs linguist-generated=true fill_ratio.rs linguist-generated=true gamma_correction.rs linguist-generated=true -graph_edge.rs linguist-generated=true +graph_edge_directed.rs linguist-generated=true +graph_edge_undirected.rs linguist-generated=true graph_node_id.rs linguist-generated=true half_size2d.rs linguist-generated=true half_size3d.rs linguist-generated=true diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge_directed.rs similarity index 84% rename from crates/store/re_types/src/components/graph_edge.rs rename to crates/store/re_types/src/components/graph_edge_directed.rs index d147b41cb852..32590c811970 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge_directed.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,15 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Component**: An edge in a graph connecting two nodes. -/// -/// Depending on the context this could represent a directed or undirected edge. +/// **Component**: An undirected edge in a graph connecting two nodes. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge(pub crate::datatypes::GraphEdge); +pub struct GraphEdgeDirected(pub crate::datatypes::GraphEdge); -impl ::re_types_core::SizeBytes for GraphEdge { +impl ::re_types_core::SizeBytes for GraphEdgeDirected { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -38,20 +36,20 @@ impl ::re_types_core::SizeBytes for GraphEdge { } } -impl> From for GraphEdge { +impl> From for GraphEdgeDirected { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdge { +impl std::borrow::Borrow for GraphEdgeDirected { #[inline] fn borrow(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::Deref for GraphEdge { +impl std::ops::Deref for GraphEdgeDirected { type Target = crate::datatypes::GraphEdge; #[inline] @@ -60,21 +58,21 @@ impl std::ops::Deref for GraphEdge { } } -impl std::ops::DerefMut for GraphEdge { +impl std::ops::DerefMut for GraphEdgeDirected { #[inline] fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdge); +::re_types_core::macros::impl_into_cow!(GraphEdgeDirected); -impl ::re_types_core::Loggable for GraphEdge { +impl ::re_types_core::Loggable for GraphEdgeDirected { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdge".into() + "rerun.components.GraphEdgeDirected".into() } #[inline] diff --git a/crates/store/re_types/src/components/graph_edge_ext.rs b/crates/store/re_types/src/components/graph_edge_ext.rs deleted file mode 100644 index eb35c9732a9c..000000000000 --- a/crates/store/re_types/src/components/graph_edge_ext.rs +++ /dev/null @@ -1,43 +0,0 @@ -use re_log_types::EntityPathHash; -use re_types_core::datatypes::EntityPath; - -use crate::datatypes::{GraphEdge, GraphNodeId}; - -impl super::GraphEdge { - /// Creates a new edge between two nodes. - pub fn new(source: impl Into, target: impl Into) -> Self { - Self(GraphEdge { - source: source.into(), - target: target.into(), - ..Default::default() - }) - } - - /// Returns the hash of the source entity, if it exists. - pub fn source_entity_hash(&self) -> Option { - self.source_entity - .as_ref() - .map(|e| re_log_types::EntityPath::from(e.clone()).hash()) - } - - /// Returns the hash of the target entity, if it exists. - pub fn target_entity_hash(&self) -> Option { - self.target_entity - .as_ref() - .map(|e| re_log_types::EntityPath::from(e.clone()).hash()) - } - - /// Specifies the entity in which the edge originates. - #[inline] - pub fn with_source_in(mut self, path: impl Into) -> Self { - self.0.source_entity = Some(path.into()); - self - } - - /// Specifies the entity in which the edge terminates. - #[inline] - pub fn with_target_in(mut self, path: impl Into) -> Self { - self.0.target_entity = Some(path.into()); - self - } -} diff --git a/crates/store/re_types/src/components/graph_edge_undirected.rs b/crates/store/re_types/src/components/graph_edge_undirected.rs new file mode 100644 index 000000000000..4fed04ebf720 --- /dev/null +++ b/crates/store/re_types/src/components/graph_edge_undirected.rs @@ -0,0 +1,106 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Component**: An undirected edge in a graph connecting two nodes. +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[repr(transparent)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphEdgeUndirected(pub crate::datatypes::GraphEdge); + +impl ::re_types_core::SizeBytes for GraphEdgeUndirected { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.0.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() + } +} + +impl> From for GraphEdgeUndirected { + fn from(v: T) -> Self { + Self(v.into()) + } +} + +impl std::borrow::Borrow for GraphEdgeUndirected { + #[inline] + fn borrow(&self) -> &crate::datatypes::GraphEdge { + &self.0 + } +} + +impl std::ops::Deref for GraphEdgeUndirected { + type Target = crate::datatypes::GraphEdge; + + #[inline] + fn deref(&self) -> &crate::datatypes::GraphEdge { + &self.0 + } +} + +impl std::ops::DerefMut for GraphEdgeUndirected { + #[inline] + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { + &mut self.0 + } +} + +::re_types_core::macros::impl_into_cow!(GraphEdgeUndirected); + +impl ::re_types_core::Loggable for GraphEdgeUndirected { + type Name = ::re_types_core::ComponentName; + + #[inline] + fn name() -> Self::Name { + "rerun.components.GraphEdgeUndirected".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + crate::datatypes::GraphEdge::arrow_datatype() + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { + datum.map(|datum| match datum.into() { + ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), + ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), + }) + })) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) + .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) + } +} diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index bb01ec990aeb..1c0323037b67 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -24,8 +24,8 @@ mod fill_ratio; mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; -mod graph_edge; -mod graph_edge_ext; +mod graph_edge_directed; +mod graph_edge_undirected; mod graph_node_id; mod half_size2d; mod half_size2d_ext; @@ -131,7 +131,8 @@ pub use self::entity_path::EntityPath; pub use self::fill_mode::FillMode; pub use self::fill_ratio::FillRatio; pub use self::gamma_correction::GammaCorrection; -pub use self::graph_edge::GraphEdge; +pub use self::graph_edge_directed::GraphEdgeDirected; +pub use self::graph_edge_undirected::GraphEdgeUndirected; pub use self::graph_node_id::GraphNodeId; pub use self::half_size2d::HalfSize2D; pub use self::half_size3d::HalfSize3D; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index c110e63f174f..3982583ca7c0 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -10,6 +10,7 @@ class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true graph_edge.rs linguist-generated=true +graph_location.rs linguist-generated=true graph_node_id.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index 62d3ed3b35a6..40b9445dc1a2 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -18,40 +18,26 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). -/// -/// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. +/// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge { /// The id of the source node. - pub source: crate::datatypes::GraphNodeId, + pub source: crate::datatypes::GraphLocation, /// The id of the target node. - pub target: crate::datatypes::GraphNodeId, - - /// The entity path of the source node. - pub source_entity: Option, - - /// The entity path of the target node. - pub target_entity: Option, + pub target: crate::datatypes::GraphLocation, } impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn heap_size_bytes(&self) -> u64 { - self.source.heap_size_bytes() - + self.target.heap_size_bytes() - + self.source_entity.heap_size_bytes() - + self.target_entity.heap_size_bytes() + self.source.heap_size_bytes() + self.target.heap_size_bytes() } #[inline] fn is_pod() -> bool { - ::is_pod() - && ::is_pod() - && >::is_pod() - && >::is_pod() + ::is_pod() && ::is_pod() } } @@ -72,24 +58,14 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Struct(std::sync::Arc::new(vec![ Field::new( "source", - ::arrow_datatype(), + ::arrow_datatype(), false, ), Field::new( "target", - ::arrow_datatype(), + ::arrow_datatype(), false, ), - Field::new( - "source_entity", - ::arrow_datatype(), - true, - ), - Field::new( - "target_entity", - ::arrow_datatype(), - true, - ), ])) } @@ -130,28 +106,8 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - source.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = source - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - source_bitmap, - ) - } - .boxed() + _ = source_bitmap; + crate::datatypes::GraphLocation::to_arrow_opt(source)? } }, { @@ -167,106 +123,8 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - target.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = target - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - target_bitmap, - ) - } - .boxed() - } - }, - { - let (somes, source_entity): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum - .as_ref() - .map(|datum| datum.source_entity.clone()) - .flatten(); - (datum.is_some(), datum) - }) - .unzip(); - let source_entity_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - source_entity.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = source_entity - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - source_entity_bitmap, - ) - } - .boxed() - } - }, - { - let (somes, target_entity): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum - .as_ref() - .map(|datum| datum.target_entity.clone()) - .flatten(); - (datum.is_some(), datum) - }) - .unzip(); - let target_entity_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - target_entity.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = target_entity - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - target_entity_bitmap, - ) - } - .boxed() + _ = target_bitmap; + crate::datatypes::GraphLocation::to_arrow_opt(target)? } }, ], @@ -314,51 +172,9 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["source"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#source")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() + crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) .with_context("rerun.datatypes.GraphEdge#source")? .into_iter() - } }; let target = { if !arrays_by_name.contains_key("target") { @@ -369,168 +185,16 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["target"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#target")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() + crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) .with_context("rerun.datatypes.GraphEdge#target")? .into_iter() - } - }; - let source_entity = { - if !arrays_by_name.contains_key("source_entity") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "source_entity", - )) - .with_context("rerun.datatypes.GraphEdge"); - } - let arrow_data = &**arrays_by_name["source_entity"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#source_entity")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#source_entity")? - .into_iter() - } - }; - let target_entity = { - if !arrays_by_name.contains_key("target_entity") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "target_entity", - )) - .with_context("rerun.datatypes.GraphEdge"); - } - let arrow_data = &**arrays_by_name["target_entity"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#target_entity")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#target_entity")? - .into_iter() - } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( - ::itertools::izip!(source, target, source_entity, target_entity), + ::itertools::izip!(source, target), arrow_data.validity(), ) .map(|opt| { - opt.map(|(source, target, source_entity, target_entity)| { + opt.map(|(source, target)| { Ok(Self { source: source .ok_or_else(DeserializationError::missing_data) @@ -538,8 +202,6 @@ impl ::re_types_core::Loggable for GraphEdge { target: target .ok_or_else(DeserializationError::missing_data) .with_context("rerun.datatypes.GraphEdge#target")?, - source_entity, - target_entity, }) }) .transpose() diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs index d0106cf60bc1..d4cd8d4636c1 100644 --- a/crates/store/re_types/src/datatypes/graph_edge_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_edge_ext.rs @@ -1,12 +1,26 @@ -use super::GraphNodeId; +use crate::datatypes::{EntityPath, GraphEdge, GraphLocation, GraphNodeId}; -impl> From<(T, T)> for super::GraphEdge { +impl> From<(T, T)> for GraphEdge { fn from(value: (T, T)) -> Self { Self { source: value.0.into(), target: value.1.into(), - source_entity: None, - target_entity: None, + } + } +} + +impl, N: Into> From<(E, N, N)> for GraphEdge { + fn from(value: (E, N, N)) -> Self { + let entity_path = value.0.into(); + Self { + source: GraphLocation { + entity_path: entity_path.clone(), + node_id: value.1.into(), + }, + target: GraphLocation { + entity_path, + node_id: value.2.into(), + }, } } } diff --git a/crates/store/re_types/src/datatypes/graph_location.rs b/crates/store/re_types/src/datatypes/graph_location.rs new file mode 100644 index 000000000000..a98f0d2a70d5 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_location.rs @@ -0,0 +1,340 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. +/// +/// We require this because the same node id can be used in multiple entities. +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphLocation { + /// The entity path that specifies where to find the node. + pub entity_path: crate::datatypes::EntityPath, + + /// The id of the node. + pub node_id: crate::datatypes::GraphNodeId, +} + +impl ::re_types_core::SizeBytes for GraphLocation { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.entity_path.heap_size_bytes() + self.node_id.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() && ::is_pod() + } +} + +::re_types_core::macros::impl_into_cow!(GraphLocation); + +impl ::re_types_core::Loggable for GraphLocation { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphLocation".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::Struct(std::sync::Arc::new(vec![ + Field::new( + "entity_path", + ::arrow_datatype(), + false, + ), + Field::new( + "node_id", + ::arrow_datatype(), + false, + ), + ])) + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + (datum.is_some(), datum) + }) + .unzip(); + let bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + StructArray::new( + Self::arrow_datatype(), + vec![ + { + let (somes, entity_path): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.entity_path.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let entity_path_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + entity_path.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = entity_path + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + entity_path_bitmap, + ) + } + .boxed() + } + }, + { + let (somes, node_id): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.node_id.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let node_id_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + node_id.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = node_id + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + node_id_bitmap, + ) + } + .boxed() + } + }, + ], + bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok({ + let arrow_data = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation")?; + if arrow_data.is_empty() { + Vec::new() + } else { + let (arrow_data_fields, arrow_data_arrays) = + (arrow_data.fields(), arrow_data.values()); + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields + .iter() + .map(|field| field.name.as_str()) + .zip(arrow_data_arrays) + .collect(); + let entity_path = { + if !arrays_by_name.contains_key("entity_path") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "entity_path", + )) + .with_context("rerun.datatypes.GraphLocation"); + } + let arrow_data = &**arrays_by_name["entity_path"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation#entity_path")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphLocation#entity_path")? + .into_iter() + } + }; + let node_id = { + if !arrays_by_name.contains_key("node_id") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "node_id", + )) + .with_context("rerun.datatypes.GraphLocation"); + } + let arrow_data = &**arrays_by_name["node_id"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation#node_id")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphLocation#node_id")? + .into_iter() + } + }; + arrow2::bitmap::utils::ZipValidity::new_with_validity( + ::itertools::izip!(entity_path, node_id), + arrow_data.validity(), + ) + .map(|opt| { + opt.map(|(entity_path, node_id)| { + Ok(Self { + entity_path: entity_path + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphLocation#entity_path")?, + node_id: node_id + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphLocation#node_id")?, + }) + }) + .transpose() + }) + .collect::>>() + .with_context("rerun.datatypes.GraphLocation")? + } + }) + } +} diff --git a/crates/store/re_types/src/datatypes/graph_location_ext.rs b/crates/store/re_types/src/datatypes/graph_location_ext.rs new file mode 100644 index 000000000000..44a3df63889c --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_location_ext.rs @@ -0,0 +1,16 @@ +use crate::datatypes::{EntityPath, GraphNodeId}; + +impl, N: Into> From<(E, N)> for super::GraphLocation { + fn from(value: (E, N)) -> Self { + Self { + entity_path: value.0.into(), + node_id: value.1.into(), + } + } +} + +impl std::fmt::Display for super::GraphLocation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{:?}", self.node_id, self.entity_path) + } +} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index ae7ba1d40427..2b31d3f54759 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -18,6 +18,8 @@ mod color_model; mod color_model_ext; mod graph_edge; mod graph_edge_ext; +mod graph_location; +mod graph_location_ext; mod graph_node_id; mod graph_node_id_ext; mod image_format; @@ -79,6 +81,7 @@ pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; pub use self::graph_edge::GraphEdge; +pub use self::graph_location::GraphLocation; pub use self::graph_node_id::GraphNodeId; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index d1e01954a8d2..633b566e0737 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -371,10 +371,17 @@ fn generate_component_reflection() -> Result::name(), + ::name(), ComponentReflection { - docstring_md: "An edge in a graph connecting two nodes.\n\nDepending on the context this could represent a directed or undirected edge.", - placeholder: Some(GraphEdge::default().to_arrow()?), + docstring_md: "An undirected edge in a graph connecting two nodes.", + placeholder: Some(GraphEdgeDirected::default().to_arrow()?), + }, + ), + ( + ::name(), + ComponentReflection { + docstring_md: "An undirected edge in a graph connecting two nodes.", + placeholder: Some(GraphEdgeUndirected::default().to_arrow()?), }, ), ( @@ -1078,8 +1085,8 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { display_name: "Graph edges", fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdge".into(), display_name : "Edges", - docstring_md : "A list of node IDs.", is_required : true, }, + "rerun.components.GraphEdgeUndirected".into(), display_name : + "Edges", docstring_md : "A list of node IDs.", is_required : true, }, ArchetypeFieldReflection { component_name : "rerun.components.Color" .into(), display_name : "Colors", docstring_md : "Optional colors for the boxes.", is_required : false, }, diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges.md index 128b5d5b9c48..d1e33e26adcf 100644 --- a/docs/content/reference/types/archetypes/graph_edges.md +++ b/docs/content/reference/types/archetypes/graph_edges.md @@ -7,7 +7,7 @@ A list of nodes in a graph with optional labels, colors, etc. ## Components -**Required**: [`GraphEdge`](../components/graph_edge.md) +**Required**: [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) **Recommended**: [`Color`](../components/color.md) diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 38d60b4ffcb8..8d1effb26a23 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,7 +29,8 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. -* [`GraphEdge`](components/graph_edge.md): An edge in a graph connecting two nodes. +* [`GraphEdgeDirected`](components/graph_edge_directed.md): An undirected edge in a graph connecting two nodes. +* [`GraphEdgeUndirected`](components/graph_edge_undirected.md): An undirected edge in a graph connecting two nodes. * [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. * [`HalfSize3D`](components/half_size3d.md): Half-size (radius) of a 3D box. diff --git a/docs/content/reference/types/components/.gitattributes b/docs/content/reference/types/components/.gitattributes index ba6eaac44f4f..9dc8fc370a5c 100644 --- a/docs/content/reference/types/components/.gitattributes +++ b/docs/content/reference/types/components/.gitattributes @@ -17,7 +17,8 @@ entity_path.md linguist-generated=true fill_mode.md linguist-generated=true fill_ratio.md linguist-generated=true gamma_correction.md linguist-generated=true -graph_edge.md linguist-generated=true +graph_edge_directed.md linguist-generated=true +graph_edge_undirected.md linguist-generated=true graph_node_id.md linguist-generated=true half_size2d.md linguist-generated=true half_size3d.md linguist-generated=true diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md deleted file mode 100644 index 37f3ad9acf41..000000000000 --- a/docs/content/reference/types/components/graph_edge.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "GraphEdge" ---- - - -An edge in a graph connecting two nodes. - -Depending on the context this could represent a directed or undirected edge. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) - * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) - * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) - - -## Used by - -* [`GraphEdges`](../archetypes/graph_edges.md) diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md new file mode 100644 index 000000000000..5623728a8ebd --- /dev/null +++ b/docs/content/reference/types/components/graph_edge_directed.md @@ -0,0 +1,17 @@ +--- +title: "GraphEdgeDirected" +--- + + +An undirected edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeDirected.html) + * 🐍 [Python API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeDirected) + * 🦀 [Rust API docs for `GraphEdgeDirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeDirected.html) + + diff --git a/docs/content/reference/types/components/graph_edge_undirected.md b/docs/content/reference/types/components/graph_edge_undirected.md new file mode 100644 index 000000000000..b34c4c4ee0e4 --- /dev/null +++ b/docs/content/reference/types/components/graph_edge_undirected.md @@ -0,0 +1,20 @@ +--- +title: "GraphEdgeUndirected" +--- + + +An undirected edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeUndirected.html) + * 🐍 [Python API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeUndirected) + * 🦀 [Rust API docs for `GraphEdgeUndirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeUndirected.html) + + +## Used by + +* [`GraphEdges`](../archetypes/graph_edges.md) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index b27e0c5eee24..93d33a4fca88 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -19,7 +19,8 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`EntityPath`](datatypes/entity_path.md): A path to an entity in the `ChunkStore`. * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. -* [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possible in different entities). +* [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possibly in different entities). +* [`GraphLocation`](datatypes/graph_location.md): Uniquely identifies a node in a graph by its entity path and node id. * [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index ea39b47a81e6..4a855f2d725d 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -14,6 +14,7 @@ entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true graph_edge.md linguist-generated=true +graph_location.md linguist-generated=true graph_node_id.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/entity_path.md b/docs/content/reference/types/datatypes/entity_path.md index d5e56de00fa6..3685222b8dd1 100644 --- a/docs/content/reference/types/datatypes/entity_path.md +++ b/docs/content/reference/types/datatypes/entity_path.md @@ -18,4 +18,4 @@ A path to an entity in the `ChunkStore`. ## Used by * [`EntityPath`](../components/entity_path.md?speculative-link) -* [`GraphEdge`](../datatypes/graph_edge.md) +* [`GraphLocation`](../datatypes/graph_location.md) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md index 7d2d9e954ce1..c739d535bf7d 100644 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -3,16 +3,12 @@ title: "GraphEdge" --- -Represents an edge in a graph connecting two nodes (possible in different entities). - -If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. +Represents an edge in a graph connecting two nodes (possibly in different entities). ## Fields -* source: [`GraphNodeId`](../datatypes/graph_node_id.md) -* target: [`GraphNodeId`](../datatypes/graph_node_id.md) -* source_entity: [`EntityPath`](../datatypes/entity_path.md) -* target_entity: [`EntityPath`](../datatypes/entity_path.md) +* source: [`GraphLocation`](../datatypes/graph_location.md) +* target: [`GraphLocation`](../datatypes/graph_location.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) @@ -22,4 +18,5 @@ If `source_entity` or `target_entity` is left out then the node id is assumed to ## Used by -* [`GraphEdge`](../components/graph_edge.md) +* [`GraphEdgeDirected`](../components/graph_edge_directed.md) +* [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) diff --git a/docs/content/reference/types/datatypes/graph_location.md b/docs/content/reference/types/datatypes/graph_location.md new file mode 100644 index 000000000000..73c4bb451fc3 --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_location.md @@ -0,0 +1,23 @@ +--- +title: "GraphLocation" +--- + + +Uniquely identifies a node in a graph by its entity path and node id. + +We require this because the same node id can be used in multiple entities. + +## Fields + +* entity_path: [`EntityPath`](../datatypes/entity_path.md) +* node_id: [`GraphNodeId`](../datatypes/graph_node_id.md) + +## API reference links + * 🌊 [C++ API docs for `GraphLocation`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphLocation.html) + * 🐍 [Python API docs for `GraphLocation`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphLocation) + * 🦀 [Rust API docs for `GraphLocation`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphLocation.html) + + +## Used by + +* [`GraphEdge`](../datatypes/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md index 3d947f1a6f05..960ff2c6617c 100644 --- a/docs/content/reference/types/datatypes/graph_node_id.md +++ b/docs/content/reference/types/datatypes/graph_node_id.md @@ -17,5 +17,5 @@ A 32-bit ID representing a node in a graph. ## Used by -* [`GraphEdge`](../datatypes/graph_edge.md) +* [`GraphLocation`](../datatypes/graph_location.md) * [`GraphNodeId`](../components/graph_node_id.md) diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs deleted file mode 100644 index e637f4e88a73..000000000000 --- a/examples/rust/graph_view/src/common.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::hash::Hash; - -use re_viewer::external::re_types::datatypes; - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub(crate) struct QualifiedNode { - pub entity_hash: re_log_types::EntityPathHash, - pub node_id: datatypes::GraphNodeId, -} - -impl std::fmt::Display for QualifiedNode { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_hash) - } -} - -#[derive(Debug, Hash)] -pub(crate) struct QualifiedEdge { - pub source: QualifiedNode, - pub target: QualifiedNode, -} diff --git a/examples/rust/graph_view/src/edge_visualizer_system.rs b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs similarity index 74% rename from examples/rust/graph_view/src/edge_visualizer_system.rs rename to examples/rust/graph_view/src/edge_undirected_visualizer_system.rs index fb2da7a59e66..82918a1e0326 100644 --- a/examples/rust/graph_view/src/edge_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs @@ -13,39 +13,28 @@ use re_viewer::external::{ }, }; -use crate::common::{QualifiedEdge, QualifiedNode}; - #[derive(Default)] -pub struct GraphEdgeVisualizer { - pub(crate) data: Vec, +pub struct EdgeUndirectedVisualizer { + pub(crate) data: Vec, } -pub(crate) struct GraphEdgeVisualizerData { +pub(crate) struct EdgeUndirectedVisualizerData { pub entity_path: re_log_types::EntityPath, - edges: ChunkComponentIterItem, + edges: ChunkComponentIterItem, colors: ChunkComponentIterItem, } pub(crate) struct EdgeInstance<'a> { - pub edge: QualifiedEdge, + pub edge: &'a components::GraphEdgeUndirected, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, } -impl GraphEdgeVisualizerData { +impl EdgeUndirectedVisualizerData { pub(crate) fn edges(&self) -> impl Iterator { clamped_zip_2x1( - self.edges.iter().map(|e| QualifiedEdge { - source: QualifiedNode { - entity_hash: e.source_entity_hash().unwrap_or(self.entity_path.hash()), - node_id: e.source.clone(), - }, - target: QualifiedNode { - entity_hash: e.target_entity_hash().unwrap_or(self.entity_path.hash()), - node_id: e.target.clone(), - }, - }), + self.edges.iter(), (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, @@ -59,13 +48,13 @@ impl GraphEdgeVisualizerData { } } -impl IdentifiedViewSystem for GraphEdgeVisualizer { +impl IdentifiedViewSystem for EdgeUndirectedVisualizer { fn identifier() -> ViewSystemIdentifier { - "GraphEdges".into() + "GraphEdgesUndirected".into() } } -impl VisualizerSystem for GraphEdgeVisualizer { +impl VisualizerSystem for EdgeUndirectedVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { VisualizerQueryInfo::from_archetype::() } @@ -86,16 +75,16 @@ impl VisualizerSystem for GraphEdgeVisualizer { &timeline_query, ); - let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdge::name()); + let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdgeUndirected::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); let data = range_zip_1x1( - all_indexed_edges.component::(), + all_indexed_edges.component::(), all_colors.component::(), ); for (_index, edges, colors) in data { - self.data.push(GraphEdgeVisualizerData { + self.data.push(EdgeUndirectedVisualizerData { entity_path: data_result.entity_path.clone(), edges, colors: colors.unwrap_or_default(), @@ -117,4 +106,4 @@ impl VisualizerSystem for GraphEdgeVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(GraphEdgeVisualizer => []); +re_viewer_context::impl_component_fallback_provider!(EdgeUndirectedVisualizer => []); diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index e83a6719ed64..4ddca0bb5f68 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -2,57 +2,68 @@ use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; use std::collections::HashMap; use re_viewer::external::{ - egui::{self, emath::TSTransform, TextWrapMode}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, re_types::SpaceViewClassIdentifier, re_ui, re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, Item, SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext - } + egui::{self, emath::TSTransform, TextWrapMode}, + re_entity_db::InstancePath, + re_log::external::log, + re_log_types::EntityPath, + re_types::{datatypes, SpaceViewClassIdentifier}, + re_ui, + re_viewer_context::{ + HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, Item, SelectionHighlight, + SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, + SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, + SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, + ViewQuery, ViewerContext, + }, }; use crate::{ - common::QualifiedEdge, - edge_visualizer_system::EdgeInstance, + edge_undirected_visualizer_system::EdgeInstance, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; -use crate::{common::QualifiedNode, edge_visualizer_system::GraphEdgeVisualizer}; +use crate::{edge_undirected_visualizer_system::EdgeUndirectedVisualizer, types::NodeLocation}; fn measure_node_sizes<'a>( ui: &mut egui::Ui, nodes: impl Iterator>, -) -> Vec<(QualifiedNode, egui::Vec2)> { +) -> Vec<(NodeLocation, egui::Vec2)> { let mut sizes = Vec::new(); let ctx = ui.ctx(); ctx.request_discard("measuring node sizes"); ui.horizontal(|ui| { for node in nodes { let response = node.draw(ui, InteractionHighlight::default()); - sizes.push((node.node_id.clone(), response.rect.size())); + sizes.push((node.location.clone(), response.rect.size())); } }); sizes } -fn compute_layout( - nodes: impl Iterator, - edges: impl Iterator, -) -> HashMap { +fn compute_layout<'a>( + nodes: impl Iterator, + edges: impl Iterator, +) -> HashMap { let mut node_to_index = HashMap::new(); let mut graph: ForceGraph = ForceGraph::default(); // TODO(grtlr): `fdg` does not account for node sizes out of the box. for (node_id, size) in nodes { let ix = graph.add_force_node( - node_id.to_string(), + format!("{:?}", node_id), NodeKind::Regular(node_id.clone(), size), ); node_to_index.insert(node_id, ix); } - for QualifiedEdge { source, target } in edges { - let source_ix = *node_to_index - .entry(source.clone()) - .or_insert(graph.add_force_node(source.to_string(), NodeKind::Dummy(source))); - let target_ix = *node_to_index - .entry(target.clone()) - .or_insert(graph.add_force_node(target.to_string(), NodeKind::Dummy(target))); + for datatypes::GraphEdge { source, target } in edges { + let source = NodeLocation::from(source.clone()); + let target = NodeLocation::from(target.clone()); + let source_ix = *node_to_index.entry(source.clone()).or_insert( + graph.add_force_node(format!("{:?}", source), NodeKind::Dummy(source.clone())), + ); + let target_ix = *node_to_index.entry(target.clone()).or_insert( + graph.add_force_node(format!("{:?}", target), NodeKind::Dummy(target.clone())), + ); graph.add_edge(source_ix, target_ix, ()); } @@ -113,14 +124,14 @@ fn fit_bounding_rect_to_screen( // We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. enum NodeKind { - Regular(QualifiedNode, egui::Vec2), - Dummy(QualifiedNode), + Regular(NodeLocation, egui::Vec2), + Dummy(NodeLocation), } impl<'a> NodeInstance<'a> { fn text(&self) -> egui::RichText { self.label.map_or( - egui::RichText::new(format!("{}@{}", self.node_id.node_id, self.entity_path)), + egui::RichText::new(self.location.node_id.to_string()), |label| egui::RichText::new(label.to_string()), ) } @@ -143,10 +154,7 @@ impl<'a> NodeInstance<'a> { egui::Frame::default() .rounding(egui::Rounding::same(4.0)) - .stroke(egui::Stroke::new( - 1.0, - ui.style().visuals.text_color(), - )) + .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) .inner_margin(egui::Vec2::new(6.0, 4.0)) .fill(bg) .show(ui, |ui| { @@ -169,7 +177,7 @@ pub struct GraphSpaceViewState { world_to_view: TSTransform, /// Positions of the nodes in world space. - layout: Option>, + layout: Option>, } impl SpaceViewState for GraphSpaceViewState { @@ -210,7 +218,7 @@ impl SpaceViewClass for GraphSpaceView { system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_visualizer::()?; - system_registry.register_visualizer::() + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -271,7 +279,9 @@ impl SpaceViewClass for GraphSpaceView { system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let node_system = system_output.view_systems.get::()?; - let edge_system = system_output.view_systems.get::()?; + let edge_system = system_output + .view_systems + .get::()?; let state = state.downcast_mut::()?; let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); @@ -285,7 +295,7 @@ impl SpaceViewClass for GraphSpaceView { edge_system .data .iter() - .flat_map(|d| d.edges().map(|e| e.edge)), + .flat_map(|d| d.edges().map(|e| &e.edge.0)), ); if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { @@ -382,9 +392,9 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let current_extent = layout - .get(&node.node_id) + .get(&node.location) .expect("missing layout information for node"); - let response = egui::Area::new(id.with((node.node_id.clone(), node.instance))) + let response = egui::Area::new(id.with((node.location.clone(), node.instance))) .current_pos(current_extent.min) .order(egui::Order::Middle) .constrain(false) @@ -395,11 +405,13 @@ impl SpaceViewClass for GraphSpaceView { }) .response; - let instance = InstancePath::instance(node.entity_path.clone(), node.instance); - ctx.select_hovered_on_click(&response, Item::DataResult(query.space_view_id, instance)); - + let instance = InstancePath::instance(data.entity_path.clone(), node.instance); + ctx.select_hovered_on_click( + &response, + Item::DataResult(query.space_view_id, instance), + ); - layout.insert(node.node_id.clone(), response.rect); + layout.insert(node.location.clone(), response.rect); entity_rect = entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); @@ -455,7 +467,7 @@ impl SpaceViewClass for GraphSpaceView { { // TODO(grtlr): This does not handle dummy nodes correctly. if let (Some(source_pos), Some(target_pos)) = - (layout.get(&edge.source), layout.get(&edge.target)) + (layout.get(&edge.0.source.clone().into()), layout.get(&edge.0.target.clone().into())) { let highlight = ent_highlight.index_highlight(instance); @@ -470,7 +482,7 @@ impl SpaceViewClass for GraphSpaceView { } }; - let response = egui::Area::new(id.with((edge, instance))) + let response = egui::Area::new(id.with((data.entity_path.hash(), instance))) .current_pos(source_pos.center()) .order(egui::Order::Background) .constrain(false) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index e5cb44f679e8..675ee3bbebb2 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,10 +2,10 @@ use re_viewer::external::{re_log, re_memory}; -mod common; -mod edge_visualizer_system; +mod edge_undirected_visualizer_system; mod graph_space_view; mod node_visualizer_system; +mod types; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index e7c8b1301843..b9ef2d55d022 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -6,7 +6,11 @@ use re_viewer::external::{ re_query::{clamped_zip_2x2, range_zip_1x3}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{self, archetypes, components, ArrowString, Loggable as _}, + re_types::{ + self, archetypes, + components::{self}, + datatypes, ArrowString, Loggable as _, + }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -14,7 +18,7 @@ use re_viewer::external::{ }, }; -use crate::common::QualifiedNode; +use crate::types::NodeLocation; /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] @@ -35,8 +39,7 @@ pub(crate) struct GraphNodeVisualizerData { } pub(crate) struct NodeInstance<'a> { - pub node_id: QualifiedNode, - pub entity_path: &'a EntityPath, + pub location: NodeLocation, pub instance: Instance, pub label: Option<&'a ArrowString>, pub color: Option, @@ -44,11 +47,9 @@ pub(crate) struct NodeInstance<'a> { impl GraphNodeVisualizerData { pub(crate) fn nodes(&self) -> impl Iterator { + let entity_hash = self.entity_path.hash(); clamped_zip_2x2( - self.node_ids.iter().map(|node_id| QualifiedNode { - entity_hash: self.entity_path.hash(), - node_id: node_id.0.clone(), - }), + self.node_ids.iter(), (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, @@ -61,9 +62,11 @@ impl GraphNodeVisualizerData { }), Option::<&ArrowString>::default, ) - .map(|(node_id, instance, color, label)| NodeInstance { - node_id, - entity_path: &self.entity_path, + .map(move |(node_id, instance, color, label)| NodeInstance { + location: NodeLocation { + entity_hash, + node_id: node_id.0.clone(), + }, instance, color: color.map(|c| Color32::from(c.0)), label, diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs new file mode 100644 index 000000000000..4e0d96a2e8c3 --- /dev/null +++ b/examples/rust/graph_view/src/types.rs @@ -0,0 +1,23 @@ +use re_log_types::{EntityPath, EntityPathHash}; +use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; + +#[derive(Clone, PartialEq, Eq, Hash)] +pub(crate) struct NodeLocation { + pub entity_hash: EntityPathHash, + pub node_id: GraphNodeId, +} + +impl From for NodeLocation { + fn from(location: GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path).hash(), + node_id: location.node_id, + } + } +} + +impl std::fmt::Debug for NodeLocation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{:?}", self.node_id, self.entity_hash) + } +} diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 1f720baae9cc..a9863f74ff05 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -5,8 +5,8 @@ //! cargo run -p minimal_options -- --help //! ``` -use rerun::components::GraphEdge; -use rerun::external::re_log; +use rerun::components::GraphEdgeUndirected; +use rerun::external::{log, re_log}; use rerun::{Color, GraphEdges, GraphNodes}; @@ -36,51 +36,49 @@ fn main() -> anyhow::Result<()> { fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); rec.log( - "kitchen/objects", + "kitchen/nodes", &GraphNodes::new(["sink", "fridge"]) .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), )?; - rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; - rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; + + rec.log("kitchen/nodes", &GraphNodes::new(["area0", "area1"]))?; + rec.log( + "kitchen/edges", + &GraphEdges::new([("kitchen/nodes", "area0", "area1")]), + )?; rec.set_time_sequence("frame", 1); - rec.log("hallway/areas", &GraphNodes::new(["area0"]))?; + rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; rec.set_time_sequence("frame", 2); - rec.log("living/objects", &GraphNodes::new(["table"]))?; + rec.log("living/nodes", &GraphNodes::new(["table"]))?; rec.log( - "living/areas", + "living/nodes", &GraphNodes::new(["area0", "area1", "area2"]), )?; rec.log( - "living/areas", - &GraphEdges::new([("area0", "area1"), ("area0", "area2"), ("area1", "area2")]), + "living/edges", + &GraphEdges::new([ + ("living/nodes", "area0", "area1"), + ("living/nodes", "area0", "area2"), + ("living/nodes", "area1", "area2"), + ]), )?; rec.log( - "doors", + "doors/edges", &GraphEdges::new([ - GraphEdge::new("area1", "area0") - .with_source_in("kitchen/areas") - .with_target_in("hallway/areas"), - GraphEdge::new("area0", "area2") - .with_source_in("hallway/areas") - .with_target_in("living/areas"), + (("kitchen/nodes", "area0"), ("hallway/nodes", "area0")), + (("hallway/nodes", "area0"), ("living/nodes", "area2")), ]), )?; rec.log( - "reachable", + "edges", &GraphEdges::new([ - GraphEdge::new("area0", "sink") - .with_source_in("kitchen/areas") - .with_target_in("kitchen/objects"), - GraphEdge::new("area1", "fridge") - .with_source_in("kitchen/areas") - .with_target_in("kitchen/objects"), - GraphEdge::new("area1", "table") - .with_source_in("living/areas") - .with_target_in("living/objects"), + ("kitchen/nodes", "area0", "sink"), + ("kitchen/nodes", "area1", "fridge"), + ("living/nodes", "area1", "table"), ]), )?; diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp index c762817ecff6..3140eb934e10 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp @@ -8,7 +8,7 @@ #include "../component_batch.hpp" #include "../components/class_id.hpp" #include "../components/color.hpp" -#include "../components/graph_edge.hpp" +#include "../components/graph_edge_undirected.hpp" #include "../components/show_labels.hpp" #include "../components/text.hpp" #include "../indicator_component.hpp" @@ -23,7 +23,7 @@ namespace rerun::archetypes { /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. struct GraphEdges { /// A list of node IDs. - Collection edges; + Collection edges; /// Optional colors for the boxes. std::optional> colors; @@ -50,7 +50,7 @@ namespace rerun::archetypes { GraphEdges() = default; GraphEdges(GraphEdges&& other) = default; - explicit GraphEdges(Collection _edges) + explicit GraphEdges(Collection _edges) : edges(std::move(_edges)) {} /// Optional colors for the boxes. diff --git a/rerun_cpp/src/rerun/components.hpp b/rerun_cpp/src/rerun/components.hpp index 4d31b84e7ce9..33653f4e4020 100644 --- a/rerun_cpp/src/rerun/components.hpp +++ b/rerun_cpp/src/rerun/components.hpp @@ -18,7 +18,8 @@ #include "components/fill_mode.hpp" #include "components/fill_ratio.hpp" #include "components/gamma_correction.hpp" -#include "components/graph_edge.hpp" +#include "components/graph_edge_directed.hpp" +#include "components/graph_edge_undirected.hpp" #include "components/graph_node_id.hpp" #include "components/half_size2d.hpp" #include "components/half_size3d.hpp" diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 4dc159087f01..370edb1baa02 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,7 +21,8 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true -graph_edge.hpp linguist-generated=true +graph_edge_directed.hpp linguist-generated=true +graph_edge_undirected.hpp linguist-generated=true graph_node_id.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge_directed.hpp similarity index 76% rename from rerun_cpp/src/rerun/components/graph_edge.hpp rename to rerun_cpp/src/rerun/components/graph_edge_directed.hpp index 552f89ef2f46..83cbe1e40020 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge_directed.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". #pragma once @@ -11,18 +11,16 @@ #include namespace rerun::components { - /// **Component**: An edge in a graph connecting two nodes. - /// - /// Depending on the context this could represent a directed or undirected edge. - struct GraphEdge { + /// **Component**: An undirected edge in a graph connecting two nodes. + struct GraphEdgeDirected { rerun::datatypes::GraphEdge edge; public: - GraphEdge() = default; + GraphEdgeDirected() = default; - GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphEdgeDirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { + GraphEdgeDirected& operator=(rerun::datatypes::GraphEdge edge_) { edge = std::move(edge_); return *this; } @@ -35,21 +33,21 @@ namespace rerun::components { } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeDirected)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdge"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdgeDirected"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. + /// Serializes an array of `rerun::components::GraphEdgeDirected` into an arrow array. static Result> to_arrow( - const components::GraphEdge* instances, size_t num_instances + const components::GraphEdgeDirected* instances, size_t num_instances ) { if (num_instances == 0) { return Loggable::to_arrow(nullptr, 0); diff --git a/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp b/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp new file mode 100644 index 000000000000..f949d4040277 --- /dev/null +++ b/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp @@ -0,0 +1,67 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". + +#pragma once + +#include "../datatypes/graph_edge.hpp" +#include "../result.hpp" + +#include +#include +#include + +namespace rerun::components { + /// **Component**: An undirected edge in a graph connecting two nodes. + struct GraphEdgeUndirected { + rerun::datatypes::GraphEdge edge; + + public: + GraphEdgeUndirected() = default; + + GraphEdgeUndirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + + GraphEdgeUndirected& operator=(rerun::datatypes::GraphEdge edge_) { + edge = std::move(edge_); + return *this; + } + + /// Cast to the underlying GraphEdge datatype + operator rerun::datatypes::GraphEdge() const { + return edge; + } + }; +} // namespace rerun::components + +namespace rerun { + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeUndirected)); + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdgeUndirected"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype() { + return Loggable::arrow_datatype(); + } + + /// Serializes an array of `rerun::components::GraphEdgeUndirected` into an arrow array. + static Result> to_arrow( + const components::GraphEdgeUndirected* instances, size_t num_instances + ) { + if (num_instances == 0) { + return Loggable::to_arrow(nullptr, 0); + } else if (instances == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Passed array instances is null when num_elements> 0." + ); + } else { + return Loggable::to_arrow( + &instances->edge, + num_instances + ); + } + } + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index d690f1863482..de1b06885622 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -15,6 +15,7 @@ #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" #include "datatypes/graph_edge.hpp" +#include "datatypes/graph_location.hpp" #include "datatypes/graph_node_id.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 719f27e27a45..923a0a15924f 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -27,6 +27,8 @@ float64.cpp linguist-generated=true float64.hpp linguist-generated=true graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true +graph_location.cpp linguist-generated=true +graph_location.hpp linguist-generated=true graph_node_id.cpp linguist-generated=true graph_node_id.hpp linguist-generated=true image_format.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp index 54308af4ae91..28f4e9286da8 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -3,8 +3,7 @@ #include "graph_edge.hpp" -#include "entity_path.hpp" -#include "graph_node_id.hpp" +#include "graph_location.hpp" #include #include @@ -16,24 +15,14 @@ namespace rerun { static const auto datatype = arrow::struct_({ arrow::field( "source", - Loggable::arrow_datatype(), + Loggable::arrow_datatype(), false ), arrow::field( "target", - Loggable::arrow_datatype(), + Loggable::arrow_datatype(), false ), - arrow::field( - "source_entity", - Loggable::arrow_datatype(), - true - ), - arrow::field( - "target_entity", - Loggable::arrow_datatype(), - true - ), }); return datatype; } @@ -72,61 +61,29 @@ namespace rerun { } { - auto field_builder = static_cast(builder->field_builder(0)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].source, - 1 - )); - } - } - { - auto field_builder = static_cast(builder->field_builder(1)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].target, - 1 - )); - } - } - { - auto field_builder = static_cast(builder->field_builder(2)); + auto field_builder = static_cast(builder->field_builder(0)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - const auto& element = elements[elem_idx]; - if (element.source_entity.has_value()) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &element.source_entity.value(), - 1 - ) - ); - } else { - ARROW_RETURN_NOT_OK(field_builder->AppendNull()); - } + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].source, + 1 + ) + ); } } { - auto field_builder = static_cast(builder->field_builder(3)); + auto field_builder = static_cast(builder->field_builder(1)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - const auto& element = elements[elem_idx]; - if (element.target_entity.has_value()) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &element.target_entity.value(), - 1 - ) - ); - } else { - ARROW_RETURN_NOT_OK(field_builder->AppendNull()); - } + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].target, + 1 + ) + ); } } ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp index a4ebe2383412..eec468dc4e75 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -4,12 +4,10 @@ #pragma once #include "../result.hpp" -#include "entity_path.hpp" -#include "graph_node_id.hpp" +#include "graph_location.hpp" #include #include -#include namespace arrow { class Array; @@ -18,21 +16,13 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). - /// - /// If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. + /// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). struct GraphEdge { /// The id of the source node. - rerun::datatypes::GraphNodeId source; + rerun::datatypes::GraphLocation source; /// The id of the target node. - rerun::datatypes::GraphNodeId target; - - /// The entity path of the source node. - std::optional source_entity; - - /// The entity path of the target node. - std::optional target_entity; + rerun::datatypes::GraphLocation target; public: GraphEdge() = default; diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.cpp b/rerun_cpp/src/rerun/datatypes/graph_location.cpp new file mode 100644 index 000000000000..5d7620f53c3e --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_location.cpp @@ -0,0 +1,90 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +#include "graph_location.hpp" + +#include "entity_path.hpp" +#include "graph_node_id.hpp" + +#include +#include + +namespace rerun::datatypes {} + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::struct_({ + arrow::field( + "entity_path", + Loggable::arrow_datatype(), + false + ), + arrow::field( + "node_id", + Loggable::arrow_datatype(), + false + ), + }); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphLocation* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + { + auto field_builder = static_cast(builder->field_builder(0)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].entity_path, + 1 + )); + } + } + { + auto field_builder = static_cast(builder->field_builder(1)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].node_id, + 1 + )); + } + } + ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.hpp b/rerun_cpp/src/rerun/datatypes/graph_location.hpp new file mode 100644 index 000000000000..6bb821a792f2 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_location.hpp @@ -0,0 +1,58 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +#pragma once + +#include "../result.hpp" +#include "entity_path.hpp" +#include "graph_node_id.hpp" + +#include +#include + +namespace arrow { + class Array; + class DataType; + class StructBuilder; +} // namespace arrow + +namespace rerun::datatypes { + /// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. + /// + /// We require this because the same node id can be used in multiple entities. + struct GraphLocation { + /// The entity path that specifies where to find the node. + rerun::datatypes::EntityPath entity_path; + + /// The id of the node. + rerun::datatypes::GraphNodeId node_id; + + public: + GraphLocation() = default; + }; +} // namespace rerun::datatypes + +namespace rerun { + template + struct Loggable; + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphLocation"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype(); + + /// Serializes an array of `rerun::datatypes::GraphLocation` into an arrow array. + static Result> to_arrow( + const datatypes::GraphLocation* instances, size_t num_instances + ); + + /// Fills an arrow array builder with an array of this type. + static rerun::Error fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, + size_t num_elements + ); + }; +} // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py index 99d7f6a18624..3d074f5ccd6e 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -74,9 +74,9 @@ def _clear(cls) -> GraphEdges: inst.__attrs_clear__() return inst - edges: components.GraphEdgeBatch = field( + edges: components.GraphEdgeUndirectedBatch = field( metadata={"component": "required"}, - converter=components.GraphEdgeBatch._required, # type: ignore[misc] + converter=components.GraphEdgeUndirectedBatch._required, # type: ignore[misc] ) # A list of node IDs. # diff --git a/rerun_py/rerun_sdk/rerun/components/.gitattributes b/rerun_py/rerun_sdk/rerun/components/.gitattributes index 5ab5fddd81c7..e23a94f9df5d 100644 --- a/rerun_py/rerun_sdk/rerun/components/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/components/.gitattributes @@ -18,7 +18,8 @@ entity_path.py linguist-generated=true fill_mode.py linguist-generated=true fill_ratio.py linguist-generated=true gamma_correction.py linguist-generated=true -graph_edge.py linguist-generated=true +graph_edge_directed.py linguist-generated=true +graph_edge_undirected.py linguist-generated=true graph_node_id.py linguist-generated=true half_size2d.py linguist-generated=true half_size3d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index cee2c0ff17e7..f4c280e724bc 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,7 +30,8 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType -from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType +from .graph_edge_directed import GraphEdgeDirected, GraphEdgeDirectedBatch, GraphEdgeDirectedType +from .graph_edge_undirected import GraphEdgeUndirected, GraphEdgeUndirectedBatch, GraphEdgeUndirectedType from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType @@ -153,9 +154,12 @@ "GammaCorrection", "GammaCorrectionBatch", "GammaCorrectionType", - "GraphEdge", - "GraphEdgeBatch", - "GraphEdgeType", + "GraphEdgeDirected", + "GraphEdgeDirectedBatch", + "GraphEdgeDirectedType", + "GraphEdgeUndirected", + "GraphEdgeUndirectedBatch", + "GraphEdgeUndirectedType", "GraphNodeId", "GraphNodeIdBatch", "GraphNodeIdType", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py deleted file mode 100644 index 19c74c1f346c..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge.py +++ /dev/null @@ -1,40 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". - -# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] - - -class GraphEdge(datatypes.GraphEdge, ComponentMixin): - """ - **Component**: An edge in a graph connecting two nodes. - - Depending on the context this could represent a directed or undirected edge. - """ - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - - # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge - pass - - -class GraphEdgeType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdge" - - -class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeType() - - -# This is patched in late to avoid circular dependencies. -GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py new file mode 100644 index 000000000000..c6335092aff6 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". + +# You can extend this class by creating a "GraphEdgeDirectedExt" class in "graph_edge_directed_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdgeDirected", "GraphEdgeDirectedBatch", "GraphEdgeDirectedType"] + + +class GraphEdgeDirected(datatypes.GraphEdge, ComponentMixin): + """**Component**: An undirected edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeDirectedExt in graph_edge_directed_ext.py + + # Note: there are no fields here because GraphEdgeDirected delegates to datatypes.GraphEdge + pass + + +class GraphEdgeDirectedType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdgeDirected" + + +class GraphEdgeDirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeDirectedType() + + +# This is patched in late to avoid circular dependencies. +GraphEdgeDirected._BATCH_TYPE = GraphEdgeDirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py new file mode 100644 index 000000000000..0519c78ebaae --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". + +# You can extend this class by creating a "GraphEdgeUndirectedExt" class in "graph_edge_undirected_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdgeUndirected", "GraphEdgeUndirectedBatch", "GraphEdgeUndirectedType"] + + +class GraphEdgeUndirected(datatypes.GraphEdge, ComponentMixin): + """**Component**: An undirected edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeUndirectedExt in graph_edge_undirected_ext.py + + # Note: there are no fields here because GraphEdgeUndirected delegates to datatypes.GraphEdge + pass + + +class GraphEdgeUndirectedType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdgeUndirected" + + +class GraphEdgeUndirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeUndirectedType() + + +# This is patched in late to avoid circular dependencies. +GraphEdgeUndirected._BATCH_TYPE = GraphEdgeUndirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index 9b375033b7da..af6b5ed76347 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -15,6 +15,7 @@ entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true graph_edge.py linguist-generated=true +graph_location.py linguist-generated=true graph_node_id.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 78cb9151e458..5428717d75c0 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -39,6 +39,13 @@ from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType +from .graph_location import ( + GraphLocation, + GraphLocationArrayLike, + GraphLocationBatch, + GraphLocationLike, + GraphLocationType, +) from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType @@ -188,6 +195,11 @@ "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType", + "GraphLocation", + "GraphLocationArrayLike", + "GraphLocationBatch", + "GraphLocationLike", + "GraphLocationType", "GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py index 6d287ea3ff5f..3fc8c8953901 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -19,57 +19,11 @@ __all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] -def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: - if isinstance(x, datatypes.GraphNodeId): - return x - else: - return datatypes.GraphNodeId(x) - - -def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: - if isinstance(x, datatypes.GraphNodeId): - return x - else: - return datatypes.GraphNodeId(x) - - -def _graph_edge__source_entity__special_field_converter_override( - x: datatypes.EntityPathLike | None, -) -> datatypes.EntityPath | None: - if x is None: - return None - elif isinstance(x, datatypes.EntityPath): - return x - else: - return datatypes.EntityPath(x) - - -def _graph_edge__target_entity__special_field_converter_override( - x: datatypes.EntityPathLike | None, -) -> datatypes.EntityPath | None: - if x is None: - return None - elif isinstance(x, datatypes.EntityPath): - return x - else: - return datatypes.EntityPath(x) - - @define(init=False) class GraphEdge: - """ - **Datatype**: Represents an edge in a graph connecting two nodes (possible in different entities). - - If `source_entity` or `target_entity` is left out then the node id is assumed to be within the current entity. - """ - - def __init__( - self: Any, - source: datatypes.GraphNodeIdLike, - target: datatypes.GraphNodeIdLike, - source_entity: datatypes.EntityPathLike | None = None, - target_entity: datatypes.EntityPathLike | None = None, - ): + """**Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities).""" + + def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.GraphLocationLike): """ Create a new instance of the GraphEdge datatype. @@ -79,40 +33,22 @@ def __init__( The id of the source node. target: The id of the target node. - source_entity: - The entity path of the source node. - target_entity: - The entity path of the target node. """ # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - self.__attrs_init__(source=source, target=target, source_entity=source_entity, target_entity=target_entity) + self.__attrs_init__(source=source, target=target) - source: datatypes.GraphNodeId = field(converter=_graph_edge__source__special_field_converter_override) + source: datatypes.GraphLocation = field() # The id of the source node. # # (Docstring intentionally commented out to hide this field from the docs) - target: datatypes.GraphNodeId = field(converter=_graph_edge__target__special_field_converter_override) + target: datatypes.GraphLocation = field() # The id of the target node. # # (Docstring intentionally commented out to hide this field from the docs) - source_entity: datatypes.EntityPath | None = field( - default=None, converter=_graph_edge__source_entity__special_field_converter_override - ) - # The entity path of the source node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - target_entity: datatypes.EntityPath | None = field( - default=None, converter=_graph_edge__target_entity__special_field_converter_override - ) - # The entity path of the target node. - # - # (Docstring intentionally commented out to hide this field from the docs) - GraphEdgeLike = GraphEdge GraphEdgeArrayLike = Union[ @@ -128,10 +64,24 @@ def __init__(self) -> None: pa.ExtensionType.__init__( self, pa.struct([ - pa.field("source", pa.utf8(), nullable=False, metadata={}), - pa.field("target", pa.utf8(), nullable=False, metadata={}), - pa.field("source_entity", pa.utf8(), nullable=True, metadata={}), - pa.field("target_entity", pa.utf8(), nullable=True, metadata={}), + pa.field( + "source", + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + nullable=False, + metadata={}, + ), + pa.field( + "target", + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + nullable=False, + metadata={}, + ), ]), self._TYPE_NAME, ) @@ -142,17 +92,15 @@ class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): @staticmethod def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch + from rerun.datatypes import GraphLocationBatch if isinstance(data, GraphEdge): data = [data] return pa.StructArray.from_arrays( [ - GraphNodeIdBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeIdBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - EntityPathBatch([x.source_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - EntityPathBatch([x.target_entity for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphLocationBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphLocationBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] ], fields=list(data_type), ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py new file mode 100644 index 000000000000..1925f78eb0ef --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py @@ -0,0 +1,108 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +# You can extend this class by creating a "GraphLocationExt" class in "graph_location_ext.py". + +from __future__ import annotations + +from typing import Any, Sequence, Union + +import pyarrow as pa +from attrs import define, field + +from .. import datatypes +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphLocation", "GraphLocationArrayLike", "GraphLocationBatch", "GraphLocationLike", "GraphLocationType"] + + +def _graph_location__entity_path__special_field_converter_override(x: datatypes.EntityPathLike) -> datatypes.EntityPath: + if isinstance(x, datatypes.EntityPath): + return x + else: + return datatypes.EntityPath(x) + + +def _graph_location__node_id__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: + if isinstance(x, datatypes.GraphNodeId): + return x + else: + return datatypes.GraphNodeId(x) + + +@define(init=False) +class GraphLocation: + """ + **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. + + We require this because the same node id can be used in multiple entities. + """ + + def __init__(self: Any, entity_path: datatypes.EntityPathLike, node_id: datatypes.GraphNodeIdLike): + """ + Create a new instance of the GraphLocation datatype. + + Parameters + ---------- + entity_path: + The entity path that specifies where to find the node. + node_id: + The id of the node. + + """ + + # You can define your own __init__ function as a member of GraphLocationExt in graph_location_ext.py + self.__attrs_init__(entity_path=entity_path, node_id=node_id) + + entity_path: datatypes.EntityPath = field(converter=_graph_location__entity_path__special_field_converter_override) + # The entity path that specifies where to find the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + node_id: datatypes.GraphNodeId = field(converter=_graph_location__node_id__special_field_converter_override) + # The id of the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + +GraphLocationLike = GraphLocation +GraphLocationArrayLike = Union[ + GraphLocation, + Sequence[GraphLocationLike], +] + + +class GraphLocationType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphLocation" + + def __init__(self) -> None: + pa.ExtensionType.__init__( + self, + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + self._TYPE_NAME, + ) + + +class GraphLocationBatch(BaseBatch[GraphLocationArrayLike]): + _ARROW_TYPE = GraphLocationType() + + @staticmethod + def _native_to_pa_array(data: GraphLocationArrayLike, data_type: pa.DataType) -> pa.Array: + from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch + + if isinstance(data, GraphLocation): + data = [data] + + return pa.StructArray.from_arrays( + [ + EntityPathBatch([x.entity_path for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeIdBatch([x.node_id for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + ], + fields=list(data_type), + ) From ebf5a668a54d0683dfaf322f99bd91139efa66d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 7 Oct 2024 16:38:13 +0200 Subject: [PATCH 037/159] WIP: prepare for dummy nodes --- .../src/edge_undirected_visualizer_system.rs | 8 ++- .../rust/graph_view/src/graph_space_view.rs | 50 +++++++++++++------ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs index 82918a1e0326..becebbcccc96 100644 --- a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs @@ -13,6 +13,8 @@ use re_viewer::external::{ }, }; +use crate::types::NodeLocation; + #[derive(Default)] pub struct EdgeUndirectedVisualizer { pub(crate) data: Vec, @@ -25,7 +27,8 @@ pub(crate) struct EdgeUndirectedVisualizerData { } pub(crate) struct EdgeInstance<'a> { - pub edge: &'a components::GraphEdgeUndirected, + pub source: NodeLocation, + pub target: NodeLocation, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, @@ -40,7 +43,8 @@ impl EdgeUndirectedVisualizerData { Option::<&components::Color>::default, ) .map(|(edge, instance, color)| EdgeInstance { - edge, + source: edge.source.clone().into(), + target: edge.target.clone().into(), entity_path: &self.entity_path, instance, color: color.map(|c| Color32::from(c.0)), diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 4ddca0bb5f68..53bc99130d5a 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -17,23 +17,23 @@ use re_viewer::external::{ }, }; +use crate::{edge_undirected_visualizer_system::EdgeUndirectedVisualizer, types::NodeLocation}; use crate::{ - edge_undirected_visualizer_system::EdgeInstance, + edge_undirected_visualizer_system::{self, EdgeInstance}, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; -use crate::{edge_undirected_visualizer_system::EdgeUndirectedVisualizer, types::NodeLocation}; fn measure_node_sizes<'a>( ui: &mut egui::Ui, nodes: impl Iterator>, -) -> Vec<(NodeLocation, egui::Vec2)> { - let mut sizes = Vec::new(); +) -> HashMap { + let mut sizes = HashMap::new(); let ctx = ui.ctx(); ctx.request_discard("measuring node sizes"); ui.horizontal(|ui| { for node in nodes { let response = node.draw(ui, InteractionHighlight::default()); - sizes.push((node.location.clone(), response.rect.size())); + sizes.insert(node.location.clone(), response.rect.size()); } }); sizes @@ -41,7 +41,7 @@ fn measure_node_sizes<'a>( fn compute_layout<'a>( nodes: impl Iterator, - edges: impl Iterator, + edges: impl Iterator, ) -> HashMap { let mut node_to_index = HashMap::new(); let mut graph: ForceGraph = ForceGraph::default(); @@ -55,9 +55,7 @@ fn compute_layout<'a>( node_to_index.insert(node_id, ix); } - for datatypes::GraphEdge { source, target } in edges { - let source = NodeLocation::from(source.clone()); - let target = NodeLocation::from(target.clone()); + for (source, target) in edges { let source_ix = *node_to_index.entry(source.clone()).or_insert( graph.add_force_node(format!("{:?}", source), NodeKind::Dummy(source.clone())), ); @@ -128,6 +126,24 @@ enum NodeKind { Dummy(NodeLocation), } +fn draw_dummy( + ui: &mut egui::Ui, + entity_path: EntityPath, + node_id: datatypes::GraphNodeId, +) -> egui::Response { + let text = egui::RichText::new(format!("{}@{}", node_id, entity_path)); + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) + .inner_margin(egui::Vec2::new(6.0, 4.0)) + .fill(egui::Color32::RED) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + ui.add(egui::Button::new(text)) + }) + .response +} + impl<'a> NodeInstance<'a> { fn text(&self) -> egui::RichText { self.label.map_or( @@ -287,7 +303,7 @@ impl SpaceViewClass for GraphSpaceView { let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); let Some(layout) = &mut state.layout else { - let node_sizes = + let mut node_sizes = measure_node_sizes(ui, node_system.data.iter().flat_map(|d| d.nodes())); let layout = compute_layout( @@ -295,7 +311,7 @@ impl SpaceViewClass for GraphSpaceView { edge_system .data .iter() - .flat_map(|d| d.edges().map(|e| &e.edge.0)), + .flat_map(|d| d.edges().map(|e| (e.source, e.target))), ); if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { @@ -459,15 +475,15 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for EdgeInstance { - edge, + source, + target, instance, color, .. } in data.edges() { - // TODO(grtlr): This does not handle dummy nodes correctly. if let (Some(source_pos), Some(target_pos)) = - (layout.get(&edge.0.source.clone().into()), layout.get(&edge.0.target.clone().into())) + (layout.get(&source), layout.get(&target)) { let highlight = ent_highlight.index_highlight(instance); @@ -511,6 +527,12 @@ impl SpaceViewClass for GraphSpaceView { ui.ctx().set_transform_layer(id, world_to_window); ui.ctx().set_sublayer(window_layer, id); + } else { + log::warn!( + "Missing layout information for edge: {:?} -> {:?}", + source, + target + ); } } } From 63f9baa8f268a437d9bfdda8e533e164f4122d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 09:17:31 +0200 Subject: [PATCH 038/159] WIP: basic dummy nodes working --- .../graph_view/src/{types.rs => common.rs} | 6 + .../src/edge_undirected_visualizer_system.rs | 2 +- examples/rust/graph_view/src/graph.rs | 109 ++++++++++++++++++ .../rust/graph_view/src/graph_space_view.rs | 75 ++++++++++-- examples/rust/graph_view/src/main.rs | 3 +- .../graph_view/src/node_visualizer_system.rs | 4 +- 6 files changed, 189 insertions(+), 10 deletions(-) rename examples/rust/graph_view/src/{types.rs => common.rs} (83%) create mode 100644 examples/rust/graph_view/src/graph.rs diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/common.rs similarity index 83% rename from examples/rust/graph_view/src/types.rs rename to examples/rust/graph_view/src/common.rs index 4e0d96a2e8c3..f5ef508bb94f 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/common.rs @@ -1,6 +1,12 @@ +use std::collections::HashSet; + use re_log_types::{EntityPath, EntityPathHash}; use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; +use crate::{ + edge_undirected_visualizer_system::EdgeInstance, node_visualizer_system::NodeInstance, +}; + #[derive(Clone, PartialEq, Eq, Hash)] pub(crate) struct NodeLocation { pub entity_hash: EntityPathHash, diff --git a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs index becebbcccc96..8852769dbc0e 100644 --- a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs @@ -13,7 +13,7 @@ use re_viewer::external::{ }, }; -use crate::types::NodeLocation; +use crate::common::NodeLocation; #[derive(Default)] pub struct EdgeUndirectedVisualizer { diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs new file mode 100644 index 000000000000..ece659b372a5 --- /dev/null +++ b/examples/rust/graph_view/src/graph.rs @@ -0,0 +1,109 @@ +use std::collections::HashSet; + +use re_log_types::EntityPath; +use re_viewer::external::re_log::external::log; + +use crate::{ + common::NodeLocation, edge_undirected_visualizer_system::EdgeInstance, + node_visualizer_system::NodeInstance, +}; + +pub(crate) struct Graph<'a, N, E> +where + N: Iterator>, + E: Iterator>, +{ + node_it: N, + edge_it: E, +} + +impl<'a, N, E> Graph<'a, N, E> +where + N: Iterator>, + E: Iterator>, +{ + pub fn new(nodes: N, edges: E) -> Self { + Self { + node_it: nodes, + edge_it: edges, + } + } + + pub fn nodes(self) -> impl Iterator> { + AllNodesIterator::new(self.node_it, edges_to_nodes(self.edge_it)) + } + + pub fn dummy_nodes(self) -> impl Iterator { + self.nodes().filter_map(|n| match n { + Node::Dummy(location, entity_path) => Some((location, entity_path)), + Node::Regular(_) => None, + }) + } +} + +pub(crate) enum Node<'a> { + Regular(NodeInstance<'a>), + Dummy(NodeLocation, &'a EntityPath), +} + +fn edges_to_iter<'a>( + edge: EdgeInstance<'a>, +) -> impl Iterator { + let source = (edge.source, edge.entity_path); + let target = (edge.target, edge.entity_path); + std::iter::once(source.clone()).chain(std::iter::once(target)) +} + +pub(crate) fn edges_to_nodes<'a>( + edges: impl IntoIterator>, +) -> impl Iterator { + edges.into_iter().flat_map(|e| edges_to_iter(e)) +} + +#[derive(Clone)] +pub(crate) struct AllNodesIterator<'a, N, E> +where + N: Iterator>, + E: Iterator + Sized, +{ + seen: HashSet, + node_it: N, + edge_it: E, +} + +impl<'a, N, E> AllNodesIterator<'a, N, E> +where + N: Iterator>, + E: Iterator, +{ + pub fn new(node_it: N, edge_it: E) -> Self { + Self { + seen: HashSet::new(), + node_it, + edge_it, + } + } +} + +impl<'a, N, E> Iterator for AllNodesIterator<'a, N, E> +where + N: Iterator>, + E: Iterator, +{ + type Item = Node<'a>; + + fn next(&mut self) -> Option> { + if let Some(node) = self.node_it.next() { + self.seen.insert(node.location.clone()); + return Some(Node::Regular(node)); + } + + for (node, entity_path) in self.edge_it.by_ref() { + if !self.seen.contains(&node) { + return Some(Node::Dummy(node, entity_path)); + } + } + + None + } +} diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 53bc99130d5a..db189ab8a944 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,5 +1,5 @@ use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use re_viewer::external::{ egui::{self, emath::TSTransform, TextWrapMode}, @@ -17,15 +17,37 @@ use re_viewer::external::{ }, }; -use crate::{edge_undirected_visualizer_system::EdgeUndirectedVisualizer, types::NodeLocation}; +use crate::{ + common::NodeLocation, + edge_undirected_visualizer_system::EdgeUndirectedVisualizer, + graph::{Graph, Node}, +}; use crate::{ edge_undirected_visualizer_system::{self, EdgeInstance}, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; +impl<'a> Node<'a> { + fn draw(&self, ui: &mut egui::Ui, highlight: InteractionHighlight) -> egui::Response { + match self { + Node::Regular(node) => node.draw(ui, highlight), + Node::Dummy(location, entity_path) => { + draw_dummy(ui, (*entity_path).clone(), location.node_id.clone()) + } + } + } + + fn location(&self) -> NodeLocation { + match self { + Node::Regular(node) => node.location.clone(), + Node::Dummy(location, _) => location.clone(), + } + } +} + fn measure_node_sizes<'a>( ui: &mut egui::Ui, - nodes: impl Iterator>, + nodes: impl Iterator>, ) -> HashMap { let mut sizes = HashMap::new(); let ctx = ui.ctx(); @@ -33,13 +55,13 @@ fn measure_node_sizes<'a>( ui.horizontal(|ui| { for node in nodes { let response = node.draw(ui, InteractionHighlight::default()); - sizes.insert(node.location.clone(), response.rect.size()); + sizes.insert(node.location(), response.rect.size()); } }); sizes } -fn compute_layout<'a>( +fn compute_layout( nodes: impl Iterator, edges: impl Iterator, ) -> HashMap { @@ -303,8 +325,21 @@ impl SpaceViewClass for GraphSpaceView { let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); let Some(layout) = &mut state.layout else { - let mut node_sizes = - measure_node_sizes(ui, node_system.data.iter().flat_map(|d| d.nodes())); + let graph = Graph::new( + node_system.data.iter().flat_map(|d| d.nodes()), + edge_system.data.iter().flat_map(|d| d.edges()), + ); + + let mut node_sizes = measure_node_sizes(ui, graph.nodes()); + + // for data in edge_system.data.iter().flat_map(|d| d.edges()) { + // if !node_sizes.contains_key(&data.source) { + // node_sizes.insert(data.source.clone(), egui::Vec2::new(42.0, 42.0)); + // } + // if !node_sizes.contains_key(&data.target) { + // node_sizes.insert(data.target.clone(), egui::Vec2::new(42.0, 42.0)); + // } + // } let layout = compute_layout( node_sizes.into_iter(), @@ -471,6 +506,32 @@ impl SpaceViewClass for GraphSpaceView { } } + let graph = Graph::new( + node_system.data.iter().flat_map(|d| d.nodes()), + edge_system.data.iter().flat_map(|d| d.edges()), + ); + + for dummy in graph.dummy_nodes() { + let current_extent = layout + .get(&dummy.0) + .expect("missing layout information for dummy node"); + let response = egui::Area::new(id.with(dummy.0.clone())) + .current_pos(current_extent.min) + .order(egui::Order::Middle) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(clip_rect_world); + draw_dummy(ui, dummy.1.clone(), dummy.0.node_id.clone()) + }) + .response; + + layout.insert(dummy.0.clone(), response.rect); + + let id = response.layer_id; + ui.ctx().set_transform_layer(id, world_to_window); + ui.ctx().set_sublayer(window_layer, id); + } + for data in edge_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 675ee3bbebb2..f707084efd97 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -5,7 +5,8 @@ use re_viewer::external::{re_log, re_memory}; mod edge_undirected_visualizer_system; mod graph_space_view; mod node_visualizer_system; -mod types; +mod common; +mod graph; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/node_visualizer_system.rs index b9ef2d55d022..368b935d93ad 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/node_visualizer_system.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use re_log_types::Instance; use re_viewer::external::{ egui::Color32, @@ -18,7 +20,7 @@ use re_viewer::external::{ }, }; -use crate::types::NodeLocation; +use crate::common::NodeLocation; /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] From 44cd7d25314e89e5538619176d5d06600d3f1214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 09:23:05 +0200 Subject: [PATCH 039/159] WIP: improve dummy nodes --- .../rust/graph_view/src/graph_space_view.rs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index db189ab8a944..3ff7c0cbd514 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -154,16 +154,19 @@ fn draw_dummy( node_id: datatypes::GraphNodeId, ) -> egui::Response { let text = egui::RichText::new(format!("{}@{}", node_id, entity_path)); - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) - .inner_margin(egui::Vec2::new(6.0, 4.0)) - .fill(egui::Color32::RED) - .show(ui, |ui| { - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - ui.add(egui::Button::new(text)) - }) - .response + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + ui.add(egui::Button::new(text)) + // ui.label(text) + // egui::Frame::default() + // .rounding(egui::Rounding::same(4.0)) + // .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) + // .inner_margin(egui::Vec2::new(6.0, 4.0)) + // .fill(egui::Color32::RED) + // .show(ui, |ui| { + // ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + // ui.add(egui::Button::new(text)) + // }) + // .response } impl<'a> NodeInstance<'a> { From c5104be7e63f74d13397f187f431b39ebfe599c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 10:00:30 +0200 Subject: [PATCH 040/159] WIP: fix dummy nodes --- .../src/edge_undirected_visualizer_system.rs | 6 +++++- examples/rust/graph_view/src/graph.rs | 7 +++---- examples/rust/graph_view/src/graph_space_view.rs | 6 ++++-- examples/rust/node_link_graph/src/main.rs | 10 +++++----- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs index 8852769dbc0e..0c1086c97fb5 100644 --- a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs @@ -1,4 +1,4 @@ -use re_log_types::Instance; +use re_log_types::{external::re_types_core::datatypes, Instance}; use re_viewer::external::{ egui::Color32, re_chunk::{ChunkComponentIterItem, LatestAtQuery}, @@ -29,6 +29,8 @@ pub(crate) struct EdgeUndirectedVisualizerData { pub(crate) struct EdgeInstance<'a> { pub source: NodeLocation, pub target: NodeLocation, + pub source_entity_path: &'a datatypes::EntityPath, + pub target_entity_path: &'a datatypes::EntityPath, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, @@ -45,6 +47,8 @@ impl EdgeUndirectedVisualizerData { .map(|(edge, instance, color)| EdgeInstance { source: edge.source.clone().into(), target: edge.target.clone().into(), + source_entity_path: &edge.0.source.entity_path, + target_entity_path: &edge.0.target.entity_path, entity_path: &self.entity_path, instance, color: color.map(|c| Color32::from(c.0)), diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index ece659b372a5..f75fdcd9b71e 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,7 +1,6 @@ use std::collections::HashSet; -use re_log_types::EntityPath; -use re_viewer::external::re_log::external::log; +use re_log_types::{external::re_types_core::datatypes::EntityPath}; use crate::{ common::NodeLocation, edge_undirected_visualizer_system::EdgeInstance, @@ -49,8 +48,8 @@ pub(crate) enum Node<'a> { fn edges_to_iter<'a>( edge: EdgeInstance<'a>, ) -> impl Iterator { - let source = (edge.source, edge.entity_path); - let target = (edge.target, edge.entity_path); + let source = (edge.source, edge.source_entity_path); + let target = (edge.target, edge.target_entity_path); std::iter::once(source.clone()).chain(std::iter::once(target)) } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 3ff7c0cbd514..fc7b6003396f 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -150,10 +150,12 @@ enum NodeKind { fn draw_dummy( ui: &mut egui::Ui, - entity_path: EntityPath, + entity_path: datatypes::EntityPath, node_id: datatypes::GraphNodeId, ) -> egui::Response { - let text = egui::RichText::new(format!("{}@{}", node_id, entity_path)); + let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)).color( + ui.style().visuals.widgets.noninteractive.text_color(), + ); ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); ui.add(egui::Button::new(text)) // ui.label(text) diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index a9863f74ff05..d90bef3bb0d4 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -36,7 +36,7 @@ fn main() -> anyhow::Result<()> { fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", 0); rec.log( - "kitchen/nodes", + "kitchen/objects", &GraphNodes::new(["sink", "fridge"]) .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), )?; @@ -51,7 +51,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; rec.set_time_sequence("frame", 2); - rec.log("living/nodes", &GraphNodes::new(["table"]))?; + rec.log("living/objects", &GraphNodes::new(["table"]))?; rec.log( "living/nodes", &GraphNodes::new(["area0", "area1", "area2"]), @@ -76,9 +76,9 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.log( "edges", &GraphEdges::new([ - ("kitchen/nodes", "area0", "sink"), - ("kitchen/nodes", "area1", "fridge"), - ("living/nodes", "area1", "table"), + (("kitchen/nodes", "area0"), ("kitchen/objects", "sink")), + (("kitchen/nodes", "area1"), ("kitchen/objects", "fridge")), + (("living/nodes", "area1"), ("living/objects", "table")), ]), )?; From 0c5d6b9dcb34fc841a0ac8dbee2ac4070ba9a080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 10:10:26 +0200 Subject: [PATCH 041/159] WIP: fmt --- .../graph_view/src/edge_undirected_visualizer_system.rs | 3 ++- examples/rust/graph_view/src/graph.rs | 2 +- examples/rust/graph_view/src/graph_space_view.rs | 9 ++++----- examples/rust/graph_view/src/main.rs | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs index 0c1086c97fb5..47ff60b60718 100644 --- a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs +++ b/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs @@ -83,7 +83,8 @@ impl VisualizerSystem for EdgeUndirectedVisualizer { &timeline_query, ); - let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdgeUndirected::name()); + let all_indexed_edges = + results.iter_as(query.timeline, components::GraphEdgeUndirected::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); let data = range_zip_1x1( diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index f75fdcd9b71e..55105d782f46 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use re_log_types::{external::re_types_core::datatypes::EntityPath}; +use re_log_types::external::re_types_core::datatypes::EntityPath; use crate::{ common::NodeLocation, edge_undirected_visualizer_system::EdgeInstance, diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index fc7b6003396f..c9c15eca045d 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -30,8 +30,8 @@ use crate::{ impl<'a> Node<'a> { fn draw(&self, ui: &mut egui::Ui, highlight: InteractionHighlight) -> egui::Response { match self { - Node::Regular(node) => node.draw(ui, highlight), - Node::Dummy(location, entity_path) => { + Node::Regular(node) => node.draw(ui, highlight), + Node::Dummy(location, entity_path) => { draw_dummy(ui, (*entity_path).clone(), location.node_id.clone()) } } @@ -153,9 +153,8 @@ fn draw_dummy( entity_path: datatypes::EntityPath, node_id: datatypes::GraphNodeId, ) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)).color( - ui.style().visuals.widgets.noninteractive.text_color(), - ); + let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)) + .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); ui.add(egui::Button::new(text)) // ui.label(text) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index f707084efd97..6b669a124d7c 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,11 +2,11 @@ use re_viewer::external::{re_log, re_memory}; +mod common; mod edge_undirected_visualizer_system; +mod graph; mod graph_space_view; mod node_visualizer_system; -mod common; -mod graph; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. From 8f99d6f281cb4666d9aa1b6346741ee824daacfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 11:16:09 +0200 Subject: [PATCH 042/159] WIP: refactor layout --- Cargo.lock | 1 + examples/rust/graph_view/Cargo.toml | 1 + examples/rust/graph_view/src/common.rs | 2 +- examples/rust/graph_view/src/error.rs | 15 +++++ .../rust/graph_view/src/graph_space_view.rs | 64 ++----------------- examples/rust/graph_view/src/layout.rs | 54 ++++++++++++++++ examples/rust/graph_view/src/main.rs | 2 + 7 files changed, 78 insertions(+), 61 deletions(-) create mode 100644 examples/rust/graph_view/src/error.rs create mode 100644 examples/rust/graph_view/src/layout.rs diff --git a/Cargo.lock b/Cargo.lock index a80394fbd44d..c14c0eda73b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2755,6 +2755,7 @@ dependencies = [ "re_log_types", "re_sdk_comms", "re_viewer", + "thiserror", ] [[package]] diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index df879562872c..410210a83674 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -27,3 +27,4 @@ mimalloc = "0.1" petgraph = "0.6" bytemuck = "1.18" fdg-sim = "0.9" +thiserror = "1.0" diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index f5ef508bb94f..4a752821e3e6 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -22,7 +22,7 @@ impl From for NodeLocation { } } -impl std::fmt::Debug for NodeLocation { +impl std::fmt::Display for NodeLocation { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}@{:?}", self.node_id, self.entity_hash) } diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs new file mode 100644 index 000000000000..644cc9997d3f --- /dev/null +++ b/examples/rust/graph_view/src/error.rs @@ -0,0 +1,15 @@ +use re_viewer::external::re_viewer_context::SpaceViewSystemExecutionError; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("edge has unknown node: {0}")] + EdgeUnknownNode(String), + +} + +impl From for SpaceViewSystemExecutionError { + fn from(val: Error) -> Self { + // TODO(grtlr): Ensure that this is the correct error type. + SpaceViewSystemExecutionError::DrawDataCreationError(Box::new(val)) + } +} diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index c9c15eca045d..405ff69eee1f 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -61,53 +61,6 @@ fn measure_node_sizes<'a>( sizes } -fn compute_layout( - nodes: impl Iterator, - edges: impl Iterator, -) -> HashMap { - let mut node_to_index = HashMap::new(); - let mut graph: ForceGraph = ForceGraph::default(); - - // TODO(grtlr): `fdg` does not account for node sizes out of the box. - for (node_id, size) in nodes { - let ix = graph.add_force_node( - format!("{:?}", node_id), - NodeKind::Regular(node_id.clone(), size), - ); - node_to_index.insert(node_id, ix); - } - - for (source, target) in edges { - let source_ix = *node_to_index.entry(source.clone()).or_insert( - graph.add_force_node(format!("{:?}", source), NodeKind::Dummy(source.clone())), - ); - let target_ix = *node_to_index.entry(target.clone()).or_insert( - graph.add_force_node(format!("{:?}", target), NodeKind::Dummy(target.clone())), - ); - graph.add_edge(source_ix, target_ix, ()); - } - - // create a simulation from the graph - let mut simulation = Simulation::from_graph(graph, SimulationParameters::default()); - - for frame in 0..1000 { - simulation.update(0.035); - } - - simulation - .get_graph() - .node_weights() - .filter_map(|node| match &node.data { - NodeKind::Regular(node_id, size) => { - let center = egui::Pos2::new(node.location.x, node.location.y); - let rect = egui::Rect::from_center_size(center, *size); - Some((node_id.clone(), rect)) - } - NodeKind::Dummy(_) => None, - }) - .collect() -} - fn bounding_rect_from_iter<'a>(rects: impl Iterator) -> Option { // Start with `None` and gradually expand the bounding box. let mut bounding_rect: Option = None; @@ -142,12 +95,6 @@ fn fit_bounding_rect_to_screen( * TSTransform::from_scaling(scale) } -// We need to differentiate between regular nodes and nodes that belong to a different entity hierarchy. -enum NodeKind { - Regular(NodeLocation, egui::Vec2), - Dummy(NodeLocation), -} - fn draw_dummy( ui: &mut egui::Ui, entity_path: datatypes::EntityPath, @@ -345,13 +292,13 @@ impl SpaceViewClass for GraphSpaceView { // } // } - let layout = compute_layout( + let layout = crate::layout::compute_layout( node_sizes.into_iter(), edge_system .data .iter() .flat_map(|d| d.edges().map(|e| (e.source, e.target))), - ); + )?; if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { state.world_to_view = fit_bounding_rect_to_screen( @@ -476,6 +423,7 @@ impl SpaceViewClass for GraphSpaceView { } let entity_path = data.entity_path.clone(); + if let Some(entity_rect) = entity_rect { let entity_id = egui::LayerId::new( egui::Order::Background, @@ -593,11 +541,7 @@ impl SpaceViewClass for GraphSpaceView { ui.ctx().set_transform_layer(id, world_to_window); ui.ctx().set_sublayer(window_layer, id); } else { - log::warn!( - "Missing layout information for edge: {:?} -> {:?}", - source, - target - ); + log::warn!("Missing layout information for edge: {source} -> {target}",); } } } diff --git a/examples/rust/graph_view/src/layout.rs b/examples/rust/graph_view/src/layout.rs new file mode 100644 index 000000000000..5a81587d1e69 --- /dev/null +++ b/examples/rust/graph_view/src/layout.rs @@ -0,0 +1,54 @@ +use std::collections::HashMap; + +use fdg_sim::{self as fdg, ForceGraphHelper}; +use re_viewer::external::egui; + +use crate::error::Error; + +type NodeInfo = (N, egui::Vec2); + +pub fn compute_layout( + nodes: impl Iterator, + edges: impl Iterator, +) -> Result, Error> +where + N: Clone + Eq + ToString + std::hash::Hash, +{ + let mut node_to_index = HashMap::new(); + let mut graph: fdg::ForceGraph, ()> = fdg::ForceGraph::default(); + + for (node_id, size) in nodes { + let ix = graph.add_force_node(node_id.to_string(), (node_id.clone(), size)); + node_to_index.insert(node_id, ix); + } + + for (source, target) in edges { + let source_ix = node_to_index + .get(&source) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + let target_ix = node_to_index + .get(&target) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + graph.add_edge(*source_ix, *target_ix, ()); + } + + // create a simulation from the graph + let mut simulation = fdg::Simulation::from_graph(graph, fdg::SimulationParameters::default()); + + for _ in 0..1000 { + simulation.update(0.035); + } + + let res = simulation + .get_graph() + .node_weights() + .map(|fdg::Node::> { data, location, .. }| { + let (ix, size) = data; + let center = egui::Pos2::new(location.x, location.y); + let rect = egui::Rect::from_center_size(center, *size); + (ix.clone(), rect) + }) + .collect(); + + Ok(res) +} diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 6b669a124d7c..e1dd689e380e 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,7 +2,9 @@ use re_viewer::external::{re_log, re_memory}; +mod error; mod common; +mod layout; mod edge_undirected_visualizer_system; mod graph; mod graph_space_view; From 6465092ed9956d80569349f0c22164b01dde50d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 11:24:16 +0200 Subject: [PATCH 043/159] WIP: cleanup --- examples/rust/graph_view/src/graph_space_view.rs | 3 +-- examples/rust/graph_view/src/layout.rs | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 405ff69eee1f..f3e19c96e880 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,5 +1,4 @@ -use fdg_sim::{ForceGraph, ForceGraphHelper, Simulation, SimulationParameters}; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use re_viewer::external::{ egui::{self, emath::TSTransform, TextWrapMode}, diff --git a/examples/rust/graph_view/src/layout.rs b/examples/rust/graph_view/src/layout.rs index 5a81587d1e69..b7334520b5f9 100644 --- a/examples/rust/graph_view/src/layout.rs +++ b/examples/rust/graph_view/src/layout.rs @@ -8,8 +8,8 @@ use crate::error::Error; type NodeInfo = (N, egui::Vec2); pub fn compute_layout( - nodes: impl Iterator, - edges: impl Iterator, + nodes: impl IntoIterator, + edges: impl IntoIterator, ) -> Result, Error> where N: Clone + Eq + ToString + std::hash::Hash, From 511543d258867d6b2ccdebc21d217f66b6699130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 14:12:27 +0200 Subject: [PATCH 044/159] WIP: factor out drawing of entities --- .../rust/graph_view/src/graph_space_view.rs | 231 +++--------------- examples/rust/graph_view/src/main.rs | 1 + examples/rust/graph_view/src/ui.rs | 155 ++++++++++++ 3 files changed, 195 insertions(+), 192 deletions(-) create mode 100644 examples/rust/graph_view/src/ui.rs diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index f3e19c96e880..ac2f0526bbf7 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -17,49 +17,13 @@ use re_viewer::external::{ }; use crate::{ - common::NodeLocation, - edge_undirected_visualizer_system::EdgeUndirectedVisualizer, - graph::{Graph, Node}, + common::NodeLocation, edge_undirected_visualizer_system::EdgeUndirectedVisualizer, error::Error, graph::{Graph, Node}, ui }; use crate::{ edge_undirected_visualizer_system::{self, EdgeInstance}, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; -impl<'a> Node<'a> { - fn draw(&self, ui: &mut egui::Ui, highlight: InteractionHighlight) -> egui::Response { - match self { - Node::Regular(node) => node.draw(ui, highlight), - Node::Dummy(location, entity_path) => { - draw_dummy(ui, (*entity_path).clone(), location.node_id.clone()) - } - } - } - - fn location(&self) -> NodeLocation { - match self { - Node::Regular(node) => node.location.clone(), - Node::Dummy(location, _) => location.clone(), - } - } -} - -fn measure_node_sizes<'a>( - ui: &mut egui::Ui, - nodes: impl Iterator>, -) -> HashMap { - let mut sizes = HashMap::new(); - let ctx = ui.ctx(); - ctx.request_discard("measuring node sizes"); - ui.horizontal(|ui| { - for node in nodes { - let response = node.draw(ui, InteractionHighlight::default()); - sizes.insert(node.location(), response.rect.size()); - } - }); - sizes -} - fn bounding_rect_from_iter<'a>(rects: impl Iterator) -> Option { // Start with `None` and gradually expand the bounding box. let mut bounding_rect: Option = None; @@ -94,69 +58,6 @@ fn fit_bounding_rect_to_screen( * TSTransform::from_scaling(scale) } -fn draw_dummy( - ui: &mut egui::Ui, - entity_path: datatypes::EntityPath, - node_id: datatypes::GraphNodeId, -) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)) - .color(ui.style().visuals.widgets.noninteractive.text_color()); - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - ui.add(egui::Button::new(text)) - // ui.label(text) - // egui::Frame::default() - // .rounding(egui::Rounding::same(4.0)) - // .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) - // .inner_margin(egui::Vec2::new(6.0, 4.0)) - // .fill(egui::Color32::RED) - // .show(ui, |ui| { - // ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - // ui.add(egui::Button::new(text)) - // }) - // .response -} - -impl<'a> NodeInstance<'a> { - fn text(&self) -> egui::RichText { - self.label.map_or( - egui::RichText::new(self.location.node_id.to_string()), - |label| egui::RichText::new(label.to_string()), - ) - } - - fn draw(&self, ui: &mut egui::Ui, highlight: InteractionHighlight) -> egui::Response { - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => ui.style().visuals.text_color(), - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, - }; - - let bg = match highlight.hover { - HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, - HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, - }; - // ui.style().visuals.faint_bg_color - - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) - .inner_margin(egui::Vec2::new(6.0, 4.0)) - .fill(bg) - .show(ui, |ui| { - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - if let Some(color) = self.color { - ui.add(egui::Button::new(self.text().color(color))); - } else { - ui.add(egui::Button::new(self.text())); - } - }) - .response - } -} - /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. @@ -280,16 +181,7 @@ impl SpaceViewClass for GraphSpaceView { edge_system.data.iter().flat_map(|d| d.edges()), ); - let mut node_sizes = measure_node_sizes(ui, graph.nodes()); - - // for data in edge_system.data.iter().flat_map(|d| d.edges()) { - // if !node_sizes.contains_key(&data.source) { - // node_sizes.insert(data.source.clone(), egui::Vec2::new(42.0, 42.0)); - // } - // if !node_sizes.contains_key(&data.target) { - // node_sizes.insert(data.target.clone(), egui::Vec2::new(42.0, 42.0)); - // } - // } + let node_sizes = ui::measure_node_sizes(ui, graph.nodes()); let layout = crate::layout::compute_layout( node_sizes.into_iter(), @@ -402,7 +294,7 @@ impl SpaceViewClass for GraphSpaceView { .show(ui.ctx(), |ui| { let highlight = ent_highlight.index_highlight(node.instance); ui.set_clip_rect(clip_rect_world); - node.draw(ui, highlight) + ui::draw_node(ui, &node, highlight) }) .response; @@ -429,31 +321,14 @@ impl SpaceViewClass for GraphSpaceView { id.with(("debug", entity_path.hash())), ); ui.ctx().set_transform_layer(entity_id, world_to_window); - let painter = egui::Painter::new(ui.ctx().clone(), entity_id, clip_rect_world); - - let padded = entity_rect.expand(10.0); - let tc = ui.ctx().style().visuals.text_color(); - painter.rect( - padded, - ui.style().visuals.window_rounding, - egui::Color32::from_rgba_unmultiplied(tc.r(), tc.g(), tc.b(), 4), - egui::Stroke::NONE, + ui::draw_entity( + ui, + clip_rect_world, + entity_id, + entity_rect, + &entity_path, + &query.highlights, ); - if (query - .highlights - .entity_outline_mask(entity_path.hash()) - .overall - .is_some()) - { - // TODO(grtlr): text should be presented in window space. - painter.text( - padded.left_top(), - egui::Align2::LEFT_BOTTOM, - entity_path.to_string(), - egui::FontId::default(), - ui.ctx().style().visuals.text_color(), - ); - } } } @@ -472,7 +347,7 @@ impl SpaceViewClass for GraphSpaceView { .constrain(false) .show(ui.ctx(), |ui| { ui.set_clip_rect(clip_rect_world); - draw_dummy(ui, dummy.1.clone(), dummy.0.node_id.clone()) + ui::draw_dummy(ui, dummy.1, &dummy.0.node_id) }) .response; @@ -486,62 +361,34 @@ impl SpaceViewClass for GraphSpaceView { for data in edge_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - for EdgeInstance { - source, - target, - instance, - color, - .. - } in data.edges() - { - if let (Some(source_pos), Some(target_pos)) = - (layout.get(&source), layout.get(&target)) - { - let highlight = ent_highlight.index_highlight(instance); - - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => None, - (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), - (HoverHighlight::Hovered, ..) => { - Some(ui.style().visuals.widgets.hovered.bg_fill) - } - }; - - let response = egui::Area::new(id.with((data.entity_path.hash(), instance))) - .current_pos(source_pos.center()) - .order(egui::Order::Background) - .constrain(false) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); - egui::Frame::default().show(ui, |ui| { - let painter = ui.painter(); - if let Some(hcolor) = hcolor { - painter.line_segment( - [source_pos.center(), target_pos.center()], - egui::Stroke::new(4.0, hcolor), - ); - } - painter.line_segment( - [source_pos.center(), target_pos.center()], - egui::Stroke::new( - 1.0, - color.unwrap_or(ui.style().visuals.text_color()), - ), - ); - }); - }) - .response; - - let id = response.layer_id; - - ui.ctx().set_transform_layer(id, world_to_window); - ui.ctx().set_sublayer(window_layer, id); - } else { - log::warn!("Missing layout information for edge: {source} -> {target}",); - } + for edge in data.edges() { + let source_pos = layout + .get(&edge.source) + .ok_or_else(|| Error::EdgeUnknownNode(edge.source.to_string()))?; + let target_pos = layout + .get(&edge.target) + .ok_or_else(|| Error::EdgeUnknownNode(edge.target.to_string()))?; + + let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) + .current_pos(source_pos.center()) + .order(egui::Order::Background) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + ); + }) + .response; + + let id = response.layer_id; + + ui.ctx().set_transform_layer(id, world_to_window); + ui.ctx().set_sublayer(window_layer, id); } } diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index e1dd689e380e..a15ab86b2c70 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -5,6 +5,7 @@ use re_viewer::external::{re_log, re_memory}; mod error; mod common; mod layout; +mod ui; mod edge_undirected_visualizer_system; mod graph; mod graph_space_view; diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs new file mode 100644 index 000000000000..32ab769a4f52 --- /dev/null +++ b/examples/rust/graph_view/src/ui.rs @@ -0,0 +1,155 @@ +use std::collections::HashMap; + +use re_log_types::EntityPath; +use re_viewer::external::{ + egui::{self, TextWrapMode}, + re_types::datatypes, + re_viewer_context::{ + HoverHighlight, InteractionHighlight, SelectionHighlight, + SpaceViewHighlights, + }, +}; + +use crate::{common::NodeLocation, graph::Node, node_visualizer_system::NodeInstance}; + +pub fn draw_node<'a>( + ui: &mut egui::Ui, + node: &NodeInstance<'a>, + highlight: InteractionHighlight, +) -> egui::Response { + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => ui.style().visuals.text_color(), + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + + let bg = match highlight.hover { + HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, + HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, + }; + // ui.style().visuals.faint_bg_color + + let text = node.label.map_or( + egui::RichText::new(node.location.node_id.to_string()), + |label| egui::RichText::new(label.to_string()), + ); + + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) + .inner_margin(egui::Vec2::new(6.0, 4.0)) + .fill(bg) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + if let Some(color) = node.color { + ui.add(egui::Button::new(text.color(color))); + } else { + ui.add(egui::Button::new(text)); + } + }) + .response +} + +pub fn draw_dummy( + ui: &mut egui::Ui, + entity_path: &datatypes::EntityPath, + node_id: &datatypes::GraphNodeId, +) -> egui::Response { + let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)) + .color(ui.style().visuals.widgets.noninteractive.text_color()); + ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + ui.add(egui::Button::new(text)) +} + +pub fn draw_entity( + ui: &mut egui::Ui, + clip_rect: egui::Rect, + layer_id: egui::LayerId, + rect: egui::Rect, + entity_path: &EntityPath, + highlights: &SpaceViewHighlights, +) { + let painter = egui::Painter::new(ui.ctx().clone(), layer_id, clip_rect); + + let padded = rect.expand(10.0); + let tc = ui.ctx().style().visuals.text_color(); + painter.rect( + padded, + ui.style().visuals.window_rounding, + egui::Color32::from_rgba_unmultiplied(tc.r(), tc.g(), tc.b(), 4), + egui::Stroke::NONE, + ); + + if (highlights + .entity_outline_mask(entity_path.hash()) + .overall + .is_some()) + { + // TODO(grtlr): text should be presented in window space. + painter.text( + padded.left_top(), + egui::Align2::LEFT_BOTTOM, + entity_path.to_string(), + egui::FontId::default(), + ui.ctx().style().visuals.text_color(), + ); + } +} + +pub fn draw_edge( + ui: &mut egui::Ui, + color: Option, + source: &egui::Rect, + target: &egui::Rect, + highlight: InteractionHighlight, +) { + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => None, + (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), + (HoverHighlight::Hovered, ..) => Some(ui.style().visuals.widgets.hovered.bg_fill), + }; + + egui::Frame::default().show(ui, |ui| { + let painter = ui.painter(); + if let Some(hcolor) = hcolor { + painter.line_segment( + [source.center(), target.center()], + egui::Stroke::new(4.0, hcolor), + ); + } + painter.line_segment( + [source.center(), target.center()], + egui::Stroke::new(1.0, color.unwrap_or(ui.style().visuals.text_color())), + ); + }); +} + +pub fn measure_node_sizes<'a>( + ui: &mut egui::Ui, + nodes: impl Iterator>, +) -> HashMap { + let mut sizes = HashMap::new(); + let ctx = ui.ctx(); + ctx.request_discard("measuring node sizes"); + ui.horizontal(|ui| { + for node in nodes { + match node { + Node::Regular(node) => { + let r = draw_node(ui, &node, InteractionHighlight::default()); + sizes.insert(node.location, r.rect.size()); + } + Node::Dummy(location, entity_path) => { + let r = draw_dummy(ui, entity_path, &location.node_id); + sizes.insert(location, r.rect.size()); + } + }; + } + }); + sizes +} From 3c3e65f88acf95d45401f37e8006c6cd332dd79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 15:16:45 +0200 Subject: [PATCH 045/159] WIP: make debug information available in selection --- Cargo.lock | 1 + examples/rust/graph_view/Cargo.toml | 1 + .../rust/graph_view/src/graph_space_view.rs | 82 ++++------------- examples/rust/graph_view/src/ui.rs | 90 ++++++++++++++++++- 4 files changed, 104 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c14c0eda73b7..a13456d210ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2752,6 +2752,7 @@ dependencies = [ "mimalloc", "petgraph", "re_crash_handler", + "re_format", "re_log_types", "re_sdk_comms", "re_viewer", diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 410210a83674..c0e79bdfe4e0 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -13,6 +13,7 @@ analytics = ["re_crash_handler/analytics", "re_viewer/analytics"] [dependencies] re_crash_handler = { path = "../../../crates/utils/re_crash_handler" } +re_format = { path = "../../../crates/utils/re_format" } re_viewer = { path = "../../../crates/viewer/re_viewer", default-features = false } re_log_types = { path = "../../../crates/store/re_log_types" } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index ac2f0526bbf7..6b565f7e36e0 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -6,7 +6,7 @@ use re_viewer::external::{ re_log::external::log, re_log_types::EntityPath, re_types::{datatypes, SpaceViewClassIdentifier}, - re_ui, + re_ui::{self, UiExt}, re_viewer_context::{ HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, Item, SelectionHighlight, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, @@ -17,68 +17,17 @@ use re_viewer::external::{ }; use crate::{ - common::NodeLocation, edge_undirected_visualizer_system::EdgeUndirectedVisualizer, error::Error, graph::{Graph, Node}, ui + common::NodeLocation, + edge_undirected_visualizer_system::EdgeUndirectedVisualizer, + error::Error, + graph::{Graph, Node}, + ui::{self, GraphSpaceViewState}, }; use crate::{ edge_undirected_visualizer_system::{self, EdgeInstance}, node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, }; -fn bounding_rect_from_iter<'a>(rects: impl Iterator) -> Option { - // Start with `None` and gradually expand the bounding box. - let mut bounding_rect: Option = None; - - for rect in rects { - bounding_rect = match bounding_rect { - Some(bounding) => Some(bounding.union(*rect)), - None => Some(*rect), - }; - } - - bounding_rect -} - -fn fit_bounding_rect_to_screen( - bounding_rect: egui::Rect, - available_size: egui::Vec2, -) -> TSTransform { - // Compute the scale factor to fit the bounding rectangle into the available screen size. - let scale_x = available_size.x / bounding_rect.width(); - let scale_y = available_size.y / bounding_rect.height(); - - // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. - let scale = scale_x.min(scale_y).min(1.0); - - // Compute the translation to center the bounding rect in the screen. - let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); - let center_world = bounding_rect.center().to_vec2(); - - // Set the transformation to scale and then translate to center. - TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) - * TSTransform::from_scaling(scale) -} - -/// Space view state for the custom space view. -/// -/// This state is preserved between frames, but not across Viewer sessions. -#[derive(Default)] -pub struct GraphSpaceViewState { - world_to_view: TSTransform, - - /// Positions of the nodes in world space. - layout: Option>, -} - -impl SpaceViewState for GraphSpaceViewState { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } -} - #[derive(Default)] pub struct GraphSpaceView; @@ -147,10 +96,11 @@ impl SpaceViewClass for GraphSpaceView { _space_origin: &EntityPath, _space_view_id: SpaceViewId, ) -> Result<(), SpaceViewSystemExecutionError> { - let _state = state.downcast_mut::()?; + let state = state.downcast_mut::()?; - ui.horizontal(|ui| { - ui.label("HEEEEELLLLLLOOOOO"); + ui.selection_grid("graph_settings_ui").show(ui, |ui| { + state.bounding_box_ui(ui); + state.debug_ui(ui); }); Ok(()) @@ -191,8 +141,8 @@ impl SpaceViewClass for GraphSpaceView { .flat_map(|d| d.edges().map(|e| (e.source, e.target))), )?; - if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { - state.world_to_view = fit_bounding_rect_to_screen( + if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { + state.fit_to_screen( bounding_box.scale_from_center(1.05), clip_rect_window.size(), ); @@ -248,9 +198,7 @@ impl SpaceViewClass for GraphSpaceView { let window_layer = ui.layer_id(); - //#[cfg(debug_assertions)] - #[cfg(any())] - { + if state.show_debug { let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); ui.ctx().set_transform_layer(debug_id, world_to_window); @@ -268,11 +216,11 @@ impl SpaceViewClass for GraphSpaceView { egui::Stroke::new(2.0, egui::Color32::GREEN), ); - if let Some(bounding_box) = bounding_rect_from_iter(layout.values()) { + if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { painter.rect( bounding_box, 0.0, - egui::Color32::from_rgba_unmultiplied(255, 0, 255, 32), + egui::Color32::from_rgba_unmultiplied(255, 0, 255, 8), egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), ); } diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 32ab769a4f52..7454a88d4911 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -1,12 +1,14 @@ use std::collections::HashMap; +use re_format::format_f32; use re_log_types::EntityPath; use re_viewer::external::{ - egui::{self, TextWrapMode}, + egui::{self, emath, TextWrapMode}, re_types::datatypes, + re_ui::UiExt, re_viewer_context::{ - HoverHighlight, InteractionHighlight, SelectionHighlight, - SpaceViewHighlights, + HoverHighlight, InteractionHighlight, SelectionHighlight, SpaceViewHighlights, + SpaceViewState, }, }; @@ -153,3 +155,85 @@ pub fn measure_node_sizes<'a>( }); sizes } + +/// Space view state for the custom space view. +/// +/// This state is preserved between frames, but not across Viewer sessions. +#[derive(Default)] +pub(crate) struct GraphSpaceViewState { + pub world_to_view: emath::TSTransform, + + // Debug information + pub show_debug: bool, + + /// Positions of the nodes in world space. + pub layout: Option>, +} + +pub fn bounding_rect_from_iter<'a>( + rects: impl Iterator, +) -> Option { + // Start with `None` and gradually expand the bounding box. + let mut bounding_rect: Option = None; + + for rect in rects { + bounding_rect = match bounding_rect { + Some(bounding) => Some(bounding.union(*rect)), + None => Some(*rect), + }; + } + + bounding_rect +} + +impl GraphSpaceViewState { + pub fn fit_to_screen(&mut self, bounding_rect: egui::Rect, available_size: egui::Vec2) { + // Compute the scale factor to fit the bounding rectangle into the available screen size. + let scale_x = available_size.x / bounding_rect.width(); + let scale_y = available_size.y / bounding_rect.height(); + + // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. + let scale = scale_x.min(scale_y).min(1.0); + + // Compute the translation to center the bounding rect in the screen. + let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); + let center_world = bounding_rect.center().to_vec2(); + + // Set the transformation to scale and then translate to center. + self.world_to_view = + emath::TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) + * emath::TSTransform::from_scaling(scale); + } + + pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { + if let Some(layout) = &self.layout { + ui.grid_left_hand_label("Bounding box") + .on_hover_text("The bounding box encompassing all Entities in the view right now"); + ui.vertical(|ui| { + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); + if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(layout.values()) { + ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); + ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); + } + }); + ui.end_row(); + } + } + + pub fn debug_ui(&mut self, ui: &mut egui::Ui) { + ui.re_checkbox(&mut self.show_debug, "Show debug information") + .on_hover_text("Shows debug information for the current graph"); + + ui.end_row(); + } +} + +impl SpaceViewState for GraphSpaceViewState { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} From 0df93fdcedfddbd885ab95351abe824db536b7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 16:27:05 +0200 Subject: [PATCH 046/159] WIP: clean up --- examples/rust/graph_view/src/common.rs | 6 ----- examples/rust/graph_view/src/graph.rs | 8 +++--- .../rust/graph_view/src/graph_space_view.rs | 26 +++++++------------ examples/rust/graph_view/src/main.rs | 3 +-- examples/rust/graph_view/src/ui.rs | 10 +++---- .../edges_undirected.rs} | 8 +++--- .../rust/graph_view/src/visualizers/mod.rs | 2 ++ .../nodes.rs} | 4 +-- 8 files changed, 25 insertions(+), 42 deletions(-) rename examples/rust/graph_view/src/{edge_undirected_visualizer_system.rs => visualizers/edges_undirected.rs} (94%) create mode 100644 examples/rust/graph_view/src/visualizers/mod.rs rename examples/rust/graph_view/src/{node_visualizer_system.rs => visualizers/nodes.rs} (98%) diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs index 4a752821e3e6..20454e88cb50 100644 --- a/examples/rust/graph_view/src/common.rs +++ b/examples/rust/graph_view/src/common.rs @@ -1,12 +1,6 @@ -use std::collections::HashSet; - use re_log_types::{EntityPath, EntityPathHash}; use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; -use crate::{ - edge_undirected_visualizer_system::EdgeInstance, node_visualizer_system::NodeInstance, -}; - #[derive(Clone, PartialEq, Eq, Hash)] pub(crate) struct NodeLocation { pub entity_hash: EntityPathHash, diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index 55105d782f46..d38552b29ffe 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -3,8 +3,8 @@ use std::collections::HashSet; use re_log_types::external::re_types_core::datatypes::EntityPath; use crate::{ - common::NodeLocation, edge_undirected_visualizer_system::EdgeInstance, - node_visualizer_system::NodeInstance, + common::NodeLocation, + visualizers::{edges_undirected::EdgeInstance, nodes::NodeInstance}, }; pub(crate) struct Graph<'a, N, E> @@ -45,9 +45,7 @@ pub(crate) enum Node<'a> { Dummy(NodeLocation, &'a EntityPath), } -fn edges_to_iter<'a>( - edge: EdgeInstance<'a>, -) -> impl Iterator { +fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { let source = (edge.source, edge.source_entity_path); let target = (edge.target, edge.target_entity_path); std::iter::once(source.clone()).chain(std::iter::once(target)) diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 6b565f7e36e0..83f18b69f26f 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,31 +1,23 @@ -use std::collections::HashMap; - use re_viewer::external::{ - egui::{self, emath::TSTransform, TextWrapMode}, + egui::{self, emath::TSTransform}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, - re_types::{datatypes, SpaceViewClassIdentifier}, + re_types::SpaceViewClassIdentifier, re_ui::{self, UiExt}, re_viewer_context::{ - HoverHighlight, IdentifiedViewSystem as _, InteractionHighlight, Item, SelectionHighlight, - SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, - SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, - SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, - ViewQuery, ViewerContext, + IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, + SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, + SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, + SystemExecutionOutput, ViewQuery, ViewerContext, }, }; use crate::{ - common::NodeLocation, - edge_undirected_visualizer_system::EdgeUndirectedVisualizer, error::Error, - graph::{Graph, Node}, + graph::Graph, ui::{self, GraphSpaceViewState}, -}; -use crate::{ - edge_undirected_visualizer_system::{self, EdgeInstance}, - node_visualizer_system::{GraphNodeVisualizer, NodeInstance}, + visualizers::{edges_undirected::EdgeUndirectedVisualizer, nodes::GraphNodeVisualizer}, }; #[derive(Default)] @@ -90,7 +82,7 @@ impl SpaceViewClass for GraphSpaceView { /// In this sample we show a combo box to select the color coordinates mode. fn selection_ui( &self, - ctx: &ViewerContext<'_>, + _ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, _space_origin: &EntityPath, diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index a15ab86b2c70..2abeb4b52360 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -6,10 +6,9 @@ mod error; mod common; mod layout; mod ui; -mod edge_undirected_visualizer_system; +mod visualizers; mod graph; mod graph_space_view; -mod node_visualizer_system; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 7454a88d4911..3a818f8c6501 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -12,11 +12,11 @@ use re_viewer::external::{ }, }; -use crate::{common::NodeLocation, graph::Node, node_visualizer_system::NodeInstance}; +use crate::{common::NodeLocation, graph::Node, visualizers::nodes::NodeInstance}; -pub fn draw_node<'a>( +pub fn draw_node( ui: &mut egui::Ui, - node: &NodeInstance<'a>, + node: &NodeInstance, highlight: InteractionHighlight, ) -> egui::Response { let hcolor = match ( @@ -171,12 +171,12 @@ pub(crate) struct GraphSpaceViewState { } pub fn bounding_rect_from_iter<'a>( - rects: impl Iterator, + rectangles: impl Iterator, ) -> Option { // Start with `None` and gradually expand the bounding box. let mut bounding_rect: Option = None; - for rect in rects { + for rect in rectangles { bounding_rect = match bounding_rect { Some(bounding) => Some(bounding.union(*rect)), None => Some(*rect), diff --git a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs b/examples/rust/graph_view/src/visualizers/edges_undirected.rs similarity index 94% rename from examples/rust/graph_view/src/edge_undirected_visualizer_system.rs rename to examples/rust/graph_view/src/visualizers/edges_undirected.rs index 47ff60b60718..faf8e6ba00b5 100644 --- a/examples/rust/graph_view/src/edge_undirected_visualizer_system.rs +++ b/examples/rust/graph_view/src/visualizers/edges_undirected.rs @@ -17,16 +17,16 @@ use crate::common::NodeLocation; #[derive(Default)] pub struct EdgeUndirectedVisualizer { - pub(crate) data: Vec, + pub data: Vec, } -pub(crate) struct EdgeUndirectedVisualizerData { +pub struct EdgeUndirectedVisualizerData { pub entity_path: re_log_types::EntityPath, edges: ChunkComponentIterItem, colors: ChunkComponentIterItem, } -pub(crate) struct EdgeInstance<'a> { +pub struct EdgeInstance<'a> { pub source: NodeLocation, pub target: NodeLocation, pub source_entity_path: &'a datatypes::EntityPath, @@ -37,7 +37,7 @@ pub(crate) struct EdgeInstance<'a> { } impl EdgeUndirectedVisualizerData { - pub(crate) fn edges(&self) -> impl Iterator { + pub fn edges(&self) -> impl Iterator { clamped_zip_2x1( self.edges.iter(), (0..).map(Instance::from), diff --git a/examples/rust/graph_view/src/visualizers/mod.rs b/examples/rust/graph_view/src/visualizers/mod.rs new file mode 100644 index 000000000000..a87f46ba7f77 --- /dev/null +++ b/examples/rust/graph_view/src/visualizers/mod.rs @@ -0,0 +1,2 @@ +pub mod edges_undirected; +pub mod nodes; diff --git a/examples/rust/graph_view/src/node_visualizer_system.rs b/examples/rust/graph_view/src/visualizers/nodes.rs similarity index 98% rename from examples/rust/graph_view/src/node_visualizer_system.rs rename to examples/rust/graph_view/src/visualizers/nodes.rs index 368b935d93ad..dbbfe2a94444 100644 --- a/examples/rust/graph_view/src/node_visualizer_system.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -1,5 +1,3 @@ -use std::collections::HashSet; - use re_log_types::Instance; use re_viewer::external::{ egui::Color32, @@ -11,7 +9,7 @@ use re_viewer::external::{ re_types::{ self, archetypes, components::{self}, - datatypes, ArrowString, Loggable as _, + ArrowString, Loggable as _, }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, From d42c899d72d7104575b01cbdc83e1ccfdd62d6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 16:45:32 +0200 Subject: [PATCH 047/159] WIP: minor changes --- examples/rust/graph_view/src/graph.rs | 2 +- examples/rust/graph_view/src/ui.rs | 1 - examples/rust/graph_view/src/visualizers/nodes.rs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index d38552b29ffe..65a08251f221 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -45,7 +45,7 @@ pub(crate) enum Node<'a> { Dummy(NodeLocation, &'a EntityPath), } -fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { +fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { let source = (edge.source, edge.source_entity_path); let target = (edge.target, edge.target_entity_path); std::iter::once(source.clone()).chain(std::iter::once(target)) diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 3a818f8c6501..4b308ec2196e 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -223,7 +223,6 @@ impl GraphSpaceViewState { pub fn debug_ui(&mut self, ui: &mut egui::Ui) { ui.re_checkbox(&mut self.show_debug, "Show debug information") .on_hover_text("Shows debug information for the current graph"); - ui.end_row(); } } diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index dbbfe2a94444..126dc49f40a0 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -27,7 +27,7 @@ pub struct GraphNodeVisualizer { } pub(crate) struct GraphNodeVisualizerData { - pub(crate) entity_path: EntityPath, + entity_path: EntityPath, node_ids: ChunkComponentIterItem, // Clamped From 002c7b05d0d432a797c2aabbb760d5d1851b263a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 17:37:58 +0200 Subject: [PATCH 048/159] WIP: cleanup --- examples/rust/graph_view/src/error.rs | 1 - examples/rust/graph_view/src/graph.rs | 2 +- examples/rust/graph_view/src/main.rs | 6 +++--- examples/rust/graph_view/src/ui.rs | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 644cc9997d3f..158e9a3bfa31 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -4,7 +4,6 @@ use re_viewer::external::re_viewer_context::SpaceViewSystemExecutionError; pub enum Error { #[error("edge has unknown node: {0}")] EdgeUnknownNode(String), - } impl From for SpaceViewSystemExecutionError { diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index 65a08251f221..d38552b29ffe 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -45,7 +45,7 @@ pub(crate) enum Node<'a> { Dummy(NodeLocation, &'a EntityPath), } -fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { +fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { let source = (edge.source, edge.source_entity_path); let target = (edge.target, edge.target_entity_path); std::iter::once(source.clone()).chain(std::iter::once(target)) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 2abeb4b52360..8bc93d6f2214 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,13 +2,13 @@ use re_viewer::external::{re_log, re_memory}; -mod error; mod common; +mod error; +mod graph; +mod graph_space_view; mod layout; mod ui; mod visualizers; -mod graph; -mod graph_space_view; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 4b308ec2196e..573f0fc612b6 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -85,10 +85,10 @@ pub fn draw_entity( egui::Stroke::NONE, ); - if (highlights + if highlights .entity_outline_mask(entity_path.hash()) .overall - .is_some()) + .is_some() { // TODO(grtlr): text should be presented in window space. painter.text( From 8fea1fcd6fa857748a3471dbadbc448c95fc34f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 8 Oct 2024 17:53:56 +0200 Subject: [PATCH 049/159] WIP: fix visibility --- examples/rust/graph_view/src/visualizers/nodes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 126dc49f40a0..77010bfe409c 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -27,7 +27,7 @@ pub struct GraphNodeVisualizer { } pub(crate) struct GraphNodeVisualizerData { - entity_path: EntityPath, + pub entity_path: EntityPath, node_ids: ChunkComponentIterItem, // Clamped From 80ad5b170414cf1d73b94717fbff7466feb7a6dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 11:37:29 +0200 Subject: [PATCH 050/159] WIP: More cleanup --- examples/rust/graph_view/src/common.rs | 23 --- examples/rust/graph_view/src/graph.rs | 177 ++++++++++-------- .../rust/graph_view/src/graph_space_view.rs | 54 +++--- examples/rust/graph_view/src/main.rs | 1 - examples/rust/graph_view/src/ui.rs | 31 ++- .../src/visualizers/edges_undirected.rs | 24 +-- .../rust/graph_view/src/visualizers/nodes.rs | 14 +- 7 files changed, 157 insertions(+), 167 deletions(-) delete mode 100644 examples/rust/graph_view/src/common.rs diff --git a/examples/rust/graph_view/src/common.rs b/examples/rust/graph_view/src/common.rs deleted file mode 100644 index 20454e88cb50..000000000000 --- a/examples/rust/graph_view/src/common.rs +++ /dev/null @@ -1,23 +0,0 @@ -use re_log_types::{EntityPath, EntityPathHash}; -use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; - -#[derive(Clone, PartialEq, Eq, Hash)] -pub(crate) struct NodeLocation { - pub entity_hash: EntityPathHash, - pub node_id: GraphNodeId, -} - -impl From for NodeLocation { - fn from(location: GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path).hash(), - node_id: location.node_id, - } - } -} - -impl std::fmt::Display for NodeLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_hash) - } -} diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index d38552b29ffe..72d8c6d5cc57 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,106 +1,135 @@ use std::collections::HashSet; -use re_log_types::external::re_types_core::datatypes::EntityPath; +use re_log_types::{EntityPath, EntityPathHash}; +use re_viewer::external::re_types::datatypes; -use crate::{ - common::NodeLocation, - visualizers::{edges_undirected::EdgeInstance, nodes::NodeInstance}, +use crate::visualizers::{ + edges_undirected::{EdgeInstance, EdgeUndirectedVisualizerData}, + nodes::{GraphNodeVisualizerData, NodeInstance}, }; -pub(crate) struct Graph<'a, N, E> -where - N: Iterator>, - E: Iterator>, -{ - node_it: N, - edge_it: E, +use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; + +pub(crate) enum Node<'a> { + Regular(NodeInstance<'a>), + Unknown(UnknownNodeInstance<'a>), } -impl<'a, N, E> Graph<'a, N, E> -where - N: Iterator>, - E: Iterator>, -{ - pub fn new(nodes: N, edges: E) -> Self { +#[derive(Clone, PartialEq, Eq, Hash)] +pub(crate) struct NodeIndex { + pub entity_hash: EntityPathHash, + pub node_id: GraphNodeId, +} + +impl From for NodeIndex { + fn from(location: GraphLocation) -> Self { Self { - node_it: nodes, - edge_it: edges, + entity_hash: EntityPath::from(location.entity_path).hash(), + node_id: location.node_id, } } +} - pub fn nodes(self) -> impl Iterator> { - AllNodesIterator::new(self.node_it, edges_to_nodes(self.edge_it)) +impl From<&GraphLocation> for NodeIndex { + fn from(location: &GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path.clone()).hash(), + node_id: location.node_id.clone(), + } } +} - pub fn dummy_nodes(self) -> impl Iterator { - self.nodes().filter_map(|n| match n { - Node::Dummy(location, entity_path) => Some((location, entity_path)), - Node::Regular(_) => None, - }) +impl std::fmt::Display for NodeIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{:?}", self.node_id, self.entity_hash) } } -pub(crate) enum Node<'a> { - Regular(NodeInstance<'a>), - Dummy(NodeLocation, &'a EntityPath), +impl<'a> From<&NodeInstance<'a>> for NodeIndex { + fn from(node: &NodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } } -fn edges_to_iter(edge: EdgeInstance) -> impl Iterator { - let source = (edge.source, edge.source_entity_path); - let target = (edge.target, edge.target_entity_path); - std::iter::once(source.clone()).chain(std::iter::once(target)) +pub(crate) struct UnknownNodeInstance<'a> { + pub node_id: &'a datatypes::GraphNodeId, + pub entity_path: &'a EntityPath, } -pub(crate) fn edges_to_nodes<'a>( - edges: impl IntoIterator>, -) -> impl Iterator { - edges.into_iter().flat_map(|e| edges_to_iter(e)) +impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { + fn from(node: &UnknownNodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } } -#[derive(Clone)] -pub(crate) struct AllNodesIterator<'a, N, E> -where - N: Iterator>, - E: Iterator + Sized, -{ - seen: HashSet, - node_it: N, - edge_it: E, +pub(crate) struct Graph<'a> { + /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list + unknown: Vec<(EntityPath, datatypes::GraphNodeId)>, + nodes: &'a Vec, + undirected: &'a Vec, } -impl<'a, N, E> AllNodesIterator<'a, N, E> -where - N: Iterator>, - E: Iterator, -{ - pub fn new(node_it: N, edge_it: E) -> Self { +impl<'a> Graph<'a> { + pub fn from_nodes_edges( + nodes: &'a Vec, + undirected: &'a Vec, + ) -> Self { + let seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes + .iter() + .flat_map(|entity| entity.nodes()) + .map(|n| (n.entity_path, n.node_id)) + .collect(); + + let unknown = undirected + .iter() + .flat_map(|entity| entity.edges().flat_map(|edge| edge.nodes())) + .filter_map(|n| { + let entity_path = EntityPath::from(n.entity_path.clone()); + if seen.contains(&(&entity_path, &n.node_id)) { + None + } else { + Some((entity_path, n.node_id)) + } + }) + .collect(); + Self { - seen: HashSet::new(), - node_it, - edge_it, + unknown, + nodes, + undirected, } } -} -impl<'a, N, E> Iterator for AllNodesIterator<'a, N, E> -where - N: Iterator>, - E: Iterator, -{ - type Item = Node<'a>; - - fn next(&mut self) -> Option> { - if let Some(node) = self.node_it.next() { - self.seen.insert(node.location.clone()); - return Some(Node::Regular(node)); - } + pub fn nodes_by_entity(&self) -> impl Iterator { + self.nodes.iter() + } - for (node, entity_path) in self.edge_it.by_ref() { - if !self.seen.contains(&node) { - return Some(Node::Dummy(node, entity_path)); - } - } + pub fn all_nodes(&self) -> impl Iterator { + let nodes = self.nodes.iter().flat_map(|entity| entity.nodes().map(Node::Regular)); + let unknowns= self.unknown_nodes().map(Node::Unknown); + nodes.chain(unknowns) + } + + pub fn edges_by_entity(&self) -> impl Iterator { + self.undirected.iter() + } + + pub fn edges(&self) -> impl Iterator { + self.undirected.iter().flat_map(|entity| entity.edges()) + } - None + pub fn unknown_nodes(&'a self) -> impl Iterator> { + self.unknown + .iter() + .map(|(entity_path, node_id)| UnknownNodeInstance { + entity_path, + node_id, + }) } } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index 83f18b69f26f..f461e3c03f30 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -1,22 +1,16 @@ use re_viewer::external::{ - egui::{self, emath::TSTransform}, - re_entity_db::InstancePath, - re_log::external::log, - re_log_types::EntityPath, - re_types::SpaceViewClassIdentifier, - re_ui::{self, UiExt}, - re_viewer_context::{ + egui::{self, emath::TSTransform}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, re_renderer::view_builder::TargetConfiguration, re_types::SpaceViewClassIdentifier, re_ui::{self, UiExt}, re_viewer_context::{ IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext, - }, + } }; use crate::{ error::Error, - graph::Graph, - ui::{self, GraphSpaceViewState}, + graph::{Graph, NodeIndex}, + ui::{self, draw_dummy, GraphSpaceViewState}, visualizers::{edges_undirected::EdgeUndirectedVisualizer, nodes::GraphNodeVisualizer}, }; @@ -114,23 +108,20 @@ impl SpaceViewClass for GraphSpaceView { .view_systems .get::()?; + let graph = Graph::from_nodes_edges(&node_system.data, &edge_system.data); + let state = state.downcast_mut::()?; let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); let Some(layout) = &mut state.layout else { - let graph = Graph::new( - node_system.data.iter().flat_map(|d| d.nodes()), - edge_system.data.iter().flat_map(|d| d.edges()), - ); - - let node_sizes = ui::measure_node_sizes(ui, graph.nodes()); + let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); let layout = crate::layout::compute_layout( node_sizes.into_iter(), edge_system .data .iter() - .flat_map(|d| d.edges().map(|e| (e.source, e.target))), + .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))), )?; if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { @@ -224,10 +215,11 @@ impl SpaceViewClass for GraphSpaceView { let mut entity_rect: Option = None; for node in data.nodes() { + let index = NodeIndex::from(&node); let current_extent = layout - .get(&node.location) + .get(&index) .expect("missing layout information for node"); - let response = egui::Area::new(id.with((node.location.clone(), node.instance))) + let response = egui::Area::new(id.with(&index)) .current_pos(current_extent.min) .order(egui::Order::Middle) .constrain(false) @@ -244,7 +236,7 @@ impl SpaceViewClass for GraphSpaceView { Item::DataResult(query.space_view_id, instance), ); - layout.insert(node.location.clone(), response.rect); + layout.insert(index, response.rect); entity_rect = entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); @@ -272,26 +264,22 @@ impl SpaceViewClass for GraphSpaceView { } } - let graph = Graph::new( - node_system.data.iter().flat_map(|d| d.nodes()), - edge_system.data.iter().flat_map(|d| d.edges()), - ); - - for dummy in graph.dummy_nodes() { + for dummy in graph.unknown_nodes() { + let index = NodeIndex::from(&dummy); let current_extent = layout - .get(&dummy.0) + .get(&index) .expect("missing layout information for dummy node"); - let response = egui::Area::new(id.with(dummy.0.clone())) + let response = egui::Area::new(id.with(&index)) .current_pos(current_extent.min) .order(egui::Order::Middle) .constrain(false) .show(ui.ctx(), |ui| { ui.set_clip_rect(clip_rect_world); - ui::draw_dummy(ui, dummy.1, &dummy.0.node_id) + ui::draw_dummy(ui, &dummy) }) .response; - layout.insert(dummy.0.clone(), response.rect); + layout.insert(index, response.rect); let id = response.layer_id; ui.ctx().set_transform_layer(id, world_to_window); @@ -302,11 +290,13 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { + let source_ix = NodeIndex::from(edge.source); + let target_ix = NodeIndex::from(edge.target); let source_pos = layout - .get(&edge.source) + .get(&source_ix) .ok_or_else(|| Error::EdgeUnknownNode(edge.source.to_string()))?; let target_pos = layout - .get(&edge.target) + .get(&target_ix) .ok_or_else(|| Error::EdgeUnknownNode(edge.target.to_string()))?; let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 8bc93d6f2214..6a6742210f3e 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -2,7 +2,6 @@ use re_viewer::external::{re_log, re_memory}; -mod common; mod error; mod graph; mod graph_space_view; diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 573f0fc612b6..014d0fd70485 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -12,11 +12,11 @@ use re_viewer::external::{ }, }; -use crate::{common::NodeLocation, graph::Node, visualizers::nodes::NodeInstance}; +use crate::{graph::{ Node, NodeIndex, UnknownNodeInstance}, visualizers::nodes::NodeInstance}; pub fn draw_node( ui: &mut egui::Ui, - node: &NodeInstance, + instance: &NodeInstance, highlight: InteractionHighlight, ) -> egui::Response { let hcolor = match ( @@ -34,8 +34,8 @@ pub fn draw_node( }; // ui.style().visuals.faint_bg_color - let text = node.label.map_or( - egui::RichText::new(node.location.node_id.to_string()), + let text = instance.label.map_or( + egui::RichText::new(instance.node_id.to_string()), |label| egui::RichText::new(label.to_string()), ); @@ -46,7 +46,7 @@ pub fn draw_node( .fill(bg) .show(ui, |ui| { ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - if let Some(color) = node.color { + if let Some(color) = instance.color { ui.add(egui::Button::new(text.color(color))); } else { ui.add(egui::Button::new(text)); @@ -57,10 +57,9 @@ pub fn draw_node( pub fn draw_dummy( ui: &mut egui::Ui, - entity_path: &datatypes::EntityPath, - node_id: &datatypes::GraphNodeId, + instance: &UnknownNodeInstance ) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", node_id, entity_path.0)) + let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path.to_string())) .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); ui.add(egui::Button::new(text)) @@ -135,20 +134,20 @@ pub fn draw_edge( pub fn measure_node_sizes<'a>( ui: &mut egui::Ui, nodes: impl Iterator>, -) -> HashMap { +) -> HashMap { let mut sizes = HashMap::new(); let ctx = ui.ctx(); ctx.request_discard("measuring node sizes"); ui.horizontal(|ui| { for node in nodes { match node { - Node::Regular(node) => { - let r = draw_node(ui, &node, InteractionHighlight::default()); - sizes.insert(node.location, r.rect.size()); + Node::Regular(instance) => { + let r = draw_node(ui, &instance, InteractionHighlight::default()); + sizes.insert((&instance).into(), r.rect.size()); } - Node::Dummy(location, entity_path) => { - let r = draw_dummy(ui, entity_path, &location.node_id); - sizes.insert(location, r.rect.size()); + Node::Unknown(instance) => { + let r = draw_dummy(ui, &instance); + sizes.insert((&instance).into(), r.rect.size()); } }; } @@ -167,7 +166,7 @@ pub(crate) struct GraphSpaceViewState { pub show_debug: bool, /// Positions of the nodes in world space. - pub layout: Option>, + pub layout: Option>, } pub fn bounding_rect_from_iter<'a>( diff --git a/examples/rust/graph_view/src/visualizers/edges_undirected.rs b/examples/rust/graph_view/src/visualizers/edges_undirected.rs index faf8e6ba00b5..6e1e4c0140e7 100644 --- a/examples/rust/graph_view/src/visualizers/edges_undirected.rs +++ b/examples/rust/graph_view/src/visualizers/edges_undirected.rs @@ -1,11 +1,11 @@ -use re_log_types::{external::re_types_core::datatypes, Instance}; +use re_log_types::{EntityPath, Instance}; use re_viewer::external::{ egui::Color32, re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_query::{clamped_zip_2x1, range_zip_1x1}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{self, archetypes, components, Loggable as _}, + re_types::{self, archetypes, datatypes, components::{self, GraphNodeId}, Loggable as _}, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -13,8 +13,6 @@ use re_viewer::external::{ }, }; -use crate::common::NodeLocation; - #[derive(Default)] pub struct EdgeUndirectedVisualizer { pub data: Vec, @@ -27,15 +25,19 @@ pub struct EdgeUndirectedVisualizerData { } pub struct EdgeInstance<'a> { - pub source: NodeLocation, - pub target: NodeLocation, - pub source_entity_path: &'a datatypes::EntityPath, - pub target_entity_path: &'a datatypes::EntityPath, + pub source: &'a datatypes::GraphLocation, + pub target: &'a datatypes::GraphLocation, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, } +impl<'a> EdgeInstance<'a> { + pub fn nodes(&'a self) -> impl Iterator { + [self.source.clone(), self.target.clone()].into_iter() + } +} + impl EdgeUndirectedVisualizerData { pub fn edges(&self) -> impl Iterator { clamped_zip_2x1( @@ -45,10 +47,8 @@ impl EdgeUndirectedVisualizerData { Option::<&components::Color>::default, ) .map(|(edge, instance, color)| EdgeInstance { - source: edge.source.clone().into(), - target: edge.target.clone().into(), - source_entity_path: &edge.0.source.entity_path, - target_entity_path: &edge.0.target.entity_path, + source: &edge.source, + target: &edge.target, entity_path: &self.entity_path, instance, color: color.map(|c| Color32::from(c.0)), diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 77010bfe409c..5a9f81ec1e8c 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -9,7 +9,7 @@ use re_viewer::external::{ re_types::{ self, archetypes, components::{self}, - ArrowString, Loggable as _, + datatypes, ArrowString, Loggable as _, }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, @@ -18,8 +18,6 @@ use re_viewer::external::{ }, }; -use crate::common::NodeLocation; - /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct GraphNodeVisualizer { @@ -39,7 +37,8 @@ pub(crate) struct GraphNodeVisualizerData { } pub(crate) struct NodeInstance<'a> { - pub location: NodeLocation, + pub node_id: &'a datatypes::GraphNodeId, + pub entity_path: &'a EntityPath, pub instance: Instance, pub label: Option<&'a ArrowString>, pub color: Option, @@ -47,7 +46,6 @@ pub(crate) struct NodeInstance<'a> { impl GraphNodeVisualizerData { pub(crate) fn nodes(&self) -> impl Iterator { - let entity_hash = self.entity_path.hash(); clamped_zip_2x2( self.node_ids.iter(), (0..).map(Instance::from), @@ -63,10 +61,8 @@ impl GraphNodeVisualizerData { Option::<&ArrowString>::default, ) .map(move |(node_id, instance, color, label)| NodeInstance { - location: NodeLocation { - entity_hash, - node_id: node_id.0.clone(), - }, + entity_path: &self.entity_path, + node_id, instance, color: color.map(|c| Color32::from(c.0)), label, From 6463f23dacb8376ff39e3aec3ec6902f573df2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 11:51:38 +0200 Subject: [PATCH 051/159] WIP: moving things around --- examples/rust/graph_view/src/graph.rs | 71 ++--------------- .../rust/graph_view/src/graph_space_view.rs | 9 +-- examples/rust/graph_view/src/main.rs | 1 + examples/rust/graph_view/src/types.rs | 77 +++++++++++++++++++ examples/rust/graph_view/src/ui.rs | 25 +++--- .../src/visualizers/edges_undirected.rs | 44 +++++------ .../rust/graph_view/src/visualizers/nodes.rs | 12 +-- 7 files changed, 123 insertions(+), 116 deletions(-) create mode 100644 examples/rust/graph_view/src/types.rs diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index 72d8c6d5cc57..706b2980352a 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,84 +1,29 @@ use std::collections::HashSet; -use re_log_types::{EntityPath, EntityPathHash}; +use re_log_types::{EntityPath}; use re_viewer::external::re_types::datatypes; -use crate::visualizers::{ - edges_undirected::{EdgeInstance, EdgeUndirectedVisualizerData}, - nodes::{GraphNodeVisualizerData, NodeInstance}, -}; - -use re_viewer::external::re_types::datatypes::{GraphLocation, GraphNodeId}; +use crate::{types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, visualizers::{ + edges_undirected::UndirectedEdgesData, + nodes::GraphNodeVisualizerData, +}}; pub(crate) enum Node<'a> { Regular(NodeInstance<'a>), Unknown(UnknownNodeInstance<'a>), } -#[derive(Clone, PartialEq, Eq, Hash)] -pub(crate) struct NodeIndex { - pub entity_hash: EntityPathHash, - pub node_id: GraphNodeId, -} - -impl From for NodeIndex { - fn from(location: GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path).hash(), - node_id: location.node_id, - } - } -} - -impl From<&GraphLocation> for NodeIndex { - fn from(location: &GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path.clone()).hash(), - node_id: location.node_id.clone(), - } - } -} - -impl std::fmt::Display for NodeIndex { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_hash) - } -} - -impl<'a> From<&NodeInstance<'a>> for NodeIndex { - fn from(node: &NodeInstance<'a>) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), - } - } -} - -pub(crate) struct UnknownNodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, - pub entity_path: &'a EntityPath, -} - -impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { - fn from(node: &UnknownNodeInstance<'a>) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), - } - } -} - pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list unknown: Vec<(EntityPath, datatypes::GraphNodeId)>, nodes: &'a Vec, - undirected: &'a Vec, + undirected: &'a Vec, } impl<'a> Graph<'a> { pub fn from_nodes_edges( nodes: &'a Vec, - undirected: &'a Vec, + undirected: &'a Vec, ) -> Self { let seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes .iter() @@ -116,7 +61,7 @@ impl<'a> Graph<'a> { nodes.chain(unknowns) } - pub fn edges_by_entity(&self) -> impl Iterator { + pub fn edges_by_entity(&self) -> impl Iterator { self.undirected.iter() } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/graph_space_view.rs index f461e3c03f30..253321f680c8 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/graph_space_view.rs @@ -8,10 +8,7 @@ use re_viewer::external::{ }; use crate::{ - error::Error, - graph::{Graph, NodeIndex}, - ui::{self, draw_dummy, GraphSpaceViewState}, - visualizers::{edges_undirected::EdgeUndirectedVisualizer, nodes::GraphNodeVisualizer}, + error::Error, graph::Graph, types::NodeIndex, ui::{self, draw_dummy, GraphSpaceViewState}, visualizers::{edges_undirected::UndirectedEdgesVisualizer, nodes::GraphNodeVisualizer} }; #[derive(Default)] @@ -42,7 +39,7 @@ impl SpaceViewClass for GraphSpaceView { system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_visualizer::()?; - system_registry.register_visualizer::() + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -106,7 +103,7 @@ impl SpaceViewClass for GraphSpaceView { let node_system = system_output.view_systems.get::()?; let edge_system = system_output .view_systems - .get::()?; + .get::()?; let graph = Graph::from_nodes_edges(&node_system.data, &edge_system.data); diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 6a6742210f3e..04ec13fc0c4e 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -8,6 +8,7 @@ mod graph_space_view; mod layout; mod ui; mod visualizers; +mod types; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs new file mode 100644 index 000000000000..c5eb59ec4991 --- /dev/null +++ b/examples/rust/graph_view/src/types.rs @@ -0,0 +1,77 @@ +use re_log_types::{EntityPath, EntityPathHash, Instance}; +use re_viewer::external::{egui, re_types::{datatypes, ArrowString}}; + +impl<'a> EdgeInstance<'a> { + pub fn nodes(&'a self) -> impl Iterator { + [self.source.clone(), self.target.clone()].into_iter() + } +} + +#[derive(Clone, PartialEq, Eq, Hash)] +pub(crate) struct NodeIndex { + pub entity_hash: EntityPathHash, + pub node_id: datatypes::GraphNodeId, +} + +impl From for NodeIndex { + fn from(location: datatypes::GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path).hash(), + node_id: location.node_id, + } + } +} + +impl From<&datatypes::GraphLocation> for NodeIndex { + fn from(location: &datatypes::GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path.clone()).hash(), + node_id: location.node_id.clone(), + } + } +} + +impl std::fmt::Display for NodeIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{:?}", self.node_id, self.entity_hash) + } +} + +impl<'a> From<&NodeInstance<'a>> for NodeIndex { + fn from(node: &NodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } +} + +pub(crate) struct NodeInstance<'a> { + pub node_id: &'a datatypes::GraphNodeId, + pub entity_path: &'a EntityPath, + pub instance: Instance, + pub label: Option<&'a ArrowString>, + pub color: Option, +} + +pub struct EdgeInstance<'a> { + pub source: &'a datatypes::GraphLocation, + pub target: &'a datatypes::GraphLocation, + pub entity_path: &'a re_log_types::EntityPath, + pub instance: Instance, + pub color: Option, +} + +pub(crate) struct UnknownNodeInstance<'a> { + pub node_id: &'a datatypes::GraphNodeId, + pub entity_path: &'a EntityPath, +} + +impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { + fn from(node: &UnknownNodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } +} diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui.rs index 014d0fd70485..81b458eace02 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui.rs @@ -4,7 +4,6 @@ use re_format::format_f32; use re_log_types::EntityPath; use re_viewer::external::{ egui::{self, emath, TextWrapMode}, - re_types::datatypes, re_ui::UiExt, re_viewer_context::{ HoverHighlight, InteractionHighlight, SelectionHighlight, SpaceViewHighlights, @@ -12,7 +11,7 @@ use re_viewer::external::{ }, }; -use crate::{graph::{ Node, NodeIndex, UnknownNodeInstance}, visualizers::nodes::NodeInstance}; +use crate::{graph::Node, types::{NodeIndex, NodeInstance, UnknownNodeInstance}}; pub fn draw_node( ui: &mut egui::Ui, @@ -34,10 +33,11 @@ pub fn draw_node( }; // ui.style().visuals.faint_bg_color - let text = instance.label.map_or( - egui::RichText::new(instance.node_id.to_string()), - |label| egui::RichText::new(label.to_string()), - ); + let text = instance + .label + .map_or(egui::RichText::new(instance.node_id.to_string()), |label| { + egui::RichText::new(label.to_string()) + }); egui::Frame::default() .rounding(egui::Rounding::same(4.0)) @@ -55,12 +55,13 @@ pub fn draw_node( .response } -pub fn draw_dummy( - ui: &mut egui::Ui, - instance: &UnknownNodeInstance -) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path.to_string())) - .color(ui.style().visuals.widgets.noninteractive.text_color()); +pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { + let text = egui::RichText::new(format!( + "{} @ {}", + instance.node_id, + instance.entity_path.to_string() + )) + .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); ui.add(egui::Button::new(text)) } diff --git a/examples/rust/graph_view/src/visualizers/edges_undirected.rs b/examples/rust/graph_view/src/visualizers/edges_undirected.rs index 6e1e4c0140e7..1afb19cc8b56 100644 --- a/examples/rust/graph_view/src/visualizers/edges_undirected.rs +++ b/examples/rust/graph_view/src/visualizers/edges_undirected.rs @@ -1,11 +1,15 @@ -use re_log_types::{EntityPath, Instance}; +use re_log_types::Instance; use re_viewer::external::{ - egui::Color32, + egui, re_chunk::{ChunkComponentIterItem, LatestAtQuery}, re_query::{clamped_zip_2x1, range_zip_1x1}, re_renderer, re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{self, archetypes, datatypes, components::{self, GraphNodeId}, Loggable as _}, + re_types::{ + self, archetypes, + components::{self}, + Loggable as _, + }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, @@ -13,32 +17,20 @@ use re_viewer::external::{ }, }; +use crate::types::EdgeInstance; + #[derive(Default)] -pub struct EdgeUndirectedVisualizer { - pub data: Vec, +pub struct UndirectedEdgesVisualizer { + pub data: Vec, } -pub struct EdgeUndirectedVisualizerData { +pub struct UndirectedEdgesData { pub entity_path: re_log_types::EntityPath, edges: ChunkComponentIterItem, colors: ChunkComponentIterItem, } -pub struct EdgeInstance<'a> { - pub source: &'a datatypes::GraphLocation, - pub target: &'a datatypes::GraphLocation, - pub entity_path: &'a re_log_types::EntityPath, - pub instance: Instance, - pub color: Option, -} - -impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { - [self.source.clone(), self.target.clone()].into_iter() - } -} - -impl EdgeUndirectedVisualizerData { +impl UndirectedEdgesData { pub fn edges(&self) -> impl Iterator { clamped_zip_2x1( self.edges.iter(), @@ -51,18 +43,18 @@ impl EdgeUndirectedVisualizerData { target: &edge.target, entity_path: &self.entity_path, instance, - color: color.map(|c| Color32::from(c.0)), + color: color.map(|c| egui::Color32::from(c.0)), }) } } -impl IdentifiedViewSystem for EdgeUndirectedVisualizer { +impl IdentifiedViewSystem for UndirectedEdgesVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphEdgesUndirected".into() } } -impl VisualizerSystem for EdgeUndirectedVisualizer { +impl VisualizerSystem for UndirectedEdgesVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { VisualizerQueryInfo::from_archetype::() } @@ -93,7 +85,7 @@ impl VisualizerSystem for EdgeUndirectedVisualizer { ); for (_index, edges, colors) in data { - self.data.push(EdgeUndirectedVisualizerData { + self.data.push(UndirectedEdgesData { entity_path: data_result.entity_path.clone(), edges, colors: colors.unwrap_or_default(), @@ -115,4 +107,4 @@ impl VisualizerSystem for EdgeUndirectedVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(EdgeUndirectedVisualizer => []); +re_viewer_context::impl_component_fallback_provider!(UndirectedEdgesVisualizer => []); diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 5a9f81ec1e8c..44f60c138b0e 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -9,7 +9,7 @@ use re_viewer::external::{ re_types::{ self, archetypes, components::{self}, - datatypes, ArrowString, Loggable as _, + ArrowString, Loggable as _, }, re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, @@ -18,6 +18,8 @@ use re_viewer::external::{ }, }; +use crate::types::NodeInstance; + /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct GraphNodeVisualizer { @@ -36,14 +38,6 @@ pub(crate) struct GraphNodeVisualizerData { show_labels: Option, } -pub(crate) struct NodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, - pub entity_path: &'a EntityPath, - pub instance: Instance, - pub label: Option<&'a ArrowString>, - pub color: Option, -} - impl GraphNodeVisualizerData { pub(crate) fn nodes(&self) -> impl Iterator { clamped_zip_2x2( From 32b9f9cf8d989b73f0495721d34b16bd21175e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 12:27:17 +0200 Subject: [PATCH 052/159] WIP: more cleanup --- examples/rust/graph_view/src/graph.rs | 23 +++++++++++-------- .../src/{graph_space_view.rs => view.rs} | 23 ++++++++++++++----- .../rust/graph_view/src/visualizers/mod.rs | 7 ++++-- .../rust/graph_view/src/visualizers/nodes.rs | 18 +++++++-------- ...dges_undirected.rs => undirected_edges.rs} | 0 5 files changed, 44 insertions(+), 27 deletions(-) rename examples/rust/graph_view/src/{graph_space_view.rs => view.rs} (94%) rename examples/rust/graph_view/src/visualizers/{edges_undirected.rs => undirected_edges.rs} (100%) diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index 706b2980352a..cd208a3bfb10 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,12 +1,12 @@ use std::collections::HashSet; -use re_log_types::{EntityPath}; +use re_log_types::EntityPath; use re_viewer::external::re_types::datatypes; -use crate::{types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, visualizers::{ - edges_undirected::UndirectedEdgesData, - nodes::GraphNodeVisualizerData, -}}; +use crate::{ + types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, + visualizers::{NodeVisualizerData, UndirectedEdgesData}, +}; pub(crate) enum Node<'a> { Regular(NodeInstance<'a>), @@ -16,13 +16,13 @@ pub(crate) enum Node<'a> { pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list unknown: Vec<(EntityPath, datatypes::GraphNodeId)>, - nodes: &'a Vec, + nodes: &'a Vec, undirected: &'a Vec, } impl<'a> Graph<'a> { pub fn from_nodes_edges( - nodes: &'a Vec, + nodes: &'a Vec, undirected: &'a Vec, ) -> Self { let seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes @@ -51,13 +51,16 @@ impl<'a> Graph<'a> { } } - pub fn nodes_by_entity(&self) -> impl Iterator { + pub fn nodes_by_entity(&self) -> impl Iterator { self.nodes.iter() } pub fn all_nodes(&self) -> impl Iterator { - let nodes = self.nodes.iter().flat_map(|entity| entity.nodes().map(Node::Regular)); - let unknowns= self.unknown_nodes().map(Node::Unknown); + let nodes = self + .nodes + .iter() + .flat_map(|entity| entity.nodes().map(Node::Regular)); + let unknowns = self.unknown_nodes().map(Node::Unknown); nodes.chain(unknowns) } diff --git a/examples/rust/graph_view/src/graph_space_view.rs b/examples/rust/graph_view/src/view.rs similarity index 94% rename from examples/rust/graph_view/src/graph_space_view.rs rename to examples/rust/graph_view/src/view.rs index 253321f680c8..f9f728d09558 100644 --- a/examples/rust/graph_view/src/graph_space_view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -1,14 +1,25 @@ use re_viewer::external::{ - egui::{self, emath::TSTransform}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, re_renderer::view_builder::TargetConfiguration, re_types::SpaceViewClassIdentifier, re_ui::{self, UiExt}, re_viewer_context::{ + egui::{self, emath::TSTransform}, + re_entity_db::InstancePath, + re_log::external::log, + re_log_types::EntityPath, + re_renderer::view_builder::TargetConfiguration, + re_types::SpaceViewClassIdentifier, + re_ui::{self, UiExt}, + re_viewer_context::{ IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext, - } + }, }; use crate::{ - error::Error, graph::Graph, types::NodeIndex, ui::{self, draw_dummy, GraphSpaceViewState}, visualizers::{edges_undirected::UndirectedEdgesVisualizer, nodes::GraphNodeVisualizer} + error::Error, + graph::Graph, + types::NodeIndex, + ui::{self, draw_dummy, GraphSpaceViewState}, + visualizers::{NodeVisualizer, UndirectedEdgesVisualizer}, }; #[derive(Default)] @@ -38,7 +49,7 @@ impl SpaceViewClass for GraphSpaceView { &self, system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { - system_registry.register_visualizer::()?; + system_registry.register_visualizer::()?; system_registry.register_visualizer::() } @@ -59,7 +70,7 @@ impl SpaceViewClass for GraphSpaceView { // By default spawn a single view at the root if there's anything the visualizer is applicable to. if ctx .applicable_entities_per_visualizer - .get(&GraphNodeVisualizer::identifier()) + .get(&NodeVisualizer::identifier()) .map_or(true, |entities| entities.is_empty()) { SpaceViewSpawnHeuristics::default() @@ -100,7 +111,7 @@ impl SpaceViewClass for GraphSpaceView { query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { - let node_system = system_output.view_systems.get::()?; + let node_system = system_output.view_systems.get::()?; let edge_system = system_output .view_systems .get::()?; diff --git a/examples/rust/graph_view/src/visualizers/mod.rs b/examples/rust/graph_view/src/visualizers/mod.rs index a87f46ba7f77..eaee2bdc9a75 100644 --- a/examples/rust/graph_view/src/visualizers/mod.rs +++ b/examples/rust/graph_view/src/visualizers/mod.rs @@ -1,2 +1,5 @@ -pub mod edges_undirected; -pub mod nodes; +mod undirected_edges; +mod nodes; + +pub(crate) use undirected_edges::{UndirectedEdgesData, UndirectedEdgesVisualizer}; +pub(crate) use nodes::{NodeVisualizerData, NodeVisualizer}; diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 44f60c138b0e..452d07afb83a 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -22,11 +22,11 @@ use crate::types::NodeInstance; /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] -pub struct GraphNodeVisualizer { - pub(crate) data: Vec, +pub struct NodeVisualizer { + pub data: Vec, } -pub(crate) struct GraphNodeVisualizerData { +pub struct NodeVisualizerData { pub entity_path: EntityPath, node_ids: ChunkComponentIterItem, @@ -38,8 +38,8 @@ pub(crate) struct GraphNodeVisualizerData { show_labels: Option, } -impl GraphNodeVisualizerData { - pub(crate) fn nodes(&self) -> impl Iterator { +impl NodeVisualizerData { + pub fn nodes(&self) -> impl Iterator { clamped_zip_2x2( self.node_ids.iter(), (0..).map(Instance::from), @@ -64,13 +64,13 @@ impl GraphNodeVisualizerData { } } -impl IdentifiedViewSystem for GraphNodeVisualizer { +impl IdentifiedViewSystem for NodeVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphNodes".into() } } -impl VisualizerSystem for GraphNodeVisualizer { +impl VisualizerSystem for NodeVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { VisualizerQueryInfo::from_archetype::() } @@ -105,7 +105,7 @@ impl VisualizerSystem for GraphNodeVisualizer { ); for (_index, node_ids, colors, labels, show_labels) in data { - self.data.push(GraphNodeVisualizerData { + self.data.push(NodeVisualizerData { entity_path: data_result.entity_path.clone(), node_ids, colors: colors.unwrap_or_default(), @@ -127,4 +127,4 @@ impl VisualizerSystem for GraphNodeVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(GraphNodeVisualizer => []); +re_viewer_context::impl_component_fallback_provider!(NodeVisualizer => []); diff --git a/examples/rust/graph_view/src/visualizers/edges_undirected.rs b/examples/rust/graph_view/src/visualizers/undirected_edges.rs similarity index 100% rename from examples/rust/graph_view/src/visualizers/edges_undirected.rs rename to examples/rust/graph_view/src/visualizers/undirected_edges.rs From 4654d3e679fd85becc583bcf4928d96394b76863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 12:49:33 +0200 Subject: [PATCH 053/159] WIP: forgotten --- examples/rust/graph_view/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 04ec13fc0c4e..e2fed0a031c6 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -4,7 +4,7 @@ use re_viewer::external::{re_log, re_memory}; mod error; mod graph; -mod graph_space_view; +mod view; mod layout; mod ui; mod visualizers; From a1d9dc73128d04b54cd84a39d2d0a6bf77f44b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 12:50:28 +0200 Subject: [PATCH 054/159] WIP: more fix --- examples/rust/graph_view/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index e2fed0a031c6..2a2f243fd75c 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -55,7 +55,7 @@ fn main() -> Result<(), Box> { app.add_receiver(rx); // Register the custom space view - app.add_space_view_class::() + app.add_space_view_class::() .unwrap(); Box::new(app) From 61203fba25072be239acc941ceb6007e4f05fbba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 14:42:37 +0200 Subject: [PATCH 055/159] WIP: initial implementation of directed edges --- .../re_types/definitions/rerun/archetypes.fbs | 3 +- .../rerun/archetypes/graph_edges_directed.fbs | 32 ++ ...h_edges.fbs => graph_edges_undirected.fbs} | 2 +- .../re_types/src/archetypes/.gitattributes | 3 +- .../src/archetypes/graph_edges_directed.rs | 303 ++++++++++++++++++ ...aph_edges.rs => graph_edges_undirected.rs} | 55 ++-- crates/store/re_types/src/archetypes/mod.rs | 6 +- crates/viewer/re_viewer/src/reflection/mod.rs | 30 +- docs/content/reference/types/archetypes.md | 3 +- .../reference/types/archetypes/.gitattributes | 3 +- .../types/archetypes/graph_edges_directed.md | 23 ++ ...aph_edges.md => graph_edges_undirected.md} | 8 +- .../reference/types/components/class_id.md | 3 +- .../reference/types/components/color.md | 3 +- .../types/components/graph_edge_directed.md | 3 + .../types/components/graph_edge_undirected.md | 2 +- .../reference/types/components/show_labels.md | 3 +- .../reference/types/components/text.md | 3 +- examples/rust/graph_view/src/graph.rs | 8 +- examples/rust/graph_view/src/ui/edge.rs | 92 ++++++ .../rust/graph_view/src/{ui.rs => ui/mod.rs} | 34 +- examples/rust/graph_view/src/view.rs | 70 +++- .../src/visualizers/edges_directed.rs | 110 +++++++ ...ndirected_edges.rs => edges_undirected.rs} | 20 +- .../rust/graph_view/src/visualizers/mod.rs | 6 +- examples/rust/node_link_graph/src/main.rs | 15 +- rerun_cpp/src/rerun/archetypes.hpp | 3 +- rerun_cpp/src/rerun/archetypes/.gitattributes | 6 +- ...aph_edges.cpp => graph_edges_directed.cpp} | 10 +- .../rerun/archetypes/graph_edges_directed.hpp | 102 ++++++ .../archetypes/graph_edges_undirected.cpp | 53 +++ ...h_edges.hpp => graph_edges_undirected.hpp} | 25 +- .../rerun_sdk/rerun/archetypes/.gitattributes | 3 +- .../rerun_sdk/rerun/archetypes/__init__.py | 6 +- .../rerun/archetypes/graph_edges_directed.py | 124 +++++++ ...aph_edges.py => graph_edges_undirected.py} | 16 +- 36 files changed, 1049 insertions(+), 142 deletions(-) create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs rename crates/store/re_types/definitions/rerun/archetypes/{graph_edges.fbs => graph_edges_undirected.fbs} (97%) create mode 100644 crates/store/re_types/src/archetypes/graph_edges_directed.rs rename crates/store/re_types/src/archetypes/{graph_edges.rs => graph_edges_undirected.rs} (83%) create mode 100644 docs/content/reference/types/archetypes/graph_edges_directed.md rename docs/content/reference/types/archetypes/{graph_edges.md => graph_edges_undirected.md} (54%) create mode 100644 examples/rust/graph_view/src/ui/edge.rs rename examples/rust/graph_view/src/{ui.rs => ui/mod.rs} (87%) create mode 100644 examples/rust/graph_view/src/visualizers/edges_directed.rs rename examples/rust/graph_view/src/visualizers/{undirected_edges.rs => edges_undirected.rs} (88%) rename rerun_cpp/src/rerun/archetypes/{graph_edges.cpp => graph_edges_directed.cpp} (89%) create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp rename rerun_cpp/src/rerun/archetypes/{graph_edges.hpp => graph_edges_undirected.hpp} (77%) create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py rename rerun_py/rerun_sdk/rerun/archetypes/{graph_edges.py => graph_edges_undirected.py} (90%) diff --git a/crates/store/re_types/definitions/rerun/archetypes.fbs b/crates/store/re_types/definitions/rerun/archetypes.fbs index bda48b2bb794..fab88b42ca62 100644 --- a/crates/store/re_types/definitions/rerun/archetypes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes.fbs @@ -13,7 +13,8 @@ include "./archetypes/depth_image.fbs"; include "./archetypes/disconnected_space.fbs"; include "./archetypes/ellipsoids3d.fbs"; include "./archetypes/encoded_image.fbs"; -include "./archetypes/graph_edges.fbs"; +include "./archetypes/graph_edges_directed.fbs"; +include "./archetypes/graph_edges_undirected.fbs"; include "./archetypes/graph_nodes.fbs"; include "./archetypes/image.fbs"; include "./archetypes/instance_poses3d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs new file mode 100644 index 000000000000..8c5a9425fbad --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs @@ -0,0 +1,32 @@ +namespace rerun.archetypes; + +// --- + +/// A list of nodes in a graph with optional labels, colors, etc. +table GraphEdgesDirected ( + "attr.rust.derive": "PartialEq, Eq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + edges: [rerun.components.GraphEdgeDirected] ("attr.rerun.component_required", order: 1000); + + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs similarity index 97% rename from crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs rename to crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs index 4c6a92de2a54..a1624717c676 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs @@ -3,7 +3,7 @@ namespace rerun.archetypes; // --- /// A list of nodes in a graph with optional labels, colors, etc. -table GraphEdges ( +table GraphEdgesUndirected ( "attr.rust.derive": "PartialEq, Eq", "attr.docs.category": "Graph", "attr.docs.view_types": "Graph View" diff --git a/crates/store/re_types/src/archetypes/.gitattributes b/crates/store/re_types/src/archetypes/.gitattributes index 014d68c38829..81c3d8f1adea 100644 --- a/crates/store/re_types/src/archetypes/.gitattributes +++ b/crates/store/re_types/src/archetypes/.gitattributes @@ -13,7 +13,8 @@ depth_image.rs linguist-generated=true disconnected_space.rs linguist-generated=true ellipsoids3d.rs linguist-generated=true encoded_image.rs linguist-generated=true -graph_edges.rs linguist-generated=true +graph_edges_directed.rs linguist-generated=true +graph_edges_undirected.rs linguist-generated=true graph_nodes.rs linguist-generated=true image.rs linguist-generated=true instance_poses3d.rs linguist-generated=true diff --git a/crates/store/re_types/src/archetypes/graph_edges_directed.rs b/crates/store/re_types/src/archetypes/graph_edges_directed.rs new file mode 100644 index 000000000000..cee936099e80 --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges_directed.rs @@ -0,0 +1,303 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct GraphEdgesDirected { + /// A list of node IDs. + pub edges: Vec, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphEdgesDirected { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.edges.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeDirected".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.GraphEdgesDirectedIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdgeDirected".into(), + "rerun.components.Color".into(), + "rerun.components.GraphEdgesDirectedIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphEdgesDirected { + /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 6usize; +} + +/// Indicator component for the [`GraphEdgesDirected`] [`::re_types_core::Archetype`] +pub type GraphEdgesDirectedIndicator = + ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphEdgesDirected { + type Indicator = GraphEdgesDirectedIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphEdgesDirected".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph edges directed" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphEdgesDirectedIndicator = GraphEdgesDirectedIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let edges = { + let array = arrays_by_name + .get("rerun.components.GraphEdgeDirected") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphEdgesDirected#edges")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#edges")? + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#colors")? + }) + } else { + None + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#labels")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? + }) + } else { + None + }; + Ok(Self { + edges, + colors, + labels, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphEdgesDirected { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.edges as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesDirected {} + +impl GraphEdgesDirected { + /// Create a new `GraphEdgesDirected`. + #[inline] + pub fn new( + edges: impl IntoIterator>, + ) -> Self { + Self { + edges: edges.into_iter().map(Into::into).collect(), + colors: None, + labels: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs similarity index 83% rename from crates/store/re_types/src/archetypes/graph_edges.rs rename to crates/store/re_types/src/archetypes/graph_edges_undirected.rs index 20118e3c9b7a..cac910e150ec 100644 --- a/crates/store/re_types/src/archetypes/graph_edges.rs +++ b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -20,7 +20,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct GraphEdges { +pub struct GraphEdgesUndirected { /// A list of node IDs. pub edges: Vec, @@ -39,7 +39,7 @@ pub struct GraphEdges { pub class_ids: Option>, } -impl ::re_types_core::SizeBytes for GraphEdges { +impl ::re_types_core::SizeBytes for GraphEdgesUndirected { #[inline] fn heap_size_bytes(&self) -> u64 { self.edges.heap_size_bytes() @@ -66,7 +66,7 @@ static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = once_cell::sync::Lazy::new(|| { [ "rerun.components.Color".into(), - "rerun.components.GraphEdgesIndicator".into(), + "rerun.components.GraphEdgesUndirectedIndicator".into(), ] }); @@ -84,37 +84,38 @@ static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = [ "rerun.components.GraphEdgeUndirected".into(), "rerun.components.Color".into(), - "rerun.components.GraphEdgesIndicator".into(), + "rerun.components.GraphEdgesUndirectedIndicator".into(), "rerun.components.Text".into(), "rerun.components.ShowLabels".into(), "rerun.components.ClassId".into(), ] }); -impl GraphEdges { +impl GraphEdgesUndirected { /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional pub const NUM_COMPONENTS: usize = 6usize; } -/// Indicator component for the [`GraphEdges`] [`::re_types_core::Archetype`] -pub type GraphEdgesIndicator = ::re_types_core::GenericIndicatorComponent; +/// Indicator component for the [`GraphEdgesUndirected`] [`::re_types_core::Archetype`] +pub type GraphEdgesUndirectedIndicator = + ::re_types_core::GenericIndicatorComponent; -impl ::re_types_core::Archetype for GraphEdges { - type Indicator = GraphEdgesIndicator; +impl ::re_types_core::Archetype for GraphEdgesUndirected { + type Indicator = GraphEdgesUndirectedIndicator; #[inline] fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphEdges".into() + "rerun.archetypes.GraphEdgesUndirected".into() } #[inline] fn display_name() -> &'static str { - "Graph edges" + "Graph edges undirected" } #[inline] fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphEdgesIndicator = GraphEdgesIndicator::DEFAULT; + static INDICATOR: GraphEdgesUndirectedIndicator = GraphEdgesUndirectedIndicator::DEFAULT; MaybeOwnedComponentBatch::Ref(&INDICATOR) } @@ -152,22 +153,22 @@ impl ::re_types_core::Archetype for GraphEdges { let array = arrays_by_name .get("rerun.components.GraphEdgeUndirected") .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphEdges#edges")?; + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")?; ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#edges")? + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphEdges#edges")? + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? }; let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { Some({ ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#colors")? + .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphEdges#colors")? + .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? }) } else { None @@ -175,18 +176,18 @@ impl ::re_types_core::Archetype for GraphEdges { let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { Some({ ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#labels")? + .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphEdges#labels")? + .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? }) } else { None }; let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#show_labels")? + .with_context("rerun.archetypes.GraphEdgesUndirected#show_labels")? .into_iter() .next() .flatten() @@ -196,11 +197,11 @@ impl ::re_types_core::Archetype for GraphEdges { let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { Some({ ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#class_ids")? + .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphEdges#class_ids")? + .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? }) } else { None @@ -215,7 +216,7 @@ impl ::re_types_core::Archetype for GraphEdges { } } -impl ::re_types_core::AsComponents for GraphEdges { +impl ::re_types_core::AsComponents for GraphEdgesUndirected { fn as_component_batches(&self) -> Vec> { re_tracing::profile_function!(); use ::re_types_core::Archetype as _; @@ -241,10 +242,10 @@ impl ::re_types_core::AsComponents for GraphEdges { } } -impl ::re_types_core::ArchetypeReflectionMarker for GraphEdges {} +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesUndirected {} -impl GraphEdges { - /// Create a new `GraphEdges`. +impl GraphEdgesUndirected { + /// Create a new `GraphEdgesUndirected`. #[inline] pub fn new( edges: impl IntoIterator>, diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 34f38386f8e2..57e15f07ff54 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -21,7 +21,8 @@ mod ellipsoids3d; mod ellipsoids3d_ext; mod encoded_image; mod encoded_image_ext; -mod graph_edges; +mod graph_edges_directed; +mod graph_edges_undirected; mod graph_nodes; mod image; mod image_ext; @@ -63,7 +64,8 @@ pub use self::depth_image::DepthImage; pub use self::disconnected_space::DisconnectedSpace; pub use self::ellipsoids3d::Ellipsoids3D; pub use self::encoded_image::EncodedImage; -pub use self::graph_edges::GraphEdges; +pub use self::graph_edges_directed::GraphEdgesDirected; +pub use self::graph_edges_undirected::GraphEdgesUndirected; pub use self::graph_nodes::GraphNodes; pub use self::image::Image; pub use self::instance_poses3d::InstancePoses3D; diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 633b566e0737..37757a757959 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -1080,9 +1080,35 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { }, ), ( - ArchetypeName::new("rerun.archetypes.GraphEdges"), + ArchetypeName::new("rerun.archetypes.GraphEdgesDirected"), ArchetypeReflection { - display_name: "Graph edges", + display_name: "Graph edges directed", + fields: vec![ + ArchetypeFieldReflection { component_name : + "rerun.components.GraphEdgeDirected".into(), display_name : "Edges", + docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, + ], + }, + ), + ( + ArchetypeName::new("rerun.archetypes.GraphEdgesUndirected"), + ArchetypeReflection { + display_name: "Graph edges undirected", fields: vec![ ArchetypeFieldReflection { component_name : "rerun.components.GraphEdgeUndirected".into(), display_name : diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index cbfdf8ad16d4..4da922d04b17 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -14,7 +14,8 @@ This page lists all built-in archetypes. ## Graph -* [`GraphEdges`](archetypes/graph_edges.md): A list of nodes in a graph with optional labels, colors, etc. +* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of nodes in a graph with optional labels, colors, etc. +* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of nodes in a graph with optional labels, colors, etc. * [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. ## Image & tensor diff --git a/docs/content/reference/types/archetypes/.gitattributes b/docs/content/reference/types/archetypes/.gitattributes index 96cbe96c0299..a78b41cb32d0 100644 --- a/docs/content/reference/types/archetypes/.gitattributes +++ b/docs/content/reference/types/archetypes/.gitattributes @@ -14,7 +14,8 @@ depth_image.md linguist-generated=true disconnected_space.md linguist-generated=true ellipsoids3d.md linguist-generated=true encoded_image.md linguist-generated=true -graph_edges.md linguist-generated=true +graph_edges_directed.md linguist-generated=true +graph_edges_undirected.md linguist-generated=true graph_nodes.md linguist-generated=true image.md linguist-generated=true instance_poses3d.md linguist-generated=true diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md new file mode 100644 index 000000000000..d6b6bc5ae700 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_edges_directed.md @@ -0,0 +1,23 @@ +--- +title: "GraphEdgesDirected" +--- + + +A list of nodes in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphEdgeDirected`](../components/graph_edge_directed.md) + +**Recommended**: [`Color`](../components/color.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesDirected.html) + * 🐍 [Python API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesDirected) + * 🦀 [Rust API docs for `GraphEdgesDirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesDirected.html) + diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md similarity index 54% rename from docs/content/reference/types/archetypes/graph_edges.md rename to docs/content/reference/types/archetypes/graph_edges_undirected.md index d1e33e26adcf..569d1e5cee43 100644 --- a/docs/content/reference/types/archetypes/graph_edges.md +++ b/docs/content/reference/types/archetypes/graph_edges_undirected.md @@ -1,5 +1,5 @@ --- -title: "GraphEdges" +title: "GraphEdgesUndirected" --- @@ -17,7 +17,7 @@ A list of nodes in a graph with optional labels, colors, etc. * [Graph View](../views/graph_view.md) ## API reference links - * 🌊 [C++ API docs for `GraphEdges`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdges.html) - * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdges) - * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html) + * 🌊 [C++ API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesUndirected.html) + * 🐍 [Python API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesUndirected) + * 🦀 [Rust API docs for `GraphEdgesUndirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesUndirected.html) diff --git a/docs/content/reference/types/components/class_id.md b/docs/content/reference/types/components/class_id.md index c7fdad731526..cbf7dca8ea68 100644 --- a/docs/content/reference/types/components/class_id.md +++ b/docs/content/reference/types/components/class_id.md @@ -22,7 +22,8 @@ A 16-bit ID representing a type of semantic class. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index b57c22f3be6c..8be33395fc02 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,7 +26,8 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md index 5623728a8ebd..b5d1ffcabeab 100644 --- a/docs/content/reference/types/components/graph_edge_directed.md +++ b/docs/content/reference/types/components/graph_edge_directed.md @@ -15,3 +15,6 @@ An undirected edge in a graph connecting two nodes. * 🦀 [Rust API docs for `GraphEdgeDirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeDirected.html) +## Used by + +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) diff --git a/docs/content/reference/types/components/graph_edge_undirected.md b/docs/content/reference/types/components/graph_edge_undirected.md index b34c4c4ee0e4..b4e3fa0a5523 100644 --- a/docs/content/reference/types/components/graph_edge_undirected.md +++ b/docs/content/reference/types/components/graph_edge_undirected.md @@ -17,4 +17,4 @@ An undirected edge in a graph connecting two nodes. ## Used by -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index 21cd75b09b39..e30cc352ffe7 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,7 +26,8 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index 0a2c9be1be3d..2af14a38050b 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,7 +22,8 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index cd208a3bfb10..063f3215684d 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -5,7 +5,7 @@ use re_viewer::external::re_types::datatypes; use crate::{ types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, - visualizers::{NodeVisualizerData, UndirectedEdgesData}, + visualizers::{NodeVisualizerData, EdgesUndirectedData}, }; pub(crate) enum Node<'a> { @@ -17,13 +17,13 @@ pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list unknown: Vec<(EntityPath, datatypes::GraphNodeId)>, nodes: &'a Vec, - undirected: &'a Vec, + undirected: &'a Vec, } impl<'a> Graph<'a> { pub fn from_nodes_edges( nodes: &'a Vec, - undirected: &'a Vec, + undirected: &'a Vec, ) -> Self { let seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes .iter() @@ -64,7 +64,7 @@ impl<'a> Graph<'a> { nodes.chain(unknowns) } - pub fn edges_by_entity(&self) -> impl Iterator { + pub fn edges_by_entity(&self) -> impl Iterator { self.undirected.iter() } diff --git a/examples/rust/graph_view/src/ui/edge.rs b/examples/rust/graph_view/src/ui/edge.rs new file mode 100644 index 000000000000..016f07c40a3e --- /dev/null +++ b/examples/rust/graph_view/src/ui/edge.rs @@ -0,0 +1,92 @@ +use re_viewer::external::{ + egui, re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight} +}; + +pub fn draw_edge( + ui: &mut egui::Ui, + color: Option, + source: &egui::Rect, + target: &egui::Rect, + highlight: InteractionHighlight, + show_arrow: bool, +) { + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => None, + (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), + (HoverHighlight::Hovered, ..) => Some(ui.style().visuals.widgets.hovered.bg_fill), + }; + + egui::Frame::default().show(ui, |ui| { + let source_center = source.center(); + let target_center = target.center(); + + // Calculate direction vector from source to target + let direction = (target_center - source_center).normalized(); + + // Find the border points on both rectangles + let source_point = find_border_point(source, -direction); // Reverse direction for target + let target_point = find_border_point(target, direction); + + let painter = ui.painter(); + if let Some(hcolor) = hcolor { + painter.line_segment([source_point, target_point], egui::Stroke::new(4.0, hcolor)); + } + + let color = color.unwrap_or(ui.style().visuals.text_color()); + painter.line_segment( + [source_point, target_point], + egui::Stroke::new(1.0, color), + ); + + // Conditionally draw an arrow at the target point + if show_arrow { + draw_arrow(painter, target_point, direction, color); + } + }); +} + +// Helper function to find the point where the line intersects the border of a rectangle +fn find_border_point(rect: &egui::Rect, direction: egui::Vec2) -> egui::Pos2 { + let mut t_min = f32::NEG_INFINITY; + let mut t_max = f32::INFINITY; + + for i in 0..2 { + let inv_d = 1.0 / direction[i]; + let mut t0 = (rect.min[i] - rect.center()[i]) * inv_d; + let mut t1 = (rect.max[i] - rect.center()[i]) * inv_d; + + if inv_d < 0.0 { + std::mem::swap(&mut t0, &mut t1); + } + + t_min = t_min.max(t0); + t_max = t_max.min(t1); + } + + let t = t_max.min(t_min); // Pick the first intersection + rect.center() + t * direction +} + +// Helper function to draw an arrow at the end of the edge +fn draw_arrow( + painter: &egui::Painter, + tip: egui::Pos2, + direction: egui::Vec2, + color: egui::Color32, +) { + let arrow_size = 10.0; // Adjust size as needed + let perpendicular = egui::Vec2::new(-direction.y, direction.x) * 0.5 * arrow_size; + + let p1 = tip - direction * arrow_size + perpendicular; + let p2 = tip - direction * arrow_size - perpendicular; + + // Draw a filled triangle for the arrow + painter.add(egui::Shape::convex_polygon( + vec![tip, p1, p2], + color, + egui::Stroke::NONE, + )); +} diff --git a/examples/rust/graph_view/src/ui.rs b/examples/rust/graph_view/src/ui/mod.rs similarity index 87% rename from examples/rust/graph_view/src/ui.rs rename to examples/rust/graph_view/src/ui/mod.rs index 81b458eace02..55dec35ae363 100644 --- a/examples/rust/graph_view/src/ui.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -11,6 +11,9 @@ use re_viewer::external::{ }, }; +mod edge; +pub(crate) use edge::draw_edge; + use crate::{graph::Node, types::{NodeIndex, NodeInstance, UnknownNodeInstance}}; pub fn draw_node( @@ -101,37 +104,6 @@ pub fn draw_entity( } } -pub fn draw_edge( - ui: &mut egui::Ui, - color: Option, - source: &egui::Rect, - target: &egui::Rect, - highlight: InteractionHighlight, -) { - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => None, - (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), - (HoverHighlight::Hovered, ..) => Some(ui.style().visuals.widgets.hovered.bg_fill), - }; - - egui::Frame::default().show(ui, |ui| { - let painter = ui.painter(); - if let Some(hcolor) = hcolor { - painter.line_segment( - [source.center(), target.center()], - egui::Stroke::new(4.0, hcolor), - ); - } - painter.line_segment( - [source.center(), target.center()], - egui::Stroke::new(1.0, color.unwrap_or(ui.style().visuals.text_color())), - ); - }); -} - pub fn measure_node_sizes<'a>( ui: &mut egui::Ui, nodes: impl Iterator>, diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index f9f728d09558..9feccba82cc2 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -3,7 +3,6 @@ use re_viewer::external::{ re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, - re_renderer::view_builder::TargetConfiguration, re_types::SpaceViewClassIdentifier, re_ui::{self, UiExt}, re_viewer_context::{ @@ -19,7 +18,7 @@ use crate::{ graph::Graph, types::NodeIndex, ui::{self, draw_dummy, GraphSpaceViewState}, - visualizers::{NodeVisualizer, UndirectedEdgesVisualizer}, + visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, }; #[derive(Default)] @@ -50,7 +49,8 @@ impl SpaceViewClass for GraphSpaceView { system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_visualizer::()?; - system_registry.register_visualizer::() + system_registry.register_visualizer::()?; + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -112,11 +112,14 @@ impl SpaceViewClass for GraphSpaceView { system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let node_system = system_output.view_systems.get::()?; - let edge_system = system_output + let directed_system = system_output .view_systems - .get::()?; + .get::()?; + let undirected_system = system_output + .view_systems + .get::()?; - let graph = Graph::from_nodes_edges(&node_system.data, &edge_system.data); + let graph = Graph::from_nodes_edges(&node_system.data, &undirected_system.data); let state = state.downcast_mut::()?; let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); @@ -124,12 +127,19 @@ impl SpaceViewClass for GraphSpaceView { let Some(layout) = &mut state.layout else { let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); + let undirected = undirected_system + .data + .iter() + .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + + let directed = directed_system + .data + .iter() + .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + let layout = crate::layout::compute_layout( node_sizes.into_iter(), - edge_system - .data - .iter() - .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))), + undirected.chain(directed), )?; if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { @@ -294,7 +304,44 @@ impl SpaceViewClass for GraphSpaceView { ui.ctx().set_sublayer(window_layer, id); } - for data in edge_system.data.iter() { + for data in undirected_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for edge in data.edges() { + let source_ix = NodeIndex::from(edge.source); + let target_ix = NodeIndex::from(edge.target); + let source_pos = layout + .get(&source_ix) + .ok_or_else(|| Error::EdgeUnknownNode(edge.source.to_string()))?; + let target_pos = layout + .get(&target_ix) + .ok_or_else(|| Error::EdgeUnknownNode(edge.target.to_string()))?; + + let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) + .current_pos(source_pos.center()) + .order(egui::Order::Background) + .constrain(false) + .show(ui.ctx(), |ui| { + ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + false + ); + }) + .response; + + let id = response.layer_id; + + ui.ctx().set_transform_layer(id, world_to_window); + ui.ctx().set_sublayer(window_layer, id); + } + } + + for data in directed_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { @@ -319,6 +366,7 @@ impl SpaceViewClass for GraphSpaceView { source_pos, target_pos, ent_highlight.index_highlight(edge.instance), + true, ); }) .response; diff --git a/examples/rust/graph_view/src/visualizers/edges_directed.rs b/examples/rust/graph_view/src/visualizers/edges_directed.rs new file mode 100644 index 000000000000..a54310c68ce0 --- /dev/null +++ b/examples/rust/graph_view/src/visualizers/edges_directed.rs @@ -0,0 +1,110 @@ +use re_log_types::Instance; +use re_viewer::external::{ + egui, + re_chunk::{ChunkComponentIterItem, LatestAtQuery}, + re_query::{clamped_zip_2x1, range_zip_1x1}, + re_renderer, + re_space_view::{DataResultQuery, RangeResultsExt}, + re_types::{ + self, archetypes, + components::{self}, + Loggable as _, + }, + re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, + ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, + VisualizerSystem, + }, +}; + +use crate::types::EdgeInstance; + +#[derive(Default)] +pub struct EdgesDirectedVisualizer { + pub data: Vec, +} + +pub struct EdgesDirectedData { + pub entity_path: re_log_types::EntityPath, + edges: ChunkComponentIterItem, + colors: ChunkComponentIterItem, +} + +impl EdgesDirectedData { + pub fn edges(&self) -> impl Iterator { + clamped_zip_2x1( + self.edges.iter(), + (0..).map(Instance::from), + self.colors.iter().map(Option::Some), + Option::<&components::Color>::default, + ) + .map(|(edge, instance, color)| EdgeInstance { + source: &edge.source, + target: &edge.target, + entity_path: &self.entity_path, + instance, + color: color.map(|c| egui::Color32::from(c.0)), + }) + } +} + +impl IdentifiedViewSystem for EdgesDirectedVisualizer { + fn identifier() -> ViewSystemIdentifier { + "GraphEdgesDirected".into() + } +} + +impl VisualizerSystem for EdgesDirectedVisualizer { + fn visualizer_query_info(&self) -> VisualizerQueryInfo { + VisualizerQueryInfo::from_archetype::() + } + + /// Populates the scene part with data from the store. + fn execute( + &mut self, + ctx: &ViewContext<'_>, + query: &ViewQuery<'_>, + _context_systems: &ViewContextCollection, + ) -> Result, SpaceViewSystemExecutionError> { + let timeline_query = LatestAtQuery::new(query.timeline, query.latest_at); + + for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { + let results = data_result + .latest_at_with_blueprint_resolved_data::( + ctx, + &timeline_query, + ); + + let all_indexed_edges = + results.iter_as(query.timeline, components::GraphEdgeDirected::name()); + let all_colors = results.iter_as(query.timeline, components::Color::name()); + + let data = range_zip_1x1( + all_indexed_edges.component::(), + all_colors.component::(), + ); + + for (_index, edges, colors) in data { + self.data.push(EdgesDirectedData { + entity_path: data_result.entity_path.clone(), + edges, + colors: colors.unwrap_or_default(), + }); + } + } + + // We're not using `re_renderer` here, so return an empty vector. + // If you want to draw additional primitives here, you can emit re_renderer draw data here directly. + Ok(Vec::new()) + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { + self + } +} + +re_viewer_context::impl_component_fallback_provider!(EdgesDirectedVisualizer => []); diff --git a/examples/rust/graph_view/src/visualizers/undirected_edges.rs b/examples/rust/graph_view/src/visualizers/edges_undirected.rs similarity index 88% rename from examples/rust/graph_view/src/visualizers/undirected_edges.rs rename to examples/rust/graph_view/src/visualizers/edges_undirected.rs index 1afb19cc8b56..360b00cb8edd 100644 --- a/examples/rust/graph_view/src/visualizers/undirected_edges.rs +++ b/examples/rust/graph_view/src/visualizers/edges_undirected.rs @@ -20,17 +20,17 @@ use re_viewer::external::{ use crate::types::EdgeInstance; #[derive(Default)] -pub struct UndirectedEdgesVisualizer { - pub data: Vec, +pub struct EdgesUndirectedVisualizer { + pub data: Vec, } -pub struct UndirectedEdgesData { +pub struct EdgesUndirectedData { pub entity_path: re_log_types::EntityPath, edges: ChunkComponentIterItem, colors: ChunkComponentIterItem, } -impl UndirectedEdgesData { +impl EdgesUndirectedData { pub fn edges(&self) -> impl Iterator { clamped_zip_2x1( self.edges.iter(), @@ -48,15 +48,15 @@ impl UndirectedEdgesData { } } -impl IdentifiedViewSystem for UndirectedEdgesVisualizer { +impl IdentifiedViewSystem for EdgesUndirectedVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphEdgesUndirected".into() } } -impl VisualizerSystem for UndirectedEdgesVisualizer { +impl VisualizerSystem for EdgesUndirectedVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() + VisualizerQueryInfo::from_archetype::() } /// Populates the scene part with data from the store. @@ -70,7 +70,7 @@ impl VisualizerSystem for UndirectedEdgesVisualizer { for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { let results = data_result - .latest_at_with_blueprint_resolved_data::( + .latest_at_with_blueprint_resolved_data::( ctx, &timeline_query, ); @@ -85,7 +85,7 @@ impl VisualizerSystem for UndirectedEdgesVisualizer { ); for (_index, edges, colors) in data { - self.data.push(UndirectedEdgesData { + self.data.push(EdgesUndirectedData { entity_path: data_result.entity_path.clone(), edges, colors: colors.unwrap_or_default(), @@ -107,4 +107,4 @@ impl VisualizerSystem for UndirectedEdgesVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(UndirectedEdgesVisualizer => []); +re_viewer_context::impl_component_fallback_provider!(EdgesUndirectedVisualizer => []); diff --git a/examples/rust/graph_view/src/visualizers/mod.rs b/examples/rust/graph_view/src/visualizers/mod.rs index eaee2bdc9a75..e21804c1cf8d 100644 --- a/examples/rust/graph_view/src/visualizers/mod.rs +++ b/examples/rust/graph_view/src/visualizers/mod.rs @@ -1,5 +1,7 @@ -mod undirected_edges; +mod edges_directed; +mod edges_undirected; mod nodes; -pub(crate) use undirected_edges::{UndirectedEdgesData, UndirectedEdgesVisualizer}; +pub(crate) use edges_directed::{EdgesDirectedData, EdgesDirectedVisualizer}; +pub(crate) use edges_undirected::{EdgesUndirectedData, EdgesUndirectedVisualizer}; pub(crate) use nodes::{NodeVisualizerData, NodeVisualizer}; diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index d90bef3bb0d4..313d62ce6afb 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -2,13 +2,12 @@ //! //! Usage: //! ``` -//! cargo run -p minimal_options -- --help +//! cargo run -p node_link_graph -- --connect //! ``` -use rerun::components::GraphEdgeUndirected; -use rerun::external::{log, re_log}; +use rerun::external::re_log; -use rerun::{Color, GraphEdges, GraphNodes}; +use rerun::{Color, GraphEdgesDirected, GraphEdgesUndirected, GraphNodes}; #[derive(Debug, clap::Parser)] #[clap(author, version, about)] @@ -44,7 +43,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.log("kitchen/nodes", &GraphNodes::new(["area0", "area1"]))?; rec.log( "kitchen/edges", - &GraphEdges::new([("kitchen/nodes", "area0", "area1")]), + &GraphEdgesDirected::new([("kitchen/nodes", "area0", "area1")]), )?; rec.set_time_sequence("frame", 1); @@ -58,7 +57,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { )?; rec.log( "living/edges", - &GraphEdges::new([ + &GraphEdgesDirected::new([ ("living/nodes", "area0", "area1"), ("living/nodes", "area0", "area2"), ("living/nodes", "area1", "area2"), @@ -67,7 +66,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.log( "doors/edges", - &GraphEdges::new([ + &GraphEdgesDirected::new([ (("kitchen/nodes", "area0"), ("hallway/nodes", "area0")), (("hallway/nodes", "area0"), ("living/nodes", "area2")), ]), @@ -75,7 +74,7 @@ fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { rec.log( "edges", - &GraphEdges::new([ + &GraphEdgesUndirected::new([ (("kitchen/nodes", "area0"), ("kitchen/objects", "sink")), (("kitchen/nodes", "area1"), ("kitchen/objects", "fridge")), (("living/nodes", "area1"), ("living/objects", "table")), diff --git a/rerun_cpp/src/rerun/archetypes.hpp b/rerun_cpp/src/rerun/archetypes.hpp index a5a700e7808b..8465c54b56c3 100644 --- a/rerun_cpp/src/rerun/archetypes.hpp +++ b/rerun_cpp/src/rerun/archetypes.hpp @@ -15,7 +15,8 @@ #include "archetypes/disconnected_space.hpp" #include "archetypes/ellipsoids3d.hpp" #include "archetypes/encoded_image.hpp" -#include "archetypes/graph_edges.hpp" +#include "archetypes/graph_edges_directed.hpp" +#include "archetypes/graph_edges_undirected.hpp" #include "archetypes/graph_nodes.hpp" #include "archetypes/image.hpp" #include "archetypes/instance_poses3d.hpp" diff --git a/rerun_cpp/src/rerun/archetypes/.gitattributes b/rerun_cpp/src/rerun/archetypes/.gitattributes index dd9503d9a9a0..98c0e80d8418 100644 --- a/rerun_cpp/src/rerun/archetypes/.gitattributes +++ b/rerun_cpp/src/rerun/archetypes/.gitattributes @@ -27,8 +27,10 @@ ellipsoids3d.cpp linguist-generated=true ellipsoids3d.hpp linguist-generated=true encoded_image.cpp linguist-generated=true encoded_image.hpp linguist-generated=true -graph_edges.cpp linguist-generated=true -graph_edges.hpp linguist-generated=true +graph_edges_directed.cpp linguist-generated=true +graph_edges_directed.hpp linguist-generated=true +graph_edges_undirected.cpp linguist-generated=true +graph_edges_undirected.hpp linguist-generated=true graph_nodes.cpp linguist-generated=true graph_nodes.hpp linguist-generated=true image.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp similarity index 89% rename from rerun_cpp/src/rerun/archetypes/graph_edges.cpp rename to rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp index 4e18f290d515..c528d1db50a7 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges.cpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". -#include "graph_edges.hpp" +#include "graph_edges_directed.hpp" #include "../collection_adapter_builtins.hpp" @@ -9,8 +9,8 @@ namespace rerun::archetypes {} namespace rerun { - Result> AsComponents::serialize( - const archetypes::GraphEdges& archetype + Result> AsComponents::serialize( + const archetypes::GraphEdgesDirected& archetype ) { using namespace archetypes; std::vector cells; @@ -42,7 +42,7 @@ namespace rerun { cells.push_back(std::move(result.value)); } { - auto indicator = GraphEdges::IndicatorComponent(); + auto indicator = GraphEdgesDirected::IndicatorComponent(); auto result = ComponentBatch::from_loggable(indicator); RR_RETURN_NOT_OK(result.error); cells.emplace_back(std::move(result.value)); diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp new file mode 100644 index 000000000000..25287f28ce3e --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp @@ -0,0 +1,102 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_edge_directed.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphEdgesDirected { + /// A list of node IDs. + Collection edges; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphEdgesDirectedIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphEdgesDirected() = default; + GraphEdgesDirected(GraphEdgesDirected&& other) = default; + + explicit GraphEdgesDirected(Collection _edges) + : edges(std::move(_edges)) {} + + /// Optional colors for the boxes. + GraphEdgesDirected with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional text labels for the node. + GraphEdgesDirected with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphEdgesDirected with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphEdgesDirected with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize( + const archetypes::GraphEdgesDirected& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp new file mode 100644 index 000000000000..01a9a49ea1da --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp @@ -0,0 +1,53 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". + +#include "graph_edges_undirected.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphEdgesUndirected& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(6); + + { + auto result = ComponentBatch::from_loggable(archetype.edges); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphEdgesUndirected::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp similarity index 77% rename from rerun_cpp/src/rerun/archetypes/graph_edges.hpp rename to rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp index 3140eb934e10..1ba357558f00 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". #pragma once @@ -21,7 +21,7 @@ namespace rerun::archetypes { /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphEdges { + struct GraphEdgesUndirected { /// A list of node IDs. Collection edges; @@ -41,34 +41,34 @@ namespace rerun::archetypes { public: static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphEdgesIndicator"; + "rerun.components.GraphEdgesUndirectedIndicator"; /// Indicator component, used to identify the archetype when converting to a list of components. using IndicatorComponent = rerun::components::IndicatorComponent; public: - GraphEdges() = default; - GraphEdges(GraphEdges&& other) = default; + GraphEdgesUndirected() = default; + GraphEdgesUndirected(GraphEdgesUndirected&& other) = default; - explicit GraphEdges(Collection _edges) + explicit GraphEdgesUndirected(Collection _edges) : edges(std::move(_edges)) {} /// Optional colors for the boxes. - GraphEdges with_colors(Collection _colors) && { + GraphEdgesUndirected with_colors(Collection _colors) && { colors = std::move(_colors); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } /// Optional text labels for the node. - GraphEdges with_labels(Collection _labels) && { + GraphEdgesUndirected with_labels(Collection _labels) && { labels = std::move(_labels); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } /// Optional choice of whether the text labels should be shown by default. - GraphEdges with_show_labels(rerun::components::ShowLabels _show_labels) && { + GraphEdgesUndirected with_show_labels(rerun::components::ShowLabels _show_labels) && { show_labels = std::move(_show_labels); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) @@ -77,7 +77,7 @@ namespace rerun::archetypes { /// Optional `components::ClassId`s for the boxes. /// /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphEdges with_class_ids(Collection _class_ids) && { + GraphEdgesUndirected with_class_ids(Collection _class_ids) && { class_ids = std::move(_class_ids); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) @@ -93,9 +93,10 @@ namespace rerun { /// \private template <> - struct AsComponents { + struct AsComponents { /// Serialize all set component batches. - static Result> serialize(const archetypes::GraphEdges& archetype + static Result> serialize( + const archetypes::GraphEdgesUndirected& archetype ); }; } // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes index 09937336c43a..7f2f7f651e9d 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes @@ -15,7 +15,8 @@ depth_image.py linguist-generated=true disconnected_space.py linguist-generated=true ellipsoids3d.py linguist-generated=true encoded_image.py linguist-generated=true -graph_edges.py linguist-generated=true +graph_edges_directed.py linguist-generated=true +graph_edges_undirected.py linguist-generated=true graph_nodes.py linguist-generated=true image.py linguist-generated=true instance_poses3d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py index 5ed9e4b83586..e10bef316177 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py @@ -15,7 +15,8 @@ from .disconnected_space import DisconnectedSpace from .ellipsoids3d import Ellipsoids3D from .encoded_image import EncodedImage -from .graph_edges import GraphEdges +from .graph_edges_directed import GraphEdgesDirected +from .graph_edges_undirected import GraphEdgesUndirected from .graph_nodes import GraphNodes from .image import Image from .instance_poses3d import InstancePoses3D @@ -50,7 +51,8 @@ "DisconnectedSpace", "Ellipsoids3D", "EncodedImage", - "GraphEdges", + "GraphEdgesDirected", + "GraphEdgesUndirected", "GraphNodes", "Image", "InstancePoses3D", diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py new file mode 100644 index 000000000000..9fc75322b0dd --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py @@ -0,0 +1,124 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +# You can extend this class by creating a "GraphEdgesDirectedExt" class in "graph_edges_directed_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphEdgesDirected"] + + +@define(str=False, repr=False, init=False) +class GraphEdgesDirected(Archetype): + """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + edges: datatypes.GraphEdgeArrayLike, + *, + colors: datatypes.Rgba32ArrayLike | None = None, + labels: datatypes.Utf8ArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphEdgesDirected archetype. + + Parameters + ---------- + edges: + A list of node IDs. + colors: + Optional colors for the boxes. + labels: + Optional text labels for the node. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphEdgesDirectedExt in graph_edges_directed_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + edges=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphEdgesDirected: + """Produce an empty GraphEdgesDirected, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + edges: components.GraphEdgeDirectedBatch = field( + metadata={"component": "required"}, + converter=components.GraphEdgeDirectedBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py similarity index 90% rename from rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py rename to rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py index 3d074f5ccd6e..6bad9dc9fe6b 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py @@ -1,7 +1,7 @@ # DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". -# You can extend this class by creating a "GraphEdgesExt" class in "graph_edges_ext.py". +# You can extend this class by creating a "GraphEdgesUndirectedExt" class in "graph_edges_undirected_ext.py". from __future__ import annotations @@ -15,11 +15,11 @@ ) from ..error_utils import catch_and_log_exceptions -__all__ = ["GraphEdges"] +__all__ = ["GraphEdgesUndirected"] @define(str=False, repr=False, init=False) -class GraphEdges(Archetype): +class GraphEdgesUndirected(Archetype): """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" def __init__( @@ -32,7 +32,7 @@ def __init__( class_ids: datatypes.ClassIdArrayLike | None = None, ): """ - Create a new instance of the GraphEdges archetype. + Create a new instance of the GraphEdgesUndirected archetype. Parameters ---------- @@ -51,7 +51,7 @@ def __init__( """ - # You can define your own __init__ function as a member of GraphEdgesExt in graph_edges_ext.py + # You can define your own __init__ function as a member of GraphEdgesUndirectedExt in graph_edges_undirected_ext.py with catch_and_log_exceptions(context=self.__class__.__name__): self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) return @@ -68,8 +68,8 @@ def __attrs_clear__(self) -> None: ) @classmethod - def _clear(cls) -> GraphEdges: - """Produce an empty GraphEdges, bypassing `__init__`.""" + def _clear(cls) -> GraphEdgesUndirected: + """Produce an empty GraphEdgesUndirected, bypassing `__init__`.""" inst = cls.__new__(cls) inst.__attrs_clear__() return inst From 435a6465f94fcdc9476ac436ee37378396c47a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 9 Oct 2024 15:45:44 +0200 Subject: [PATCH 056/159] WIP: implement `LayoutProvider` --- examples/rust/graph_view/src/layout.rs | 54 -------------- .../graph_view/src/layout/force_directed.rs | 70 +++++++++++++++++++ examples/rust/graph_view/src/layout/mod.rs | 21 ++++++ examples/rust/graph_view/src/view.rs | 22 +++--- 4 files changed, 101 insertions(+), 66 deletions(-) delete mode 100644 examples/rust/graph_view/src/layout.rs create mode 100644 examples/rust/graph_view/src/layout/force_directed.rs create mode 100644 examples/rust/graph_view/src/layout/mod.rs diff --git a/examples/rust/graph_view/src/layout.rs b/examples/rust/graph_view/src/layout.rs deleted file mode 100644 index b7334520b5f9..000000000000 --- a/examples/rust/graph_view/src/layout.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::collections::HashMap; - -use fdg_sim::{self as fdg, ForceGraphHelper}; -use re_viewer::external::egui; - -use crate::error::Error; - -type NodeInfo = (N, egui::Vec2); - -pub fn compute_layout( - nodes: impl IntoIterator, - edges: impl IntoIterator, -) -> Result, Error> -where - N: Clone + Eq + ToString + std::hash::Hash, -{ - let mut node_to_index = HashMap::new(); - let mut graph: fdg::ForceGraph, ()> = fdg::ForceGraph::default(); - - for (node_id, size) in nodes { - let ix = graph.add_force_node(node_id.to_string(), (node_id.clone(), size)); - node_to_index.insert(node_id, ix); - } - - for (source, target) in edges { - let source_ix = node_to_index - .get(&source) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; - let target_ix = node_to_index - .get(&target) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; - graph.add_edge(*source_ix, *target_ix, ()); - } - - // create a simulation from the graph - let mut simulation = fdg::Simulation::from_graph(graph, fdg::SimulationParameters::default()); - - for _ in 0..1000 { - simulation.update(0.035); - } - - let res = simulation - .get_graph() - .node_weights() - .map(|fdg::Node::> { data, location, .. }| { - let (ix, size) = data; - let center = egui::Pos2::new(location.x, location.y); - let rect = egui::Rect::from_center_size(center, *size); - (ix.clone(), rect) - }) - .collect(); - - Ok(res) -} diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs new file mode 100644 index 000000000000..03ac998a65ee --- /dev/null +++ b/examples/rust/graph_view/src/layout/force_directed.rs @@ -0,0 +1,70 @@ +use std::collections::HashMap; + +use fdg_sim::{self as fdg, ForceGraphHelper}; +use re_viewer::external::egui; + +use crate::{error::Error, types::NodeIndex}; + +use super::LayoutProvider; + +pub struct ForceBasedLayout; + +impl ForceBasedLayout { + pub fn new() -> Self { + Self + } +} + +impl LayoutProvider for ForceBasedLayout { + type NodeIx = NodeIndex; + + fn name() -> &'static str { + "Force Directed" + } + + fn compute( + &self, + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { + let mut node_to_index = HashMap::new(); + let mut graph: fdg::ForceGraph<(Self::NodeIx, egui::Vec2), ()> = fdg::ForceGraph::default(); + + for (node_id, size) in nodes { + let ix = graph.add_force_node(node_id.to_string(), (node_id.clone(), size)); + node_to_index.insert(node_id, ix); + } + + for (source, target) in directed.into_iter().chain(undirected).into_iter() { + let source_ix = node_to_index + .get(&source) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + let target_ix = node_to_index + .get(&target) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + graph.add_edge(*source_ix, *target_ix, ()); + } + + // create a simulation from the graph + let mut simulation = + fdg::Simulation::from_graph(graph, fdg::SimulationParameters::default()); + + for _ in 0..1000 { + simulation.update(0.035); + } + + let res = simulation + .get_graph() + .node_weights() + .map(|fdg::Node { data, location, .. }| { + let (ix, size) = data; + let center = egui::Pos2::new(location.x, location.y); + let rect = egui::Rect::from_center_size(center, *size); + (ix.clone(), rect) + }) + .collect(); + + Ok(res) + } +} diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs new file mode 100644 index 000000000000..4b12f06e9aaa --- /dev/null +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -0,0 +1,21 @@ +use std::collections::HashMap; + +use re_viewer::external::egui; + +use crate::error::Error; + +mod force_directed; +pub(crate) use force_directed::ForceBasedLayout; + +pub(crate) trait LayoutProvider { + type NodeIx: Clone + Eq + std::hash::Hash; + + fn name() -> &'static str; + + fn compute( + &self, + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error>; +} diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 9feccba82cc2..aa54bb52491d 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -16,8 +16,9 @@ use re_viewer::external::{ use crate::{ error::Error, graph::Graph, + layout::{ForceBasedLayout, LayoutProvider}, types::NodeIndex, - ui::{self, draw_dummy, GraphSpaceViewState}, + ui::{self, GraphSpaceViewState}, visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, }; @@ -128,19 +129,16 @@ impl SpaceViewClass for GraphSpaceView { let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); let undirected = undirected_system - .data - .iter() - .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + .data + .iter() + .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); let directed = directed_system - .data - .iter() - .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + .data + .iter() + .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - let layout = crate::layout::compute_layout( - node_sizes.into_iter(), - undirected.chain(directed), - )?; + let layout = ForceBasedLayout::new().compute(node_sizes.into_iter(), undirected, directed)?; if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { state.fit_to_screen( @@ -329,7 +327,7 @@ impl SpaceViewClass for GraphSpaceView { source_pos, target_pos, ent_highlight.index_highlight(edge.instance), - false + false, ); }) .response; From 9c86e3796ce170833485528dace7e722dd462fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 10 Oct 2024 10:25:32 +0200 Subject: [PATCH 057/159] WIP: layout switching and convenience --- Cargo.lock | 7 + examples/rust/graph_view/Cargo.toml | 5 +- examples/rust/graph_view/src/layout/dot.rs | 122 ++++++++++++++++++ .../graph_view/src/layout/force_directed.rs | 17 +-- examples/rust/graph_view/src/layout/mod.rs | 38 +++++- examples/rust/graph_view/src/ui/mod.rs | 69 +--------- examples/rust/graph_view/src/ui/state.rs | 118 +++++++++++++++++ examples/rust/graph_view/src/view.rs | 6 +- 8 files changed, 296 insertions(+), 86 deletions(-) create mode 100644 examples/rust/graph_view/src/layout/dot.rs create mode 100644 examples/rust/graph_view/src/ui/state.rs diff --git a/Cargo.lock b/Cargo.lock index a13456d210ad..b8bec82061c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2749,6 +2749,7 @@ version = "0.0.0" dependencies = [ "bytemuck", "fdg-sim", + "layout-rs", "mimalloc", "petgraph", "re_crash_handler", @@ -3225,6 +3226,12 @@ dependencies = [ "libc", ] +[[package]] +name = "layout-rs" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84deb28a3a6c839ca42a7341664f32281416d69e2f29deb85aec5cc0243fdea8" + [[package]] name = "lazy_static" version = "1.4.0" diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index c0e79bdfe4e0..fb1344cd7765 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -27,5 +27,8 @@ mimalloc = "0.1" petgraph = "0.6" bytemuck = "1.18" -fdg-sim = "0.9" thiserror = "1.0" + +# Experiment with different layout algorithms. +fdg-sim = "0.9" +layout-rs = "0.1" diff --git a/examples/rust/graph_view/src/layout/dot.rs b/examples/rust/graph_view/src/layout/dot.rs new file mode 100644 index 000000000000..c284997d06e5 --- /dev/null +++ b/examples/rust/graph_view/src/layout/dot.rs @@ -0,0 +1,122 @@ +use std::collections::HashMap; + +use layout::{ + core::{ + base::Orientation, + format::{ClipHandle, RenderBackend}, + geometry::Point, + style::StyleAttr, + }, + std_shapes::shapes::{Arrow, Element, ShapeKind}, + topo::layout::VisualGraph, +}; +use re_viewer::external::egui; + +use crate::{error::Error, types::NodeIndex}; + +use super::Layout; + +#[derive(Debug, Default, PartialEq, Eq)] +pub struct DotLayout; + +impl Layout for DotLayout { + type NodeIx = NodeIndex; + + fn compute( + &self, + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { + let mut handle_to_ix = HashMap::new(); + let mut ix_to_handle = HashMap::new(); + + let mut graph = VisualGraph::new(Orientation::TopToBottom); + + for (ix, size) in nodes { + let size = Point::new(size.x as f64, size.y as f64); + let handle = graph.add_node(Element::create( + ShapeKind::new_box("test"), + StyleAttr::simple(), + Orientation::LeftToRight, + size, + )); + handle_to_ix.insert(handle, ix.clone()); + ix_to_handle.insert(ix, handle); + } + + for (source_ix, target_ix) in directed { + let source = ix_to_handle + .get(&source_ix) + .ok_or_else(|| Error::EdgeUnknownNode(source_ix.to_string()))?; + let target = ix_to_handle + .get(&target_ix) + .ok_or_else(|| Error::EdgeUnknownNode(target_ix.to_string()))?; + graph.add_edge(Arrow::simple("test"), *source, *target); + } + + for (source_ix, target_ix) in undirected { + let source = ix_to_handle + .get(&source_ix) + .ok_or_else(|| Error::EdgeUnknownNode(source_ix.to_string()))?; + let target = ix_to_handle + .get(&target_ix) + .ok_or_else(|| Error::EdgeUnknownNode(target_ix.to_string()))?; + + // TODO(grtlr): find a better way other than adding duplicate edges. + graph.add_edge(Arrow::simple("test"), *source, *target); + graph.add_edge(Arrow::simple("test"), *target, *source); + } + + graph.do_it(false, false, false, &mut DummyBackend); + + let res = handle_to_ix + .into_iter() + .map(|(h, ix)| { + let (min, max) = graph.pos(h).bbox(false); + ( + ix, + egui::Rect::from_min_max( + egui::Pos2::new(min.x as f32, min.y as f32), + egui::Pos2::new(max.x as f32, max.y as f32), + ), + ) + }) + .collect(); + + Ok(res) + } +} + +struct DummyBackend; + +impl RenderBackend for DummyBackend { + fn draw_rect( + &mut self, + _xy: Point, + _size: Point, + _look: &StyleAttr, + _clip: Option, + ) { + } + + fn draw_line(&mut self, _start: Point, _stop: Point, _look: &StyleAttr) {} + + fn draw_circle(&mut self, _xy: Point, _size: Point, _look: &StyleAttr) {} + + fn draw_text(&mut self, _xy: Point, _text: &str, _look: &StyleAttr) {} + + fn draw_arrow( + &mut self, + _path: &[(Point, Point)], + _dashed: bool, + _head: (bool, bool), + _look: &StyleAttr, + _text: &str, + ) { + } + + fn create_clip(&mut self, _xy: Point, _size: Point, _rounded_px: usize) -> ClipHandle { + ClipHandle::default() + } +} diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs index 03ac998a65ee..2d1d68f7525a 100644 --- a/examples/rust/graph_view/src/layout/force_directed.rs +++ b/examples/rust/graph_view/src/layout/force_directed.rs @@ -5,23 +5,14 @@ use re_viewer::external::egui; use crate::{error::Error, types::NodeIndex}; -use super::LayoutProvider; +use super::Layout; +#[derive(Debug, Default, PartialEq, Eq)] pub struct ForceBasedLayout; -impl ForceBasedLayout { - pub fn new() -> Self { - Self - } -} - -impl LayoutProvider for ForceBasedLayout { +impl Layout for ForceBasedLayout { type NodeIx = NodeIndex; - fn name() -> &'static str { - "Force Directed" - } - fn compute( &self, nodes: impl IntoIterator, @@ -36,7 +27,7 @@ impl LayoutProvider for ForceBasedLayout { node_to_index.insert(node_id, ix); } - for (source, target) in directed.into_iter().chain(undirected).into_iter() { + for (source, target) in directed.into_iter().chain(undirected) { let source_ix = node_to_index .get(&source) .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index 4b12f06e9aaa..ba5dbfcf4e3c 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -2,16 +2,16 @@ use std::collections::HashMap; use re_viewer::external::egui; -use crate::error::Error; +use crate::{error::Error, types::NodeIndex}; +mod dot; +pub(crate) use dot::DotLayout; mod force_directed; pub(crate) use force_directed::ForceBasedLayout; -pub(crate) trait LayoutProvider { +pub(crate) trait Layout { type NodeIx: Clone + Eq + std::hash::Hash; - fn name() -> &'static str; - fn compute( &self, nodes: impl IntoIterator, @@ -19,3 +19,33 @@ pub(crate) trait LayoutProvider { undirected: impl IntoIterator, ) -> Result, Error>; } + +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum LayoutProvider { + Dot(DotLayout), + ForceDirected(ForceBasedLayout), +} + +impl LayoutProvider { + pub(crate) fn new_dot() -> Self { + LayoutProvider::Dot(Default::default()) + } + + pub(crate) fn new_force_directed() -> Self { + LayoutProvider::ForceDirected(Default::default()) + } +} + +impl LayoutProvider { + pub(crate) fn compute( + &self, + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { + match self { + LayoutProvider::Dot(layout) => layout.compute(nodes, directed, undirected), + LayoutProvider::ForceDirected(layout) => layout.compute(nodes, directed, undirected), + } + } +} diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 55dec35ae363..5e0b166886ee 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -13,8 +13,10 @@ use re_viewer::external::{ mod edge; pub(crate) use edge::draw_edge; +mod state; +pub(crate) use state::GraphSpaceViewState; -use crate::{graph::Node, types::{NodeIndex, NodeInstance, UnknownNodeInstance}}; +use crate::{graph::Node, layout::LayoutProvider, types::{NodeIndex, NodeInstance, UnknownNodeInstance}}; pub fn draw_node( ui: &mut egui::Ui, @@ -128,20 +130,6 @@ pub fn measure_node_sizes<'a>( sizes } -/// Space view state for the custom space view. -/// -/// This state is preserved between frames, but not across Viewer sessions. -#[derive(Default)] -pub(crate) struct GraphSpaceViewState { - pub world_to_view: emath::TSTransform, - - // Debug information - pub show_debug: bool, - - /// Positions of the nodes in world space. - pub layout: Option>, -} - pub fn bounding_rect_from_iter<'a>( rectangles: impl Iterator, ) -> Option { @@ -157,54 +145,3 @@ pub fn bounding_rect_from_iter<'a>( bounding_rect } - -impl GraphSpaceViewState { - pub fn fit_to_screen(&mut self, bounding_rect: egui::Rect, available_size: egui::Vec2) { - // Compute the scale factor to fit the bounding rectangle into the available screen size. - let scale_x = available_size.x / bounding_rect.width(); - let scale_y = available_size.y / bounding_rect.height(); - - // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. - let scale = scale_x.min(scale_y).min(1.0); - - // Compute the translation to center the bounding rect in the screen. - let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); - let center_world = bounding_rect.center().to_vec2(); - - // Set the transformation to scale and then translate to center. - self.world_to_view = - emath::TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) - * emath::TSTransform::from_scaling(scale); - } - - pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { - if let Some(layout) = &self.layout { - ui.grid_left_hand_label("Bounding box") - .on_hover_text("The bounding box encompassing all Entities in the view right now"); - ui.vertical(|ui| { - ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(layout.values()) { - ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); - ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); - } - }); - ui.end_row(); - } - } - - pub fn debug_ui(&mut self, ui: &mut egui::Ui) { - ui.re_checkbox(&mut self.show_debug, "Show debug information") - .on_hover_text("Shows debug information for the current graph"); - ui.end_row(); - } -} - -impl SpaceViewState for GraphSpaceViewState { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } -} diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs new file mode 100644 index 000000000000..ab3d67f7f42e --- /dev/null +++ b/examples/rust/graph_view/src/ui/state.rs @@ -0,0 +1,118 @@ +use std::collections::HashMap; + +use re_format::format_f32; +use re_viewer::external::{ + egui::{self, emath}, + re_ui::UiExt, + re_viewer_context::SpaceViewState, +}; + +use crate::{layout::LayoutProvider, types::NodeIndex}; + +use super::bounding_rect_from_iter; + +/// Space view state for the custom space view. +/// +/// This state is preserved between frames, but not across Viewer sessions. +pub(crate) struct GraphSpaceViewState { + pub world_to_view: emath::TSTransform, + pub clip_rect_window: egui::Rect, + + // Debug information + pub show_debug: bool, + + /// Positions of the nodes in world space. + pub layout: Option>, + pub layout_provider: LayoutProvider, +} + +impl Default for GraphSpaceViewState { + fn default() -> Self { + Self { + world_to_view: Default::default(), + clip_rect_window: egui::Rect::NOTHING, + show_debug: Default::default(), + layout: Default::default(), + layout_provider: LayoutProvider::new_dot(), + } + } +} + +impl GraphSpaceViewState { + pub fn fit_to_screen(&mut self, bounding_rect: egui::Rect, available_size: egui::Vec2) { + // Compute the scale factor to fit the bounding rectangle into the available screen size. + let scale_x = available_size.x / bounding_rect.width(); + let scale_y = available_size.y / bounding_rect.height(); + + // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. + let scale = scale_x.min(scale_y).min(1.0); + + // Compute the translation to center the bounding rect in the screen. + let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); + let center_world = bounding_rect.center().to_vec2(); + + // Set the transformation to scale and then translate to center. + self.world_to_view = + emath::TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) + * emath::TSTransform::from_scaling(scale); + } + + pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { + if let Some(layout) = &self.layout { + ui.grid_left_hand_label("Bounding box") + .on_hover_text("The bounding box encompassing all Entities in the view right now"); + ui.vertical(|ui| { + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); + if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(layout.values()) { + ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); + ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); + } + }); + ui.end_row(); + if ui + .button("Fit to screen") + .on_hover_text("Fit the bounding box to the screen") + .clicked() + { + if let Some(bounding_rect) = bounding_rect_from_iter(layout.values()) { + self.fit_to_screen(bounding_rect, self.clip_rect_window.size()); + } + } + ui.end_row(); + } + } + + pub fn debug_ui(&mut self, ui: &mut egui::Ui) { + ui.re_checkbox(&mut self.show_debug, "Show debug information") + .on_hover_text("Shows debug information for the current graph"); + ui.end_row(); + } + + pub fn layout_provider_ui(&mut self, ui: &mut egui::Ui) { + ui.horizontal(|ui| { + ui.label("Layout algorithm:"); + + let layout_options = [ + (LayoutProvider::new_dot(), "Dot"), + (LayoutProvider::new_force_directed(), "Force Directed"), + ]; + + for (l, t) in layout_options { + if ui.re_radio_value(&mut self.layout_provider, l, t).changed() { + self.layout = None + }; + } + }); + ui.end_row(); + } +} + +impl SpaceViewState for GraphSpaceViewState { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index aa54bb52491d..1e07cd93d86b 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -16,7 +16,6 @@ use re_viewer::external::{ use crate::{ error::Error, graph::Graph, - layout::{ForceBasedLayout, LayoutProvider}, types::NodeIndex, ui::{self, GraphSpaceViewState}, visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, @@ -96,6 +95,7 @@ impl SpaceViewClass for GraphSpaceView { ui.selection_grid("graph_settings_ui").show(ui, |ui| { state.bounding_box_ui(ui); state.debug_ui(ui); + state.layout_provider_ui(ui); }); Ok(()) @@ -123,7 +123,9 @@ impl SpaceViewClass for GraphSpaceView { let graph = Graph::from_nodes_edges(&node_system.data, &undirected_system.data); let state = state.downcast_mut::()?; + let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); + state.clip_rect_window = clip_rect_window; let Some(layout) = &mut state.layout else { let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); @@ -138,7 +140,7 @@ impl SpaceViewClass for GraphSpaceView { .iter() .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - let layout = ForceBasedLayout::new().compute(node_sizes.into_iter(), undirected, directed)?; + let layout = state.layout_provider.compute(node_sizes.into_iter(), undirected, directed)?; if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { state.fit_to_screen( From fc40c49543939ec06e7e061cd09567bd3aa7e0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 10 Oct 2024 11:22:23 +0200 Subject: [PATCH 058/159] WIP: fmt --- examples/rust/graph_view/src/graph.rs | 2 +- examples/rust/graph_view/src/main.rs | 7 +++---- examples/rust/graph_view/src/types.rs | 5 ++++- examples/rust/graph_view/src/ui/edge.rs | 8 +++----- examples/rust/graph_view/src/ui/mod.rs | 6 +++++- examples/rust/graph_view/src/view.rs | 5 ++++- examples/rust/graph_view/src/visualizers/mod.rs | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index 063f3215684d..de090a66ad30 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -5,7 +5,7 @@ use re_viewer::external::re_types::datatypes; use crate::{ types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, - visualizers::{NodeVisualizerData, EdgesUndirectedData}, + visualizers::{EdgesUndirectedData, NodeVisualizerData}, }; pub(crate) enum Node<'a> { diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 2a2f243fd75c..086b54fb9306 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -4,11 +4,11 @@ use re_viewer::external::{re_log, re_memory}; mod error; mod graph; -mod view; mod layout; +mod types; mod ui; +mod view; mod visualizers; -mod types; // By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, // and prune the data store when it goes above a certain limit. @@ -55,8 +55,7 @@ fn main() -> Result<(), Box> { app.add_receiver(rx); // Register the custom space view - app.add_space_view_class::() - .unwrap(); + app.add_space_view_class::().unwrap(); Box::new(app) }), diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs index c5eb59ec4991..9f0298b4013a 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/types.rs @@ -1,5 +1,8 @@ use re_log_types::{EntityPath, EntityPathHash, Instance}; -use re_viewer::external::{egui, re_types::{datatypes, ArrowString}}; +use re_viewer::external::{ + egui, + re_types::{datatypes, ArrowString}, +}; impl<'a> EdgeInstance<'a> { pub fn nodes(&'a self) -> impl Iterator { diff --git a/examples/rust/graph_view/src/ui/edge.rs b/examples/rust/graph_view/src/ui/edge.rs index 016f07c40a3e..b86507a88769 100644 --- a/examples/rust/graph_view/src/ui/edge.rs +++ b/examples/rust/graph_view/src/ui/edge.rs @@ -1,5 +1,6 @@ use re_viewer::external::{ - egui, re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight} + egui, + re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}, }; pub fn draw_edge( @@ -36,10 +37,7 @@ pub fn draw_edge( } let color = color.unwrap_or(ui.style().visuals.text_color()); - painter.line_segment( - [source_point, target_point], - egui::Stroke::new(1.0, color), - ); + painter.line_segment([source_point, target_point], egui::Stroke::new(1.0, color)); // Conditionally draw an arrow at the target point if show_arrow { diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 5e0b166886ee..8e61c83caceb 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -16,7 +16,11 @@ pub(crate) use edge::draw_edge; mod state; pub(crate) use state::GraphSpaceViewState; -use crate::{graph::Node, layout::LayoutProvider, types::{NodeIndex, NodeInstance, UnknownNodeInstance}}; +use crate::{ + graph::Node, + layout::LayoutProvider, + types::{NodeIndex, NodeInstance, UnknownNodeInstance}, +}; pub fn draw_node( ui: &mut egui::Ui, diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 1e07cd93d86b..70652fb0a338 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -140,7 +140,10 @@ impl SpaceViewClass for GraphSpaceView { .iter() .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - let layout = state.layout_provider.compute(node_sizes.into_iter(), undirected, directed)?; + let layout = + state + .layout_provider + .compute(node_sizes.into_iter(), undirected, directed)?; if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { state.fit_to_screen( diff --git a/examples/rust/graph_view/src/visualizers/mod.rs b/examples/rust/graph_view/src/visualizers/mod.rs index e21804c1cf8d..d55fa4e7662d 100644 --- a/examples/rust/graph_view/src/visualizers/mod.rs +++ b/examples/rust/graph_view/src/visualizers/mod.rs @@ -4,4 +4,4 @@ mod nodes; pub(crate) use edges_directed::{EdgesDirectedData, EdgesDirectedVisualizer}; pub(crate) use edges_undirected::{EdgesUndirectedData, EdgesUndirectedVisualizer}; -pub(crate) use nodes::{NodeVisualizerData, NodeVisualizer}; +pub(crate) use nodes::{NodeVisualizer, NodeVisualizerData}; From 69d225ed2e90d1f34a7dbf6b9682faab40ecc95a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 10 Oct 2024 11:31:33 +0200 Subject: [PATCH 059/159] WIP: rerun (no pun intended :innocent:) codegen --- crates/store/re_types/src/datatypes/graph_edge.rs | 1 + crates/store/re_types/src/datatypes/graph_location.rs | 1 + crates/store/re_types/src/datatypes/graph_node_id.rs | 1 + docs/content/reference/types/archetypes/graph_edges_directed.md | 1 + .../content/reference/types/archetypes/graph_edges_undirected.md | 1 + docs/content/reference/types/archetypes/graph_nodes.md | 1 + 6 files changed, 6 insertions(+) diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index 40b9445dc1a2..292b8ac8742b 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -76,6 +76,7 @@ impl ::re_types_core::Loggable for GraphEdge { Self: Clone + 'a, { #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] use ::re_types_core::{Loggable as _, ResultExt as _}; use arrow2::{array::*, datatypes::*}; Ok({ diff --git a/crates/store/re_types/src/datatypes/graph_location.rs b/crates/store/re_types/src/datatypes/graph_location.rs index a98f0d2a70d5..51954a2c866d 100644 --- a/crates/store/re_types/src/datatypes/graph_location.rs +++ b/crates/store/re_types/src/datatypes/graph_location.rs @@ -78,6 +78,7 @@ impl ::re_types_core::Loggable for GraphLocation { Self: Clone + 'a, { #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] use ::re_types_core::{Loggable as _, ResultExt as _}; use arrow2::{array::*, datatypes::*}; Ok({ diff --git a/crates/store/re_types/src/datatypes/graph_node_id.rs b/crates/store/re_types/src/datatypes/graph_node_id.rs index 9d564631745a..876da591e151 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id.rs @@ -74,6 +74,7 @@ impl ::re_types_core::Loggable for GraphNodeId { Self: Clone + 'a, { #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] use ::re_types_core::{Loggable as _, ResultExt as _}; use arrow2::{array::*, datatypes::*}; Ok({ diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md index d6b6bc5ae700..97cb29660eac 100644 --- a/docs/content/reference/types/archetypes/graph_edges_directed.md +++ b/docs/content/reference/types/archetypes/graph_edges_directed.md @@ -15,6 +15,7 @@ A list of nodes in a graph with optional labels, colors, etc. ## Shown in * [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) ## API reference links * 🌊 [C++ API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesDirected.html) diff --git a/docs/content/reference/types/archetypes/graph_edges_undirected.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md index 569d1e5cee43..24d4b2dba01f 100644 --- a/docs/content/reference/types/archetypes/graph_edges_undirected.md +++ b/docs/content/reference/types/archetypes/graph_edges_undirected.md @@ -15,6 +15,7 @@ A list of nodes in a graph with optional labels, colors, etc. ## Shown in * [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) ## API reference links * 🌊 [C++ API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesUndirected.html) diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index f600054e3019..0338e5a1657a 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -15,6 +15,7 @@ A list of nodes in a graph with optional labels, colors, etc. ## Shown in * [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) ## API reference links * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html) From 58e22676f7592ceb2707ec202a6559e3bbaad318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 10 Oct 2024 18:07:48 +0200 Subject: [PATCH 060/159] WIP: add social example and some fixes --- Cargo.lock | 3 + .../src/datatypes/graph_node_id_ext.rs | 6 + examples/rust/graph_view/src/error.rs | 5 +- examples/rust/graph_view/src/graph.rs | 78 +- examples/rust/graph_view/src/types.rs | 18 + examples/rust/graph_view/src/ui/state.rs | 2 +- examples/rust/graph_view/src/view.rs | 24 +- examples/rust/node_link_graph/Cargo.toml | 5 + .../rust/node_link_graph/src/examples/mod.rs | 2 + .../node_link_graph/src/examples/simple.rs | 56 + .../src/examples/social/README.md | 1 + .../src/examples/social/mod.rs | 85 + .../src/examples/social/tij_SFHH.dat_ | 70261 ++++++++++++++++ examples/rust/node_link_graph/src/main.rs | 92 +- 14 files changed, 70552 insertions(+), 86 deletions(-) create mode 100644 examples/rust/node_link_graph/src/examples/mod.rs create mode 100644 examples/rust/node_link_graph/src/examples/simple.rs create mode 100644 examples/rust/node_link_graph/src/examples/social/README.md create mode 100644 examples/rust/node_link_graph/src/examples/social/mod.rs create mode 100644 examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ diff --git a/Cargo.lock b/Cargo.lock index b8bec82061c1..c53b8f2b17da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3729,7 +3729,10 @@ dependencies = [ "anyhow", "clap", "glam 0.28.0", + "itertools 0.13.0", "rerun", + "strum", + "strum_macros", ] [[package]] diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs index ccf4643d2c2e..573deeec9c19 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs @@ -4,6 +4,12 @@ impl std::convert::From<&str> for super::GraphNodeId { } } +impl std::convert::From for super::GraphNodeId { + fn from(s: String) -> Self { + Self(s.into()) + } +} + impl std::fmt::Display for super::GraphNodeId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 158e9a3bfa31..31713cc228bb 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -1,9 +1,12 @@ -use re_viewer::external::re_viewer_context::SpaceViewSystemExecutionError; +use re_log_types::EntityPath; +use re_viewer::external::{re_types::datatypes, re_viewer_context::SpaceViewSystemExecutionError}; #[derive(thiserror::Error, Debug)] pub enum Error { #[error("edge has unknown node: {0}")] EdgeUnknownNode(String), + #[error("missing layout information for node `{1}` in entity `{0}`")] + MissingLayoutInformation(EntityPath, datatypes::GraphNodeId) } impl From for SpaceViewSystemExecutionError { diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph.rs index de090a66ad30..9333fcd6514f 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph.rs @@ -1,11 +1,13 @@ -use std::collections::HashSet; +use std::{collections::HashSet, hash::Hash}; +use petgraph::graphmap::EdgesDirected; use re_log_types::EntityPath; use re_viewer::external::re_types::datatypes; use crate::{ - types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, - visualizers::{EdgesUndirectedData, NodeVisualizerData}, + error::Error, + types::{EdgeInstance, NodeIndex, NodeInstance, UnknownNodeInstance}, + visualizers::{EdgesDirectedData, EdgesUndirectedData, NodeVisualizerData}, }; pub(crate) enum Node<'a> { @@ -13,49 +15,85 @@ pub(crate) enum Node<'a> { Unknown(UnknownNodeInstance<'a>), } +impl<'a> From<&Node<'a>> for NodeIndex { + fn from(node: &Node) -> Self { + match node { + Node::Regular(node) => node.into(), + Node::Unknown(node) => node.into(), + } + } +} + +impl<'a> From> for NodeIndex { + fn from(node: Node) -> Self { + match node { + Node::Regular(node) => node.into(), + Node::Unknown(node) => node.into(), + } + } +} + pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: Vec<(EntityPath, datatypes::GraphNodeId)>, + unknown: HashSet<(EntityPath, datatypes::GraphNodeId)>, nodes: &'a Vec, + directed: &'a Vec, undirected: &'a Vec, } impl<'a> Graph<'a> { pub fn from_nodes_edges( nodes: &'a Vec, + directed: &'a Vec, undirected: &'a Vec, - ) -> Self { - let seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes + ) -> Option { + let mut seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes .iter() .flat_map(|entity| entity.nodes()) .map(|n| (n.entity_path, n.node_id)) .collect(); - let unknown = undirected - .iter() - .flat_map(|entity| entity.edges().flat_map(|edge| edge.nodes())) - .filter_map(|n| { - let entity_path = EntityPath::from(n.entity_path.clone()); - if seen.contains(&(&entity_path, &n.node_id)) { - None - } else { - Some((entity_path, n.node_id)) + let mut unknown = HashSet::new(); + for entity in undirected { + for edge in entity.edges() { + for node in edge.nodes() { + let entity_path = EntityPath::from(node.entity_path.clone()); + if seen.contains(&(&entity_path, &node.node_id)) { + continue; + } + unknown.insert((entity_path, node.node_id)); } - }) - .collect(); + } + } + for entity in directed { + for edge in entity.edges() { + for node in edge.nodes() { + let entity_path = EntityPath::from(node.entity_path.clone()); + if seen.contains(&(&entity_path, &node.node_id)) { + continue; + } + unknown.insert((entity_path, node.node_id)); + } + } + } + + if nodes.is_empty() && unknown.is_empty() { + return None; + } - Self { + Some(Self { unknown, nodes, + directed, undirected, - } + }) } pub fn nodes_by_entity(&self) -> impl Iterator { self.nodes.iter() } - pub fn all_nodes(&self) -> impl Iterator { + pub fn all_nodes(&'a self) -> impl Iterator { let nodes = self .nodes .iter() diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs index 9f0298b4013a..14084f5baaf7 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/types.rs @@ -49,6 +49,15 @@ impl<'a> From<&NodeInstance<'a>> for NodeIndex { } } +impl<'a> From> for NodeIndex { + fn from(node: NodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } +} + pub(crate) struct NodeInstance<'a> { pub node_id: &'a datatypes::GraphNodeId, pub entity_path: &'a EntityPath, @@ -78,3 +87,12 @@ impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { } } } + +impl<'a> From> for NodeIndex { + fn from(node: UnknownNodeInstance<'a>) -> Self { + Self { + entity_hash: node.entity_path.hash(), + node_id: node.node_id.clone(), + } + } +} diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index ab3d67f7f42e..19420813ce9f 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -33,7 +33,7 @@ impl Default for GraphSpaceViewState { clip_rect_window: egui::Rect::NOTHING, show_debug: Default::default(), layout: Default::default(), - layout_provider: LayoutProvider::new_dot(), + layout_provider: LayoutProvider::new_force_directed(), } } } diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 70652fb0a338..f61d12f09551 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -120,7 +120,14 @@ impl SpaceViewClass for GraphSpaceView { .view_systems .get::()?; - let graph = Graph::from_nodes_edges(&node_system.data, &undirected_system.data); + let Some(graph) = Graph::from_nodes_edges( + &node_system.data, + &directed_system.data, + &undirected_system.data, + ) else { + log::warn!("No graph data available."); + return Ok(()); + }; let state = state.downcast_mut::()?; @@ -157,6 +164,11 @@ impl SpaceViewClass for GraphSpaceView { return Ok(()); }; + if graph.all_nodes().any(|n| !layout.contains_key(&NodeIndex::from(&n))) { + state.layout = None; + return Ok(()); + } + let response = ui.interact(clip_rect_window, id, egui::Sense::click_and_drag()); // Allow dragging the background as well. @@ -237,9 +249,13 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let index = NodeIndex::from(&node); - let current_extent = layout - .get(&index) - .expect("missing layout information for node"); + let Some(current_extent) = layout.get(&index) else { + return Err(Error::MissingLayoutInformation( + data.entity_path.clone(), + node.node_id.clone(), + ) + .into()); + }; let response = egui::Area::new(id.with(&index)) .current_pos(current_extent.min) .order(egui::Order::Middle) diff --git a/examples/rust/node_link_graph/Cargo.toml b/examples/rust/node_link_graph/Cargo.toml index 811c91b1c6bc..abfad846affb 100644 --- a/examples/rust/node_link_graph/Cargo.toml +++ b/examples/rust/node_link_graph/Cargo.toml @@ -12,3 +12,8 @@ rerun = { path = "../../../crates/top/rerun", features = ["clap"] } anyhow = "1.0" clap = { version = "4.0", features = ["derive"] } glam = "0.28" + +# Iterate over enums +strum = "0.26" +strum_macros = "0.26" +itertools = "0.13" diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs new file mode 100644 index 000000000000..c1669f2b3912 --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -0,0 +1,2 @@ +pub mod simple; +pub mod social; diff --git a/examples/rust/node_link_graph/src/examples/simple.rs b/examples/rust/node_link_graph/src/examples/simple.rs new file mode 100644 index 000000000000..8e7b1ec77a44 --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/simple.rs @@ -0,0 +1,56 @@ +use rerun::{Color, GraphEdgesDirected, GraphEdgesUndirected, GraphNodes}; + +use crate::Args; + +pub fn run(args: &Args) -> anyhow::Result<()> { + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_simple")?; + + rec.set_time_sequence("frame", 0); + rec.log( + "kitchen/objects", + &GraphNodes::new(["sink", "fridge"]) + .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), + )?; + + rec.log("kitchen/nodes", &GraphNodes::new(["area0", "area1"]))?; + rec.log( + "kitchen/edges", + &GraphEdgesDirected::new([("kitchen/nodes", "area0", "area1")]), + )?; + + rec.set_time_sequence("frame", 1); + rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; + + rec.set_time_sequence("frame", 2); + rec.log("living/objects", &GraphNodes::new(["table"]))?; + rec.log( + "living/nodes", + &GraphNodes::new(["area0", "area1", "area2"]), + )?; + rec.log( + "living/edges", + &GraphEdgesDirected::new([ + ("living/nodes", "area0", "area1"), + ("living/nodes", "area0", "area2"), + ("living/nodes", "area1", "area2"), + ]), + )?; + + rec.log( + "doors/edges", + &GraphEdgesDirected::new([ + (("kitchen/nodes", "area0"), ("hallway/nodes", "area0")), + (("hallway/nodes", "area0"), ("living/nodes", "area2")), + ]), + )?; + + rec.log( + "edges", + &GraphEdgesUndirected::new([ + (("kitchen/nodes", "area0"), ("kitchen/objects", "sink")), + (("kitchen/nodes", "area1"), ("kitchen/objects", "fridge")), + (("living/nodes", "area1"), ("living/objects", "table")), + ]), + )?; + Ok(()) +} diff --git a/examples/rust/node_link_graph/src/examples/social/README.md b/examples/rust/node_link_graph/src/examples/social/README.md new file mode 100644 index 000000000000..3c84974ac7c9 --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/social/README.md @@ -0,0 +1 @@ +Data from http://www.sociopatterns.org/datasets/sfhh-conference-data-set/. diff --git a/examples/rust/node_link_graph/src/examples/social/mod.rs b/examples/rust/node_link_graph/src/examples/social/mod.rs new file mode 100644 index 000000000000..29e31849fb67 --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/social/mod.rs @@ -0,0 +1,85 @@ +use itertools::Itertools; +use rerun::{ + components::{self}, + datatypes, + external::log, + GraphEdgesUndirected, GraphNodes, +}; + +use crate::Args; +use std::{ + collections::HashSet, + io::{BufRead, BufReader}, +}; + +struct Interaction { + timestamp: u32, + person_a: datatypes::GraphNodeId, + person_b: datatypes::GraphNodeId, +} + +fn parse_data_file() -> anyhow::Result> { + let contents = include_str!("tij_SFHH.dat_"); + let cursor = std::io::Cursor::new(contents.as_bytes()); + let reader = BufReader::new(cursor); + + let mut entries = Vec::new(); + for line in reader.lines() { + let line = line?; + let parts: Vec = line + .split_whitespace() + .map(|s| s.parse().unwrap()) + .collect(); + + let t = parts[0].as_str(); + let i = parts[1].as_str(); + let j = parts[2].as_str(); + + entries.push(Interaction { + timestamp: t.parse::()?, + person_a: i.into(), + person_b: j.into(), + }); + } + + Ok(entries) +} + +pub fn run(args: &Args) -> anyhow::Result<()> { + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_social")?; + + // rec.set_time_sequence("frame", 0); + let entries = parse_data_file()?; + + for (timestamp, chunk) in &entries.into_iter().chunk_by(|t| t.timestamp) { + + let interactions = chunk.collect::>(); + + let mut nodes = HashSet::new(); + for i in interactions.iter() { + nodes.insert(i.person_a.clone()); + nodes.insert(i.person_b.clone()); + } + + if nodes.is_empty() { + continue; + } + + log::info!("Logging nodes for timestamp `{timestamp}`: {:?}", nodes); + + rec.set_time_sequence("frame", timestamp); + + rec.log( + "/persons", + &GraphNodes::new(nodes.iter().map(|n| { + components::GraphNodeId::from(datatypes::GraphNodeId(n.to_string().into())) + })), + )?; + + rec.log( + "/interactions", + &GraphEdgesUndirected::new(interactions.into_iter().map(|i| ("/persons", i.person_a, i.person_b))), + )?; + } + Ok(()) +} diff --git a/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ b/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ new file mode 100644 index 000000000000..6b01b0c138e7 --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ @@ -0,0 +1,70261 @@ +32520 1467 1591 +32560 1513 1591 +32700 1591 1467 +32720 1591 1467 +32740 1591 1467 +32760 1591 1467 +32820 1467 1591 +32840 1467 1591 +32860 1467 1591 +32960 1568 1591 +32980 1568 1591 +33000 1568 1591 +33020 1568 1591 +33080 1562 1467 +33180 1524 1562 +33220 1524 1562 +33260 1771 1428 +33400 1600 1523 +33400 1525 1529 +33400 1600 1544 +33400 1600 1529 +33400 1600 1519 +33400 1544 1529 +33400 1544 1519 +33400 1600 1525 +33400 1600 1583 +33400 1510 1519 +33400 1544 1525 +33400 1519 1583 +33400 1519 1525 +33400 1519 1529 +33400 1549 1525 +33400 1583 1529 +33400 1510 1525 +33400 1583 1525 +33400 1553 1525 +33400 1583 1510 +33420 1606 1523 +33420 1600 1510 +33420 1600 1544 +33420 1600 1549 +33420 1600 1529 +33420 1600 1519 +33420 1510 1544 +33420 1544 1583 +33420 1544 1529 +33420 1544 1519 +33420 1549 1529 +33420 1519 1553 +33420 1523 1525 +33420 1600 1553 +33420 1600 1525 +33420 1600 1583 +33420 1510 1549 +33420 1510 1529 +33420 1510 1519 +33420 1544 1553 +33420 1544 1549 +33420 1544 1525 +33420 1519 1549 +33420 1519 1583 +33420 1519 1525 +33420 1519 1529 +33420 1549 1553 +33420 1549 1525 +33420 1549 1583 +33420 1583 1529 +33420 1553 1523 +33420 1510 1525 +33420 1583 1553 +33420 1583 1525 +33420 1553 1525 +33420 1510 1553 +33420 1583 1510 +33440 1600 1510 +33440 1600 1544 +33440 1600 1549 +33440 1600 1529 +33440 1600 1519 +33440 1510 1544 +33440 1544 1583 +33440 1544 1529 +33440 1544 1519 +33440 1549 1529 +33440 1519 1553 +33440 1523 1525 +33440 1600 1553 +33440 1600 1525 +33440 1600 1583 +33440 1510 1549 +33440 1510 1529 +33440 1510 1519 +33440 1544 1553 +33440 1544 1523 +33440 1544 1549 +33440 1544 1525 +33440 1519 1549 +33440 1519 1583 +33440 1519 1523 +33440 1519 1525 +33440 1519 1529 +33440 1549 1553 +33440 1549 1525 +33440 1549 1583 +33440 1583 1529 +33440 1553 1523 +33440 1529 1525 +33440 1510 1525 +33440 1583 1553 +33440 1583 1525 +33440 1553 1525 +33440 1510 1553 +33440 1583 1510 +33460 1600 1553 +33460 1600 1523 +33460 1600 1525 +33460 1600 1583 +33460 1510 1549 +33460 1510 1529 +33460 1510 1519 +33460 1544 1553 +33460 1544 1523 +33460 1544 1549 +33460 1544 1525 +33460 1519 1549 +33460 1519 1583 +33460 1519 1523 +33460 1519 1525 +33460 1519 1529 +33460 1549 1553 +33460 1549 1523 +33460 1549 1525 +33460 1549 1583 +33460 1583 1529 +33460 1553 1523 +33460 1523 1529 +33460 1529 1525 +33460 1510 1525 +33460 1583 1553 +33460 1583 1525 +33460 1553 1525 +33460 1510 1553 +33460 1583 1510 +33480 1510 1525 +33480 1583 1553 +33480 1583 1525 +33480 1553 1525 +33480 1510 1553 +33480 1583 1510 +33500 1519 1549 +33500 1510 1525 +33500 1583 1553 +33500 1583 1525 +33500 1553 1525 +33500 1510 1553 +33500 1583 1510 +33520 1622 1529 +33520 1510 1525 +33520 1583 1553 +33520 1583 1525 +33520 1553 1525 +33520 1510 1553 +33520 1583 1510 +33540 1510 1525 +33540 1583 1553 +33540 1583 1525 +33540 1553 1525 +33540 1510 1553 +33540 1583 1510 +33560 1510 1525 +33560 1583 1553 +33560 1583 1525 +33560 1553 1523 +33560 1553 1525 +33560 1510 1553 +33560 1583 1510 +33580 1510 1525 +33580 1583 1553 +33580 1583 1525 +33580 1553 1523 +33580 1553 1525 +33580 1523 1525 +33580 1510 1553 +33580 1583 1523 +33580 1583 1510 +33600 1510 1553 +33600 1510 1599 +33600 1583 1523 +33600 1513 1560 +33600 1523 1599 +33600 1525 1599 +33600 1510 1523 +33600 1583 1510 +33620 1553 1525 +33620 1523 1525 +33620 1513 1560 +33620 1523 1599 +33620 1525 1599 +33620 1510 1523 +33620 1583 1510 +33640 1513 1560 +33640 1523 1599 +33640 1525 1599 +33640 1510 1523 +33640 1583 1510 +33660 1602 1631 +33660 1583 1553 +33660 1525 1599 +33660 1510 1553 +33660 1510 1523 +33660 1583 1523 +33660 1553 1523 +33660 1583 1510 +33680 1510 1553 +33680 1510 1523 +33680 1583 1523 +33680 1553 1523 +33680 1553 1525 +33680 1553 1599 +33680 1523 1599 +33680 1523 1525 +33680 1583 1510 +33700 1510 1599 +33700 1583 1599 +33700 1602 1631 +33700 1583 1510 +33720 1583 1525 +33720 1583 1599 +33720 1599 1525 +33720 1602 1631 +33720 1510 1525 +33720 1523 1525 +33720 1573 1519 +33720 1537 1560 +33720 1599 1523 +33720 1583 1510 +33740 1573 1519 +33740 1537 1560 +33740 1599 1523 +33740 1583 1510 +33760 1537 1560 +33760 1599 1523 +33760 1583 1510 +33780 1602 1631 +33780 1599 1523 +33780 1583 1510 +33800 1583 1599 +33800 1599 1510 +33800 1583 1519 +33800 1602 1631 +33800 1599 1523 +33800 1583 1510 +33820 1583 1519 +33820 1519 1525 +33820 1602 1631 +33820 1599 1523 +33820 1583 1510 +33840 1602 1631 +33840 1599 1523 +33840 1583 1510 +33860 1560 1531 +33860 1602 1631 +33860 1599 1523 +33860 1583 1510 +33880 1602 1631 +33880 1523 1531 +33880 1599 1523 +33880 1583 1510 +33900 1539 1568 +33900 1599 1604 +33900 1602 1631 +33900 1599 1531 +33900 1523 1531 +33900 1604 1531 +33900 1599 1523 +33900 1583 1510 +33920 1599 1531 +33920 1523 1531 +33920 1604 1531 +33920 1599 1523 +33920 1583 1510 +33940 1599 1529 +33940 1599 1510 +33940 1604 1531 +33940 1599 1525 +33940 1599 1523 +33940 1602 1631 +33940 1583 1510 +33960 1529 1523 +33960 1510 1523 +33960 1583 1599 +33960 1599 1529 +33960 1599 1510 +33960 1604 1531 +33960 1599 1525 +33960 1599 1523 +33960 1602 1631 +33960 1583 1510 +33980 1583 1599 +33980 1599 1529 +33980 1599 1510 +33980 1604 1531 +33980 1599 1525 +33980 1549 1525 +33980 1599 1523 +33980 1602 1631 +33980 1583 1510 +34000 1543 1513 +34000 1544 1573 +34000 1599 1525 +34000 1549 1525 +34000 1599 1523 +34000 1602 1631 +34000 1583 1510 +34020 1583 1599 +34020 1599 1529 +34020 1599 1510 +34020 1549 1525 +34020 1599 1523 +34020 1602 1631 +34020 1583 1510 +34040 1543 1513 +34040 1599 1529 +34040 1599 1510 +34040 1549 1525 +34040 1599 1523 +34040 1602 1631 +34040 1583 1510 +34060 1583 1599 +34060 1599 1529 +34060 1599 1510 +34060 1544 1573 +34060 1549 1525 +34060 1599 1523 +34060 1602 1631 +34060 1583 1510 +34080 1599 1529 +34080 1599 1510 +34080 1604 1531 +34080 1519 1523 +34080 1544 1573 +34080 1549 1525 +34080 1599 1523 +34080 1602 1631 +34080 1583 1510 +34100 1544 1573 +34100 1549 1525 +34100 1599 1523 +34100 1602 1631 +34100 1583 1510 +34120 1544 1549 +34120 1544 1525 +34120 1544 1599 +34120 1549 1525 +34120 1599 1525 +34120 1599 1523 +34120 1544 1523 +34120 1602 1631 +34120 1604 1531 +34120 1583 1510 +34140 1544 1583 +34140 1544 1525 +34140 1544 1599 +34140 1549 1525 +34140 1599 1525 +34140 1599 1523 +34140 1544 1523 +34140 1544 1510 +34140 1602 1631 +34140 1604 1531 +34140 1583 1510 +34160 1599 1523 +34160 1525 1529 +34160 1544 1523 +34160 1544 1510 +34160 1602 1631 +34160 1604 1531 +34160 1583 1510 +34180 1544 1523 +34180 1544 1510 +34180 1523 1525 +34180 1544 1599 +34180 1602 1631 +34180 1583 1525 +34180 1544 1525 +34180 1604 1531 +34180 1583 1510 +34200 1544 1599 +34200 1602 1631 +34200 1526 1531 +34200 1583 1525 +34200 1544 1525 +34200 1604 1531 +34200 1599 1523 +34200 1583 1510 +34220 1602 1631 +34220 1526 1531 +34220 1510 1525 +34220 1583 1525 +34220 1544 1525 +34220 1604 1531 +34220 1599 1523 +34220 1583 1510 +34240 1510 1525 +34240 1583 1525 +34240 1544 1525 +34240 1604 1531 +34240 1582 1523 +34240 1582 1599 +34240 1599 1523 +34240 1583 1510 +34260 1549 1525 +34260 1583 1525 +34260 1602 1631 +34260 1544 1525 +34260 1604 1531 +34260 1582 1523 +34260 1582 1599 +34260 1599 1523 +34260 1583 1510 +34280 1544 1525 +34280 1551 1269 +34280 1604 1531 +34280 1582 1523 +34280 1582 1599 +34280 1599 1523 +34280 1583 1510 +34300 1463 1628 +34300 1604 1531 +34300 1519 1523 +34300 1582 1523 +34300 1582 1599 +34300 1599 1523 +34300 1549 1525 +34300 1583 1510 +34320 1552 1600 +34320 1582 1523 +34320 1582 1599 +34320 1602 1631 +34320 1599 1523 +34320 1549 1525 +34320 1583 1510 +34340 1551 1269 +34340 1599 1523 +34340 1549 1525 +34340 1604 1531 +34340 1583 1510 +34360 1544 1523 +34360 1551 1514 +34360 1551 1269 +34360 1591 1531 +34360 1544 1599 +34360 1599 1523 +34360 1549 1525 +34360 1604 1531 +34360 1583 1510 +34380 1591 1604 +34380 1551 1514 +34380 1551 1269 +34380 1591 1531 +34380 1602 1631 +34380 1544 1599 +34380 1599 1523 +34380 1549 1525 +34380 1604 1531 +34380 1583 1510 +34400 1544 1523 +34400 1547 1504 +34400 1551 1514 +34400 1551 1269 +34400 1552 1600 +34400 1591 1531 +34400 1602 1631 +34400 1523 1529 +34400 1544 1599 +34400 1599 1523 +34400 1549 1525 +34400 1604 1531 +34400 1583 1510 +34420 1544 1599 +34420 1599 1523 +34420 1510 1529 +34420 1523 1525 +34420 1599 1529 +34420 1549 1525 +34420 1604 1531 +34420 1583 1510 +34440 1544 1525 +34440 1544 1510 +34440 1599 1529 +34440 1600 1523 +34440 1601 1604 +34440 1510 1525 +34440 1549 1525 +34440 1463 1628 +34440 1604 1531 +34440 1583 1510 +34460 1544 1600 +34460 1544 1523 +34460 1549 1525 +34460 1599 1510 +34460 1519 1523 +34460 1463 1628 +34460 1599 1523 +34460 1602 1631 +34460 1604 1531 +34460 1583 1510 +34480 1463 1628 +34480 1599 1523 +34480 1601 1629 +34480 1599 1529 +34480 1602 1631 +34480 1604 1531 +34480 1583 1510 +34500 1544 1529 +34500 1549 1523 +34500 1601 1629 +34500 1616 1518 +34500 1547 1504 +34500 1599 1529 +34500 1544 1599 +34500 1549 1519 +34500 1602 1631 +34500 1604 1531 +34500 1583 1510 +34520 1547 1504 +34520 1599 1529 +34520 1523 1529 +34520 1544 1599 +34520 1549 1519 +34520 1602 1631 +34520 1604 1531 +34520 1583 1510 +34540 1544 1529 +34540 1544 1599 +34540 1549 1519 +34540 1600 1519 +34540 1602 1631 +34540 1604 1531 +34540 1551 1269 +34540 1583 1510 +34560 1544 1523 +34560 1600 1519 +34560 1602 1631 +34560 1604 1531 +34560 1463 1628 +34560 1551 1269 +34560 1616 1518 +34560 1599 1523 +34560 1583 1510 +34580 1544 1529 +34580 1551 1514 +34580 1551 1269 +34580 1616 1518 +34580 1547 1504 +34580 1599 1523 +34580 1583 1510 +34600 1544 1599 +34600 1547 1504 +34600 1691 1518 +34600 1600 1519 +34600 1599 1523 +34600 1604 1531 +34600 1583 1510 +34620 1544 1529 +34620 1599 1523 +34620 1604 1531 +34620 1551 1514 +34620 1602 1631 +34620 1583 1510 +34640 1544 1529 +34640 1545 1580 +34640 1549 1523 +34640 1616 1518 +34640 1549 1599 +34640 1599 1523 +34640 1604 1531 +34640 1551 1514 +34640 1602 1631 +34640 1583 1510 +34660 1549 1599 +34660 1599 1523 +34660 1604 1531 +34660 1544 1599 +34660 1551 1514 +34660 1602 1631 +34660 1583 1510 +34680 1544 1529 +34680 1544 1599 +34680 1544 1523 +34680 1551 1514 +34680 1616 1518 +34680 1600 1519 +34680 1602 1631 +34680 1583 1510 +34700 1523 1529 +34700 1544 1523 +34700 1551 1514 +34700 1616 1518 +34700 1600 1519 +34700 1602 1631 +34700 1583 1510 +34720 1544 1523 +34720 1551 1514 +34720 1616 1518 +34720 1600 1519 +34720 1602 1631 +34720 1604 1531 +34720 1583 1510 +34740 1544 1523 +34740 1549 1529 +34740 1551 1514 +34740 1616 1518 +34740 1600 1519 +34740 1602 1631 +34740 1604 1531 +34740 1583 1510 +34760 1539 1549 +34760 1600 1523 +34760 1600 1519 +34760 1601 1629 +34760 1602 1631 +34760 1544 1529 +34760 1604 1531 +34760 1519 1523 +34760 1583 1510 +34780 1544 1529 +34780 1544 1583 +34780 1604 1531 +34780 1616 1518 +34780 1544 1510 +34780 1519 1523 +34780 1583 1510 +34800 1544 1510 +34800 1600 1523 +34800 1539 1544 +34800 1600 1519 +34800 1519 1523 +34800 1539 1529 +34800 1583 1510 +34820 1600 1523 +34820 1604 1531 +34820 1539 1544 +34820 1600 1519 +34820 1602 1631 +34820 1519 1523 +34820 1539 1529 +34820 1583 1510 +34840 1539 1544 +34840 1539 1600 +34840 1600 1519 +34840 1544 1523 +34840 1463 1628 +34840 1602 1631 +34840 1519 1523 +34840 1539 1529 +34840 1544 1529 +34840 1583 1510 +34860 1539 1599 +34860 1539 1519 +34860 1544 1523 +34860 1463 1628 +34860 1600 1523 +34860 1602 1631 +34860 1519 1523 +34860 1539 1529 +34860 1544 1529 +34860 1583 1510 +34880 1539 1544 +34880 1599 1600 +34880 1599 1519 +34880 1600 1523 +34880 1602 1631 +34880 1519 1529 +34880 1519 1523 +34880 1539 1529 +34880 1539 1523 +34880 1544 1529 +34880 1599 1523 +34880 1600 1519 +34880 1544 1599 +34880 1583 1510 +34900 1539 1529 +34900 1539 1631 +34900 1539 1523 +34900 1539 1771 +34900 1544 1529 +34900 1599 1523 +34900 1599 1529 +34900 1599 1631 +34900 1539 1599 +34900 1599 1510 +34900 1600 1519 +34900 1544 1599 +34900 1604 1531 +34900 1583 1510 +34920 1539 1544 +34920 1539 1599 +34920 1583 1599 +34920 1599 1600 +34920 1599 1510 +34920 1600 1523 +34920 1602 1631 +34920 1519 1523 +34920 1600 1519 +34920 1544 1599 +34920 1604 1531 +34920 1583 1510 +34940 1549 1631 +34940 1600 1523 +34940 1602 1631 +34940 1519 1523 +34940 1600 1519 +34940 1544 1599 +34940 1544 1523 +34940 1604 1531 +34940 1583 1510 +34960 1600 1519 +34960 1599 1529 +34960 1523 1529 +34960 1544 1529 +34960 1544 1599 +34960 1544 1523 +34960 1604 1531 +34960 1569 1520 +34960 1583 1510 +34980 1599 1529 +34980 1600 1628 +34980 1602 1631 +34980 1523 1529 +34980 1616 1518 +34980 1544 1529 +34980 1463 1628 +34980 1544 1599 +34980 1599 1523 +34980 1544 1523 +34980 1604 1531 +34980 1539 1547 +34980 1569 1520 +34980 1583 1510 +35000 1463 1600 +35000 1616 1518 +35000 1544 1529 +35000 1463 1628 +35000 1544 1599 +35000 1599 1523 +35000 1544 1523 +35000 1604 1531 +35000 1539 1547 +35000 1569 1520 +35000 1583 1510 +35020 1544 1529 +35020 1545 1616 +35020 1569 1742 +35020 1463 1628 +35020 1599 1529 +35020 1544 1599 +35020 1599 1523 +35020 1544 1523 +35020 1604 1531 +35020 1539 1547 +35020 1569 1520 +35020 1583 1510 +35040 1599 1529 +35040 1544 1599 +35040 1599 1523 +35040 1601 1629 +35040 1523 1529 +35040 1544 1523 +35040 1545 1430 +35040 1430 1453 +35040 1604 1531 +35040 1539 1547 +35040 1569 1520 +35040 1583 1510 +35060 1544 1599 +35060 1599 1523 +35060 1600 1529 +35060 1601 1629 +35060 1523 1529 +35060 1544 1523 +35060 1545 1453 +35060 1545 1430 +35060 1430 1453 +35060 1563 1618 +35060 1742 1520 +35060 1604 1531 +35060 1539 1547 +35060 1569 1520 +35060 1569 1742 +35060 1583 1510 +35080 1544 1529 +35080 1544 1523 +35080 1545 1453 +35080 1545 1430 +35080 1430 1453 +35080 1434 1448 +35080 1563 1618 +35080 1463 1599 +35080 1463 1628 +35080 1742 1520 +35080 1604 1531 +35080 1539 1547 +35080 1569 1520 +35080 1569 1742 +35080 1549 1523 +35080 1583 1510 +35100 1448 1600 +35100 1463 1628 +35100 1601 1629 +35100 1742 1520 +35100 1604 1531 +35100 1539 1547 +35100 1569 1520 +35100 1569 1742 +35100 1549 1523 +35100 1583 1510 +35120 1563 1618 +35120 1604 1531 +35120 1539 1547 +35120 1569 1520 +35120 1569 1742 +35120 1549 1523 +35120 1583 1510 +35140 1604 1531 +35140 1539 1547 +35140 1742 1520 +35140 1569 1520 +35140 1569 1742 +35140 1549 1523 +35140 1583 1510 +35160 1539 1547 +35160 1569 1448 +35160 1742 1520 +35160 1569 1520 +35160 1569 1742 +35160 1549 1523 +35160 1583 1510 +35180 1448 1487 +35180 1529 1531 +35180 1583 1531 +35180 1463 1628 +35180 1742 1520 +35180 1510 1531 +35180 1523 1531 +35180 1569 1520 +35180 1569 1742 +35180 1602 1631 +35180 1549 1523 +35180 1583 1510 +35200 1539 1448 +35200 1544 1531 +35200 1583 1531 +35200 1463 1628 +35200 1742 1520 +35200 1510 1531 +35200 1523 1531 +35200 1569 1520 +35200 1604 1518 +35200 1569 1742 +35200 1602 1631 +35200 1549 1523 +35200 1583 1510 +35220 1434 1602 +35220 1434 1631 +35220 1523 1531 +35220 1569 1520 +35220 1604 1518 +35220 1569 1742 +35220 1602 1631 +35220 1549 1523 +35220 1583 1510 +35240 1569 1520 +35240 1604 1616 +35240 1604 1518 +35240 1569 1742 +35240 1602 1631 +35240 1549 1523 +35240 1583 1510 +35260 1569 1742 +35260 1602 1631 +35260 1549 1523 +35260 1583 1510 +35280 1563 1618 +35280 1463 1628 +35280 1602 1631 +35280 1616 1518 +35280 1604 1616 +35280 1549 1523 +35280 1583 1510 +35300 1604 1616 +35300 1569 1742 +35300 1742 1520 +35300 1549 1523 +35300 1583 1510 +35320 1569 1520 +35320 1569 1742 +35320 1742 1520 +35320 1549 1523 +35320 1616 1518 +35320 1583 1510 +35340 1563 1618 +35340 1569 1520 +35340 1569 1626 +35340 1569 1742 +35340 1742 1520 +35340 1742 1626 +35340 1626 1520 +35340 1549 1523 +35340 1616 1518 +35340 1583 1510 +35360 1549 1523 +35360 1616 1518 +35360 1583 1510 +35380 1563 1618 +35380 1549 1523 +35380 1616 1518 +35380 1583 1510 +35400 1549 1523 +35400 1616 1518 +35400 1583 1510 +35420 1549 1523 +35420 1434 1629 +35420 1616 1518 +35420 1742 1520 +35420 1563 1618 +35420 1599 1512 +35420 1583 1510 +35440 1742 1520 +35440 1563 1618 +35440 1599 1512 +35440 1583 1510 +35460 1563 1618 +35460 1604 1616 +35460 1604 1527 +35460 1549 1523 +35460 1599 1512 +35460 1583 1510 +35480 1592 1618 +35480 1549 1523 +35480 1616 1518 +35480 1604 1518 +35480 1599 1512 +35480 1583 1510 +35500 1549 1523 +35500 1563 1618 +35500 1616 1518 +35500 1604 1518 +35500 1604 1616 +35500 1599 1512 +35500 1583 1510 +35520 1616 1518 +35520 1604 1518 +35520 1604 1616 +35520 1599 1512 +35520 1583 1510 +35540 1592 1618 +35540 1616 1518 +35540 1563 1618 +35540 1604 1518 +35540 1519 1529 +35540 1604 1616 +35540 1549 1523 +35540 1599 1512 +35540 1583 1510 +35560 1563 1618 +35560 1604 1518 +35560 1519 1529 +35560 1604 1616 +35560 1549 1523 +35560 1563 1592 +35560 1599 1512 +35560 1583 1510 +35580 1592 1618 +35580 1604 1616 +35580 1549 1523 +35580 1563 1592 +35580 1601 1629 +35580 1599 1512 +35580 1583 1510 +35600 1549 1523 +35600 1563 1592 +35600 1604 1518 +35600 1601 1629 +35600 1628 1527 +35600 1599 1512 +35600 1519 1529 +35600 1583 1510 +35620 1563 1618 +35620 1592 1520 +35620 1601 1629 +35620 1628 1527 +35620 1599 1512 +35620 1604 1616 +35620 1519 1529 +35620 1583 1510 +35640 1549 1523 +35640 1549 1525 +35640 1601 1629 +35640 1604 1518 +35640 1628 1527 +35640 1599 1512 +35640 1604 1616 +35640 1519 1529 +35640 1583 1510 +35660 1563 1618 +35660 1628 1527 +35660 1599 1512 +35660 1592 1626 +35660 1604 1616 +35660 1519 1529 +35660 1616 1518 +35660 1583 1510 +35680 1599 1512 +35680 1604 1518 +35680 1592 1520 +35680 1592 1626 +35680 1604 1616 +35680 1519 1529 +35680 1616 1518 +35680 1583 1510 +35700 1563 1618 +35700 1592 1520 +35700 1592 1626 +35700 1604 1616 +35700 1519 1529 +35700 1616 1518 +35700 1628 1527 +35700 1549 1523 +35700 1583 1510 +35720 1616 1518 +35720 1628 1527 +35720 1600 1626 +35720 1549 1523 +35720 1600 1520 +35720 1626 1520 +35720 1604 1518 +35720 1583 1510 +35740 1600 1626 +35740 1549 1523 +35740 1600 1520 +35740 1626 1520 +35740 1601 1629 +35740 1604 1518 +35740 1583 1510 +35760 1549 1523 +35760 1600 1520 +35760 1626 1520 +35760 1563 1618 +35760 1601 1629 +35760 1604 1616 +35760 1604 1518 +35760 1512 1525 +35760 1583 1510 +35780 1544 1529 +35780 1544 1525 +35780 1616 1518 +35780 1563 1618 +35780 1601 1629 +35780 1604 1616 +35780 1604 1518 +35780 1512 1525 +35780 1583 1510 +35800 1563 1618 +35800 1437 1599 +35800 1601 1629 +35800 1604 1616 +35800 1549 1523 +35800 1604 1518 +35800 1512 1525 +35800 1583 1510 +35820 1549 1523 +35820 1599 1527 +35820 1604 1518 +35820 1512 1525 +35820 1616 1518 +35820 1583 1510 +35840 1437 1527 +35840 1604 1518 +35840 1544 1529 +35840 1463 1628 +35840 1563 1618 +35840 1512 1525 +35840 1437 1599 +35840 1616 1518 +35840 1583 1510 +35860 1544 1529 +35860 1463 1628 +35860 1592 1527 +35860 1601 1629 +35860 1549 1523 +35860 1463 1518 +35860 1563 1618 +35860 1512 1525 +35860 1437 1599 +35860 1616 1518 +35860 1583 1510 +35880 1549 1523 +35880 1463 1518 +35880 1592 1525 +35880 1563 1618 +35880 1512 1525 +35880 1437 1599 +35880 1592 1600 +35880 1616 1518 +35880 1583 1510 +35900 1563 1618 +35900 1512 1525 +35900 1437 1599 +35900 1592 1600 +35900 1616 1518 +35900 1583 1510 +35920 1549 1523 +35920 1592 1525 +35920 1437 1599 +35920 1592 1600 +35920 1616 1518 +35920 1549 1525 +35920 1583 1510 +35940 1592 1523 +35940 1523 1525 +35940 1563 1618 +35940 1437 1599 +35940 1592 1600 +35940 1616 1518 +35940 1549 1525 +35940 1583 1510 +35960 1544 1592 +35960 1544 1604 +35960 1463 1518 +35960 1592 1525 +35960 1563 1618 +35960 1437 1599 +35960 1592 1600 +35960 1616 1518 +35960 1549 1525 +35960 1583 1510 +35980 1544 1525 +35980 1563 1618 +35980 1437 1599 +35980 1592 1600 +35980 1616 1518 +35980 1604 1523 +35980 1549 1525 +35980 1583 1510 +36000 1542 1599 +36000 1437 1599 +36000 1592 1600 +36000 1616 1518 +36000 1604 1523 +36000 1549 1525 +36000 1583 1510 +36020 1544 1525 +36020 1463 1628 +36020 1616 1518 +36020 1563 1592 +36020 1604 1523 +36020 1549 1525 +36020 1583 1510 +36040 1563 1592 +36040 1604 1523 +36040 1616 1527 +36040 1518 1527 +36040 1549 1525 +36040 1583 1510 +36060 1549 1525 +36060 1583 1510 +36080 1544 1549 +36080 1448 1629 +36080 1463 1628 +36080 1549 1525 +36080 1583 1510 +36100 1544 1604 +36100 1463 1628 +36100 1549 1525 +36100 1583 1510 +36120 1544 1529 +36120 1553 1523 +36120 1544 1604 +36120 1463 1628 +36120 1549 1525 +36120 1583 1510 +36140 1544 1529 +36140 1553 1523 +36140 1563 1618 +36140 1544 1604 +36140 1463 1628 +36140 1549 1525 +36140 1583 1510 +36160 1544 1604 +36160 1600 1529 +36160 1523 1525 +36160 1463 1628 +36160 1549 1525 +36160 1583 1510 +36180 1544 1525 +36180 1549 1523 +36180 1523 1525 +36180 1600 1519 +36180 1544 1523 +36180 1463 1628 +36180 1549 1525 +36180 1583 1510 +36200 1563 1592 +36200 1600 1519 +36200 1544 1523 +36200 1463 1628 +36200 1549 1525 +36200 1583 1510 +36220 1600 1529 +36220 1600 1519 +36220 1519 1529 +36220 1544 1523 +36220 1437 1604 +36220 1463 1628 +36220 1544 1525 +36220 1523 1525 +36220 1549 1525 +36220 1583 1510 +36240 1544 1523 +36240 1437 1604 +36240 1463 1628 +36240 1544 1525 +36240 1523 1525 +36240 1549 1525 +36240 1583 1510 +36260 1463 1628 +36260 1600 1519 +36260 1519 1529 +36260 1544 1525 +36260 1523 1525 +36260 1549 1525 +36260 1583 1510 +36280 1600 1519 +36280 1519 1529 +36280 1544 1523 +36280 1544 1525 +36280 1523 1525 +36280 1549 1525 +36280 1583 1510 +36300 1448 1487 +36300 1544 1523 +36300 1544 1525 +36300 1523 1525 +36300 1549 1525 +36300 1583 1510 +36320 1544 1523 +36320 1544 1525 +36320 1523 1525 +36320 1549 1525 +36320 1600 1519 +36320 1583 1510 +36340 1523 1525 +36340 1549 1525 +36340 1519 1529 +36340 1600 1519 +36340 1601 1629 +36340 1583 1510 +36360 1544 1525 +36360 1523 1525 +36360 1549 1525 +36360 1544 1523 +36360 1519 1529 +36360 1600 1519 +36360 1601 1629 +36360 1583 1510 +36380 1549 1525 +36380 1600 1529 +36380 1544 1523 +36380 1519 1529 +36380 1600 1519 +36380 1601 1629 +36380 1583 1510 +36400 1544 1600 +36400 1544 1523 +36400 1519 1529 +36400 1600 1519 +36400 1601 1629 +36400 1523 1525 +36400 1583 1510 +36420 1600 1519 +36420 1601 1629 +36420 1523 1525 +36420 1583 1510 +36440 1523 1525 +36440 1583 1510 +36460 1601 1629 +36460 1523 1525 +36460 1583 1510 +36480 1601 1629 +36480 1600 1519 +36480 1523 1525 +36480 1583 1510 +36500 1600 1529 +36500 1600 1519 +36500 1523 1525 +36500 1583 1510 +36520 1463 1628 +36520 1601 1629 +36520 1600 1529 +36520 1600 1519 +36520 1523 1525 +36520 1583 1510 +36540 1601 1629 +36540 1600 1529 +36540 1600 1519 +36540 1523 1525 +36540 1583 1510 +36560 1463 1628 +36560 1601 1629 +36560 1600 1529 +36560 1600 1519 +36560 1523 1525 +36560 1583 1510 +36580 1601 1629 +36580 1600 1529 +36580 1600 1519 +36580 1523 1525 +36580 1583 1510 +36600 1601 1629 +36600 1600 1529 +36600 1600 1519 +36600 1523 1525 +36600 1583 1510 +36620 1601 1629 +36620 1519 1529 +36620 1600 1529 +36620 1600 1519 +36620 1523 1525 +36620 1583 1510 +36640 1600 1529 +36640 1600 1519 +36640 1523 1525 +36640 1583 1510 +36660 1461 1627 +36660 1600 1519 +36660 1523 1525 +36660 1583 1510 +36680 1600 1519 +36680 1523 1525 +36680 1583 1510 +36700 1600 1519 +36700 1549 1523 +36700 1549 1525 +36700 1523 1525 +36700 1583 1510 +36720 1549 1523 +36720 1461 1627 +36720 1549 1525 +36720 1523 1525 +36720 1583 1510 +36740 1553 1519 +36740 1549 1525 +36740 1523 1525 +36740 1583 1510 +36760 1549 1523 +36760 1553 1519 +36760 1549 1525 +36760 1600 1519 +36760 1523 1525 +36760 1583 1510 +36780 1549 1525 +36780 1600 1519 +36780 1523 1525 +36780 1583 1510 +36800 1600 1519 +36800 1523 1525 +36800 1583 1510 +36820 1549 1599 +36820 1600 1519 +36820 1523 1525 +36820 1583 1510 +36840 1600 1519 +36840 1523 1525 +36840 1583 1510 +36860 1600 1523 +36860 1523 1525 +36860 1601 1629 +36860 1583 1510 +36880 1601 1629 +36880 1519 1523 +36880 1583 1510 +36900 1600 1519 +36900 1601 1629 +36900 1519 1523 +36900 1583 1510 +36920 1583 1510 +36940 1600 1529 +36940 1600 1519 +36940 1583 1510 +36960 1583 1510 +36980 1600 1529 +36980 1583 1510 +37000 1600 1529 +37000 1600 1519 +37000 1583 1510 +37020 1583 1510 +37040 1600 1529 +37040 1583 1510 +37060 1629 1599 +37060 1600 1529 +37060 1583 1510 +37080 1600 1519 +37080 1600 1529 +37080 1463 1628 +37080 1583 1510 +37100 1600 1519 +37100 1600 1529 +37100 1463 1628 +37100 1583 1510 +37120 1600 1519 +37120 1600 1529 +37120 1463 1628 +37120 1583 1510 +37140 1549 1525 +37140 1600 1529 +37140 1463 1628 +37140 1583 1510 +37160 1600 1529 +37160 1463 1628 +37160 1583 1510 +37180 1549 1525 +37180 1463 1628 +37180 1592 1563 +37180 1600 1519 +37180 1583 1510 +37200 1600 1519 +37200 1583 1510 +37220 1600 1523 +37220 1583 1510 +37240 1578 1519 +37240 1549 1525 +37240 1519 1523 +37240 1618 1592 +37240 1583 1510 +37260 1463 1628 +37260 1600 1519 +37260 1583 1510 +37280 1618 1592 +37280 1463 1628 +37280 1600 1519 +37280 1583 1510 +37300 1600 1519 +37300 1583 1510 +37320 1600 1519 +37320 1583 1510 +37340 1600 1523 +37340 1510 1549 +37340 1463 1628 +37340 1600 1519 +37340 1583 1510 +37360 1549 1525 +37360 1463 1628 +37360 1600 1519 +37360 1583 1510 +37380 1600 1523 +37380 1600 1519 +37380 1510 1549 +37380 1583 1510 +37400 1510 1549 +37400 1549 1525 +37400 1583 1510 +37420 1544 1523 +37420 1549 1525 +37420 1583 1510 +37440 1600 1523 +37440 1583 1510 +37460 1549 1525 +37460 1592 1563 +37460 1600 1523 +37460 1583 1510 +37480 1463 1628 +37480 1600 1523 +37480 1600 1519 +37480 1583 1510 +37500 1544 1519 +37500 1592 1563 +37500 1600 1544 +37500 1600 1523 +37500 1600 1519 +37500 1583 1510 +37520 1592 1563 +37520 1600 1544 +37520 1600 1523 +37520 1600 1519 +37520 1583 1510 +37540 1549 1525 +37540 1600 1544 +37540 1544 1523 +37540 1600 1523 +37540 1600 1519 +37540 1583 1510 +37560 1600 1544 +37560 1544 1523 +37560 1600 1523 +37560 1600 1519 +37560 1583 1510 +37580 1600 1544 +37580 1544 1523 +37580 1600 1523 +37580 1600 1519 +37580 1549 1525 +37580 1583 1510 +37600 1544 1523 +37600 1600 1523 +37600 1600 1519 +37600 1549 1525 +37600 1583 1510 +37620 1600 1523 +37620 1600 1544 +37620 1600 1519 +37620 1549 1525 +37620 1583 1510 +37640 1600 1544 +37640 1600 1519 +37640 1544 1519 +37640 1549 1525 +37640 1583 1510 +37660 1600 1544 +37660 1600 1519 +37660 1544 1519 +37660 1549 1525 +37660 1583 1510 +37680 1523 1519 +37680 1583 1510 +37700 1600 1544 +37700 1519 1594 +37700 1583 1510 +37720 1544 1519 +37720 1583 1510 +37740 1544 1519 +37740 1521 1593 +37740 1549 1525 +37740 1583 1510 +37760 1549 1525 +37760 1583 1510 +37780 1549 1525 +37780 1583 1510 +37800 1549 1525 +37800 1583 1510 +37820 1549 1525 +37820 1583 1510 +37840 1519 1594 +37840 1463 1628 +37840 1549 1525 +37840 1583 1510 +37860 1600 1544 +37860 1549 1525 +37860 1583 1510 +37880 1549 1525 +37880 1583 1510 +37900 1549 1525 +37900 1583 1510 +37920 1600 1544 +37920 1549 1525 +37920 1583 1510 +37940 1549 1525 +37940 1583 1510 +37960 1523 1553 +37960 1521 1593 +37960 1544 1600 +37960 1549 1525 +37960 1583 1510 +37980 1600 1523 +37980 1521 1593 +37980 1463 1628 +37980 1544 1600 +37980 1549 1525 +37980 1583 1510 +38000 1523 1544 +38000 1544 1600 +38000 1549 1525 +38000 1583 1510 +38020 1600 1523 +38020 1544 1600 +38020 1549 1525 +38020 1583 1510 +38040 1523 1544 +38040 1544 1600 +38040 1549 1525 +38040 1594 1519 +38040 1583 1510 +38060 1544 1600 +38060 1549 1525 +38060 1600 1523 +38060 1593 1521 +38060 1594 1519 +38060 1583 1510 +38080 1593 1521 +38080 1523 1544 +38080 1594 1519 +38080 1583 1510 +38100 1523 1544 +38100 1549 1525 +38100 1594 1519 +38100 1523 1463 +38100 1583 1510 +38120 1521 1593 +38120 1594 1519 +38120 1523 1463 +38120 1463 1628 +38120 1583 1510 +38140 1793 1523 +38140 1521 1593 +38140 1594 1519 +38140 1793 1463 +38140 1523 1463 +38140 1463 1628 +38140 1583 1510 +38160 1793 1463 +38160 1523 1628 +38160 1523 1463 +38160 1463 1628 +38160 1583 1510 +38180 1519 1594 +38180 1463 1628 +38180 1583 1510 +38200 1549 1523 +38200 1583 1510 +38220 1463 1628 +38220 1583 1510 +38240 1544 1523 +38240 1544 1519 +38240 1519 1553 +38240 1463 1628 +38240 1583 1510 +38260 1544 1583 +38260 1519 1600 +38260 1463 1628 +38260 1583 1510 +38280 1523 1544 +38280 1583 1510 +38300 1463 1628 +38300 1600 1519 +38300 1583 1510 +38320 1600 1519 +38320 1583 1510 +38340 1600 1519 +38340 1463 1628 +38340 1583 1510 +38360 1600 1519 +38360 1463 1628 +38360 1583 1510 +38380 1523 1549 +38380 1583 1510 +38400 1523 1549 +38400 1583 1510 +38420 1583 1510 +38440 1600 1519 +38440 1523 1549 +38440 1583 1510 +38460 1523 1549 +38460 1583 1510 +38480 1523 1549 +38480 1600 1519 +38480 1583 1510 +38500 1523 1549 +38500 1593 1521 +38500 1463 1628 +38500 1600 1519 +38500 1583 1510 +38520 1553 1600 +38520 1463 1628 +38520 1600 1519 +38520 1583 1510 +38540 1549 1523 +38540 1600 1519 +38540 1583 1510 +38560 1463 1628 +38560 1583 1510 +38580 1463 1628 +38580 1583 1510 +38600 1523 1549 +38600 1600 1519 +38600 1583 1510 +38620 1598 1655 +38620 1600 1529 +38620 1600 1519 +38620 1436 1724 +38620 1436 1598 +38620 1724 1469 +38620 1724 1489 +38620 1598 1489 +38620 1724 1598 +38620 1853 1436 +38620 1853 1915 +38620 1915 1436 +38620 1583 1510 +38640 1853 1469 +38640 1600 1519 +38640 1436 1724 +38640 1436 1598 +38640 1724 1469 +38640 1598 1469 +38640 1489 1469 +38640 1463 1628 +38640 1724 1489 +38640 1598 1489 +38640 1724 1598 +38640 1853 1436 +38640 1853 1915 +38640 1915 1436 +38640 1583 1510 +38660 1436 1600 +38660 1724 1600 +38660 1600 1519 +38660 1436 1724 +38660 1436 1598 +38660 1724 1469 +38660 1598 1469 +38660 1489 1469 +38660 1463 1628 +38660 1724 1489 +38660 1598 1489 +38660 1724 1598 +38660 1853 1436 +38660 1853 1915 +38660 1915 1436 +38660 1583 1510 +38680 1436 1463 +38680 1463 1724 +38680 1436 1724 +38680 1436 1598 +38680 1724 1469 +38680 1598 1469 +38680 1489 1469 +38680 1463 1628 +38680 1724 1489 +38680 1598 1489 +38680 1724 1598 +38680 1853 1436 +38680 1853 1915 +38680 1915 1436 +38680 1583 1510 +38700 1549 1523 +38700 1628 1655 +38700 1436 1724 +38700 1436 1598 +38700 1598 1628 +38700 1724 1628 +38700 1724 1469 +38700 1598 1469 +38700 1489 1469 +38700 1436 1628 +38700 1463 1628 +38700 1724 1489 +38700 1598 1489 +38700 1724 1598 +38700 1853 1436 +38700 1853 1915 +38700 1915 1436 +38700 1583 1510 +38720 1436 1469 +38720 1436 1724 +38720 1436 1463 +38720 1436 1598 +38720 1598 1628 +38720 1724 1628 +38720 1724 1469 +38720 1598 1469 +38720 1489 1469 +38720 1436 1628 +38720 1463 1628 +38720 1724 1489 +38720 1598 1489 +38720 1724 1598 +38720 1853 1436 +38720 1853 1915 +38720 1915 1436 +38720 1583 1510 +38740 1436 1724 +38740 1436 1463 +38740 1436 1598 +38740 1451 1459 +38740 1469 1853 +38740 1598 1655 +38740 1598 1628 +38740 1489 1655 +38740 1463 1724 +38740 1724 1628 +38740 1724 1469 +38740 1598 1469 +38740 1489 1469 +38740 1436 1628 +38740 1463 1628 +38740 1724 1489 +38740 1598 1489 +38740 1724 1598 +38740 1853 1436 +38740 1853 1915 +38740 1915 1436 +38740 1583 1510 +38760 1436 1489 +38760 1463 1724 +38760 1463 1655 +38760 1724 1655 +38760 1724 1628 +38760 1724 1469 +38760 1598 1469 +38760 1489 1469 +38760 1463 1489 +38760 1436 1628 +38760 1463 1628 +38760 1724 1489 +38760 1436 1469 +38760 1598 1489 +38760 1724 1598 +38760 1853 1436 +38760 1853 1915 +38760 1915 1436 +38760 1583 1510 +38780 1544 1523 +38780 1463 1489 +38780 1853 1628 +38780 1436 1628 +38780 1436 1463 +38780 1463 1628 +38780 1724 1489 +38780 1436 1469 +38780 1598 1489 +38780 1724 1598 +38780 1853 1436 +38780 1853 1915 +38780 1915 1436 +38780 1583 1510 +38800 1436 1628 +38800 1436 1463 +38800 1441 1592 +38800 1463 1628 +38800 1523 1655 +38800 1544 1489 +38800 1544 1724 +38800 1724 1489 +38800 1436 1469 +38800 1519 1525 +38800 1853 1469 +38800 1598 1489 +38800 1724 1598 +38800 1853 1436 +38800 1853 1915 +38800 1915 1436 +38800 1583 1510 +38820 1544 1489 +38820 1544 1724 +38820 1544 1628 +38820 1544 1598 +38820 1724 1489 +38820 1724 1628 +38820 1598 1628 +38820 1489 1628 +38820 1436 1469 +38820 1519 1525 +38820 1853 1469 +38820 1598 1489 +38820 1724 1598 +38820 1853 1436 +38820 1853 1915 +38820 1915 1436 +38820 1583 1510 +38840 1469 1655 +38840 1436 1469 +38840 1519 1525 +38840 1853 1469 +38840 1598 1489 +38840 1724 1598 +38840 1853 1436 +38840 1853 1915 +38840 1915 1436 +38840 1583 1510 +38860 1600 1529 +38860 1469 1915 +38860 1469 1655 +38860 1436 1469 +38860 1519 1525 +38860 1853 1469 +38860 1598 1489 +38860 1724 1598 +38860 1853 1436 +38860 1853 1915 +38860 1915 1436 +38860 1583 1510 +38880 1553 1600 +38880 1853 1789 +38880 1853 1523 +38880 1853 1655 +38880 1469 1655 +38880 1519 1789 +38880 1655 1915 +38880 1655 1789 +38880 1436 1469 +38880 1519 1525 +38880 1853 1469 +38880 1598 1489 +38880 1724 1598 +38880 1789 1469 +38880 1853 1436 +38880 1853 1915 +38880 1789 1915 +38880 1915 1436 +38880 1583 1510 +38900 1544 1553 +38900 1549 1510 +38900 1436 1469 +38900 1523 1789 +38900 1544 1549 +38900 1519 1525 +38900 1853 1469 +38900 1598 1489 +38900 1724 1598 +38900 1789 1469 +38900 1915 1469 +38900 1853 1436 +38900 1853 1915 +38900 1789 1915 +38900 1789 1436 +38900 1915 1436 +38900 1583 1510 +38920 1544 1549 +38920 1469 1523 +38920 1920 1600 +38920 1724 1628 +38920 1598 1628 +38920 1489 1628 +38920 1529 1915 +38920 1853 1529 +38920 1563 1592 +38920 1519 1525 +38920 1853 1469 +38920 1598 1489 +38920 1724 1598 +38920 1789 1469 +38920 1915 1469 +38920 1853 1436 +38920 1853 1915 +38920 1789 1915 +38920 1789 1436 +38920 1915 1436 +38920 1583 1510 +38940 1920 1600 +38940 1463 1628 +38940 1469 1519 +38940 1436 1529 +38940 1724 1628 +38940 1598 1628 +38940 1489 1628 +38940 1529 1915 +38940 1549 1510 +38940 1724 1489 +38940 1853 1529 +38940 1563 1592 +38940 1436 1469 +38940 1519 1525 +38940 1853 1469 +38940 1598 1489 +38940 1724 1598 +38940 1789 1469 +38940 1915 1469 +38940 1853 1436 +38940 1853 1915 +38940 1789 1915 +38940 1789 1436 +38940 1915 1436 +38940 1583 1510 +38960 1544 1436 +38960 1436 1529 +38960 1463 1598 +38960 1724 1628 +38960 1598 1628 +38960 1489 1628 +38960 1529 1915 +38960 1544 1915 +38960 1544 1469 +38960 1549 1510 +38960 1724 1489 +38960 1853 1529 +38960 1563 1592 +38960 1436 1469 +38960 1519 1525 +38960 1853 1469 +38960 1598 1489 +38960 1724 1598 +38960 1789 1469 +38960 1915 1469 +38960 1853 1436 +38960 1853 1915 +38960 1789 1915 +38960 1789 1436 +38960 1915 1436 +38960 1583 1510 +38980 1544 1915 +38980 1544 1469 +38980 1544 1789 +38980 1549 1510 +38980 1549 1583 +38980 1724 1489 +38980 1853 1529 +38980 1463 1489 +38980 1563 1592 +38980 1436 1469 +38980 1519 1525 +38980 1853 1469 +38980 1598 1489 +38980 1724 1598 +38980 1789 1469 +38980 1915 1469 +38980 1853 1436 +38980 1853 1915 +38980 1789 1915 +38980 1789 1436 +38980 1915 1436 +38980 1583 1510 +39000 1920 1600 +39000 1463 1489 +39000 1529 1915 +39000 1563 1592 +39000 1436 1469 +39000 1525 1529 +39000 1519 1525 +39000 1853 1469 +39000 1598 1489 +39000 1724 1598 +39000 1789 1469 +39000 1915 1469 +39000 1853 1436 +39000 1853 1915 +39000 1789 1915 +39000 1789 1436 +39000 1915 1436 +39000 1583 1510 +39020 1563 1592 +39020 1436 1525 +39020 1525 1915 +39020 1519 1529 +39020 1436 1469 +39020 1525 1529 +39020 1519 1525 +39020 1549 1510 +39020 1853 1469 +39020 1598 1489 +39020 1724 1598 +39020 1789 1469 +39020 1915 1469 +39020 1853 1436 +39020 1853 1915 +39020 1789 1915 +39020 1789 1436 +39020 1915 1436 +39020 1583 1510 +39040 1519 1529 +39040 1436 1469 +39040 1525 1529 +39040 1724 1489 +39040 1519 1525 +39040 1549 1510 +39040 1853 1469 +39040 1593 1521 +39040 1598 1489 +39040 1724 1598 +39040 1789 1469 +39040 1915 1469 +39040 1853 1436 +39040 1853 1915 +39040 1789 1915 +39040 1789 1436 +39040 1915 1436 +39040 1583 1510 +39060 1724 1489 +39060 1519 1525 +39060 1563 1592 +39060 1549 1510 +39060 1853 1469 +39060 1593 1521 +39060 1598 1489 +39060 1724 1598 +39060 1789 1469 +39060 1915 1469 +39060 1853 1436 +39060 1853 1915 +39060 1789 1915 +39060 1789 1436 +39060 1915 1436 +39060 1583 1510 +39080 1563 1592 +39080 1549 1510 +39080 1853 1469 +39080 1593 1521 +39080 1598 1489 +39080 1724 1598 +39080 1789 1469 +39080 1436 1469 +39080 1915 1469 +39080 1853 1436 +39080 1853 1915 +39080 1789 1915 +39080 1789 1436 +39080 1915 1436 +39080 1583 1510 +39100 1549 1510 +39100 1519 1525 +39100 1724 1489 +39100 1853 1469 +39100 1593 1521 +39100 1598 1489 +39100 1724 1598 +39100 1789 1469 +39100 1436 1469 +39100 1915 1469 +39100 1853 1436 +39100 1853 1915 +39100 1789 1915 +39100 1789 1436 +39100 1915 1436 +39100 1583 1510 +39120 1563 1592 +39120 1724 1489 +39120 1853 1469 +39120 1593 1521 +39120 1598 1489 +39120 1724 1598 +39120 1789 1469 +39120 1436 1469 +39120 1915 1469 +39120 1853 1436 +39120 1853 1915 +39120 1789 1915 +39120 1789 1436 +39120 1915 1436 +39120 1583 1510 +39140 1519 1525 +39140 1853 1469 +39140 1593 1521 +39140 1598 1489 +39140 1724 1598 +39140 1789 1469 +39140 1436 1469 +39140 1915 1469 +39140 1853 1436 +39140 1853 1915 +39140 1789 1915 +39140 1789 1436 +39140 1915 1436 +39140 1583 1510 +39160 1519 1525 +39160 1853 1469 +39160 1593 1521 +39160 1598 1489 +39160 1724 1598 +39160 1789 1469 +39160 1436 1469 +39160 1915 1469 +39160 1853 1436 +39160 1853 1915 +39160 1789 1915 +39160 1789 1436 +39160 1915 1436 +39160 1583 1510 +39180 1519 1525 +39180 1724 1489 +39180 1853 1469 +39180 1593 1521 +39180 1598 1489 +39180 1724 1598 +39180 1789 1469 +39180 1436 1469 +39180 1915 1469 +39180 1853 1436 +39180 1853 1915 +39180 1789 1915 +39180 1789 1436 +39180 1915 1436 +39180 1583 1510 +39200 1519 1525 +39200 1724 1489 +39200 1853 1469 +39200 1593 1521 +39200 1598 1489 +39200 1724 1598 +39200 1789 1469 +39200 1436 1469 +39200 1915 1469 +39200 1853 1436 +39200 1853 1915 +39200 1789 1915 +39200 1789 1436 +39200 1915 1436 +39200 1583 1510 +39220 1519 1525 +39220 1724 1489 +39220 1853 1469 +39220 1593 1521 +39220 1598 1489 +39220 1724 1598 +39220 1789 1469 +39220 1436 1469 +39220 1915 1469 +39220 1853 1436 +39220 1853 1915 +39220 1789 1915 +39220 1789 1436 +39220 1915 1436 +39220 1583 1510 +39240 1519 1525 +39240 1463 1724 +39240 1463 1598 +39240 1724 1489 +39240 1853 1469 +39240 1463 1489 +39240 1593 1521 +39240 1598 1489 +39240 1724 1598 +39240 1789 1469 +39240 1436 1469 +39240 1915 1469 +39240 1853 1436 +39240 1853 1915 +39240 1789 1915 +39240 1789 1436 +39240 1915 1436 +39240 1583 1510 +39260 1549 1510 +39260 1853 1469 +39260 1599 1655 +39260 1463 1489 +39260 1593 1521 +39260 1598 1489 +39260 1724 1598 +39260 1789 1469 +39260 1436 1469 +39260 1915 1469 +39260 1853 1436 +39260 1853 1915 +39260 1789 1915 +39260 1789 1436 +39260 1915 1436 +39260 1583 1510 +39280 1519 1525 +39280 1463 1489 +39280 1593 1521 +39280 1598 1489 +39280 1724 1598 +39280 1789 1469 +39280 1436 1469 +39280 1915 1469 +39280 1853 1436 +39280 1853 1915 +39280 1789 1915 +39280 1789 1436 +39280 1915 1436 +39280 1583 1510 +39300 1538 1874 +39300 1574 1532 +39300 1599 1655 +39300 1617 1779 +39300 1874 1522 +39300 1774 1779 +39300 1463 1489 +39300 1825 1903 +39300 1825 1779 +39300 1825 1874 +39300 1825 1791 +39300 1903 1779 +39300 1469 1853 +39300 1593 1521 +39300 1598 1489 +39300 1724 1598 +39300 1574 1778 +39300 1903 1874 +39300 1778 1532 +39300 1789 1469 +39300 1436 1469 +39300 1779 1874 +39300 1791 1874 +39300 1791 1903 +39300 1903 1522 +39300 1915 1469 +39300 1825 1522 +39300 1853 1436 +39300 1779 1791 +39300 1791 1522 +39300 1779 1522 +39300 1853 1915 +39300 1789 1915 +39300 1789 1436 +39300 1915 1436 +39300 1583 1510 +39320 1463 1489 +39320 1857 1617 +39320 1825 1903 +39320 1825 1779 +39320 1825 1874 +39320 1825 1791 +39320 1853 1529 +39320 1903 1779 +39320 1469 1853 +39320 1593 1521 +39320 1519 1525 +39320 1598 1489 +39320 1724 1598 +39320 1574 1778 +39320 1903 1874 +39320 1778 1532 +39320 1789 1469 +39320 1436 1469 +39320 1779 1874 +39320 1791 1874 +39320 1791 1903 +39320 1903 1522 +39320 1915 1469 +39320 1825 1522 +39320 1853 1436 +39320 1779 1791 +39320 1791 1522 +39320 1779 1522 +39320 1853 1915 +39320 1789 1915 +39320 1789 1436 +39320 1915 1436 +39320 1583 1510 +39340 1549 1525 +39340 1678 1599 +39340 1774 1791 +39340 1437 1441 +39340 1774 1779 +39340 1903 1779 +39340 1469 1853 +39340 1593 1521 +39340 1519 1525 +39340 1598 1489 +39340 1724 1598 +39340 1574 1778 +39340 1903 1874 +39340 1778 1532 +39340 1789 1469 +39340 1436 1469 +39340 1779 1874 +39340 1791 1874 +39340 1791 1903 +39340 1903 1522 +39340 1915 1469 +39340 1825 1522 +39340 1853 1436 +39340 1779 1791 +39340 1791 1522 +39340 1779 1522 +39340 1853 1915 +39340 1789 1915 +39340 1789 1436 +39340 1915 1436 +39340 1583 1510 +39360 1853 1529 +39360 1437 1441 +39360 1774 1779 +39360 1903 1779 +39360 1469 1853 +39360 1593 1521 +39360 1519 1525 +39360 1825 1791 +39360 1598 1489 +39360 1724 1598 +39360 1574 1778 +39360 1903 1874 +39360 1778 1532 +39360 1789 1469 +39360 1436 1469 +39360 1779 1874 +39360 1791 1874 +39360 1791 1903 +39360 1903 1522 +39360 1915 1469 +39360 1825 1522 +39360 1779 1825 +39360 1853 1436 +39360 1779 1791 +39360 1791 1522 +39360 1779 1522 +39360 1853 1915 +39360 1789 1915 +39360 1789 1436 +39360 1915 1436 +39360 1583 1510 +39380 1678 1655 +39380 1437 1441 +39380 1449 1531 +39380 1774 1779 +39380 1903 1779 +39380 1678 1599 +39380 1574 1532 +39380 1469 1853 +39380 1593 1521 +39380 1519 1525 +39380 1825 1791 +39380 1598 1489 +39380 1724 1598 +39380 1574 1778 +39380 1903 1874 +39380 1778 1532 +39380 1825 1903 +39380 1789 1469 +39380 1436 1469 +39380 1779 1874 +39380 1791 1874 +39380 1791 1903 +39380 1903 1522 +39380 1915 1469 +39380 1825 1522 +39380 1779 1825 +39380 1853 1436 +39380 1779 1791 +39380 1791 1522 +39380 1779 1522 +39380 1853 1915 +39380 1789 1915 +39380 1789 1436 +39380 1915 1436 +39380 1583 1510 +39400 1678 1599 +39400 1574 1532 +39400 1469 1529 +39400 1469 1853 +39400 1853 1529 +39400 1436 1529 +39400 1593 1521 +39400 1825 1874 +39400 1519 1525 +39400 1825 1791 +39400 1598 1489 +39400 1724 1598 +39400 1574 1778 +39400 1903 1874 +39400 1778 1532 +39400 1825 1903 +39400 1789 1469 +39400 1436 1469 +39400 1779 1874 +39400 1791 1874 +39400 1789 1853 +39400 1791 1903 +39400 1903 1522 +39400 1915 1469 +39400 1825 1522 +39400 1779 1825 +39400 1853 1436 +39400 1779 1791 +39400 1791 1522 +39400 1779 1522 +39400 1853 1915 +39400 1789 1915 +39400 1789 1436 +39400 1915 1436 +39400 1583 1510 +39420 1544 1600 +39420 1544 1519 +39420 1469 1529 +39420 1469 1853 +39420 1853 1529 +39420 1529 1915 +39420 1436 1529 +39420 1593 1521 +39420 1600 1525 +39420 1774 1779 +39420 1825 1874 +39420 1463 1598 +39420 1600 1519 +39420 1519 1525 +39420 1825 1791 +39420 1598 1489 +39420 1724 1489 +39420 1724 1598 +39420 1574 1778 +39420 1903 1874 +39420 1778 1532 +39420 1825 1903 +39420 1789 1469 +39420 1436 1469 +39420 1779 1874 +39420 1791 1874 +39420 1789 1853 +39420 1791 1903 +39420 1903 1522 +39420 1915 1469 +39420 1825 1522 +39420 1779 1825 +39420 1853 1436 +39420 1779 1791 +39420 1791 1522 +39420 1779 1522 +39420 1779 1903 +39420 1853 1915 +39420 1789 1915 +39420 1789 1436 +39420 1915 1436 +39420 1583 1510 +39440 1538 1874 +39440 1544 1529 +39440 1544 1789 +39440 1544 1469 +39440 1549 1519 +39440 1436 1529 +39440 1574 1532 +39440 1593 1521 +39440 1600 1525 +39440 1774 1779 +39440 1553 1600 +39440 1825 1874 +39440 1463 1489 +39440 1463 1724 +39440 1463 1598 +39440 1600 1519 +39440 1519 1525 +39440 1549 1525 +39440 1825 1791 +39440 1598 1489 +39440 1724 1489 +39440 1724 1598 +39440 1574 1778 +39440 1903 1874 +39440 1778 1532 +39440 1825 1903 +39440 1789 1469 +39440 1436 1469 +39440 1779 1874 +39440 1791 1874 +39440 1789 1853 +39440 1791 1903 +39440 1903 1522 +39440 1915 1469 +39440 1825 1522 +39440 1779 1825 +39440 1853 1436 +39440 1779 1791 +39440 1791 1522 +39440 1779 1522 +39440 1779 1903 +39440 1853 1915 +39440 1789 1915 +39440 1789 1436 +39440 1915 1436 +39440 1583 1510 +39460 1553 1600 +39460 1825 1874 +39460 1463 1489 +39460 1463 1724 +39460 1463 1598 +39460 1600 1519 +39460 1857 1617 +39460 1519 1525 +39460 1544 1600 +39460 1874 1522 +39460 1549 1525 +39460 1825 1791 +39460 1598 1489 +39460 1724 1489 +39460 1724 1598 +39460 1853 1469 +39460 1574 1778 +39460 1903 1874 +39460 1778 1532 +39460 1825 1903 +39460 1789 1469 +39460 1436 1469 +39460 1779 1874 +39460 1791 1874 +39460 1789 1853 +39460 1791 1903 +39460 1903 1522 +39460 1915 1469 +39460 1825 1522 +39460 1779 1825 +39460 1853 1436 +39460 1779 1791 +39460 1791 1522 +39460 1779 1522 +39460 1779 1903 +39460 1853 1915 +39460 1789 1915 +39460 1789 1436 +39460 1915 1436 +39460 1583 1510 +39480 1544 1600 +39480 1544 1525 +39480 1853 1600 +39480 1600 1469 +39480 1874 1522 +39480 1549 1525 +39480 1825 1791 +39480 1598 1489 +39480 1724 1489 +39480 1724 1598 +39480 1716 1599 +39480 1574 1532 +39480 1853 1469 +39480 1574 1778 +39480 1903 1874 +39480 1778 1532 +39480 1825 1903 +39480 1789 1469 +39480 1436 1469 +39480 1779 1874 +39480 1791 1874 +39480 1789 1853 +39480 1791 1903 +39480 1903 1522 +39480 1915 1469 +39480 1825 1522 +39480 1779 1825 +39480 1853 1436 +39480 1779 1791 +39480 1791 1522 +39480 1779 1522 +39480 1779 1903 +39480 1853 1915 +39480 1789 1915 +39480 1789 1436 +39480 1915 1436 +39480 1583 1510 +39500 1544 1469 +39500 1463 1489 +39500 1463 1724 +39500 1463 1598 +39500 1857 1617 +39500 1874 1522 +39500 1549 1525 +39500 1825 1791 +39500 1598 1489 +39500 1724 1489 +39500 1724 1598 +39500 1716 1599 +39500 1574 1532 +39500 1853 1469 +39500 1574 1778 +39500 1903 1874 +39500 1778 1532 +39500 1825 1903 +39500 1789 1469 +39500 1436 1469 +39500 1779 1874 +39500 1791 1874 +39500 1789 1853 +39500 1791 1903 +39500 1903 1522 +39500 1915 1469 +39500 1825 1522 +39500 1779 1825 +39500 1853 1436 +39500 1779 1791 +39500 1791 1522 +39500 1779 1522 +39500 1779 1903 +39500 1853 1915 +39500 1789 1915 +39500 1789 1436 +39500 1915 1436 +39500 1583 1510 +39520 1544 1525 +39520 1544 1519 +39520 1549 1525 +39520 1519 1525 +39520 1825 1874 +39520 1825 1791 +39520 1598 1489 +39520 1724 1489 +39520 1724 1598 +39520 1808 1599 +39520 1716 1599 +39520 1574 1532 +39520 1853 1469 +39520 1574 1778 +39520 1903 1874 +39520 1778 1532 +39520 1825 1903 +39520 1789 1469 +39520 1436 1469 +39520 1779 1874 +39520 1791 1874 +39520 1789 1853 +39520 1791 1903 +39520 1903 1522 +39520 1915 1469 +39520 1825 1522 +39520 1779 1825 +39520 1853 1436 +39520 1779 1791 +39520 1791 1522 +39520 1779 1522 +39520 1779 1903 +39520 1853 1915 +39520 1789 1915 +39520 1789 1436 +39520 1915 1436 +39520 1583 1510 +39540 1519 1600 +39540 1825 1874 +39540 1857 1617 +39540 1874 1522 +39540 1825 1791 +39540 1598 1489 +39540 1724 1489 +39540 1724 1598 +39540 1808 1599 +39540 1716 1599 +39540 1574 1532 +39540 1853 1469 +39540 1574 1778 +39540 1903 1874 +39540 1778 1532 +39540 1825 1903 +39540 1789 1469 +39540 1436 1469 +39540 1779 1874 +39540 1791 1874 +39540 1789 1853 +39540 1791 1903 +39540 1903 1522 +39540 1915 1469 +39540 1825 1522 +39540 1779 1825 +39540 1853 1436 +39540 1779 1791 +39540 1791 1522 +39540 1779 1522 +39540 1779 1903 +39540 1853 1915 +39540 1789 1915 +39540 1789 1436 +39540 1915 1436 +39540 1583 1510 +39560 1544 1915 +39560 1549 1519 +39560 1600 1529 +39560 1874 1522 +39560 1825 1791 +39560 1598 1489 +39560 1463 1724 +39560 1724 1489 +39560 1724 1598 +39560 1808 1599 +39560 1716 1599 +39560 1574 1532 +39560 1853 1469 +39560 1574 1778 +39560 1903 1874 +39560 1778 1532 +39560 1825 1903 +39560 1789 1469 +39560 1436 1469 +39560 1779 1874 +39560 1791 1874 +39560 1789 1853 +39560 1791 1903 +39560 1903 1522 +39560 1915 1469 +39560 1825 1522 +39560 1779 1825 +39560 1853 1436 +39560 1779 1791 +39560 1791 1522 +39560 1779 1522 +39560 1779 1903 +39560 1853 1915 +39560 1789 1915 +39560 1789 1436 +39560 1915 1436 +39560 1583 1510 +39580 1825 1874 +39580 1774 1779 +39580 1519 1600 +39580 1716 1655 +39580 1463 1489 +39580 1463 1598 +39580 1825 1791 +39580 1598 1489 +39580 1463 1724 +39580 1724 1489 +39580 1724 1598 +39580 1808 1599 +39580 1716 1599 +39580 1574 1532 +39580 1853 1469 +39580 1574 1778 +39580 1903 1874 +39580 1778 1532 +39580 1825 1903 +39580 1789 1469 +39580 1436 1469 +39580 1779 1874 +39580 1791 1874 +39580 1789 1853 +39580 1791 1903 +39580 1903 1522 +39580 1915 1469 +39580 1825 1522 +39580 1779 1825 +39580 1853 1436 +39580 1779 1791 +39580 1791 1522 +39580 1779 1522 +39580 1779 1903 +39580 1853 1915 +39580 1789 1915 +39580 1789 1436 +39580 1915 1436 +39580 1583 1510 +39600 1544 1915 +39600 1549 1600 +39600 1593 1521 +39600 1525 1915 +39600 1519 1600 +39600 1716 1655 +39600 1463 1489 +39600 1463 1598 +39600 1825 1791 +39600 1598 1489 +39600 1463 1724 +39600 1724 1489 +39600 1724 1598 +39600 1544 1853 +39600 1808 1599 +39600 1716 1599 +39600 1574 1532 +39600 1853 1469 +39600 1574 1778 +39600 1903 1874 +39600 1778 1532 +39600 1825 1903 +39600 1789 1469 +39600 1436 1469 +39600 1779 1874 +39600 1791 1874 +39600 1789 1853 +39600 1791 1903 +39600 1903 1522 +39600 1915 1469 +39600 1825 1522 +39600 1779 1825 +39600 1853 1436 +39600 1779 1791 +39600 1791 1522 +39600 1779 1522 +39600 1779 1903 +39600 1853 1915 +39600 1789 1915 +39600 1789 1436 +39600 1915 1436 +39600 1583 1510 +39620 1519 1600 +39620 1716 1655 +39620 1463 1489 +39620 1463 1598 +39620 1600 1529 +39620 1874 1522 +39620 1544 1789 +39620 1825 1791 +39620 1598 1489 +39620 1463 1724 +39620 1724 1489 +39620 1724 1598 +39620 1544 1853 +39620 1808 1599 +39620 1716 1599 +39620 1523 1525 +39620 1574 1532 +39620 1853 1469 +39620 1574 1778 +39620 1903 1874 +39620 1778 1532 +39620 1825 1903 +39620 1789 1469 +39620 1436 1469 +39620 1779 1874 +39620 1791 1874 +39620 1789 1853 +39620 1791 1903 +39620 1903 1522 +39620 1915 1469 +39620 1825 1522 +39620 1779 1825 +39620 1853 1436 +39620 1779 1791 +39620 1791 1522 +39620 1779 1522 +39620 1779 1903 +39620 1853 1915 +39620 1789 1915 +39620 1789 1436 +39620 1915 1436 +39620 1583 1510 +39640 1544 1789 +39640 1825 1791 +39640 1598 1489 +39640 1463 1724 +39640 1724 1489 +39640 1724 1598 +39640 1544 1853 +39640 1808 1599 +39640 1716 1599 +39640 1523 1525 +39640 1574 1532 +39640 1853 1469 +39640 1574 1778 +39640 1903 1874 +39640 1778 1532 +39640 1825 1903 +39640 1789 1469 +39640 1436 1469 +39640 1779 1874 +39640 1791 1874 +39640 1789 1853 +39640 1791 1903 +39640 1903 1522 +39640 1915 1469 +39640 1825 1522 +39640 1779 1825 +39640 1853 1436 +39640 1779 1791 +39640 1791 1522 +39640 1779 1522 +39640 1779 1903 +39640 1853 1915 +39640 1789 1915 +39640 1789 1436 +39640 1915 1436 +39640 1583 1510 +39660 1463 1724 +39660 1724 1489 +39660 1724 1598 +39660 1544 1853 +39660 1808 1599 +39660 1716 1599 +39660 1523 1525 +39660 1574 1532 +39660 1853 1469 +39660 1574 1778 +39660 1903 1874 +39660 1778 1532 +39660 1825 1903 +39660 1789 1469 +39660 1436 1469 +39660 1779 1874 +39660 1791 1874 +39660 1789 1853 +39660 1791 1903 +39660 1903 1522 +39660 1915 1469 +39660 1825 1522 +39660 1779 1825 +39660 1853 1436 +39660 1779 1791 +39660 1791 1522 +39660 1779 1522 +39660 1779 1903 +39660 1853 1915 +39660 1789 1915 +39660 1789 1436 +39660 1915 1436 +39660 1583 1510 +39680 1544 1853 +39680 1808 1599 +39680 1716 1599 +39680 1463 1489 +39680 1531 1512 +39680 1523 1525 +39680 1808 1716 +39680 1774 1779 +39680 1574 1532 +39680 1463 1598 +39680 1549 1523 +39680 1853 1469 +39680 1574 1778 +39680 1903 1874 +39680 1778 1532 +39680 1825 1903 +39680 1789 1469 +39680 1436 1469 +39680 1779 1874 +39680 1791 1874 +39680 1789 1853 +39680 1791 1825 +39680 1791 1903 +39680 1903 1522 +39680 1915 1469 +39680 1825 1522 +39680 1779 1825 +39680 1853 1436 +39680 1779 1791 +39680 1791 1522 +39680 1779 1522 +39680 1779 1903 +39680 1853 1915 +39680 1789 1915 +39680 1789 1436 +39680 1915 1436 +39680 1583 1510 +39700 1920 1544 +39700 1808 1716 +39700 1463 1724 +39700 1774 1779 +39700 1549 1525 +39700 1574 1532 +39700 1519 1529 +39700 1463 1598 +39700 1549 1523 +39700 1600 1519 +39700 1853 1469 +39700 1574 1778 +39700 1903 1874 +39700 1778 1532 +39700 1825 1903 +39700 1789 1469 +39700 1436 1469 +39700 1779 1874 +39700 1791 1874 +39700 1789 1853 +39700 1791 1825 +39700 1791 1903 +39700 1903 1522 +39700 1915 1469 +39700 1825 1522 +39700 1779 1825 +39700 1853 1436 +39700 1779 1791 +39700 1791 1522 +39700 1779 1522 +39700 1779 1903 +39700 1853 1915 +39700 1789 1915 +39700 1789 1436 +39700 1915 1436 +39700 1583 1510 +39720 1549 1525 +39720 1574 1532 +39720 1724 1598 +39720 1519 1529 +39720 1463 1598 +39720 1600 1529 +39720 1549 1523 +39720 1600 1519 +39720 1853 1469 +39720 1574 1778 +39720 1903 1874 +39720 1778 1532 +39720 1825 1903 +39720 1789 1469 +39720 1436 1469 +39720 1779 1874 +39720 1791 1874 +39720 1789 1853 +39720 1791 1825 +39720 1791 1903 +39720 1903 1522 +39720 1915 1469 +39720 1825 1522 +39720 1779 1825 +39720 1853 1436 +39720 1779 1791 +39720 1791 1522 +39720 1779 1522 +39720 1779 1903 +39720 1853 1915 +39720 1789 1915 +39720 1789 1436 +39720 1915 1436 +39720 1583 1510 +39740 1459 1503 +39740 1523 1525 +39740 1724 1598 +39740 1874 1522 +39740 1519 1529 +39740 1463 1598 +39740 1600 1529 +39740 1549 1523 +39740 1600 1519 +39740 1853 1469 +39740 1574 1778 +39740 1903 1874 +39740 1778 1532 +39740 1825 1903 +39740 1789 1469 +39740 1436 1469 +39740 1779 1874 +39740 1791 1874 +39740 1789 1853 +39740 1791 1825 +39740 1791 1903 +39740 1903 1522 +39740 1915 1469 +39740 1825 1522 +39740 1779 1825 +39740 1853 1436 +39740 1779 1791 +39740 1791 1522 +39740 1779 1522 +39740 1779 1903 +39740 1853 1915 +39740 1789 1915 +39740 1789 1436 +39740 1915 1436 +39740 1583 1510 +39760 1574 1532 +39760 1724 1598 +39760 1825 1874 +39760 1874 1522 +39760 1779 1774 +39760 1549 1525 +39760 1519 1529 +39760 1463 1598 +39760 1724 1489 +39760 1600 1529 +39760 1598 1489 +39760 1549 1523 +39760 1600 1519 +39760 1853 1469 +39760 1574 1778 +39760 1903 1874 +39760 1778 1532 +39760 1825 1903 +39760 1789 1469 +39760 1436 1469 +39760 1779 1874 +39760 1791 1874 +39760 1789 1853 +39760 1791 1825 +39760 1791 1903 +39760 1903 1522 +39760 1915 1469 +39760 1825 1522 +39760 1779 1825 +39760 1853 1436 +39760 1779 1791 +39760 1791 1522 +39760 1779 1522 +39760 1779 1903 +39760 1853 1915 +39760 1789 1915 +39760 1789 1436 +39760 1915 1436 +39760 1583 1510 +39780 1549 1553 +39780 1549 1525 +39780 1519 1529 +39780 1463 1598 +39780 1724 1489 +39780 1600 1529 +39780 1915 1525 +39780 1598 1489 +39780 1549 1523 +39780 1600 1519 +39780 1853 1469 +39780 1574 1778 +39780 1903 1874 +39780 1778 1532 +39780 1825 1903 +39780 1789 1469 +39780 1436 1469 +39780 1779 1874 +39780 1791 1874 +39780 1789 1853 +39780 1791 1825 +39780 1791 1903 +39780 1903 1522 +39780 1915 1469 +39780 1825 1522 +39780 1779 1825 +39780 1853 1436 +39780 1779 1791 +39780 1791 1522 +39780 1779 1522 +39780 1779 1903 +39780 1853 1915 +39780 1789 1915 +39780 1789 1436 +39780 1915 1436 +39780 1583 1510 +39800 1463 1598 +39800 1724 1489 +39800 1600 1529 +39800 1915 1525 +39800 1574 1532 +39800 1598 1489 +39800 1549 1523 +39800 1599 1839 +39800 1600 1519 +39800 1853 1469 +39800 1599 1641 +39800 1574 1778 +39800 1903 1874 +39800 1778 1532 +39800 1825 1903 +39800 1789 1469 +39800 1436 1469 +39800 1779 1874 +39800 1791 1874 +39800 1789 1853 +39800 1791 1825 +39800 1791 1903 +39800 1903 1522 +39800 1915 1469 +39800 1825 1522 +39800 1779 1825 +39800 1853 1436 +39800 1779 1791 +39800 1791 1522 +39800 1779 1522 +39800 1779 1903 +39800 1853 1915 +39800 1789 1915 +39800 1789 1436 +39800 1915 1436 +39800 1583 1510 +39820 1808 1716 +39820 1574 1532 +39820 1598 1489 +39820 1549 1523 +39820 1857 1617 +39820 1519 1529 +39820 1599 1839 +39820 1600 1519 +39820 1853 1469 +39820 1599 1641 +39820 1574 1778 +39820 1903 1874 +39820 1778 1532 +39820 1825 1903 +39820 1789 1469 +39820 1436 1469 +39820 1779 1874 +39820 1791 1874 +39820 1789 1853 +39820 1791 1825 +39820 1791 1903 +39820 1903 1522 +39820 1915 1469 +39820 1825 1522 +39820 1779 1825 +39820 1853 1436 +39820 1779 1791 +39820 1791 1522 +39820 1779 1522 +39820 1779 1903 +39820 1853 1915 +39820 1789 1915 +39820 1789 1436 +39820 1915 1436 +39820 1583 1510 +39840 1549 1523 +39840 1449 1531 +39840 1463 1489 +39840 1857 1617 +39840 1724 1598 +39840 1519 1529 +39840 1599 1839 +39840 1600 1529 +39840 1600 1519 +39840 1853 1469 +39840 1599 1641 +39840 1574 1778 +39840 1903 1874 +39840 1778 1532 +39840 1825 1903 +39840 1789 1469 +39840 1436 1469 +39840 1779 1874 +39840 1791 1874 +39840 1789 1853 +39840 1791 1825 +39840 1791 1903 +39840 1903 1522 +39840 1915 1469 +39840 1825 1522 +39840 1779 1825 +39840 1853 1436 +39840 1779 1791 +39840 1791 1522 +39840 1779 1522 +39840 1779 1903 +39840 1853 1915 +39840 1789 1915 +39840 1789 1436 +39840 1915 1436 +39840 1583 1510 +39860 1825 1874 +39860 1724 1598 +39860 1874 1522 +39860 1523 1789 +39860 1519 1529 +39860 1599 1655 +39860 1599 1839 +39860 1600 1529 +39860 1641 1655 +39860 1779 1774 +39860 1600 1523 +39860 1600 1519 +39860 1519 1523 +39860 1574 1532 +39860 1853 1469 +39860 1599 1641 +39860 1574 1778 +39860 1903 1874 +39860 1778 1532 +39860 1825 1903 +39860 1789 1469 +39860 1436 1469 +39860 1779 1874 +39860 1791 1874 +39860 1789 1853 +39860 1791 1825 +39860 1791 1903 +39860 1903 1522 +39860 1915 1469 +39860 1825 1522 +39860 1779 1825 +39860 1853 1436 +39860 1779 1791 +39860 1791 1522 +39860 1779 1522 +39860 1779 1903 +39860 1853 1915 +39860 1789 1915 +39860 1789 1436 +39860 1915 1436 +39860 1583 1510 +39880 1544 1549 +39880 1519 1529 +39880 1599 1655 +39880 1599 1839 +39880 1600 1529 +39880 1531 1512 +39880 1641 1655 +39880 1779 1774 +39880 1525 1915 +39880 1600 1523 +39880 1600 1519 +39880 1519 1523 +39880 1574 1532 +39880 1544 1519 +39880 1853 1469 +39880 1599 1641 +39880 1574 1778 +39880 1903 1874 +39880 1778 1532 +39880 1825 1903 +39880 1549 1525 +39880 1789 1469 +39880 1436 1469 +39880 1779 1874 +39880 1791 1874 +39880 1789 1853 +39880 1791 1825 +39880 1791 1903 +39880 1903 1522 +39880 1915 1469 +39880 1825 1522 +39880 1779 1825 +39880 1853 1436 +39880 1779 1791 +39880 1791 1522 +39880 1779 1522 +39880 1779 1903 +39880 1853 1915 +39880 1789 1915 +39880 1789 1436 +39880 1915 1436 +39880 1583 1510 +39900 1825 1874 +39900 1531 1512 +39900 1641 1655 +39900 1779 1774 +39900 1525 1915 +39900 1544 1523 +39900 1600 1523 +39900 1600 1519 +39900 1519 1523 +39900 1574 1532 +39900 1544 1519 +39900 1853 1469 +39900 1599 1641 +39900 1574 1778 +39900 1903 1874 +39900 1778 1532 +39900 1825 1903 +39900 1549 1525 +39900 1789 1469 +39900 1436 1469 +39900 1779 1874 +39900 1791 1874 +39900 1789 1853 +39900 1791 1825 +39900 1791 1903 +39900 1903 1522 +39900 1915 1469 +39900 1825 1522 +39900 1779 1825 +39900 1853 1436 +39900 1779 1791 +39900 1791 1522 +39900 1779 1522 +39900 1779 1903 +39900 1853 1915 +39900 1789 1915 +39900 1789 1436 +39900 1915 1436 +39900 1583 1510 +39920 1544 1523 +39920 1839 1599 +39920 1600 1523 +39920 1600 1519 +39920 1874 1522 +39920 1519 1523 +39920 1574 1532 +39920 1544 1519 +39920 1724 1598 +39920 1853 1469 +39920 1599 1641 +39920 1574 1778 +39920 1903 1874 +39920 1778 1532 +39920 1825 1903 +39920 1549 1525 +39920 1789 1469 +39920 1436 1469 +39920 1779 1874 +39920 1791 1874 +39920 1789 1853 +39920 1791 1825 +39920 1791 1903 +39920 1903 1522 +39920 1915 1469 +39920 1825 1522 +39920 1779 1825 +39920 1853 1436 +39920 1779 1791 +39920 1791 1522 +39920 1779 1522 +39920 1779 1903 +39920 1853 1915 +39920 1789 1915 +39920 1789 1436 +39920 1915 1436 +39920 1583 1510 +39940 1779 1774 +39940 1523 1915 +39940 1544 1600 +39940 1574 1532 +39940 1544 1519 +39940 1724 1598 +39940 1853 1469 +39940 1599 1641 +39940 1574 1778 +39940 1903 1874 +39940 1778 1532 +39940 1825 1903 +39940 1549 1525 +39940 1789 1469 +39940 1436 1469 +39940 1779 1874 +39940 1791 1874 +39940 1789 1853 +39940 1791 1825 +39940 1791 1903 +39940 1903 1522 +39940 1915 1469 +39940 1825 1522 +39940 1779 1825 +39940 1853 1436 +39940 1779 1791 +39940 1791 1522 +39940 1779 1522 +39940 1779 1903 +39940 1853 1915 +39940 1789 1915 +39940 1789 1436 +39940 1915 1436 +39940 1583 1510 +39960 1544 1600 +39960 1574 1532 +39960 1449 1531 +39960 1544 1529 +39960 1544 1519 +39960 1724 1598 +39960 1853 1469 +39960 1599 1641 +39960 1574 1778 +39960 1903 1874 +39960 1778 1532 +39960 1825 1903 +39960 1549 1525 +39960 1789 1469 +39960 1436 1469 +39960 1779 1874 +39960 1791 1874 +39960 1789 1853 +39960 1791 1825 +39960 1791 1903 +39960 1903 1522 +39960 1915 1469 +39960 1825 1522 +39960 1779 1825 +39960 1853 1436 +39960 1779 1791 +39960 1791 1522 +39960 1779 1522 +39960 1779 1903 +39960 1853 1915 +39960 1789 1915 +39960 1789 1436 +39960 1915 1436 +39960 1583 1510 +39980 1544 1529 +39980 1544 1519 +39980 1724 1598 +39980 1853 1469 +39980 1523 1915 +39980 1519 1529 +39980 1599 1641 +39980 1779 1774 +39980 1574 1778 +39980 1903 1874 +39980 1778 1532 +39980 1825 1903 +39980 1549 1525 +39980 1789 1469 +39980 1436 1469 +39980 1779 1874 +39980 1791 1874 +39980 1789 1853 +39980 1791 1825 +39980 1791 1903 +39980 1903 1522 +39980 1915 1469 +39980 1825 1522 +39980 1779 1825 +39980 1853 1436 +39980 1779 1791 +39980 1791 1522 +39980 1779 1522 +39980 1779 1903 +39980 1853 1915 +39980 1789 1915 +39980 1789 1436 +39980 1915 1436 +39980 1583 1510 +40000 1519 1529 +40000 1599 1641 +40000 1779 1774 +40000 1574 1778 +40000 1574 1532 +40000 1903 1874 +40000 1778 1532 +40000 1825 1903 +40000 1874 1522 +40000 1549 1525 +40000 1789 1469 +40000 1436 1469 +40000 1779 1874 +40000 1791 1874 +40000 1789 1853 +40000 1791 1825 +40000 1791 1903 +40000 1903 1522 +40000 1915 1469 +40000 1825 1522 +40000 1779 1825 +40000 1853 1436 +40000 1779 1791 +40000 1791 1522 +40000 1779 1522 +40000 1779 1903 +40000 1853 1915 +40000 1789 1915 +40000 1789 1436 +40000 1915 1436 +40000 1583 1510 +40020 1574 1778 +40020 1574 1532 +40020 1469 1853 +40020 1903 1874 +40020 1628 1521 +40020 1778 1532 +40020 1825 1903 +40020 1874 1522 +40020 1724 1598 +40020 1463 1489 +40020 1549 1525 +40020 1789 1469 +40020 1436 1469 +40020 1779 1874 +40020 1791 1874 +40020 1789 1853 +40020 1791 1825 +40020 1791 1903 +40020 1903 1522 +40020 1915 1469 +40020 1825 1522 +40020 1779 1825 +40020 1853 1436 +40020 1779 1791 +40020 1791 1522 +40020 1779 1522 +40020 1779 1903 +40020 1853 1915 +40020 1789 1915 +40020 1789 1436 +40020 1915 1436 +40020 1583 1510 +40040 1825 1874 +40040 1778 1532 +40040 1599 1641 +40040 1825 1903 +40040 1874 1522 +40040 1724 1598 +40040 1463 1489 +40040 1549 1525 +40040 1789 1469 +40040 1436 1469 +40040 1779 1874 +40040 1791 1874 +40040 1789 1853 +40040 1791 1825 +40040 1791 1903 +40040 1903 1522 +40040 1915 1469 +40040 1825 1522 +40040 1779 1825 +40040 1853 1436 +40040 1779 1791 +40040 1791 1522 +40040 1779 1522 +40040 1779 1903 +40040 1853 1915 +40040 1789 1915 +40040 1789 1436 +40040 1915 1436 +40040 1583 1510 +40060 1825 1903 +40060 1874 1522 +40060 1724 1598 +40060 1544 1523 +40060 1463 1489 +40060 1857 1617 +40060 1574 1778 +40060 1574 1532 +40060 1549 1525 +40060 1789 1469 +40060 1436 1469 +40060 1779 1874 +40060 1791 1874 +40060 1874 1903 +40060 1789 1853 +40060 1791 1825 +40060 1791 1903 +40060 1903 1522 +40060 1915 1469 +40060 1825 1522 +40060 1779 1825 +40060 1853 1436 +40060 1779 1791 +40060 1791 1522 +40060 1779 1522 +40060 1779 1903 +40060 1853 1915 +40060 1789 1915 +40060 1789 1436 +40060 1915 1436 +40060 1583 1510 +40080 1724 1598 +40080 1544 1523 +40080 1469 1853 +40080 1641 1655 +40080 1463 1489 +40080 1599 1641 +40080 1857 1617 +40080 1778 1532 +40080 1574 1778 +40080 1574 1532 +40080 1549 1525 +40080 1789 1469 +40080 1436 1469 +40080 1779 1874 +40080 1791 1874 +40080 1874 1903 +40080 1789 1853 +40080 1791 1825 +40080 1791 1903 +40080 1903 1522 +40080 1915 1469 +40080 1825 1522 +40080 1779 1825 +40080 1853 1436 +40080 1779 1791 +40080 1791 1522 +40080 1779 1522 +40080 1779 1903 +40080 1853 1915 +40080 1789 1915 +40080 1789 1436 +40080 1915 1436 +40080 1583 1510 +40100 1544 1523 +40100 1469 1853 +40100 1599 1773 +40100 1874 1522 +40100 1544 1519 +40100 1641 1655 +40100 1463 1489 +40100 1599 1641 +40100 1857 1617 +40100 1778 1532 +40100 1574 1778 +40100 1574 1532 +40100 1549 1525 +40100 1789 1469 +40100 1436 1469 +40100 1779 1874 +40100 1791 1874 +40100 1874 1903 +40100 1789 1853 +40100 1791 1825 +40100 1791 1903 +40100 1825 1903 +40100 1903 1522 +40100 1915 1469 +40100 1825 1522 +40100 1779 1825 +40100 1853 1436 +40100 1779 1791 +40100 1791 1522 +40100 1779 1522 +40100 1779 1903 +40100 1853 1915 +40100 1789 1915 +40100 1789 1436 +40100 1915 1436 +40100 1583 1510 +40120 1544 1519 +40120 1641 1655 +40120 1463 1489 +40120 1599 1641 +40120 1724 1598 +40120 1857 1617 +40120 1778 1532 +40120 1574 1778 +40120 1574 1532 +40120 1808 1716 +40120 1549 1525 +40120 1789 1469 +40120 1436 1469 +40120 1779 1874 +40120 1791 1874 +40120 1874 1903 +40120 1789 1853 +40120 1791 1825 +40120 1791 1903 +40120 1825 1903 +40120 1903 1522 +40120 1915 1469 +40120 1825 1522 +40120 1779 1825 +40120 1853 1436 +40120 1779 1791 +40120 1791 1522 +40120 1779 1522 +40120 1779 1903 +40120 1853 1915 +40120 1789 1915 +40120 1789 1436 +40120 1915 1436 +40120 1583 1510 +40140 1463 1489 +40140 1599 1641 +40140 1724 1598 +40140 1857 1617 +40140 1774 1779 +40140 1544 1529 +40140 1778 1532 +40140 1574 1778 +40140 1574 1532 +40140 1808 1716 +40140 1549 1525 +40140 1678 1459 +40140 1789 1469 +40140 1853 1469 +40140 1436 1469 +40140 1779 1874 +40140 1791 1874 +40140 1874 1903 +40140 1789 1853 +40140 1791 1825 +40140 1791 1903 +40140 1825 1903 +40140 1903 1522 +40140 1915 1469 +40140 1825 1522 +40140 1779 1825 +40140 1853 1436 +40140 1779 1791 +40140 1791 1522 +40140 1779 1522 +40140 1779 1903 +40140 1853 1915 +40140 1789 1915 +40140 1789 1436 +40140 1915 1436 +40140 1583 1510 +40160 1519 1600 +40160 1724 1598 +40160 1857 1441 +40160 1773 1641 +40160 1857 1617 +40160 1774 1779 +40160 1544 1529 +40160 1778 1532 +40160 1574 1778 +40160 1574 1532 +40160 1808 1716 +40160 1549 1525 +40160 1678 1459 +40160 1789 1469 +40160 1853 1469 +40160 1436 1469 +40160 1779 1874 +40160 1791 1874 +40160 1874 1903 +40160 1789 1853 +40160 1791 1825 +40160 1791 1903 +40160 1825 1903 +40160 1903 1522 +40160 1915 1469 +40160 1825 1522 +40160 1779 1825 +40160 1853 1436 +40160 1779 1791 +40160 1791 1522 +40160 1779 1522 +40160 1779 1903 +40160 1853 1915 +40160 1789 1915 +40160 1789 1436 +40160 1915 1436 +40160 1583 1510 +40180 1544 1519 +40180 1773 1641 +40180 1857 1617 +40180 1874 1522 +40180 1774 1779 +40180 1525 1915 +40180 1441 1617 +40180 1599 1655 +40180 1544 1529 +40180 1778 1532 +40180 1574 1778 +40180 1574 1532 +40180 1808 1716 +40180 1549 1525 +40180 1678 1459 +40180 1789 1469 +40180 1853 1469 +40180 1436 1469 +40180 1779 1874 +40180 1791 1874 +40180 1874 1903 +40180 1789 1853 +40180 1791 1825 +40180 1791 1903 +40180 1825 1903 +40180 1903 1522 +40180 1915 1469 +40180 1825 1522 +40180 1779 1825 +40180 1853 1436 +40180 1779 1791 +40180 1791 1522 +40180 1779 1522 +40180 1779 1903 +40180 1853 1915 +40180 1789 1915 +40180 1789 1436 +40180 1915 1436 +40180 1583 1510 +40200 1441 1617 +40200 1441 1857 +40200 1599 1655 +40200 1544 1529 +40200 1544 1523 +40200 1778 1532 +40200 1574 1778 +40200 1574 1532 +40200 1808 1716 +40200 1549 1525 +40200 1678 1459 +40200 1789 1469 +40200 1853 1469 +40200 1436 1469 +40200 1779 1874 +40200 1791 1874 +40200 1874 1903 +40200 1789 1853 +40200 1791 1825 +40200 1791 1903 +40200 1825 1903 +40200 1903 1522 +40200 1915 1469 +40200 1825 1522 +40200 1779 1825 +40200 1853 1436 +40200 1779 1791 +40200 1791 1522 +40200 1779 1522 +40200 1779 1903 +40200 1853 1915 +40200 1789 1915 +40200 1789 1436 +40200 1915 1436 +40200 1583 1510 +40220 1544 1529 +40220 1544 1523 +40220 1778 1532 +40220 1463 1489 +40220 1463 1599 +40220 1574 1778 +40220 1574 1532 +40220 1808 1716 +40220 1599 1489 +40220 1549 1525 +40220 1600 1529 +40220 1678 1459 +40220 1789 1469 +40220 1853 1469 +40220 1436 1469 +40220 1779 1874 +40220 1791 1874 +40220 1874 1903 +40220 1789 1853 +40220 1791 1825 +40220 1791 1903 +40220 1825 1903 +40220 1903 1522 +40220 1915 1469 +40220 1825 1522 +40220 1779 1825 +40220 1853 1436 +40220 1779 1791 +40220 1791 1522 +40220 1779 1522 +40220 1779 1903 +40220 1853 1915 +40220 1789 1915 +40220 1789 1436 +40220 1915 1436 +40220 1583 1510 +40240 1544 1519 +40240 1773 1441 +40240 1574 1778 +40240 1574 1532 +40240 1489 1655 +40240 1808 1716 +40240 1463 1628 +40240 1599 1489 +40240 1441 1617 +40240 1549 1525 +40240 1600 1529 +40240 1678 1459 +40240 1857 1617 +40240 1779 1774 +40240 1789 1469 +40240 1853 1469 +40240 1436 1469 +40240 1779 1874 +40240 1791 1874 +40240 1874 1903 +40240 1789 1853 +40240 1791 1825 +40240 1791 1903 +40240 1825 1903 +40240 1903 1522 +40240 1915 1469 +40240 1825 1522 +40240 1779 1825 +40240 1853 1436 +40240 1779 1791 +40240 1791 1522 +40240 1779 1522 +40240 1779 1903 +40240 1853 1915 +40240 1789 1915 +40240 1789 1436 +40240 1915 1436 +40240 1583 1510 +40260 1808 1716 +40260 1463 1628 +40260 1724 1598 +40260 1599 1489 +40260 1857 1441 +40260 1441 1617 +40260 1874 1522 +40260 1549 1525 +40260 1600 1529 +40260 1678 1459 +40260 1857 1617 +40260 1779 1774 +40260 1789 1469 +40260 1853 1469 +40260 1436 1469 +40260 1779 1874 +40260 1791 1874 +40260 1874 1903 +40260 1789 1853 +40260 1791 1825 +40260 1791 1903 +40260 1825 1903 +40260 1903 1522 +40260 1915 1469 +40260 1825 1522 +40260 1779 1825 +40260 1853 1436 +40260 1779 1791 +40260 1791 1522 +40260 1779 1522 +40260 1779 1903 +40260 1853 1915 +40260 1789 1915 +40260 1789 1436 +40260 1915 1436 +40260 1778 1532 +40260 1583 1510 +40280 1544 1600 +40280 1549 1525 +40280 1563 1592 +40280 1600 1529 +40280 1678 1459 +40280 1437 1458 +40280 1857 1617 +40280 1779 1774 +40280 1789 1469 +40280 1853 1469 +40280 1436 1469 +40280 1779 1874 +40280 1791 1874 +40280 1874 1903 +40280 1789 1853 +40280 1791 1825 +40280 1791 1903 +40280 1825 1903 +40280 1903 1522 +40280 1915 1469 +40280 1825 1522 +40280 1779 1825 +40280 1853 1436 +40280 1779 1791 +40280 1791 1522 +40280 1779 1522 +40280 1779 1903 +40280 1853 1915 +40280 1789 1915 +40280 1789 1436 +40280 1574 1778 +40280 1915 1436 +40280 1778 1532 +40280 1583 1510 +40300 1546 1468 +40300 1546 1558 +40300 1678 1459 +40300 1808 1463 +40300 1558 1468 +40300 1437 1458 +40300 1441 1857 +40300 1857 1617 +40300 1871 1572 +40300 1489 1915 +40300 1779 1774 +40300 1920 1598 +40300 1825 1874 +40300 1598 1724 +40300 1617 1441 +40300 1789 1469 +40300 1853 1469 +40300 1436 1469 +40300 1779 1874 +40300 1791 1874 +40300 1874 1903 +40300 1574 1532 +40300 1724 1920 +40300 1599 1767 +40300 1789 1853 +40300 1791 1825 +40300 1791 1903 +40300 1825 1903 +40300 1903 1522 +40300 1915 1469 +40300 1825 1522 +40300 1779 1825 +40300 1853 1436 +40300 1779 1791 +40300 1791 1522 +40300 1779 1522 +40300 1779 1903 +40300 1853 1915 +40300 1789 1915 +40300 1789 1436 +40300 1574 1778 +40300 1915 1436 +40300 1778 1532 +40300 1583 1510 +40320 1920 1598 +40320 1641 1857 +40320 1544 1523 +40320 1825 1874 +40320 1874 1522 +40320 1523 1529 +40320 1598 1724 +40320 1617 1441 +40320 1600 1529 +40320 1789 1469 +40320 1853 1469 +40320 1436 1469 +40320 1779 1874 +40320 1791 1874 +40320 1874 1903 +40320 1574 1532 +40320 1724 1920 +40320 1599 1767 +40320 1789 1853 +40320 1791 1825 +40320 1791 1903 +40320 1825 1903 +40320 1903 1522 +40320 1915 1469 +40320 1825 1522 +40320 1779 1825 +40320 1853 1436 +40320 1779 1791 +40320 1791 1522 +40320 1779 1522 +40320 1779 1903 +40320 1853 1915 +40320 1789 1915 +40320 1789 1436 +40320 1574 1778 +40320 1915 1436 +40320 1778 1532 +40320 1583 1510 +40340 1549 1583 +40340 1591 1872 +40340 1598 1724 +40340 1617 1441 +40340 1655 1767 +40340 1544 1600 +40340 1600 1529 +40340 1789 1469 +40340 1853 1469 +40340 1436 1469 +40340 1779 1874 +40340 1791 1874 +40340 1874 1903 +40340 1574 1532 +40340 1593 1463 +40340 1724 1920 +40340 1599 1767 +40340 1678 1459 +40340 1789 1853 +40340 1791 1825 +40340 1791 1903 +40340 1825 1903 +40340 1903 1522 +40340 1915 1469 +40340 1825 1522 +40340 1779 1825 +40340 1853 1436 +40340 1779 1791 +40340 1791 1522 +40340 1779 1522 +40340 1779 1903 +40340 1853 1915 +40340 1789 1915 +40340 1789 1436 +40340 1574 1778 +40340 1915 1436 +40340 1778 1532 +40340 1583 1510 +40360 1574 1874 +40360 1599 1655 +40360 1774 1779 +40360 1879 1441 +40360 1544 1600 +40360 1593 1628 +40360 1600 1529 +40360 1789 1469 +40360 1853 1469 +40360 1436 1469 +40360 1538 1874 +40360 1779 1874 +40360 1791 1874 +40360 1825 1874 +40360 1874 1903 +40360 1574 1532 +40360 1593 1463 +40360 1724 1920 +40360 1599 1767 +40360 1678 1459 +40360 1789 1853 +40360 1791 1825 +40360 1791 1903 +40360 1825 1903 +40360 1903 1522 +40360 1915 1469 +40360 1825 1522 +40360 1779 1825 +40360 1853 1436 +40360 1779 1791 +40360 1791 1522 +40360 1779 1522 +40360 1779 1903 +40360 1853 1915 +40360 1789 1915 +40360 1789 1436 +40360 1574 1778 +40360 1915 1436 +40360 1778 1532 +40360 1583 1510 +40380 1544 1600 +40380 1549 1915 +40380 1549 1525 +40380 1593 1628 +40380 1600 1529 +40380 1655 1767 +40380 1789 1469 +40380 1853 1469 +40380 1436 1469 +40380 1441 1489 +40380 1538 1874 +40380 1602 1631 +40380 1779 1874 +40380 1791 1874 +40380 1825 1874 +40380 1874 1903 +40380 1874 1522 +40380 1512 1531 +40380 1574 1532 +40380 1593 1463 +40380 1724 1920 +40380 1599 1767 +40380 1678 1459 +40380 1789 1853 +40380 1791 1825 +40380 1791 1903 +40380 1825 1903 +40380 1903 1522 +40380 1915 1469 +40380 1825 1522 +40380 1779 1825 +40380 1853 1436 +40380 1779 1791 +40380 1791 1522 +40380 1779 1522 +40380 1779 1903 +40380 1853 1915 +40380 1789 1915 +40380 1789 1436 +40380 1574 1778 +40380 1915 1436 +40380 1778 1532 +40380 1583 1510 +40400 1538 1874 +40400 1602 1631 +40400 1613 1489 +40400 1613 1767 +40400 1641 1444 +40400 1774 1874 +40400 1779 1874 +40400 1791 1874 +40400 1825 1874 +40400 1874 1903 +40400 1874 1522 +40400 1512 1531 +40400 1574 1532 +40400 1593 1463 +40400 1600 1469 +40400 1724 1920 +40400 1469 1523 +40400 1538 1825 +40400 1599 1767 +40400 1678 1459 +40400 1789 1853 +40400 1791 1825 +40400 1791 1903 +40400 1825 1903 +40400 1903 1522 +40400 1915 1469 +40400 1825 1522 +40400 1779 1825 +40400 1853 1436 +40400 1767 1489 +40400 1779 1791 +40400 1791 1522 +40400 1599 1489 +40400 1779 1522 +40400 1779 1903 +40400 1853 1915 +40400 1544 1525 +40400 1789 1915 +40400 1789 1436 +40400 1574 1778 +40400 1915 1436 +40400 1778 1532 +40400 1583 1510 +40420 1538 1779 +40420 1538 1791 +40420 1554 1871 +40420 1574 1532 +40420 1591 1872 +40420 1593 1463 +40420 1600 1853 +40420 1600 1436 +40420 1600 1469 +40420 1600 1789 +40420 1613 1441 +40420 1623 1716 +40420 1724 1920 +40420 1469 1523 +40420 1538 1825 +40420 1599 1767 +40420 1655 1489 +40420 1436 1469 +40420 1678 1459 +40420 1789 1853 +40420 1791 1825 +40420 1791 1903 +40420 1825 1903 +40420 1903 1522 +40420 1915 1469 +40420 1825 1522 +40420 1779 1825 +40420 1853 1436 +40420 1767 1489 +40420 1779 1791 +40420 1791 1522 +40420 1599 1489 +40420 1779 1522 +40420 1779 1903 +40420 1853 1915 +40420 1544 1525 +40420 1789 1915 +40420 1789 1436 +40420 1574 1778 +40420 1915 1436 +40420 1778 1532 +40420 1583 1510 +40440 1538 1825 +40440 1538 1874 +40440 1538 1903 +40440 1544 1549 +40440 1549 1525 +40440 1549 1510 +40440 1549 1583 +40440 1568 1598 +40440 1599 1767 +40440 1613 1773 +40440 1655 1489 +40440 1825 1874 +40440 1436 1469 +40440 1573 1452 +40440 1623 1808 +40440 1678 1459 +40440 1779 1874 +40440 1789 1853 +40440 1791 1825 +40440 1791 1903 +40440 1825 1903 +40440 1874 1522 +40440 1874 1903 +40440 1903 1522 +40440 1915 1469 +40440 1825 1522 +40440 1779 1825 +40440 1853 1436 +40440 1767 1489 +40440 1779 1791 +40440 1791 1522 +40440 1599 1489 +40440 1779 1522 +40440 1779 1903 +40440 1853 1915 +40440 1544 1525 +40440 1789 1915 +40440 1789 1436 +40440 1574 1778 +40440 1915 1436 +40440 1778 1532 +40440 1583 1510 +40460 1549 1600 +40460 1568 1920 +40460 1573 1452 +40460 1623 1808 +40460 1678 1459 +40460 1774 1779 +40460 1779 1874 +40460 1789 1853 +40460 1791 1825 +40460 1791 1903 +40460 1825 1903 +40460 1857 1441 +40460 1874 1522 +40460 1874 1903 +40460 1903 1522 +40460 1915 1469 +40460 1458 1519 +40460 1512 1531 +40460 1825 1522 +40460 1779 1825 +40460 1789 1529 +40460 1915 1529 +40460 1436 1529 +40460 1724 1920 +40460 1853 1436 +40460 1767 1489 +40460 1779 1791 +40460 1791 1522 +40460 1599 1489 +40460 1779 1522 +40460 1779 1903 +40460 1853 1915 +40460 1544 1525 +40460 1789 1915 +40460 1789 1436 +40460 1574 1778 +40460 1574 1532 +40460 1915 1436 +40460 1778 1532 +40460 1583 1510 +40480 1539 1858 +40480 1554 1678 +40480 1600 1915 +40480 1631 1448 +40480 1634 1487 +40480 1678 1497 +40480 1771 1920 +40480 1825 1522 +40480 1500 1511 +40480 1546 1558 +40480 1599 1767 +40480 1779 1825 +40480 1789 1529 +40480 1915 1529 +40480 1436 1529 +40480 1724 1920 +40480 1853 1436 +40480 1767 1489 +40480 1779 1791 +40480 1791 1522 +40480 1599 1489 +40480 1779 1522 +40480 1600 1458 +40480 1779 1903 +40480 1853 1915 +40480 1459 1468 +40480 1546 1459 +40480 1558 1459 +40480 1558 1468 +40480 1544 1525 +40480 1789 1915 +40480 1789 1436 +40480 1574 1778 +40480 1574 1532 +40480 1915 1436 +40480 1778 1532 +40480 1583 1510 +40500 1539 1920 +40500 1543 1434 +40500 1546 1558 +40500 1546 1606 +40500 1554 1623 +40500 1556 1716 +40500 1590 1530 +40500 1591 1872 +40500 1599 1767 +40500 1604 1616 +40500 1631 1678 +40500 1779 1825 +40500 1789 1529 +40500 1915 1529 +40500 1436 1529 +40500 1623 1716 +40500 1774 1779 +40500 1858 1872 +40500 1568 1771 +40500 1572 1871 +40500 1724 1920 +40500 1853 1436 +40500 1543 1518 +40500 1767 1489 +40500 1779 1791 +40500 1791 1522 +40500 1791 1903 +40500 1599 1489 +40500 1779 1522 +40500 1600 1458 +40500 1779 1903 +40500 1903 1522 +40500 1546 1468 +40500 1853 1915 +40500 1459 1468 +40500 1546 1459 +40500 1558 1459 +40500 1558 1468 +40500 1544 1525 +40500 1789 1915 +40500 1789 1436 +40500 1554 1716 +40500 1574 1778 +40500 1574 1532 +40500 1915 1436 +40500 1778 1532 +40500 1583 1510 +40520 1543 1604 +40520 1559 1487 +40520 1563 1596 +40520 1598 1920 +40520 1606 1459 +40520 1623 1716 +40520 1628 1526 +40520 1774 1779 +40520 1853 1519 +40520 1858 1872 +40520 1463 1526 +40520 1512 1531 +40520 1568 1771 +40520 1572 1871 +40520 1623 1808 +40520 1857 1441 +40520 1604 1518 +40520 1724 1920 +40520 1853 1436 +40520 1543 1518 +40520 1767 1489 +40520 1779 1791 +40520 1791 1522 +40520 1791 1903 +40520 1599 1489 +40520 1779 1522 +40520 1600 1458 +40520 1779 1903 +40520 1903 1522 +40520 1546 1468 +40520 1853 1915 +40520 1459 1468 +40520 1546 1459 +40520 1558 1459 +40520 1558 1468 +40520 1544 1525 +40520 1789 1915 +40520 1789 1436 +40520 1554 1716 +40520 1574 1778 +40520 1574 1532 +40520 1915 1436 +40520 1778 1532 +40520 1583 1510 +40540 1556 1716 +40540 1559 1463 +40540 1568 1872 +40540 1568 1771 +40540 1572 1871 +40540 1591 1858 +40540 1599 1767 +40540 1600 1853 +40540 1613 1626 +40540 1622 1464 +40540 1623 1808 +40540 1631 1497 +40540 1771 1872 +40540 1853 1458 +40540 1857 1441 +40540 1915 1458 +40540 1538 1825 +40540 1602 1619 +40540 1604 1518 +40540 1904 1517 +40540 1436 1458 +40540 1724 1920 +40540 1853 1436 +40540 1543 1518 +40540 1767 1489 +40540 1779 1791 +40540 1791 1522 +40540 1791 1903 +40540 1599 1489 +40540 1779 1522 +40540 1546 1558 +40540 1600 1458 +40540 1779 1903 +40540 1903 1522 +40540 1546 1468 +40540 1853 1915 +40540 1459 1468 +40540 1546 1459 +40540 1558 1459 +40540 1558 1468 +40540 1544 1525 +40540 1789 1915 +40540 1789 1436 +40540 1554 1716 +40540 1574 1778 +40540 1574 1532 +40540 1915 1436 +40540 1778 1532 +40540 1583 1510 +40560 1538 1825 +40560 1538 1779 +40560 1539 1517 +40560 1557 1606 +40560 1602 1619 +40560 1604 1518 +40560 1619 1631 +40560 1623 1631 +40560 1904 1517 +40560 1436 1458 +40560 1602 1631 +40560 1604 1616 +40560 1617 1857 +40560 1724 1920 +40560 1853 1436 +40560 1543 1518 +40560 1563 1592 +40560 1767 1489 +40560 1779 1791 +40560 1791 1522 +40560 1791 1903 +40560 1599 1489 +40560 1779 1522 +40560 1546 1558 +40560 1600 1458 +40560 1779 1903 +40560 1903 1522 +40560 1546 1468 +40560 1853 1915 +40560 1459 1468 +40560 1546 1459 +40560 1558 1459 +40560 1558 1468 +40560 1544 1525 +40560 1789 1915 +40560 1789 1436 +40560 1554 1716 +40560 1574 1778 +40560 1574 1532 +40560 1915 1436 +40560 1778 1532 +40560 1583 1510 +40580 1539 1771 +40580 1559 1858 +40580 1602 1631 +40580 1604 1616 +40580 1617 1857 +40580 1623 1441 +40580 1724 1920 +40580 1789 1523 +40580 1853 1458 +40580 1853 1436 +40580 1915 1458 +40580 1458 1523 +40580 1537 1517 +40580 1543 1604 +40580 1543 1518 +40580 1563 1592 +40580 1617 1441 +40580 1591 1858 +40580 1767 1489 +40580 1779 1791 +40580 1791 1522 +40580 1791 1903 +40580 1853 1523 +40580 1599 1489 +40580 1779 1522 +40580 1546 1558 +40580 1600 1458 +40580 1779 1903 +40580 1903 1522 +40580 1546 1468 +40580 1853 1915 +40580 1459 1468 +40580 1546 1459 +40580 1558 1459 +40580 1558 1468 +40580 1460 1499 +40580 1544 1525 +40580 1789 1853 +40580 1789 1915 +40580 1789 1436 +40580 1554 1716 +40580 1574 1778 +40580 1574 1532 +40580 1915 1436 +40580 1778 1532 +40580 1583 1510 +40600 1537 1568 +40600 1537 1517 +40600 1537 1559 +40600 1538 1779 +40600 1543 1604 +40600 1543 1518 +40600 1563 1592 +40600 1617 1441 +40600 1622 1460 +40600 1628 1463 +40600 1904 1448 +40600 1464 1497 +40600 1512 1531 +40600 1591 1858 +40600 1767 1489 +40600 1779 1791 +40600 1791 1522 +40600 1791 1903 +40600 1853 1523 +40600 1915 1523 +40600 1538 1522 +40600 1541 1555 +40600 1541 1533 +40600 1599 1489 +40600 1779 1522 +40600 1546 1558 +40600 1600 1458 +40600 1779 1903 +40600 1903 1522 +40600 1546 1468 +40600 1853 1915 +40600 1459 1468 +40600 1546 1459 +40600 1558 1459 +40600 1558 1468 +40600 1460 1499 +40600 1544 1525 +40600 1572 1871 +40600 1789 1853 +40600 1789 1915 +40600 1789 1436 +40600 1573 1452 +40600 1617 1623 +40600 1554 1716 +40600 1574 1778 +40600 1574 1532 +40600 1915 1436 +40600 1599 1840 +40600 1778 1532 +40600 1583 1510 +40620 1537 1469 +40620 1555 1533 +40620 1562 1612 +40620 1568 1465 +40620 1579 1426 +40620 1579 1590 +40620 1590 1601 +40620 1590 1470 +40620 1591 1858 +40620 1596 1441 +40620 1596 1613 +40620 1596 1622 +40620 1641 1460 +40620 1767 1489 +40620 1779 1791 +40620 1791 1522 +40620 1791 1903 +40620 1853 1523 +40620 1858 1466 +40620 1915 1523 +40620 1538 1522 +40620 1541 1555 +40620 1541 1533 +40620 1599 1489 +40620 1773 1464 +40620 1779 1522 +40620 1436 1458 +40620 1500 1511 +40620 1546 1558 +40620 1599 1767 +40620 1600 1458 +40620 1779 1903 +40620 1903 1522 +40620 1546 1468 +40620 1623 1441 +40620 1853 1915 +40620 1459 1468 +40620 1546 1459 +40620 1558 1459 +40620 1558 1468 +40620 1460 1499 +40620 1544 1525 +40620 1572 1871 +40620 1724 1920 +40620 1789 1853 +40620 1789 1915 +40620 1789 1436 +40620 1573 1452 +40620 1617 1623 +40620 1554 1716 +40620 1574 1778 +40620 1574 1532 +40620 1915 1436 +40620 1599 1840 +40620 1778 1532 +40620 1583 1510 +40640 1538 1522 +40640 1541 1555 +40640 1541 1533 +40640 1541 1527 +40640 1590 1530 +40640 1593 1622 +40640 1599 1489 +40640 1600 1436 +40640 1600 1463 +40640 1608 1825 +40640 1617 1441 +40640 1617 1857 +40640 1773 1464 +40640 1779 1522 +40640 1857 1441 +40640 1436 1458 +40640 1469 1517 +40640 1470 1530 +40640 1500 1511 +40640 1504 1517 +40640 1546 1558 +40640 1599 1767 +40640 1600 1458 +40640 1600 1853 +40640 1716 1904 +40640 1779 1903 +40640 1840 1489 +40640 1903 1522 +40640 1546 1468 +40640 1623 1441 +40640 1853 1915 +40640 1459 1468 +40640 1546 1459 +40640 1558 1459 +40640 1558 1468 +40640 1619 1497 +40640 1460 1499 +40640 1544 1525 +40640 1572 1871 +40640 1724 1920 +40640 1789 1853 +40640 1789 1915 +40640 1789 1436 +40640 1573 1452 +40640 1617 1623 +40640 1554 1716 +40640 1574 1778 +40640 1574 1532 +40640 1915 1436 +40640 1599 1840 +40640 1778 1532 +40640 1583 1510 +40660 1538 1779 +40660 1538 1903 +40660 1546 1558 +40660 1555 1533 +40660 1590 1470 +40660 1599 1767 +40660 1600 1458 +40660 1600 1853 +40660 1604 1518 +40660 1608 1530 +40660 1619 1528 +40660 1655 1463 +40660 1716 1904 +40660 1771 1525 +40660 1774 1903 +40660 1779 1903 +40660 1840 1489 +40660 1903 1522 +40660 1546 1468 +40660 1574 1903 +40660 1623 1441 +40660 1650 1655 +40660 1742 1520 +40660 1778 1903 +40660 1853 1915 +40660 1853 1523 +40660 1459 1468 +40660 1546 1459 +40660 1558 1459 +40660 1558 1468 +40660 1590 1608 +40660 1619 1497 +40660 1441 1464 +40660 1460 1499 +40660 1544 1525 +40660 1572 1871 +40660 1724 1920 +40660 1789 1853 +40660 1789 1915 +40660 1789 1436 +40660 1573 1452 +40660 1617 1623 +40660 1554 1716 +40660 1574 1778 +40660 1574 1532 +40660 1915 1436 +40660 1599 1840 +40660 1778 1532 +40660 1583 1510 +40660 1767 1489 +40680 1538 1778 +40680 1541 1533 +40680 1546 1468 +40680 1554 1457 +40680 1574 1903 +40680 1579 1590 +40680 1593 1437 +40680 1596 1623 +40680 1623 1441 +40680 1650 1655 +40680 1655 1668 +40680 1655 1762 +40680 1742 1520 +40680 1743 1762 +40680 1778 1903 +40680 1808 1904 +40680 1853 1915 +40680 1853 1523 +40680 1903 1532 +40680 1915 1523 +40680 1452 1470 +40680 1459 1468 +40680 1497 1528 +40680 1546 1459 +40680 1558 1459 +40680 1558 1468 +40680 1590 1608 +40680 1593 1526 +40680 1619 1497 +40680 1436 1523 +40680 1441 1464 +40680 1460 1499 +40680 1500 1511 +40680 1501 1524 +40680 1544 1525 +40680 1572 1871 +40680 1724 1920 +40680 1789 1853 +40680 1650 1668 +40680 1650 1743 +40680 1789 1915 +40680 1789 1436 +40680 1573 1452 +40680 1617 1623 +40680 1668 1743 +40680 1554 1716 +40680 1668 1762 +40680 1574 1778 +40680 1574 1532 +40680 1915 1436 +40680 1599 1840 +40680 1778 1532 +40680 1583 1510 +40680 1767 1489 +40680 1650 1762 +40700 1546 1459 +40700 1558 1426 +40700 1558 1459 +40700 1558 1468 +40700 1590 1608 +40700 1590 1920 +40700 1590 1470 +40700 1593 1526 +40700 1608 1470 +40700 1612 1466 +40700 1619 1497 +40700 1825 1436 +40700 1853 1436 +40700 1436 1523 +40700 1441 1464 +40700 1460 1499 +40700 1500 1511 +40700 1501 1524 +40700 1544 1525 +40700 1572 1871 +40700 1678 1459 +40700 1724 1920 +40700 1789 1853 +40700 1825 1915 +40700 1582 1593 +40700 1650 1668 +40700 1650 1743 +40700 1789 1915 +40700 1789 1436 +40700 1573 1452 +40700 1617 1623 +40700 1668 1743 +40700 1554 1716 +40700 1668 1762 +40700 1574 1778 +40700 1574 1532 +40700 1915 1436 +40700 1599 1840 +40700 1778 1532 +40700 1583 1510 +40700 1767 1489 +40700 1650 1762 +40720 1542 1598 +40720 1544 1525 +40720 1572 1871 +40720 1582 1619 +40720 1582 1437 +40720 1593 1599 +40720 1678 1426 +40720 1678 1459 +40720 1724 1920 +40720 1789 1519 +40720 1789 1853 +40720 1789 1523 +40720 1825 1915 +40720 1853 1915 +40720 1853 1519 +40720 1554 1457 +40720 1582 1593 +40720 1650 1668 +40720 1650 1743 +40720 1789 1915 +40720 1789 1436 +40720 1426 1459 +40720 1573 1452 +40720 1617 1623 +40720 1668 1743 +40720 1742 1520 +40720 1915 1523 +40720 1608 1530 +40720 1554 1716 +40720 1668 1762 +40720 1574 1778 +40720 1574 1532 +40720 1915 1436 +40720 1436 1519 +40720 1599 1840 +40720 1778 1532 +40720 1915 1519 +40720 1583 1510 +40720 1767 1489 +40720 1650 1762 +40740 1538 1903 +40740 1540 1641 +40740 1541 1533 +40740 1546 1468 +40740 1554 1457 +40740 1557 1487 +40740 1569 1520 +40740 1582 1593 +40740 1650 1668 +40740 1650 1743 +40740 1789 1915 +40740 1789 1436 +40740 1426 1459 +40740 1497 1526 +40740 1554 1629 +40740 1573 1452 +40740 1617 1623 +40740 1668 1743 +40740 1742 1520 +40740 1915 1523 +40740 1436 1523 +40740 1441 1464 +40740 1512 1531 +40740 1608 1530 +40740 1629 1716 +40740 1650 1463 +40740 1668 1463 +40740 1762 1463 +40740 1554 1716 +40740 1563 1592 +40740 1668 1762 +40740 1574 1778 +40740 1574 1532 +40740 1915 1436 +40740 1436 1519 +40740 1599 1840 +40740 1778 1532 +40740 1915 1519 +40740 1587 1535 +40740 1500 1511 +40740 1583 1510 +40740 1767 1489 +40740 1650 1762 +40760 1538 1574 +40760 1554 1629 +40760 1557 1606 +40760 1573 1452 +40760 1604 1518 +40760 1617 1623 +40760 1668 1743 +40760 1678 1527 +40760 1742 1520 +40760 1789 1525 +40760 1915 1523 +40760 1431 1468 +40760 1436 1523 +40760 1438 1501 +40760 1441 1464 +40760 1468 1516 +40760 1512 1531 +40760 1544 1529 +40760 1572 1871 +40760 1608 1530 +40760 1629 1716 +40760 1650 1463 +40760 1668 1463 +40760 1762 1463 +40760 1554 1716 +40760 1563 1592 +40760 1668 1762 +40760 1574 1778 +40760 1574 1532 +40760 1915 1436 +40760 1436 1519 +40760 1599 1840 +40760 1778 1532 +40760 1915 1519 +40760 1587 1535 +40760 1500 1511 +40760 1583 1510 +40760 1767 1489 +40760 1650 1762 +40780 1540 1641 +40780 1541 1847 +40780 1544 1529 +40780 1572 1871 +40780 1600 1825 +40780 1608 1530 +40780 1623 1464 +40780 1628 1668 +40780 1629 1716 +40780 1650 1463 +40780 1668 1463 +40780 1762 1463 +40780 1825 1499 +40780 1554 1716 +40780 1563 1592 +40780 1668 1762 +40780 1507 1522 +40780 1525 1529 +40780 1541 1533 +40780 1574 1778 +40780 1574 1532 +40780 1915 1436 +40780 1436 1519 +40780 1599 1840 +40780 1778 1532 +40780 1915 1519 +40780 1587 1535 +40780 1500 1511 +40780 1583 1510 +40780 1459 1503 +40780 1767 1489 +40780 1623 1441 +40780 1650 1762 +40800 1538 1604 +40800 1538 1574 +40800 1542 1598 +40800 1546 1468 +40800 1554 1716 +40800 1563 1592 +40800 1574 1604 +40800 1587 1598 +40800 1600 1519 +40800 1604 1778 +40800 1655 1743 +40800 1668 1762 +40800 1742 1520 +40800 1789 1529 +40800 1879 1527 +40800 1425 1433 +40800 1441 1527 +40800 1460 1499 +40800 1507 1522 +40800 1525 1529 +40800 1541 1533 +40800 1544 1525 +40800 1549 1600 +40800 1574 1778 +40800 1574 1532 +40800 1582 1593 +40800 1915 1436 +40800 1436 1519 +40800 1599 1840 +40800 1778 1532 +40800 1915 1519 +40800 1587 1535 +40800 1613 1622 +40800 1500 1511 +40800 1583 1510 +40800 1459 1503 +40800 1767 1489 +40800 1623 1441 +40800 1650 1762 +40820 1541 1533 +40820 1544 1525 +40820 1549 1600 +40820 1558 1608 +40820 1574 1778 +40820 1574 1532 +40820 1582 1593 +40820 1582 1527 +40820 1604 1532 +40820 1628 1650 +40820 1825 1915 +40820 1915 1436 +40820 1436 1519 +40820 1599 1840 +40820 1778 1532 +40820 1915 1519 +40820 1572 1871 +40820 1587 1535 +40820 1613 1622 +40820 1500 1511 +40820 1583 1510 +40820 1436 1525 +40820 1459 1503 +40820 1608 1530 +40820 1767 1489 +40820 1623 1441 +40820 1573 1452 +40820 1650 1762 +40840 1554 1444 +40840 1599 1840 +40840 1778 1532 +40840 1789 1879 +40840 1879 1487 +40840 1915 1519 +40840 1572 1871 +40840 1587 1535 +40840 1613 1622 +40840 1773 1520 +40840 1500 1511 +40840 1668 1762 +40840 1840 1489 +40840 1583 1510 +40840 1436 1525 +40840 1459 1503 +40840 1608 1530 +40840 1767 1489 +40840 1623 1441 +40840 1573 1452 +40840 1650 1762 +40860 1546 1468 +40860 1549 1525 +40860 1554 1623 +40860 1557 1606 +40860 1572 1871 +40860 1582 1593 +40860 1587 1535 +40860 1600 1879 +40860 1613 1622 +40860 1773 1520 +40860 1789 1915 +40860 1789 1525 +40860 1469 1527 +40860 1500 1511 +40860 1668 1762 +40860 1742 1520 +40860 1840 1489 +40860 1583 1510 +40860 1879 1436 +40860 1436 1525 +40860 1544 1915 +40860 1459 1503 +40860 1608 1530 +40860 1767 1840 +40860 1767 1489 +40860 1460 1499 +40860 1623 1441 +40860 1573 1452 +40860 1650 1762 +40880 1542 1598 +40880 1544 1519 +40880 1554 1602 +40880 1668 1762 +40880 1742 1520 +40880 1789 1523 +40880 1840 1489 +40880 1425 1535 +40880 1507 1522 +40880 1583 1510 +40880 1617 1623 +40880 1879 1436 +40880 1879 1525 +40880 1436 1525 +40880 1544 1915 +40880 1459 1503 +40880 1608 1530 +40880 1767 1840 +40880 1767 1489 +40880 1460 1499 +40880 1623 1441 +40880 1573 1452 +40880 1650 1762 +40900 1544 1523 +40900 1546 1468 +40900 1549 1879 +40900 1568 1634 +40900 1583 1510 +40900 1617 1441 +40900 1617 1623 +40900 1915 1519 +40900 1920 1466 +40900 1549 1436 +40900 1879 1436 +40900 1879 1525 +40900 1436 1525 +40900 1544 1915 +40900 1557 1606 +40900 1459 1503 +40900 1608 1530 +40900 1767 1840 +40900 1510 1523 +40900 1549 1525 +40900 1599 1652 +40900 1716 1469 +40900 1767 1489 +40900 1460 1499 +40900 1623 1441 +40900 1573 1452 +40900 1650 1762 +40920 1549 1436 +40920 1552 1453 +40920 1572 1871 +40920 1629 1535 +40920 1742 1520 +40920 1879 1436 +40920 1879 1525 +40920 1879 1510 +40920 1436 1525 +40920 1436 1460 +40920 1512 1531 +40920 1544 1915 +40920 1557 1606 +40920 1582 1593 +40920 1652 1655 +40920 1459 1503 +40920 1608 1920 +40920 1608 1530 +40920 1613 1622 +40920 1767 1840 +40920 1840 1489 +40920 1426 1459 +40920 1469 1514 +40920 1510 1523 +40920 1549 1525 +40920 1716 1900 +40920 1773 1527 +40920 1599 1747 +40920 1599 1652 +40920 1716 1469 +40920 1716 1514 +40920 1767 1489 +40920 1460 1499 +40920 1623 1441 +40920 1500 1511 +40920 1573 1452 +40920 1650 1762 +40940 1544 1915 +40940 1544 1519 +40940 1557 1606 +40940 1558 1465 +40940 1562 1436 +40940 1562 1879 +40940 1569 1520 +40940 1582 1593 +40940 1598 1920 +40940 1617 1441 +40940 1650 1463 +40940 1652 1655 +40940 1655 1747 +40940 1762 1463 +40940 1879 1917 +40940 1917 1436 +40940 1459 1503 +40940 1499 1510 +40940 1541 1533 +40940 1546 1468 +40940 1591 1872 +40940 1608 1920 +40940 1608 1530 +40940 1613 1622 +40940 1767 1840 +40940 1840 1489 +40940 1426 1459 +40940 1469 1514 +40940 1510 1523 +40940 1549 1525 +40940 1563 1592 +40940 1716 1900 +40940 1773 1527 +40940 1599 1747 +40940 1599 1652 +40940 1716 1469 +40940 1716 1514 +40940 1452 1522 +40940 1767 1489 +40940 1460 1499 +40940 1623 1441 +40940 1500 1511 +40940 1573 1452 +40940 1652 1747 +40940 1650 1762 +40960 1541 1533 +40960 1544 1789 +40960 1546 1468 +40960 1548 1516 +40960 1548 1431 +40960 1582 1773 +40960 1582 1527 +40960 1591 1872 +40960 1608 1920 +40960 1608 1530 +40960 1613 1622 +40960 1767 1840 +40960 1840 1489 +40960 1900 1469 +40960 1426 1459 +40960 1461 1495 +40960 1469 1514 +40960 1510 1523 +40960 1549 1525 +40960 1563 1592 +40960 1572 1871 +40960 1716 1900 +40960 1773 1527 +40960 1599 1747 +40960 1599 1652 +40960 1716 1469 +40960 1493 1532 +40960 1512 1531 +40960 1716 1514 +40960 1452 1522 +40960 1617 1623 +40960 1767 1489 +40960 1790 1493 +40960 1460 1499 +40960 1623 1441 +40960 1500 1511 +40960 1573 1452 +40960 1652 1747 +40960 1507 1522 +40960 1912 1493 +40960 1912 1532 +40960 1790 1912 +40960 1650 1762 +40980 1538 1912 +40980 1538 1790 +40980 1539 1558 +40980 1549 1525 +40980 1563 1592 +40980 1572 1871 +40980 1596 1520 +40980 1596 1617 +40980 1600 1825 +40980 1628 1463 +40980 1668 1762 +40980 1716 1900 +40980 1731 1912 +40980 1773 1527 +40980 1872 1879 +40980 1888 1916 +40980 1904 1459 +40980 1915 1523 +40980 1538 1916 +40980 1562 1593 +40980 1569 1520 +40980 1599 1747 +40980 1599 1652 +40980 1613 1626 +40980 1716 1469 +40980 1790 1532 +40980 1828 1493 +40980 1493 1532 +40980 1512 1531 +40980 1716 1514 +40980 1452 1522 +40980 1617 1623 +40980 1767 1489 +40980 1790 1493 +40980 1460 1499 +40980 1828 1532 +40980 1623 1441 +40980 1500 1511 +40980 1790 1916 +40980 1573 1452 +40980 1652 1747 +40980 1507 1522 +40980 1912 1493 +40980 1916 1493 +40980 1828 1912 +40980 1912 1532 +40980 1912 1916 +40980 1916 1532 +40980 1790 1828 +40980 1790 1912 +40980 1828 1916 +40980 1650 1762 +41000 1538 1916 +41000 1538 1532 +41000 1542 1920 +41000 1562 1593 +41000 1562 1525 +41000 1568 1535 +41000 1569 1520 +41000 1574 1513 +41000 1579 1591 +41000 1582 1527 +41000 1587 1535 +41000 1591 1872 +41000 1593 1525 +41000 1599 1747 +41000 1599 1652 +41000 1613 1626 +41000 1716 1469 +41000 1731 1805 +41000 1789 1433 +41000 1790 1532 +41000 1828 1493 +41000 1493 1532 +41000 1512 1531 +41000 1544 1523 +41000 1617 1441 +41000 1716 1514 +41000 1863 1493 +41000 1452 1522 +41000 1617 1623 +41000 1461 1495 +41000 1767 1489 +41000 1790 1493 +41000 1460 1499 +41000 1499 1510 +41000 1828 1532 +41000 1623 1441 +41000 1500 1511 +41000 1790 1916 +41000 1573 1452 +41000 1652 1747 +41000 1608 1530 +41000 1507 1522 +41000 1888 1493 +41000 1912 1493 +41000 1916 1493 +41000 1888 1532 +41000 1828 1912 +41000 1912 1532 +41000 1805 1532 +41000 1912 1916 +41000 1916 1532 +41000 1790 1828 +41000 1731 1863 +41000 1790 1912 +41000 1805 1888 +41000 1731 1888 +41000 1828 1916 +41000 1863 1888 +41000 1650 1762 +41020 1538 1828 +41020 1544 1915 +41020 1544 1523 +41020 1552 1593 +41020 1559 1458 +41020 1596 1617 +41020 1597 1528 +41020 1617 1441 +41020 1716 1848 +41020 1716 1514 +41020 1771 1437 +41020 1828 1863 +41020 1863 1493 +41020 1428 1520 +41020 1452 1522 +41020 1460 1510 +41020 1549 1525 +41020 1617 1623 +41020 1863 1912 +41020 1426 1459 +41020 1461 1495 +41020 1790 1805 +41020 1767 1489 +41020 1790 1493 +41020 1805 1912 +41020 1828 1888 +41020 1460 1499 +41020 1499 1510 +41020 1828 1532 +41020 1510 1523 +41020 1548 1431 +41020 1623 1441 +41020 1500 1511 +41020 1863 1532 +41020 1790 1916 +41020 1573 1452 +41020 1652 1747 +41020 1557 1606 +41020 1731 1532 +41020 1608 1530 +41020 1507 1522 +41020 1863 1916 +41020 1731 1912 +41020 1805 1493 +41020 1888 1493 +41020 1912 1493 +41020 1916 1493 +41020 1888 1532 +41020 1828 1912 +41020 1912 1532 +41020 1805 1828 +41020 1805 1532 +41020 1912 1916 +41020 1916 1532 +41020 1790 1828 +41020 1731 1863 +41020 1805 1863 +41020 1790 1912 +41020 1805 1888 +41020 1888 1912 +41020 1790 1888 +41020 1731 1888 +41020 1805 1916 +41020 1828 1916 +41020 1863 1888 +41020 1650 1762 +41040 1538 1888 +41040 1549 1525 +41040 1549 1919 +41040 1562 1903 +41040 1568 1599 +41040 1599 1612 +41040 1599 1655 +41040 1613 1871 +41040 1617 1623 +41040 1668 1762 +41040 1731 1493 +41040 1767 1840 +41040 1790 1863 +41040 1863 1912 +41040 1426 1459 +41040 1461 1495 +41040 1546 1468 +41040 1582 1449 +41040 1790 1805 +41040 1587 1535 +41040 1767 1489 +41040 1790 1493 +41040 1790 1532 +41040 1805 1912 +41040 1828 1888 +41040 1460 1499 +41040 1499 1510 +41040 1563 1592 +41040 1572 1871 +41040 1828 1532 +41040 1510 1523 +41040 1548 1431 +41040 1623 1441 +41040 1500 1511 +41040 1863 1532 +41040 1790 1916 +41040 1573 1452 +41040 1652 1747 +41040 1557 1606 +41040 1731 1532 +41040 1608 1530 +41040 1629 1519 +41040 1507 1522 +41040 1863 1916 +41040 1731 1912 +41040 1731 1790 +41040 1805 1493 +41040 1888 1493 +41040 1912 1493 +41040 1916 1493 +41040 1493 1532 +41040 1888 1532 +41040 1828 1912 +41040 1912 1532 +41040 1805 1828 +41040 1805 1532 +41040 1731 1828 +41040 1888 1916 +41040 1912 1916 +41040 1916 1532 +41040 1790 1828 +41040 1731 1863 +41040 1805 1863 +41040 1790 1912 +41040 1805 1888 +41040 1888 1912 +41040 1790 1888 +41040 1731 1888 +41040 1731 1805 +41040 1805 1916 +41040 1828 1916 +41040 1863 1888 +41040 1650 1762 +41040 1731 1916 +41060 1541 1555 +41060 1543 1521 +41060 1546 1468 +41060 1548 1516 +41060 1552 1527 +41060 1581 1847 +41060 1582 1449 +41060 1641 1900 +41060 1790 1805 +41060 1435 1535 +41060 1587 1535 +41060 1767 1489 +41060 1790 1493 +41060 1790 1532 +41060 1805 1912 +41060 1828 1888 +41060 1828 1493 +41060 1425 1431 +41060 1460 1499 +41060 1499 1510 +41060 1563 1592 +41060 1572 1871 +41060 1828 1532 +41060 1510 1523 +41060 1510 1525 +41060 1548 1431 +41060 1623 1441 +41060 1500 1511 +41060 1863 1532 +41060 1790 1916 +41060 1573 1452 +41060 1652 1747 +41060 1557 1606 +41060 1731 1532 +41060 1608 1530 +41060 1629 1519 +41060 1507 1522 +41060 1863 1916 +41060 1731 1912 +41060 1731 1790 +41060 1805 1493 +41060 1863 1493 +41060 1888 1493 +41060 1912 1493 +41060 1916 1493 +41060 1493 1532 +41060 1888 1532 +41060 1828 1912 +41060 1912 1532 +41060 1805 1828 +41060 1805 1532 +41060 1731 1828 +41060 1888 1916 +41060 1912 1916 +41060 1916 1532 +41060 1790 1828 +41060 1731 1863 +41060 1805 1863 +41060 1790 1912 +41060 1805 1888 +41060 1888 1912 +41060 1790 1888 +41060 1731 1888 +41060 1731 1805 +41060 1805 1916 +41060 1828 1916 +41060 1863 1888 +41060 1650 1762 +41060 1731 1916 +41080 1549 1460 +41080 1587 1535 +41080 1590 1465 +41080 1596 1617 +41080 1628 1428 +41080 1628 1463 +41080 1641 1459 +41080 1668 1762 +41080 1716 1514 +41080 1767 1489 +41080 1773 1527 +41080 1790 1493 +41080 1790 1532 +41080 1805 1912 +41080 1828 1888 +41080 1828 1493 +41080 1425 1431 +41080 1460 1499 +41080 1495 1501 +41080 1499 1510 +41080 1512 1531 +41080 1563 1592 +41080 1572 1871 +41080 1652 1498 +41080 1716 1848 +41080 1828 1532 +41080 1452 1522 +41080 1510 1523 +41080 1510 1525 +41080 1548 1431 +41080 1623 1441 +41080 1431 1516 +41080 1500 1511 +41080 1549 1525 +41080 1840 1489 +41080 1863 1532 +41080 1790 1916 +41080 1573 1452 +41080 1652 1747 +41080 1579 1919 +41080 1557 1606 +41080 1731 1532 +41080 1608 1530 +41080 1629 1519 +41080 1507 1522 +41080 1863 1916 +41080 1731 1912 +41080 1731 1790 +41080 1805 1493 +41080 1863 1493 +41080 1888 1493 +41080 1912 1493 +41080 1916 1493 +41080 1493 1532 +41080 1888 1532 +41080 1828 1912 +41080 1912 1532 +41080 1805 1828 +41080 1805 1532 +41080 1731 1828 +41080 1888 1916 +41080 1912 1916 +41080 1916 1532 +41080 1790 1828 +41080 1731 1863 +41080 1805 1863 +41080 1790 1912 +41080 1805 1888 +41080 1888 1912 +41080 1790 1888 +41080 1863 1912 +41080 1731 1888 +41080 1731 1805 +41080 1805 1916 +41080 1828 1916 +41080 1863 1888 +41080 1650 1762 +41080 1731 1916 +41100 1543 1521 +41100 1546 1468 +41100 1549 1499 +41100 1552 1527 +41100 1555 1533 +41100 1563 1592 +41100 1572 1871 +41100 1603 1495 +41100 1652 1498 +41100 1716 1848 +41100 1747 1498 +41100 1828 1532 +41100 1452 1522 +41100 1499 1525 +41100 1510 1523 +41100 1510 1525 +41100 1541 1555 +41100 1548 1431 +41100 1623 1441 +41100 1716 1771 +41100 1920 1530 +41100 1431 1516 +41100 1500 1511 +41100 1549 1525 +41100 1790 1863 +41100 1840 1489 +41100 1863 1532 +41100 1790 1916 +41100 1573 1452 +41100 1652 1747 +41100 1579 1919 +41100 1557 1606 +41100 1731 1532 +41100 1608 1530 +41100 1629 1519 +41100 1507 1522 +41100 1863 1916 +41100 1731 1912 +41100 1731 1790 +41100 1731 1493 +41100 1805 1493 +41100 1863 1493 +41100 1888 1493 +41100 1912 1493 +41100 1916 1493 +41100 1493 1532 +41100 1888 1532 +41100 1828 1912 +41100 1912 1532 +41100 1790 1805 +41100 1805 1828 +41100 1805 1532 +41100 1731 1828 +41100 1888 1916 +41100 1912 1916 +41100 1916 1532 +41100 1790 1828 +41100 1731 1863 +41100 1805 1863 +41100 1790 1912 +41100 1805 1888 +41100 1888 1912 +41100 1790 1888 +41100 1863 1912 +41100 1731 1888 +41100 1731 1805 +41100 1805 1916 +41100 1828 1916 +41100 1863 1888 +41100 1650 1762 +41100 1731 1916 +41120 1541 1555 +41120 1548 1431 +41120 1599 1449 +41120 1604 1616 +41120 1623 1441 +41120 1650 1428 +41120 1655 1842 +41120 1716 1771 +41120 1920 1530 +41120 1431 1516 +41120 1435 1535 +41120 1500 1511 +41120 1541 1533 +41120 1549 1525 +41120 1599 1842 +41120 1628 1428 +41120 1790 1863 +41120 1790 1532 +41120 1790 1493 +41120 1840 1489 +41120 1858 1522 +41120 1863 1532 +41120 1628 1668 +41120 1790 1916 +41120 1828 1888 +41120 1543 1808 +41120 1573 1452 +41120 1652 1747 +41120 1773 1527 +41120 1579 1919 +41120 1557 1606 +41120 1731 1532 +41120 1828 1493 +41120 1608 1530 +41120 1629 1519 +41120 1507 1522 +41120 1863 1916 +41120 1731 1912 +41120 1731 1790 +41120 1731 1493 +41120 1805 1493 +41120 1863 1493 +41120 1888 1493 +41120 1912 1493 +41120 1916 1493 +41120 1493 1532 +41120 1888 1532 +41120 1805 1912 +41120 1828 1912 +41120 1912 1532 +41120 1790 1805 +41120 1805 1828 +41120 1805 1532 +41120 1731 1828 +41120 1888 1916 +41120 1912 1916 +41120 1770 1842 +41120 1916 1532 +41120 1790 1828 +41120 1731 1863 +41120 1805 1863 +41120 1790 1912 +41120 1805 1888 +41120 1888 1912 +41120 1790 1888 +41120 1863 1912 +41120 1731 1888 +41120 1731 1805 +41120 1805 1916 +41120 1828 1916 +41120 1863 1888 +41120 1650 1762 +41120 1731 1916 +41120 1650 1668 +41140 1541 1533 +41140 1544 1599 +41140 1546 1468 +41140 1549 1523 +41140 1549 1525 +41140 1555 1533 +41140 1581 1789 +41140 1596 1520 +41140 1599 1770 +41140 1599 1842 +41140 1599 1460 +41140 1599 1525 +41140 1599 1655 +41140 1617 1495 +41140 1619 1436 +41140 1628 1428 +41140 1628 1762 +41140 1790 1863 +41140 1790 1532 +41140 1790 1493 +41140 1839 1495 +41140 1840 1489 +41140 1858 1522 +41140 1858 1452 +41140 1863 1532 +41140 1425 1431 +41140 1427 1495 +41140 1452 1522 +41140 1460 1499 +41140 1572 1871 +41140 1581 1510 +41140 1587 1535 +41140 1628 1650 +41140 1628 1668 +41140 1790 1916 +41140 1828 1888 +41140 1523 1525 +41140 1543 1808 +41140 1573 1452 +41140 1652 1747 +41140 1773 1527 +41140 1426 1459 +41140 1579 1919 +41140 1441 1464 +41140 1557 1606 +41140 1731 1532 +41140 1828 1493 +41140 1608 1530 +41140 1629 1519 +41140 1507 1522 +41140 1863 1916 +41140 1460 1525 +41140 1731 1912 +41140 1731 1790 +41140 1731 1493 +41140 1805 1493 +41140 1863 1493 +41140 1888 1493 +41140 1912 1493 +41140 1916 1493 +41140 1493 1532 +41140 1888 1532 +41140 1805 1912 +41140 1828 1912 +41140 1912 1532 +41140 1790 1805 +41140 1805 1828 +41140 1805 1532 +41140 1828 1532 +41140 1731 1828 +41140 1716 1848 +41140 1888 1916 +41140 1912 1916 +41140 1770 1842 +41140 1916 1532 +41140 1790 1828 +41140 1731 1863 +41140 1805 1863 +41140 1790 1912 +41140 1805 1888 +41140 1888 1912 +41140 1790 1888 +41140 1863 1912 +41140 1731 1888 +41140 1731 1805 +41140 1805 1916 +41140 1828 1916 +41140 1863 1888 +41140 1650 1762 +41140 1731 1916 +41140 1650 1668 +41160 1537 1568 +41160 1541 1555 +41160 1554 1581 +41160 1572 1871 +41160 1581 1510 +41160 1587 1535 +41160 1599 1523 +41160 1623 1495 +41160 1628 1650 +41160 1628 1668 +41160 1641 1900 +41160 1655 1770 +41160 1668 1428 +41160 1668 1463 +41160 1762 1428 +41160 1762 1463 +41160 1789 1842 +41160 1790 1916 +41160 1828 1888 +41160 1858 1496 +41160 1858 1505 +41160 1428 1463 +41160 1436 1441 +41160 1496 1505 +41160 1523 1525 +41160 1543 1808 +41160 1563 1469 +41160 1573 1452 +41160 1652 1747 +41160 1773 1527 +41160 1426 1459 +41160 1467 1513 +41160 1579 1919 +41160 1441 1464 +41160 1557 1606 +41160 1731 1532 +41160 1828 1493 +41160 1608 1530 +41160 1629 1519 +41160 1507 1522 +41160 1863 1916 +41160 1431 1516 +41160 1460 1525 +41160 1731 1912 +41160 1731 1790 +41160 1731 1493 +41160 1805 1493 +41160 1863 1493 +41160 1888 1493 +41160 1912 1493 +41160 1916 1493 +41160 1493 1532 +41160 1888 1532 +41160 1805 1912 +41160 1828 1912 +41160 1912 1532 +41160 1790 1805 +41160 1805 1828 +41160 1805 1532 +41160 1828 1532 +41160 1731 1828 +41160 1716 1848 +41160 1888 1916 +41160 1912 1916 +41160 1770 1842 +41160 1916 1532 +41160 1790 1828 +41160 1731 1863 +41160 1805 1863 +41160 1790 1912 +41160 1805 1888 +41160 1888 1912 +41160 1790 1888 +41160 1863 1912 +41160 1731 1888 +41160 1731 1805 +41160 1805 1916 +41160 1828 1916 +41160 1863 1888 +41160 1650 1762 +41160 1668 1762 +41160 1731 1916 +41160 1650 1668 +41180 1541 1533 +41180 1543 1808 +41180 1552 1513 +41180 1555 1533 +41180 1559 1469 +41180 1562 1603 +41180 1563 1469 +41180 1573 1452 +41180 1599 1600 +41180 1604 1616 +41180 1652 1747 +41180 1767 1489 +41180 1770 1789 +41180 1773 1527 +41180 1920 1530 +41180 1426 1459 +41180 1427 1526 +41180 1460 1523 +41180 1467 1513 +41180 1467 1527 +41180 1500 1511 +41180 1553 1599 +41180 1579 1919 +41180 1599 1761 +41180 1740 1761 +41180 1452 1522 +41180 1441 1464 +41180 1557 1606 +41180 1731 1532 +41180 1790 1863 +41180 1828 1493 +41180 1549 1825 +41180 1608 1530 +41180 1629 1519 +41180 1507 1522 +41180 1863 1916 +41180 1431 1516 +41180 1460 1525 +41180 1548 1431 +41180 1554 1568 +41180 1731 1912 +41180 1731 1790 +41180 1731 1493 +41180 1790 1493 +41180 1805 1493 +41180 1863 1493 +41180 1888 1493 +41180 1912 1493 +41180 1916 1493 +41180 1493 1532 +41180 1888 1532 +41180 1863 1532 +41180 1805 1912 +41180 1828 1912 +41180 1912 1532 +41180 1790 1532 +41180 1790 1805 +41180 1805 1828 +41180 1805 1532 +41180 1828 1532 +41180 1731 1828 +41180 1716 1848 +41180 1888 1916 +41180 1912 1916 +41180 1770 1842 +41180 1916 1532 +41180 1790 1828 +41180 1731 1863 +41180 1805 1863 +41180 1790 1912 +41180 1805 1888 +41180 1888 1912 +41180 1790 1888 +41180 1863 1912 +41180 1731 1888 +41180 1731 1805 +41180 1805 1916 +41180 1828 1916 +41180 1863 1888 +41180 1650 1762 +41180 1668 1762 +41180 1731 1916 +41180 1650 1668 +41200 1552 1773 +41200 1553 1599 +41200 1559 1563 +41200 1562 1436 +41200 1563 1581 +41200 1579 1919 +41200 1599 1740 +41200 1599 1761 +41200 1617 1441 +41200 1628 1463 +41200 1641 1773 +41200 1655 1761 +41200 1655 1676 +41200 1676 1761 +41200 1740 1761 +41200 1779 1505 +41200 1828 1888 +41200 1452 1522 +41200 1513 1527 +41200 1523 1525 +41200 1563 1592 +41200 1603 1443 +41200 1641 1871 +41200 1441 1464 +41200 1538 1774 +41200 1557 1606 +41200 1628 1428 +41200 1628 1650 +41200 1731 1532 +41200 1790 1863 +41200 1828 1493 +41200 1460 1499 +41200 1496 1505 +41200 1549 1825 +41200 1608 1530 +41200 1629 1519 +41200 1507 1522 +41200 1548 1516 +41200 1863 1916 +41200 1431 1516 +41200 1460 1525 +41200 1548 1431 +41200 1554 1568 +41200 1541 1555 +41200 1587 1535 +41200 1731 1912 +41200 1731 1790 +41200 1731 1493 +41200 1790 1493 +41200 1805 1493 +41200 1863 1493 +41200 1888 1493 +41200 1912 1493 +41200 1916 1493 +41200 1493 1532 +41200 1628 1762 +41200 1628 1668 +41200 1888 1532 +41200 1863 1532 +41200 1805 1912 +41200 1828 1912 +41200 1912 1532 +41200 1790 1532 +41200 1790 1805 +41200 1805 1828 +41200 1805 1532 +41200 1828 1532 +41200 1617 1464 +41200 1731 1828 +41200 1716 1848 +41200 1888 1916 +41200 1912 1916 +41200 1770 1842 +41200 1916 1532 +41200 1790 1828 +41200 1731 1863 +41200 1805 1863 +41200 1790 1912 +41200 1805 1888 +41200 1888 1912 +41200 1790 1888 +41200 1863 1912 +41200 1731 1888 +41200 1731 1805 +41200 1805 1916 +41200 1828 1916 +41200 1863 1888 +41200 1650 1762 +41200 1668 1762 +41200 1790 1916 +41200 1731 1916 +41200 1650 1668 +41220 1544 1762 +41220 1544 1599 +41220 1558 1441 +41220 1563 1592 +41220 1578 1779 +41220 1600 1659 +41220 1603 1443 +41220 1641 1871 +41220 1773 1527 +41220 1920 1530 +41220 1435 1496 +41220 1441 1464 +41220 1458 1510 +41220 1500 1511 +41220 1538 1774 +41220 1543 1808 +41220 1557 1606 +41220 1599 1700 +41220 1604 1616 +41220 1628 1428 +41220 1628 1650 +41220 1659 1700 +41220 1700 1757 +41220 1731 1532 +41220 1790 1863 +41220 1828 1493 +41220 1460 1499 +41220 1496 1505 +41220 1549 1825 +41220 1608 1530 +41220 1629 1519 +41220 1507 1522 +41220 1548 1516 +41220 1863 1916 +41220 1431 1516 +41220 1460 1525 +41220 1548 1431 +41220 1599 1757 +41220 1554 1568 +41220 1573 1522 +41220 1599 1659 +41220 1659 1757 +41220 1541 1555 +41220 1587 1535 +41220 1731 1912 +41220 1731 1790 +41220 1731 1493 +41220 1790 1493 +41220 1805 1493 +41220 1863 1493 +41220 1888 1493 +41220 1912 1493 +41220 1916 1493 +41220 1493 1532 +41220 1628 1762 +41220 1628 1668 +41220 1888 1532 +41220 1863 1532 +41220 1805 1912 +41220 1828 1912 +41220 1912 1532 +41220 1790 1532 +41220 1790 1805 +41220 1805 1828 +41220 1805 1532 +41220 1828 1532 +41220 1617 1464 +41220 1731 1828 +41220 1716 1848 +41220 1888 1916 +41220 1912 1916 +41220 1770 1842 +41220 1916 1532 +41220 1790 1828 +41220 1731 1863 +41220 1805 1863 +41220 1790 1912 +41220 1805 1888 +41220 1888 1912 +41220 1790 1888 +41220 1863 1912 +41220 1731 1888 +41220 1731 1805 +41220 1805 1916 +41220 1828 1916 +41220 1863 1888 +41220 1650 1762 +41220 1668 1762 +41220 1790 1916 +41220 1731 1916 +41220 1650 1668 +41240 1538 1774 +41240 1539 1500 +41240 1543 1808 +41240 1557 1606 +41240 1558 1840 +41240 1558 1489 +41240 1581 1465 +41240 1599 1700 +41240 1604 1616 +41240 1617 1441 +41240 1628 1428 +41240 1628 1650 +41240 1655 1740 +41240 1659 1700 +41240 1688 1700 +41240 1696 1700 +41240 1696 1523 +41240 1700 1831 +41240 1700 1523 +41240 1700 1757 +41240 1731 1532 +41240 1790 1863 +41240 1828 1493 +41240 1831 1523 +41240 1425 1431 +41240 1435 1505 +41240 1460 1499 +41240 1496 1505 +41240 1545 1430 +41240 1549 1825 +41240 1599 1628 +41240 1608 1530 +41240 1629 1519 +41240 1676 1740 +41240 1825 1525 +41240 1507 1522 +41240 1548 1516 +41240 1553 1599 +41240 1573 1452 +41240 1597 1857 +41240 1863 1916 +41240 1431 1516 +41240 1460 1525 +41240 1548 1431 +41240 1599 1757 +41240 1554 1568 +41240 1573 1522 +41240 1599 1696 +41240 1599 1688 +41240 1599 1659 +41240 1659 1696 +41240 1659 1688 +41240 1659 1757 +41240 1541 1555 +41240 1541 1533 +41240 1587 1535 +41240 1731 1912 +41240 1731 1790 +41240 1564 1470 +41240 1652 1747 +41240 1731 1493 +41240 1790 1493 +41240 1805 1493 +41240 1863 1493 +41240 1888 1493 +41240 1912 1493 +41240 1916 1493 +41240 1493 1532 +41240 1628 1762 +41240 1628 1668 +41240 1888 1532 +41240 1863 1532 +41240 1805 1912 +41240 1828 1912 +41240 1912 1532 +41240 1688 1696 +41240 1740 1761 +41240 1790 1532 +41240 1790 1805 +41240 1805 1828 +41240 1805 1532 +41240 1828 1532 +41240 1617 1464 +41240 1731 1828 +41240 1688 1757 +41240 1716 1848 +41240 1742 1513 +41240 1888 1916 +41240 1912 1916 +41240 1696 1757 +41240 1770 1842 +41240 1916 1532 +41240 1790 1828 +41240 1731 1863 +41240 1805 1863 +41240 1790 1912 +41240 1805 1888 +41240 1888 1912 +41240 1790 1888 +41240 1863 1912 +41240 1731 1888 +41240 1731 1805 +41240 1805 1916 +41240 1828 1916 +41240 1863 1888 +41240 1650 1762 +41240 1668 1762 +41240 1790 1916 +41240 1731 1916 +41240 1650 1668 +41260 1545 1430 +41260 1549 1696 +41260 1549 1825 +41260 1549 1688 +41260 1549 1757 +41260 1553 1688 +41260 1557 1425 +41260 1562 1449 +41260 1563 1590 +41260 1598 1427 +41260 1599 1628 +41260 1600 1659 +41260 1602 1469 +41260 1608 1530 +41260 1629 1519 +41260 1676 1740 +41260 1825 1529 +41260 1825 1525 +41260 1828 1888 +41260 1840 1489 +41260 1426 1459 +41260 1507 1522 +41260 1548 1516 +41260 1553 1599 +41260 1569 1513 +41260 1573 1452 +41260 1597 1857 +41260 1599 1600 +41260 1773 1527 +41260 1863 1916 +41260 1431 1516 +41260 1452 1522 +41260 1460 1525 +41260 1548 1431 +41260 1557 1431 +41260 1562 1603 +41260 1599 1757 +41260 1554 1568 +41260 1557 1516 +41260 1573 1522 +41260 1599 1696 +41260 1599 1688 +41260 1599 1659 +41260 1659 1696 +41260 1659 1688 +41260 1659 1757 +41260 1900 1519 +41260 1541 1555 +41260 1541 1533 +41260 1587 1535 +41260 1676 1761 +41260 1731 1912 +41260 1731 1790 +41260 1564 1470 +41260 1652 1747 +41260 1731 1493 +41260 1790 1493 +41260 1805 1493 +41260 1863 1493 +41260 1888 1493 +41260 1912 1493 +41260 1916 1493 +41260 1493 1532 +41260 1628 1762 +41260 1628 1668 +41260 1888 1532 +41260 1863 1532 +41260 1805 1912 +41260 1828 1912 +41260 1912 1532 +41260 1688 1696 +41260 1740 1761 +41260 1790 1532 +41260 1790 1805 +41260 1805 1828 +41260 1805 1532 +41260 1828 1532 +41260 1617 1464 +41260 1731 1828 +41260 1688 1757 +41260 1716 1848 +41260 1742 1513 +41260 1888 1916 +41260 1912 1916 +41260 1696 1757 +41260 1770 1842 +41260 1916 1532 +41260 1790 1828 +41260 1731 1863 +41260 1805 1863 +41260 1790 1912 +41260 1805 1888 +41260 1888 1912 +41260 1790 1888 +41260 1863 1912 +41260 1731 1888 +41260 1731 1805 +41260 1805 1916 +41260 1828 1916 +41260 1863 1888 +41260 1650 1762 +41260 1668 1762 +41260 1790 1916 +41260 1731 1916 +41260 1650 1668 +41280 1543 1808 +41280 1548 1516 +41280 1549 1529 +41280 1552 1773 +41280 1553 1599 +41280 1562 1443 +41280 1563 1592 +41280 1569 1513 +41280 1569 1742 +41280 1573 1452 +41280 1597 1857 +41280 1599 1600 +41280 1767 1489 +41280 1773 1527 +41280 1863 1916 +41280 1425 1516 +41280 1431 1516 +41280 1441 1489 +41280 1452 1522 +41280 1460 1525 +41280 1496 1505 +41280 1523 1525 +41280 1539 1581 +41280 1548 1431 +41280 1549 1525 +41280 1557 1606 +41280 1557 1431 +41280 1562 1603 +41280 1599 1757 +41280 1601 1920 +41280 1825 1523 +41280 1500 1511 +41280 1554 1568 +41280 1557 1516 +41280 1573 1522 +41280 1599 1696 +41280 1599 1688 +41280 1599 1659 +41280 1606 1516 +41280 1659 1696 +41280 1659 1688 +41280 1659 1757 +41280 1700 1525 +41280 1900 1519 +41280 1541 1555 +41280 1541 1533 +41280 1587 1535 +41280 1603 1443 +41280 1676 1761 +41280 1731 1912 +41280 1731 1790 +41280 1546 1468 +41280 1603 1449 +41280 1767 1840 +41280 1564 1470 +41280 1652 1747 +41280 1731 1493 +41280 1790 1493 +41280 1805 1493 +41280 1828 1493 +41280 1863 1493 +41280 1888 1493 +41280 1912 1493 +41280 1916 1493 +41280 1493 1532 +41280 1628 1428 +41280 1628 1762 +41280 1628 1668 +41280 1888 1532 +41280 1863 1532 +41280 1460 1499 +41280 1805 1912 +41280 1828 1912 +41280 1912 1532 +41280 1688 1696 +41280 1740 1761 +41280 1790 1532 +41280 1790 1805 +41280 1805 1828 +41280 1805 1532 +41280 1828 1532 +41280 1617 1464 +41280 1731 1828 +41280 1688 1757 +41280 1716 1848 +41280 1742 1513 +41280 1888 1916 +41280 1912 1916 +41280 1696 1757 +41280 1770 1842 +41280 1916 1532 +41280 1790 1828 +41280 1731 1863 +41280 1805 1863 +41280 1790 1912 +41280 1790 1863 +41280 1805 1888 +41280 1888 1912 +41280 1790 1888 +41280 1863 1912 +41280 1731 1888 +41280 1731 1805 +41280 1805 1916 +41280 1828 1916 +41280 1863 1888 +41280 1731 1532 +41280 1650 1762 +41280 1668 1762 +41280 1790 1916 +41280 1731 1916 +41280 1650 1668 +41300 1539 1581 +41300 1546 1558 +41300 1548 1557 +41300 1548 1431 +41300 1549 1688 +41300 1549 1525 +41300 1549 1583 +41300 1557 1606 +41300 1557 1431 +41300 1558 1596 +41300 1562 1603 +41300 1568 1578 +41300 1599 1757 +41300 1601 1920 +41300 1655 1676 +41300 1825 1523 +41300 1828 1888 +41300 1840 1489 +41300 1500 1511 +41300 1554 1568 +41300 1557 1516 +41300 1558 1468 +41300 1573 1522 +41300 1599 1696 +41300 1599 1688 +41300 1599 1659 +41300 1606 1516 +41300 1617 1441 +41300 1655 1740 +41300 1659 1696 +41300 1659 1688 +41300 1659 1757 +41300 1676 1740 +41300 1700 1825 +41300 1700 1523 +41300 1700 1525 +41300 1900 1519 +41300 1441 1464 +41300 1541 1555 +41300 1541 1533 +41300 1562 1449 +41300 1587 1535 +41300 1603 1443 +41300 1676 1761 +41300 1731 1912 +41300 1731 1790 +41300 1825 1525 +41300 1546 1468 +41300 1603 1449 +41300 1767 1840 +41300 1564 1470 +41300 1652 1747 +41300 1731 1493 +41300 1790 1493 +41300 1805 1493 +41300 1828 1493 +41300 1863 1493 +41300 1888 1493 +41300 1912 1493 +41300 1916 1493 +41300 1493 1532 +41300 1628 1428 +41300 1628 1762 +41300 1628 1668 +41300 1888 1532 +41300 1863 1532 +41300 1460 1499 +41300 1805 1912 +41300 1828 1912 +41300 1912 1532 +41300 1688 1696 +41300 1740 1761 +41300 1790 1532 +41300 1790 1805 +41300 1805 1828 +41300 1805 1532 +41300 1828 1532 +41300 1617 1464 +41300 1731 1828 +41300 1688 1757 +41300 1716 1848 +41300 1742 1513 +41300 1888 1916 +41300 1912 1916 +41300 1696 1757 +41300 1770 1842 +41300 1916 1532 +41300 1790 1828 +41300 1731 1863 +41300 1805 1863 +41300 1790 1912 +41300 1790 1863 +41300 1805 1888 +41300 1888 1912 +41300 1790 1888 +41300 1863 1912 +41300 1731 1888 +41300 1731 1805 +41300 1805 1916 +41300 1828 1916 +41300 1863 1888 +41300 1731 1532 +41300 1650 1762 +41300 1668 1762 +41300 1790 1916 +41300 1731 1916 +41300 1650 1668 +41320 1537 1463 +41320 1546 1470 +41320 1549 1700 +41320 1554 1568 +41320 1555 1533 +41320 1557 1516 +41320 1558 1468 +41320 1563 1592 +41320 1573 1522 +41320 1582 1455 +41320 1599 1696 +41320 1599 1688 +41320 1599 1659 +41320 1599 1700 +41320 1606 1516 +41320 1606 1431 +41320 1608 1530 +41320 1617 1441 +41320 1623 1857 +41320 1655 1761 +41320 1655 1740 +41320 1659 1696 +41320 1659 1688 +41320 1659 1757 +41320 1676 1740 +41320 1700 1825 +41320 1700 1523 +41320 1700 1525 +41320 1773 1527 +41320 1900 1519 +41320 1425 1516 +41320 1441 1464 +41320 1452 1522 +41320 1460 1525 +41320 1468 1470 +41320 1541 1555 +41320 1541 1533 +41320 1560 1580 +41320 1562 1449 +41320 1573 1452 +41320 1587 1535 +41320 1599 1600 +41320 1600 1831 +41320 1603 1443 +41320 1676 1761 +41320 1731 1912 +41320 1731 1790 +41320 1825 1525 +41320 1431 1516 +41320 1546 1468 +41320 1549 1523 +41320 1603 1449 +41320 1767 1840 +41320 1548 1516 +41320 1564 1470 +41320 1652 1747 +41320 1731 1493 +41320 1743 1441 +41320 1790 1493 +41320 1805 1493 +41320 1828 1493 +41320 1863 1493 +41320 1888 1493 +41320 1912 1493 +41320 1916 1493 +41320 1493 1532 +41320 1628 1428 +41320 1628 1762 +41320 1628 1668 +41320 1888 1532 +41320 1863 1532 +41320 1460 1499 +41320 1552 1527 +41320 1805 1912 +41320 1828 1912 +41320 1912 1532 +41320 1688 1696 +41320 1740 1761 +41320 1790 1532 +41320 1790 1805 +41320 1805 1828 +41320 1805 1532 +41320 1828 1532 +41320 1617 1464 +41320 1731 1828 +41320 1688 1757 +41320 1716 1848 +41320 1742 1513 +41320 1888 1916 +41320 1912 1916 +41320 1604 1616 +41320 1696 1757 +41320 1770 1842 +41320 1916 1532 +41320 1790 1828 +41320 1731 1863 +41320 1805 1863 +41320 1790 1912 +41320 1790 1863 +41320 1805 1888 +41320 1888 1912 +41320 1863 1916 +41320 1790 1888 +41320 1863 1912 +41320 1731 1888 +41320 1731 1805 +41320 1805 1916 +41320 1828 1916 +41320 1863 1888 +41320 1731 1532 +41320 1650 1762 +41320 1668 1762 +41320 1790 1916 +41320 1731 1916 +41320 1650 1668 +41340 1541 1555 +41340 1541 1533 +41340 1546 1558 +41340 1549 1599 +41340 1558 1470 +41340 1560 1580 +41340 1562 1449 +41340 1562 1603 +41340 1573 1452 +41340 1573 1598 +41340 1587 1535 +41340 1591 1858 +41340 1598 1452 +41340 1599 1600 +41340 1599 1523 +41340 1600 1831 +41340 1603 1443 +41340 1676 1761 +41340 1731 1912 +41340 1731 1790 +41340 1825 1525 +41340 1840 1489 +41340 1431 1516 +41340 1500 1511 +41340 1523 1525 +41340 1546 1468 +41340 1549 1523 +41340 1549 1525 +41340 1556 1700 +41340 1597 1857 +41340 1599 1757 +41340 1603 1449 +41340 1767 1840 +41340 1452 1465 +41340 1548 1516 +41340 1564 1470 +41340 1652 1747 +41340 1731 1493 +41340 1743 1441 +41340 1790 1493 +41340 1805 1493 +41340 1828 1493 +41340 1863 1493 +41340 1888 1493 +41340 1912 1493 +41340 1916 1493 +41340 1493 1532 +41340 1628 1428 +41340 1628 1762 +41340 1628 1668 +41340 1655 1676 +41340 1888 1532 +41340 1863 1532 +41340 1460 1499 +41340 1552 1527 +41340 1659 1523 +41340 1805 1912 +41340 1828 1912 +41340 1912 1532 +41340 1688 1696 +41340 1740 1761 +41340 1790 1532 +41340 1790 1805 +41340 1805 1828 +41340 1805 1532 +41340 1828 1532 +41340 1601 1920 +41340 1617 1464 +41340 1731 1828 +41340 1688 1757 +41340 1716 1848 +41340 1742 1513 +41340 1888 1916 +41340 1912 1916 +41340 1604 1616 +41340 1696 1757 +41340 1770 1842 +41340 1916 1532 +41340 1790 1828 +41340 1731 1863 +41340 1805 1863 +41340 1790 1912 +41340 1790 1863 +41340 1805 1888 +41340 1888 1912 +41340 1863 1916 +41340 1790 1888 +41340 1863 1912 +41340 1731 1888 +41340 1731 1805 +41340 1805 1916 +41340 1828 1916 +41340 1863 1888 +41340 1731 1532 +41340 1650 1762 +41340 1668 1762 +41340 1790 1916 +41340 1731 1916 +41340 1650 1668 +41360 1537 1463 +41360 1546 1468 +41360 1548 1431 +41360 1549 1523 +41360 1549 1525 +41360 1554 1535 +41360 1556 1700 +41360 1583 1831 +41360 1596 1700 +41360 1596 1831 +41360 1597 1857 +41360 1599 1688 +41360 1599 1696 +41360 1599 1757 +41360 1603 1449 +41360 1655 1761 +41360 1659 1825 +41360 1700 1525 +41360 1767 1840 +41360 1831 1529 +41360 1452 1465 +41360 1496 1505 +41360 1499 1525 +41360 1548 1516 +41360 1549 1825 +41360 1564 1470 +41360 1628 1650 +41360 1652 1747 +41360 1731 1493 +41360 1743 1441 +41360 1773 1527 +41360 1790 1493 +41360 1805 1493 +41360 1828 1493 +41360 1831 1523 +41360 1863 1493 +41360 1888 1493 +41360 1912 1493 +41360 1916 1493 +41360 1426 1459 +41360 1493 1532 +41360 1628 1428 +41360 1628 1762 +41360 1628 1668 +41360 1655 1676 +41360 1888 1532 +41360 1900 1519 +41360 1863 1532 +41360 1460 1499 +41360 1552 1527 +41360 1659 1523 +41360 1805 1912 +41360 1828 1912 +41360 1912 1532 +41360 1688 1696 +41360 1740 1761 +41360 1790 1532 +41360 1790 1805 +41360 1805 1828 +41360 1805 1532 +41360 1828 1532 +41360 1601 1920 +41360 1617 1464 +41360 1731 1828 +41360 1688 1757 +41360 1716 1848 +41360 1742 1513 +41360 1888 1916 +41360 1912 1916 +41360 1604 1616 +41360 1696 1757 +41360 1770 1842 +41360 1916 1532 +41360 1790 1828 +41360 1731 1863 +41360 1805 1863 +41360 1790 1912 +41360 1790 1863 +41360 1805 1888 +41360 1888 1912 +41360 1863 1916 +41360 1790 1888 +41360 1863 1912 +41360 1731 1888 +41360 1731 1805 +41360 1805 1916 +41360 1828 1916 +41360 1863 1888 +41360 1731 1532 +41360 1650 1762 +41360 1668 1762 +41360 1790 1916 +41360 1731 1916 +41360 1650 1668 +41380 1537 1428 +41380 1548 1516 +41380 1549 1825 +41380 1549 1599 +41380 1550 1501 +41380 1564 1470 +41380 1573 1452 +41380 1583 1523 +41380 1599 1761 +41380 1617 1857 +41380 1628 1650 +41380 1652 1747 +41380 1700 1497 +41380 1716 1871 +41380 1731 1493 +41380 1743 1857 +41380 1743 1441 +41380 1773 1527 +41380 1790 1493 +41380 1805 1493 +41380 1828 1493 +41380 1831 1523 +41380 1863 1493 +41380 1888 1493 +41380 1912 1493 +41380 1916 1493 +41380 1426 1459 +41380 1431 1516 +41380 1493 1532 +41380 1538 1493 +41380 1543 1634 +41380 1549 1696 +41380 1549 1553 +41380 1549 1688 +41380 1549 1757 +41380 1613 1437 +41380 1628 1428 +41380 1628 1762 +41380 1628 1668 +41380 1655 1676 +41380 1655 1740 +41380 1888 1532 +41380 1900 1519 +41380 1460 1525 +41380 1500 1511 +41380 1512 1531 +41380 1591 1858 +41380 1825 1525 +41380 1863 1532 +41380 1460 1499 +41380 1552 1527 +41380 1659 1523 +41380 1805 1912 +41380 1558 1468 +41380 1828 1912 +41380 1912 1532 +41380 1676 1740 +41380 1688 1696 +41380 1740 1761 +41380 1790 1532 +41380 1790 1805 +41380 1805 1828 +41380 1805 1532 +41380 1828 1532 +41380 1601 1920 +41380 1617 1464 +41380 1676 1761 +41380 1731 1828 +41380 1828 1888 +41380 1688 1757 +41380 1716 1848 +41380 1742 1513 +41380 1731 1912 +41380 1888 1916 +41380 1912 1916 +41380 1604 1616 +41380 1696 1757 +41380 1770 1842 +41380 1916 1532 +41380 1790 1828 +41380 1731 1863 +41380 1805 1863 +41380 1790 1912 +41380 1731 1790 +41380 1790 1863 +41380 1805 1888 +41380 1888 1912 +41380 1863 1916 +41380 1790 1888 +41380 1863 1912 +41380 1731 1888 +41380 1731 1805 +41380 1805 1916 +41380 1828 1916 +41380 1863 1888 +41380 1731 1532 +41380 1650 1762 +41380 1668 1762 +41380 1790 1916 +41380 1731 1916 +41380 1650 1668 +41400 1537 1688 +41400 1538 1493 +41400 1543 1634 +41400 1549 1696 +41400 1549 1553 +41400 1549 1688 +41400 1549 1757 +41400 1568 1535 +41400 1592 1458 +41400 1599 1688 +41400 1599 1523 +41400 1608 1530 +41400 1613 1437 +41400 1628 1428 +41400 1628 1762 +41400 1628 1668 +41400 1641 1858 +41400 1655 1676 +41400 1655 1740 +41400 1700 1452 +41400 1767 1840 +41400 1831 1529 +41400 1888 1532 +41400 1900 1519 +41400 1460 1525 +41400 1465 1501 +41400 1499 1525 +41400 1500 1511 +41400 1512 1531 +41400 1537 1668 +41400 1555 1533 +41400 1556 1523 +41400 1569 1520 +41400 1591 1858 +41400 1603 1449 +41400 1700 1528 +41400 1825 1525 +41400 1863 1532 +41400 1460 1499 +41400 1541 1555 +41400 1552 1527 +41400 1573 1523 +41400 1587 1535 +41400 1659 1523 +41400 1805 1912 +41400 1831 1499 +41400 1496 1505 +41400 1537 1628 +41400 1558 1468 +41400 1828 1912 +41400 1912 1532 +41400 1676 1740 +41400 1688 1696 +41400 1740 1761 +41400 1790 1532 +41400 1790 1805 +41400 1805 1828 +41400 1805 1532 +41400 1828 1532 +41400 1563 1592 +41400 1601 1920 +41400 1617 1464 +41400 1676 1761 +41400 1731 1828 +41400 1828 1888 +41400 1688 1757 +41400 1716 1848 +41400 1742 1513 +41400 1731 1912 +41400 1888 1916 +41400 1912 1916 +41400 1604 1616 +41400 1696 1757 +41400 1770 1842 +41400 1916 1532 +41400 1790 1828 +41400 1731 1863 +41400 1805 1863 +41400 1790 1912 +41400 1731 1790 +41400 1790 1863 +41400 1805 1888 +41400 1888 1912 +41400 1863 1916 +41400 1790 1888 +41400 1863 1912 +41400 1731 1888 +41400 1731 1805 +41400 1805 1916 +41400 1828 1916 +41400 1863 1888 +41400 1731 1532 +41400 1650 1762 +41400 1668 1762 +41400 1790 1916 +41400 1731 1916 +41400 1650 1668 +41420 1537 1668 +41420 1544 1573 +41420 1546 1779 +41420 1552 1562 +41420 1555 1533 +41420 1556 1523 +41420 1569 1520 +41420 1587 1458 +41420 1591 1858 +41420 1603 1449 +41420 1606 1496 +41420 1700 1528 +41420 1743 1441 +41420 1761 1770 +41420 1825 1525 +41420 1831 1460 +41420 1863 1532 +41420 1458 1535 +41420 1459 1520 +41420 1460 1499 +41420 1470 1513 +41420 1523 1525 +41420 1541 1555 +41420 1552 1527 +41420 1573 1523 +41420 1587 1535 +41420 1659 1523 +41420 1805 1912 +41420 1828 1863 +41420 1831 1499 +41420 1496 1505 +41420 1537 1628 +41420 1537 1762 +41420 1558 1468 +41420 1828 1912 +41420 1912 1532 +41420 1676 1740 +41420 1688 1696 +41420 1740 1761 +41420 1790 1532 +41420 1790 1805 +41420 1805 1828 +41420 1805 1532 +41420 1828 1532 +41420 1563 1592 +41420 1601 1920 +41420 1617 1464 +41420 1676 1761 +41420 1731 1828 +41420 1828 1888 +41420 1688 1757 +41420 1716 1848 +41420 1603 1531 +41420 1742 1513 +41420 1731 1912 +41420 1888 1916 +41420 1912 1916 +41420 1604 1616 +41420 1696 1757 +41420 1770 1842 +41420 1916 1532 +41420 1790 1828 +41420 1731 1863 +41420 1805 1863 +41420 1790 1912 +41420 1731 1790 +41420 1790 1863 +41420 1805 1888 +41420 1888 1912 +41420 1863 1916 +41420 1790 1888 +41420 1863 1912 +41420 1731 1888 +41420 1731 1805 +41420 1805 1916 +41420 1828 1916 +41420 1863 1888 +41420 1731 1532 +41420 1650 1762 +41420 1668 1762 +41420 1790 1916 +41420 1731 1916 +41420 1650 1668 +41440 1537 1757 +41440 1538 1888 +41440 1538 1916 +41440 1538 1805 +41440 1541 1555 +41440 1544 1831 +41440 1549 1757 +41440 1550 1630 +41440 1552 1527 +41440 1553 1599 +41440 1554 1528 +41440 1554 1700 +41440 1554 1463 +41440 1559 1700 +41440 1573 1523 +41440 1587 1535 +41440 1599 1696 +41440 1599 1688 +41440 1599 1757 +41440 1613 1700 +41440 1626 1857 +41440 1655 1688 +41440 1655 1831 +41440 1659 1523 +41440 1757 1499 +41440 1761 1831 +41440 1805 1912 +41440 1828 1863 +41440 1831 1499 +41440 1900 1519 +41440 1496 1505 +41440 1537 1628 +41440 1543 1634 +41440 1544 1583 +41440 1568 1596 +41440 1613 1459 +41440 1767 1489 +41440 1431 1516 +41440 1470 1527 +41440 1537 1762 +41440 1558 1468 +41440 1562 1641 +41440 1562 1470 +41440 1828 1912 +41440 1912 1532 +41440 1676 1740 +41440 1688 1696 +41440 1740 1761 +41440 1790 1532 +41440 1790 1805 +41440 1805 1828 +41440 1805 1532 +41440 1828 1532 +41440 1512 1531 +41440 1563 1592 +41440 1601 1920 +41440 1617 1464 +41440 1676 1761 +41440 1731 1828 +41440 1828 1888 +41440 1688 1757 +41440 1716 1848 +41440 1603 1531 +41440 1742 1513 +41440 1731 1912 +41440 1888 1916 +41440 1912 1916 +41440 1604 1616 +41440 1696 1757 +41440 1770 1842 +41440 1460 1525 +41440 1916 1532 +41440 1499 1525 +41440 1790 1828 +41440 1731 1863 +41440 1805 1863 +41440 1790 1912 +41440 1731 1790 +41440 1790 1863 +41440 1805 1888 +41440 1888 1912 +41440 1863 1916 +41440 1790 1888 +41440 1863 1912 +41440 1731 1888 +41440 1731 1805 +41440 1805 1916 +41440 1828 1916 +41440 1863 1888 +41440 1731 1532 +41440 1650 1762 +41440 1668 1762 +41440 1790 1916 +41440 1731 1916 +41440 1650 1668 +41460 1537 1628 +41460 1539 1469 +41460 1543 1634 +41460 1544 1583 +41460 1548 1590 +41460 1548 1431 +41460 1554 1448 +41460 1554 1452 +41460 1568 1596 +41460 1582 1688 +41460 1582 1676 +41460 1591 1858 +41460 1596 1879 +41460 1603 1512 +41460 1613 1459 +41460 1747 1514 +41460 1747 1871 +41460 1767 1840 +41460 1767 1489 +41460 1431 1516 +41460 1470 1527 +41460 1537 1762 +41460 1549 1553 +41460 1555 1533 +41460 1556 1825 +41460 1558 1468 +41460 1562 1641 +41460 1562 1470 +41460 1582 1761 +41460 1603 1449 +41460 1773 1527 +41460 1828 1912 +41460 1863 1532 +41460 1888 1532 +41460 1912 1532 +41460 1449 1531 +41460 1628 1762 +41460 1676 1740 +41460 1688 1696 +41460 1740 1761 +41460 1790 1532 +41460 1790 1805 +41460 1805 1828 +41460 1805 1532 +41460 1828 1532 +41460 1512 1531 +41460 1563 1592 +41460 1601 1920 +41460 1617 1464 +41460 1676 1761 +41460 1731 1828 +41460 1828 1888 +41460 1434 1469 +41460 1628 1668 +41460 1688 1757 +41460 1716 1848 +41460 1460 1499 +41460 1603 1531 +41460 1742 1513 +41460 1731 1912 +41460 1840 1489 +41460 1888 1916 +41460 1912 1916 +41460 1604 1616 +41460 1696 1757 +41460 1770 1842 +41460 1460 1525 +41460 1916 1532 +41460 1499 1525 +41460 1790 1828 +41460 1443 1523 +41460 1731 1863 +41460 1805 1863 +41460 1790 1912 +41460 1731 1790 +41460 1790 1863 +41460 1805 1888 +41460 1888 1912 +41460 1863 1916 +41460 1790 1888 +41460 1863 1912 +41460 1731 1888 +41460 1731 1805 +41460 1805 1916 +41460 1828 1916 +41460 1863 1888 +41460 1731 1532 +41460 1650 1762 +41460 1668 1762 +41460 1790 1916 +41460 1731 1916 +41460 1650 1668 +41480 1537 1762 +41480 1537 1650 +41480 1549 1553 +41480 1555 1533 +41480 1556 1825 +41480 1558 1468 +41480 1559 1840 +41480 1559 1489 +41480 1562 1641 +41480 1562 1470 +41480 1573 1443 +41480 1573 1523 +41480 1582 1761 +41480 1582 1740 +41480 1582 1500 +41480 1603 1449 +41480 1617 1441 +41480 1619 1496 +41480 1619 1505 +41480 1655 1688 +41480 1678 1847 +41480 1773 1527 +41480 1828 1863 +41480 1828 1912 +41480 1858 1470 +41480 1863 1532 +41480 1888 1532 +41480 1900 1519 +41480 1912 1532 +41480 1449 1531 +41480 1569 1520 +41480 1590 1602 +41480 1628 1762 +41480 1628 1650 +41480 1676 1740 +41480 1688 1696 +41480 1740 1761 +41480 1790 1532 +41480 1790 1805 +41480 1805 1828 +41480 1805 1532 +41480 1825 1443 +41480 1828 1532 +41480 1512 1531 +41480 1541 1555 +41480 1541 1533 +41480 1563 1592 +41480 1601 1920 +41480 1617 1464 +41480 1676 1761 +41480 1731 1828 +41480 1828 1888 +41480 1434 1469 +41480 1544 1599 +41480 1599 1659 +41480 1628 1668 +41480 1688 1757 +41480 1716 1848 +41480 1460 1499 +41480 1603 1531 +41480 1742 1513 +41480 1731 1912 +41480 1840 1489 +41480 1888 1916 +41480 1912 1916 +41480 1604 1616 +41480 1696 1757 +41480 1770 1842 +41480 1460 1525 +41480 1916 1532 +41480 1499 1525 +41480 1544 1659 +41480 1790 1828 +41480 1443 1523 +41480 1731 1863 +41480 1805 1863 +41480 1790 1912 +41480 1731 1790 +41480 1790 1863 +41480 1805 1888 +41480 1888 1912 +41480 1863 1916 +41480 1790 1888 +41480 1863 1912 +41480 1731 1888 +41480 1731 1805 +41480 1805 1916 +41480 1828 1916 +41480 1863 1888 +41480 1731 1532 +41480 1650 1762 +41480 1668 1762 +41480 1790 1916 +41480 1731 1916 +41480 1650 1668 +41500 1537 1628 +41500 1543 1634 +41500 1569 1520 +41500 1578 1501 +41500 1590 1602 +41500 1628 1762 +41500 1628 1650 +41500 1676 1740 +41500 1688 1696 +41500 1740 1761 +41500 1774 1888 +41500 1790 1532 +41500 1790 1805 +41500 1805 1828 +41500 1805 1532 +41500 1825 1443 +41500 1828 1532 +41500 1500 1511 +41500 1512 1531 +41500 1523 1529 +41500 1541 1555 +41500 1541 1533 +41500 1563 1592 +41500 1583 1825 +41500 1601 1920 +41500 1617 1464 +41500 1676 1761 +41500 1731 1828 +41500 1828 1888 +41500 1431 1516 +41500 1434 1469 +41500 1496 1505 +41500 1544 1599 +41500 1599 1659 +41500 1628 1668 +41500 1688 1757 +41500 1716 1848 +41500 1919 1510 +41500 1460 1499 +41500 1603 1531 +41500 1742 1513 +41500 1805 1912 +41500 1546 1468 +41500 1587 1535 +41500 1731 1912 +41500 1840 1489 +41500 1888 1524 +41500 1888 1916 +41500 1912 1916 +41500 1549 1443 +41500 1604 1616 +41500 1696 1757 +41500 1770 1842 +41500 1460 1525 +41500 1591 1858 +41500 1916 1532 +41500 1499 1525 +41500 1544 1659 +41500 1790 1828 +41500 1443 1523 +41500 1549 1523 +41500 1731 1863 +41500 1805 1863 +41500 1790 1912 +41500 1731 1790 +41500 1790 1863 +41500 1805 1888 +41500 1888 1912 +41500 1863 1916 +41500 1790 1888 +41500 1863 1912 +41500 1731 1888 +41500 1731 1805 +41500 1805 1916 +41500 1828 1916 +41500 1863 1888 +41500 1731 1532 +41500 1650 1762 +41500 1668 1762 +41500 1790 1916 +41500 1731 1916 +41500 1650 1668 +41520 1537 1762 +41520 1541 1555 +41520 1541 1533 +41520 1555 1533 +41520 1562 1678 +41520 1563 1592 +41520 1583 1825 +41520 1599 1825 +41520 1599 1770 +41520 1601 1920 +41520 1606 1516 +41520 1606 1431 +41520 1617 1464 +41520 1676 1761 +41520 1731 1828 +41520 1828 1888 +41520 1828 1863 +41520 1900 1519 +41520 1431 1516 +41520 1434 1469 +41520 1442 1455 +41520 1449 1531 +41520 1496 1505 +41520 1524 1532 +41520 1539 1599 +41520 1544 1599 +41520 1599 1659 +41520 1613 1495 +41520 1628 1668 +41520 1655 1688 +41520 1688 1757 +41520 1716 1848 +41520 1773 1527 +41520 1919 1510 +41520 1460 1499 +41520 1603 1531 +41520 1742 1513 +41520 1805 1912 +41520 1857 1470 +41520 1912 1524 +41520 1916 1524 +41520 1546 1468 +41520 1587 1535 +41520 1731 1524 +41520 1731 1912 +41520 1805 1524 +41520 1828 1912 +41520 1840 1489 +41520 1888 1524 +41520 1888 1916 +41520 1912 1916 +41520 1549 1443 +41520 1604 1616 +41520 1696 1757 +41520 1770 1842 +41520 1912 1532 +41520 1460 1525 +41520 1591 1858 +41520 1863 1524 +41520 1916 1532 +41520 1499 1525 +41520 1538 1524 +41520 1544 1659 +41520 1790 1828 +41520 1443 1523 +41520 1549 1523 +41520 1731 1863 +41520 1805 1863 +41520 1790 1912 +41520 1731 1790 +41520 1790 1863 +41520 1805 1888 +41520 1888 1912 +41520 1863 1916 +41520 1790 1888 +41520 1863 1912 +41520 1731 1888 +41520 1731 1805 +41520 1805 1916 +41520 1828 1916 +41520 1863 1888 +41520 1731 1532 +41520 1650 1762 +41520 1668 1762 +41520 1790 1916 +41520 1731 1916 +41520 1650 1668 +41540 1537 1463 +41540 1539 1599 +41540 1544 1599 +41540 1553 1706 +41540 1569 1596 +41540 1582 1535 +41540 1596 1469 +41540 1599 1659 +41540 1603 1449 +41540 1613 1495 +41540 1628 1668 +41540 1655 1688 +41540 1688 1757 +41540 1716 1848 +41540 1767 1489 +41540 1773 1527 +41540 1919 1510 +41540 1460 1499 +41540 1487 1500 +41540 1552 1527 +41540 1603 1531 +41540 1609 1471 +41540 1742 1513 +41540 1774 1888 +41540 1805 1912 +41540 1857 1470 +41540 1912 1524 +41540 1916 1524 +41540 1546 1468 +41540 1583 1599 +41540 1587 1535 +41540 1599 1529 +41540 1731 1524 +41540 1731 1912 +41540 1805 1524 +41540 1828 1912 +41540 1828 1532 +41540 1840 1489 +41540 1888 1524 +41540 1888 1916 +41540 1912 1916 +41540 1539 1544 +41540 1549 1443 +41540 1604 1616 +41540 1696 1757 +41540 1706 1766 +41540 1770 1842 +41540 1912 1532 +41540 1460 1525 +41540 1591 1858 +41540 1863 1524 +41540 1916 1532 +41540 1499 1525 +41540 1538 1524 +41540 1544 1659 +41540 1790 1828 +41540 1443 1523 +41540 1549 1523 +41540 1731 1863 +41540 1805 1863 +41540 1790 1805 +41540 1790 1912 +41540 1731 1790 +41540 1790 1532 +41540 1888 1532 +41540 1790 1863 +41540 1805 1888 +41540 1888 1912 +41540 1863 1916 +41540 1790 1888 +41540 1805 1828 +41540 1863 1912 +41540 1731 1888 +41540 1731 1805 +41540 1805 1532 +41540 1805 1916 +41540 1828 1916 +41540 1863 1888 +41540 1731 1532 +41540 1650 1762 +41540 1668 1762 +41540 1790 1916 +41540 1731 1916 +41540 1650 1668 +41560 1552 1527 +41560 1582 1496 +41560 1596 1441 +41560 1603 1531 +41560 1609 1471 +41560 1700 1504 +41560 1742 1513 +41560 1767 1840 +41560 1770 1501 +41560 1774 1888 +41560 1805 1912 +41560 1857 1470 +41560 1912 1524 +41560 1916 1524 +41560 1431 1516 +41560 1455 1487 +41560 1539 1659 +41560 1546 1468 +41560 1563 1592 +41560 1583 1599 +41560 1587 1535 +41560 1648 1706 +41560 1498 1526 +41560 1599 1529 +41560 1648 1766 +41560 1731 1524 +41560 1731 1912 +41560 1805 1524 +41560 1828 1912 +41560 1828 1532 +41560 1840 1489 +41560 1888 1524 +41560 1888 1916 +41560 1912 1916 +41560 1539 1544 +41560 1549 1443 +41560 1559 1604 +41560 1604 1616 +41560 1696 1757 +41560 1706 1766 +41560 1770 1842 +41560 1912 1532 +41560 1460 1525 +41560 1591 1858 +41560 1863 1524 +41560 1916 1532 +41560 1499 1525 +41560 1731 1828 +41560 1538 1524 +41560 1541 1555 +41560 1544 1659 +41560 1578 1920 +41560 1790 1828 +41560 1443 1523 +41560 1549 1523 +41560 1688 1457 +41560 1900 1519 +41560 1731 1863 +41560 1805 1863 +41560 1790 1805 +41560 1790 1912 +41560 1731 1790 +41560 1790 1532 +41560 1888 1532 +41560 1541 1533 +41560 1790 1863 +41560 1805 1888 +41560 1863 1532 +41560 1888 1912 +41560 1863 1916 +41560 1617 1464 +41560 1790 1888 +41560 1805 1828 +41560 1863 1912 +41560 1731 1888 +41560 1731 1805 +41560 1805 1532 +41560 1805 1916 +41560 1828 1916 +41560 1863 1888 +41560 1731 1532 +41560 1650 1762 +41560 1668 1762 +41560 1790 1916 +41560 1731 1916 +41560 1650 1668 +41580 1539 1659 +41580 1543 1634 +41580 1546 1468 +41580 1546 1558 +41580 1563 1592 +41580 1583 1599 +41580 1587 1535 +41580 1596 1773 +41580 1601 1920 +41580 1648 1706 +41580 1740 1431 +41580 1783 1461 +41580 1426 1459 +41580 1498 1526 +41580 1596 1641 +41580 1599 1529 +41580 1648 1766 +41580 1731 1524 +41580 1731 1912 +41580 1805 1524 +41580 1828 1912 +41580 1828 1532 +41580 1840 1489 +41580 1888 1524 +41580 1888 1916 +41580 1912 1916 +41580 1539 1544 +41580 1549 1443 +41580 1559 1604 +41580 1604 1616 +41580 1696 1757 +41580 1706 1766 +41580 1770 1842 +41580 1912 1532 +41580 1460 1525 +41580 1591 1858 +41580 1863 1524 +41580 1916 1532 +41580 1499 1525 +41580 1731 1828 +41580 1538 1524 +41580 1541 1555 +41580 1544 1659 +41580 1578 1920 +41580 1790 1828 +41580 1443 1523 +41580 1549 1523 +41580 1688 1457 +41580 1900 1519 +41580 1731 1863 +41580 1805 1863 +41580 1790 1805 +41580 1790 1912 +41580 1731 1790 +41580 1790 1532 +41580 1888 1532 +41580 1541 1533 +41580 1919 1510 +41580 1790 1863 +41580 1805 1888 +41580 1863 1532 +41580 1888 1912 +41580 1863 1916 +41580 1617 1464 +41580 1790 1888 +41580 1805 1828 +41580 1863 1912 +41580 1731 1888 +41580 1731 1805 +41580 1805 1532 +41580 1805 1916 +41580 1828 1916 +41580 1863 1888 +41580 1731 1532 +41580 1650 1762 +41580 1668 1762 +41580 1790 1916 +41580 1731 1916 +41580 1650 1668 +41600 1539 1501 +41600 1539 1599 +41600 1556 1825 +41600 1569 1520 +41600 1596 1641 +41600 1599 1529 +41600 1641 1773 +41600 1648 1766 +41600 1655 1757 +41600 1696 1706 +41600 1706 1757 +41600 1731 1524 +41600 1731 1912 +41600 1757 1520 +41600 1757 1766 +41600 1805 1524 +41600 1805 1912 +41600 1828 1912 +41600 1828 1532 +41600 1840 1489 +41600 1857 1470 +41600 1888 1524 +41600 1888 1916 +41600 1912 1524 +41600 1912 1916 +41600 1916 1524 +41600 1460 1499 +41600 1500 1511 +41600 1539 1544 +41600 1539 1499 +41600 1549 1443 +41600 1559 1604 +41600 1604 1616 +41600 1655 1706 +41600 1696 1757 +41600 1706 1766 +41600 1770 1842 +41600 1912 1532 +41600 1460 1525 +41600 1463 1527 +41600 1591 1858 +41600 1648 1757 +41600 1767 1489 +41600 1863 1524 +41600 1916 1532 +41600 1499 1525 +41600 1655 1696 +41600 1731 1828 +41600 1538 1524 +41600 1541 1555 +41600 1544 1659 +41600 1578 1920 +41600 1648 1696 +41600 1790 1828 +41600 1443 1523 +41600 1549 1523 +41600 1688 1457 +41600 1774 1888 +41600 1900 1519 +41600 1731 1863 +41600 1805 1863 +41600 1790 1805 +41600 1790 1912 +41600 1731 1790 +41600 1790 1532 +41600 1888 1532 +41600 1541 1533 +41600 1919 1510 +41600 1790 1863 +41600 1805 1888 +41600 1863 1532 +41600 1888 1912 +41600 1863 1916 +41600 1617 1464 +41600 1790 1888 +41600 1805 1828 +41600 1863 1912 +41600 1731 1888 +41600 1731 1805 +41600 1805 1532 +41600 1805 1916 +41600 1828 1916 +41600 1863 1888 +41600 1731 1532 +41600 1650 1762 +41600 1668 1762 +41600 1790 1916 +41600 1731 1916 +41600 1650 1668 +41620 1539 1544 +41620 1539 1761 +41620 1539 1499 +41620 1549 1443 +41620 1558 1619 +41620 1559 1604 +41620 1590 1602 +41620 1599 1525 +41620 1603 1449 +41620 1604 1616 +41620 1623 1871 +41620 1655 1706 +41620 1696 1757 +41620 1706 1766 +41620 1747 1448 +41620 1757 1761 +41620 1761 1766 +41620 1767 1840 +41620 1770 1842 +41620 1912 1532 +41620 1431 1516 +41620 1448 1527 +41620 1460 1525 +41620 1463 1513 +41620 1463 1527 +41620 1507 1522 +41620 1546 1558 +41620 1591 1858 +41620 1648 1757 +41620 1767 1489 +41620 1863 1524 +41620 1916 1532 +41620 1470 1526 +41620 1498 1526 +41620 1499 1529 +41620 1499 1525 +41620 1513 1527 +41620 1655 1696 +41620 1655 1761 +41620 1706 1761 +41620 1731 1828 +41620 1825 1501 +41620 1538 1524 +41620 1541 1555 +41620 1544 1659 +41620 1578 1920 +41620 1599 1443 +41620 1648 1696 +41620 1790 1828 +41620 1443 1523 +41620 1496 1505 +41620 1549 1523 +41620 1688 1457 +41620 1774 1888 +41620 1825 1525 +41620 1900 1519 +41620 1731 1863 +41620 1805 1863 +41620 1470 1498 +41620 1790 1805 +41620 1790 1912 +41620 1731 1790 +41620 1790 1532 +41620 1888 1532 +41620 1501 1525 +41620 1541 1533 +41620 1555 1533 +41620 1919 1510 +41620 1790 1863 +41620 1805 1888 +41620 1863 1532 +41620 1888 1912 +41620 1863 1916 +41620 1617 1464 +41620 1790 1888 +41620 1805 1828 +41620 1863 1912 +41620 1731 1888 +41620 1731 1805 +41620 1805 1532 +41620 1805 1916 +41620 1828 1916 +41620 1863 1888 +41620 1731 1532 +41620 1650 1762 +41620 1668 1762 +41620 1790 1916 +41620 1731 1916 +41620 1650 1668 +41640 1538 1888 +41640 1541 1590 +41640 1546 1558 +41640 1546 1879 +41640 1548 1431 +41640 1549 1499 +41640 1559 1616 +41640 1563 1592 +41640 1581 1742 +41640 1591 1858 +41640 1596 1773 +41640 1603 1531 +41640 1622 1831 +41640 1628 1513 +41640 1648 1757 +41640 1655 1757 +41640 1700 1437 +41640 1767 1489 +41640 1779 1527 +41640 1789 1517 +41640 1863 1524 +41640 1888 1524 +41640 1916 1532 +41640 1443 1501 +41640 1470 1526 +41640 1498 1526 +41640 1499 1529 +41640 1499 1525 +41640 1500 1511 +41640 1512 1531 +41640 1513 1527 +41640 1537 1520 +41640 1543 1562 +41640 1558 1468 +41640 1581 1613 +41640 1601 1920 +41640 1628 1463 +41640 1655 1696 +41640 1655 1761 +41640 1706 1761 +41640 1731 1828 +41640 1825 1501 +41640 1538 1524 +41640 1541 1555 +41640 1544 1659 +41640 1578 1920 +41640 1599 1443 +41640 1648 1696 +41640 1790 1828 +41640 1828 1532 +41640 1443 1523 +41640 1496 1505 +41640 1549 1523 +41640 1688 1457 +41640 1774 1888 +41640 1825 1525 +41640 1900 1519 +41640 1731 1863 +41640 1805 1863 +41640 1470 1498 +41640 1587 1535 +41640 1790 1805 +41640 1790 1912 +41640 1828 1912 +41640 1731 1790 +41640 1790 1532 +41640 1888 1532 +41640 1501 1525 +41640 1541 1533 +41640 1555 1533 +41640 1919 1510 +41640 1790 1863 +41640 1805 1888 +41640 1863 1532 +41640 1888 1912 +41640 1863 1916 +41640 1617 1464 +41640 1790 1888 +41640 1805 1828 +41640 1863 1912 +41640 1731 1888 +41640 1731 1805 +41640 1805 1532 +41640 1805 1916 +41640 1828 1916 +41640 1863 1888 +41640 1731 1532 +41640 1650 1762 +41640 1668 1762 +41640 1731 1912 +41640 1790 1916 +41640 1731 1916 +41640 1912 1916 +41640 1650 1668 +41660 1537 1520 +41660 1543 1562 +41660 1544 1499 +41660 1558 1468 +41660 1581 1613 +41660 1596 1630 +41660 1601 1920 +41660 1617 1441 +41660 1623 1470 +41660 1628 1871 +41660 1628 1463 +41660 1628 1527 +41660 1641 1773 +41660 1648 1501 +41660 1648 1525 +41660 1655 1696 +41660 1655 1761 +41660 1659 1499 +41660 1696 1501 +41660 1706 1761 +41660 1731 1828 +41660 1757 1761 +41660 1825 1501 +41660 1828 1863 +41660 1871 1527 +41660 1463 1527 +41660 1538 1524 +41660 1541 1555 +41660 1544 1659 +41660 1549 1443 +41660 1553 1756 +41660 1578 1920 +41660 1599 1443 +41660 1640 1756 +41660 1648 1696 +41660 1747 1448 +41660 1790 1828 +41660 1828 1532 +41660 1888 1916 +41660 1443 1523 +41660 1496 1505 +41660 1549 1523 +41660 1599 1756 +41660 1688 1457 +41660 1774 1888 +41660 1825 1525 +41660 1900 1519 +41660 1731 1863 +41660 1805 1863 +41660 1840 1489 +41660 1470 1498 +41660 1587 1535 +41660 1767 1779 +41660 1790 1805 +41660 1790 1912 +41660 1828 1912 +41660 1731 1790 +41660 1790 1532 +41660 1888 1532 +41660 1501 1525 +41660 1541 1533 +41660 1555 1533 +41660 1919 1510 +41660 1790 1863 +41660 1805 1888 +41660 1863 1532 +41660 1888 1912 +41660 1863 1916 +41660 1617 1464 +41660 1790 1888 +41660 1805 1828 +41660 1863 1912 +41660 1731 1888 +41660 1731 1805 +41660 1805 1532 +41660 1805 1916 +41660 1828 1916 +41660 1863 1888 +41660 1731 1532 +41660 1650 1762 +41660 1668 1762 +41660 1731 1912 +41660 1790 1916 +41660 1731 1916 +41660 1912 1916 +41660 1650 1668 +41680 1538 1524 +41680 1541 1555 +41680 1544 1659 +41680 1549 1443 +41680 1550 1486 +41680 1553 1756 +41680 1574 1770 +41680 1578 1920 +41680 1592 1742 +41680 1596 1500 +41680 1599 1640 +41680 1599 1443 +41680 1640 1756 +41680 1648 1696 +41680 1688 1443 +41680 1688 1761 +41680 1696 1529 +41680 1696 1443 +41680 1696 1525 +41680 1706 1766 +41680 1747 1448 +41680 1761 1513 +41680 1761 1522 +41680 1790 1828 +41680 1828 1532 +41680 1888 1916 +41680 1443 1523 +41680 1443 1499 +41680 1460 1499 +41680 1465 1503 +41680 1470 1526 +41680 1496 1505 +41680 1507 1522 +41680 1549 1523 +41680 1599 1756 +41680 1606 1516 +41680 1688 1457 +41680 1688 1706 +41680 1774 1888 +41680 1825 1525 +41680 1900 1519 +41680 1731 1863 +41680 1805 1863 +41680 1840 1489 +41680 1470 1498 +41680 1587 1535 +41680 1767 1779 +41680 1790 1805 +41680 1790 1912 +41680 1828 1912 +41680 1731 1790 +41680 1790 1532 +41680 1888 1532 +41680 1501 1525 +41680 1541 1533 +41680 1555 1533 +41680 1919 1510 +41680 1500 1511 +41680 1805 1912 +41680 1790 1863 +41680 1805 1888 +41680 1863 1532 +41680 1888 1912 +41680 1863 1916 +41680 1617 1464 +41680 1790 1888 +41680 1805 1828 +41680 1863 1912 +41680 1731 1888 +41680 1731 1805 +41680 1805 1532 +41680 1805 1916 +41680 1828 1916 +41680 1863 1888 +41680 1731 1532 +41680 1916 1532 +41680 1650 1762 +41680 1668 1762 +41680 1731 1912 +41680 1790 1916 +41680 1731 1916 +41680 1912 1916 +41680 1650 1668 +41700 1543 1562 +41700 1545 1430 +41700 1546 1468 +41700 1546 1558 +41700 1549 1523 +41700 1581 1641 +41700 1599 1756 +41700 1603 1512 +41700 1606 1516 +41700 1688 1457 +41700 1688 1706 +41700 1700 1437 +41700 1706 1457 +41700 1774 1888 +41700 1825 1525 +41700 1825 1501 +41700 1831 1528 +41700 1900 1519 +41700 1558 1468 +41700 1569 1520 +41700 1619 1448 +41700 1731 1863 +41700 1805 1863 +41700 1828 1863 +41700 1840 1489 +41700 1470 1498 +41700 1587 1535 +41700 1655 1757 +41700 1767 1779 +41700 1790 1805 +41700 1790 1912 +41700 1912 1532 +41700 1463 1527 +41700 1828 1912 +41700 1731 1790 +41700 1790 1532 +41700 1888 1532 +41700 1501 1525 +41700 1541 1533 +41700 1555 1533 +41700 1919 1510 +41700 1500 1511 +41700 1805 1912 +41700 1790 1863 +41700 1805 1888 +41700 1863 1532 +41700 1888 1912 +41700 1863 1916 +41700 1617 1464 +41700 1790 1888 +41700 1805 1828 +41700 1863 1912 +41700 1731 1888 +41700 1731 1805 +41700 1805 1532 +41700 1805 1916 +41700 1731 1828 +41700 1828 1916 +41700 1863 1888 +41700 1731 1532 +41700 1916 1532 +41700 1650 1762 +41700 1668 1762 +41700 1731 1912 +41700 1790 1916 +41700 1731 1916 +41700 1912 1916 +41700 1650 1668 +41720 1549 1499 +41720 1554 1520 +41720 1558 1468 +41720 1562 1634 +41720 1569 1520 +41720 1581 1517 +41720 1596 1716 +41720 1599 1519 +41720 1616 1770 +41720 1617 1441 +41720 1619 1448 +41720 1640 1756 +41720 1640 1519 +41720 1641 1441 +41720 1696 1529 +41720 1700 1831 +41720 1731 1863 +41720 1773 1791 +41720 1778 1839 +41720 1805 1863 +41720 1828 1863 +41720 1840 1489 +41720 1458 1460 +41720 1470 1498 +41720 1470 1526 +41720 1499 1529 +41720 1549 1640 +41720 1553 1756 +41720 1578 1920 +41720 1587 1535 +41720 1604 1770 +41720 1613 1631 +41720 1628 1900 +41720 1655 1757 +41720 1767 1779 +41720 1790 1805 +41720 1790 1912 +41720 1912 1532 +41720 1463 1527 +41720 1544 1659 +41720 1828 1912 +41720 1426 1459 +41720 1431 1516 +41720 1512 1531 +41720 1731 1790 +41720 1747 1448 +41720 1790 1532 +41720 1888 1532 +41720 1501 1525 +41720 1541 1533 +41720 1555 1533 +41720 1919 1510 +41720 1467 1504 +41720 1500 1511 +41720 1805 1912 +41720 1790 1863 +41720 1805 1888 +41720 1863 1532 +41720 1888 1912 +41720 1863 1916 +41720 1617 1464 +41720 1790 1888 +41720 1805 1828 +41720 1863 1912 +41720 1888 1916 +41720 1731 1888 +41720 1731 1805 +41720 1805 1532 +41720 1805 1916 +41720 1731 1828 +41720 1828 1916 +41720 1863 1888 +41720 1541 1555 +41720 1731 1532 +41720 1916 1532 +41720 1592 1742 +41720 1650 1762 +41720 1668 1762 +41720 1731 1912 +41720 1790 1916 +41720 1731 1916 +41720 1912 1916 +41720 1650 1668 +41740 1545 1430 +41740 1549 1640 +41740 1549 1553 +41740 1553 1756 +41740 1578 1920 +41740 1587 1535 +41740 1596 1879 +41740 1599 1523 +41740 1603 1512 +41740 1603 1441 +41740 1603 1517 +41740 1604 1616 +41740 1604 1770 +41740 1613 1631 +41740 1623 1520 +41740 1628 1900 +41740 1628 1527 +41740 1655 1757 +41740 1767 1779 +41740 1773 1831 +41740 1779 1489 +41740 1790 1805 +41740 1790 1912 +41740 1791 1517 +41740 1831 1528 +41740 1831 1531 +41740 1857 1526 +41740 1912 1532 +41740 1441 1517 +41740 1460 1499 +41740 1463 1527 +41740 1544 1659 +41740 1548 1431 +41740 1767 1840 +41740 1825 1523 +41740 1828 1912 +41740 1426 1459 +41740 1431 1516 +41740 1498 1526 +41740 1512 1531 +41740 1559 1604 +41740 1603 1531 +41740 1648 1529 +41740 1676 1471 +41740 1731 1790 +41740 1747 1448 +41740 1790 1828 +41740 1790 1532 +41740 1774 1888 +41740 1888 1532 +41740 1501 1525 +41740 1541 1533 +41740 1555 1533 +41740 1919 1510 +41740 1467 1504 +41740 1500 1511 +41740 1805 1912 +41740 1790 1863 +41740 1805 1888 +41740 1863 1532 +41740 1888 1912 +41740 1688 1457 +41740 1828 1532 +41740 1863 1916 +41740 1617 1464 +41740 1790 1888 +41740 1805 1828 +41740 1863 1912 +41740 1888 1916 +41740 1731 1888 +41740 1731 1805 +41740 1805 1532 +41740 1805 1916 +41740 1731 1828 +41740 1828 1916 +41740 1863 1888 +41740 1541 1555 +41740 1731 1532 +41740 1916 1532 +41740 1592 1742 +41740 1650 1762 +41740 1668 1762 +41740 1731 1912 +41740 1648 1696 +41740 1790 1916 +41740 1731 1916 +41740 1912 1916 +41740 1650 1668 +41760 1544 1659 +41760 1548 1431 +41760 1558 1468 +41760 1581 1613 +41760 1596 1652 +41760 1599 1527 +41760 1613 1495 +41760 1628 1463 +41760 1756 1527 +41760 1756 1525 +41760 1757 1766 +41760 1767 1840 +41760 1825 1523 +41760 1828 1912 +41760 1839 1470 +41760 1842 1466 +41760 1900 1489 +41760 1426 1459 +41760 1431 1516 +41760 1468 1512 +41760 1498 1526 +41760 1501 1529 +41760 1512 1531 +41760 1547 1716 +41760 1548 1516 +41760 1559 1604 +41760 1581 1495 +41760 1596 1678 +41760 1603 1531 +41760 1648 1529 +41760 1676 1471 +41760 1696 1529 +41760 1731 1790 +41760 1747 1448 +41760 1790 1828 +41760 1790 1532 +41760 1563 1497 +41760 1593 1524 +41760 1617 1441 +41760 1767 1489 +41760 1774 1888 +41760 1840 1489 +41760 1888 1532 +41760 1501 1525 +41760 1541 1533 +41760 1555 1533 +41760 1919 1510 +41760 1467 1504 +41760 1500 1511 +41760 1599 1756 +41760 1805 1912 +41760 1790 1863 +41760 1805 1888 +41760 1863 1532 +41760 1888 1912 +41760 1688 1457 +41760 1828 1532 +41760 1863 1916 +41760 1617 1464 +41760 1790 1888 +41760 1805 1828 +41760 1863 1912 +41760 1888 1916 +41760 1731 1888 +41760 1731 1805 +41760 1805 1863 +41760 1805 1532 +41760 1805 1916 +41760 1731 1828 +41760 1828 1916 +41760 1863 1888 +41760 1541 1555 +41760 1731 1532 +41760 1916 1532 +41760 1592 1742 +41760 1700 1528 +41760 1650 1762 +41760 1668 1762 +41760 1731 1912 +41760 1648 1696 +41760 1790 1916 +41760 1731 1916 +41760 1912 1916 +41760 1731 1863 +41760 1650 1668 +41780 1539 1716 +41780 1539 1879 +41780 1545 1430 +41780 1547 1716 +41780 1548 1516 +41780 1559 1770 +41780 1559 1604 +41780 1560 1604 +41780 1581 1495 +41780 1596 1678 +41780 1602 1874 +41780 1603 1531 +41780 1606 1516 +41780 1609 1434 +41780 1613 1630 +41780 1648 1529 +41780 1655 1757 +41780 1676 1471 +41780 1696 1529 +41780 1731 1790 +41780 1747 1448 +41780 1790 1828 +41780 1790 1912 +41780 1790 1532 +41780 1828 1888 +41780 1828 1863 +41780 1853 1471 +41780 1563 1497 +41780 1593 1524 +41780 1603 1437 +41780 1613 1448 +41780 1617 1441 +41780 1752 1766 +41780 1767 1489 +41780 1774 1888 +41780 1840 1489 +41780 1888 1532 +41780 1501 1525 +41780 1541 1533 +41780 1546 1519 +41780 1555 1533 +41780 1919 1510 +41780 1467 1504 +41780 1500 1511 +41780 1599 1756 +41780 1648 1525 +41780 1805 1912 +41780 1790 1863 +41780 1805 1888 +41780 1863 1532 +41780 1888 1912 +41780 1587 1535 +41780 1688 1457 +41780 1828 1532 +41780 1863 1916 +41780 1617 1464 +41780 1790 1888 +41780 1790 1805 +41780 1805 1828 +41780 1863 1912 +41780 1888 1916 +41780 1731 1888 +41780 1731 1805 +41780 1805 1863 +41780 1805 1532 +41780 1805 1916 +41780 1731 1828 +41780 1828 1916 +41780 1863 1888 +41780 1541 1555 +41780 1731 1532 +41780 1912 1532 +41780 1916 1532 +41780 1592 1742 +41780 1700 1528 +41780 1650 1762 +41780 1668 1762 +41780 1731 1912 +41780 1648 1696 +41780 1790 1916 +41780 1731 1916 +41780 1912 1916 +41780 1731 1863 +41780 1650 1668 +41800 1538 1524 +41800 1539 1580 +41800 1544 1659 +41800 1559 1616 +41800 1563 1688 +41800 1563 1497 +41800 1581 1652 +41800 1582 1602 +41800 1593 1524 +41800 1603 1437 +41800 1609 1915 +41800 1613 1448 +41800 1613 1623 +41800 1617 1441 +41800 1749 1757 +41800 1752 1512 +41800 1752 1766 +41800 1767 1489 +41800 1767 1779 +41800 1774 1888 +41800 1779 1489 +41800 1840 1489 +41800 1853 1487 +41800 1888 1532 +41800 1916 1524 +41800 1465 1503 +41800 1501 1525 +41800 1519 1523 +41800 1541 1533 +41800 1546 1519 +41800 1555 1533 +41800 1919 1510 +41800 1467 1504 +41800 1500 1511 +41800 1599 1756 +41800 1648 1525 +41800 1805 1912 +41800 1498 1526 +41800 1585 1752 +41800 1790 1863 +41800 1805 1888 +41800 1863 1532 +41800 1888 1912 +41800 1587 1535 +41800 1688 1457 +41800 1828 1532 +41800 1863 1916 +41800 1617 1464 +41800 1790 1888 +41800 1790 1805 +41800 1805 1828 +41800 1863 1912 +41800 1888 1916 +41800 1731 1888 +41800 1731 1805 +41800 1805 1863 +41800 1805 1532 +41800 1805 1916 +41800 1731 1828 +41800 1828 1916 +41800 1863 1888 +41800 1541 1555 +41800 1731 1532 +41800 1912 1532 +41800 1916 1532 +41800 1592 1742 +41800 1700 1528 +41800 1828 1912 +41800 1650 1762 +41800 1668 1762 +41800 1731 1912 +41800 1648 1696 +41800 1790 1916 +41800 1731 1916 +41800 1912 1916 +41800 1731 1863 +41800 1650 1668 +41820 1541 1533 +41820 1546 1519 +41820 1549 1583 +41820 1555 1533 +41820 1578 1920 +41820 1583 1529 +41820 1596 1465 +41820 1655 1512 +41820 1749 1512 +41820 1831 1858 +41820 1919 1510 +41820 1433 1487 +41820 1460 1499 +41820 1467 1504 +41820 1500 1511 +41820 1516 1520 +41820 1569 1599 +41820 1599 1756 +41820 1648 1525 +41820 1696 1529 +41820 1888 1524 +41820 1912 1524 +41820 1603 1486 +41820 1805 1912 +41820 1498 1526 +41820 1585 1752 +41820 1790 1863 +41820 1805 1888 +41820 1863 1532 +41820 1888 1912 +41820 1559 1604 +41820 1587 1535 +41820 1688 1457 +41820 1828 1532 +41820 1863 1916 +41820 1617 1464 +41820 1790 1888 +41820 1790 1805 +41820 1805 1828 +41820 1863 1912 +41820 1888 1916 +41820 1731 1888 +41820 1731 1805 +41820 1805 1863 +41820 1805 1532 +41820 1805 1916 +41820 1731 1828 +41820 1828 1916 +41820 1863 1888 +41820 1541 1555 +41820 1731 1532 +41820 1790 1828 +41820 1790 1532 +41820 1912 1532 +41820 1916 1532 +41820 1592 1742 +41820 1700 1528 +41820 1790 1912 +41820 1828 1912 +41820 1650 1762 +41820 1668 1762 +41820 1731 1912 +41820 1648 1696 +41820 1731 1790 +41820 1790 1916 +41820 1731 1916 +41820 1912 1916 +41820 1731 1863 +41820 1650 1668 +41840 1538 1888 +41840 1538 1912 +41840 1538 1731 +41840 1538 1524 +41840 1544 1569 +41840 1544 1523 +41840 1544 1599 +41840 1548 1448 +41840 1549 1525 +41840 1569 1599 +41840 1597 1749 +41840 1599 1756 +41840 1602 1789 +41840 1641 1773 +41840 1648 1529 +41840 1648 1525 +41840 1696 1529 +41840 1888 1524 +41840 1912 1524 +41840 1523 1525 +41840 1544 1525 +41840 1558 1468 +41840 1603 1486 +41840 1805 1912 +41840 1853 1434 +41840 1496 1505 +41840 1498 1526 +41840 1585 1752 +41840 1774 1888 +41840 1790 1863 +41840 1805 1888 +41840 1863 1532 +41840 1888 1912 +41840 1559 1604 +41840 1587 1535 +41840 1688 1457 +41840 1828 1532 +41840 1863 1916 +41840 1559 1574 +41840 1617 1464 +41840 1790 1888 +41840 1790 1805 +41840 1805 1828 +41840 1863 1912 +41840 1888 1916 +41840 1731 1888 +41840 1731 1805 +41840 1805 1863 +41840 1805 1532 +41840 1805 1916 +41840 1731 1828 +41840 1767 1779 +41840 1828 1916 +41840 1863 1888 +41840 1541 1555 +41840 1731 1532 +41840 1790 1828 +41840 1790 1532 +41840 1912 1532 +41840 1916 1532 +41840 1592 1742 +41840 1700 1528 +41840 1790 1912 +41840 1828 1912 +41840 1650 1762 +41840 1668 1762 +41840 1731 1912 +41840 1648 1696 +41840 1731 1790 +41840 1790 1916 +41840 1731 1916 +41840 1912 1916 +41840 1731 1863 +41840 1650 1668 +41860 1539 1495 +41860 1544 1525 +41860 1547 1716 +41860 1548 1516 +41860 1549 1599 +41860 1555 1533 +41860 1558 1468 +41860 1563 1457 +41860 1591 1858 +41860 1596 1629 +41860 1596 1495 +41860 1599 1523 +41860 1603 1486 +41860 1606 1516 +41860 1606 1431 +41860 1609 1471 +41860 1629 1517 +41860 1641 1514 +41860 1731 1524 +41860 1805 1524 +41860 1805 1912 +41860 1853 1434 +41860 1904 1513 +41860 1496 1505 +41860 1498 1526 +41860 1546 1825 +41860 1549 1583 +41860 1585 1752 +41860 1749 1757 +41860 1752 1766 +41860 1774 1888 +41860 1790 1863 +41860 1805 1888 +41860 1863 1532 +41860 1888 1912 +41860 1507 1522 +41860 1559 1604 +41860 1574 1604 +41860 1587 1535 +41860 1688 1457 +41860 1828 1532 +41860 1863 1916 +41860 1888 1532 +41860 1559 1574 +41860 1617 1464 +41860 1790 1888 +41860 1790 1805 +41860 1805 1828 +41860 1840 1489 +41860 1863 1912 +41860 1888 1916 +41860 1731 1888 +41860 1731 1805 +41860 1805 1863 +41860 1805 1532 +41860 1805 1916 +41860 1500 1511 +41860 1731 1828 +41860 1767 1779 +41860 1828 1916 +41860 1863 1888 +41860 1541 1555 +41860 1731 1532 +41860 1790 1828 +41860 1467 1504 +41860 1790 1532 +41860 1912 1532 +41860 1916 1532 +41860 1592 1742 +41860 1700 1528 +41860 1790 1912 +41860 1828 1912 +41860 1650 1762 +41860 1668 1762 +41860 1731 1912 +41860 1648 1696 +41860 1731 1790 +41860 1790 1916 +41860 1731 1916 +41860 1912 1916 +41860 1731 1863 +41860 1650 1668 +41880 1541 1533 +41880 1544 1523 +41880 1546 1825 +41880 1549 1583 +41880 1558 1516 +41880 1569 1696 +41880 1581 1505 +41880 1585 1752 +41880 1596 1858 +41880 1596 1700 +41880 1609 1628 +41880 1676 1853 +41880 1676 1469 +41880 1696 1525 +41880 1749 1465 +41880 1749 1757 +41880 1749 1470 +41880 1752 1766 +41880 1757 1470 +41880 1774 1888 +41880 1790 1863 +41880 1805 1888 +41880 1825 1529 +41880 1828 1863 +41880 1863 1532 +41880 1888 1912 +41880 1507 1522 +41880 1559 1604 +41880 1574 1604 +41880 1587 1535 +41880 1593 1521 +41880 1599 1756 +41880 1688 1457 +41880 1828 1532 +41880 1863 1916 +41880 1888 1532 +41880 1559 1574 +41880 1617 1464 +41880 1790 1888 +41880 1790 1805 +41880 1805 1828 +41880 1840 1489 +41880 1863 1912 +41880 1888 1916 +41880 1538 1888 +41880 1538 1805 +41880 1731 1888 +41880 1731 1805 +41880 1805 1863 +41880 1805 1532 +41880 1805 1916 +41880 1871 1517 +41880 1500 1511 +41880 1603 1449 +41880 1731 1828 +41880 1767 1779 +41880 1828 1916 +41880 1863 1888 +41880 1512 1531 +41880 1541 1555 +41880 1731 1532 +41880 1790 1828 +41880 1467 1504 +41880 1790 1532 +41880 1912 1532 +41880 1916 1532 +41880 1592 1742 +41880 1700 1528 +41880 1790 1912 +41880 1828 1912 +41880 1900 1920 +41880 1650 1762 +41880 1668 1762 +41880 1731 1912 +41880 1648 1696 +41880 1731 1790 +41880 1790 1916 +41880 1731 1916 +41880 1912 1916 +41880 1731 1863 +41880 1650 1668 +41900 1538 1916 +41900 1539 1596 +41900 1547 1629 +41900 1549 1553 +41900 1559 1604 +41900 1560 1789 +41900 1569 1602 +41900 1574 1604 +41900 1587 1535 +41900 1593 1521 +41900 1599 1756 +41900 1599 1645 +41900 1602 1469 +41900 1603 1512 +41900 1606 1516 +41900 1640 1525 +41900 1655 1707 +41900 1688 1457 +41900 1688 1434 +41900 1767 1489 +41900 1828 1532 +41900 1863 1916 +41900 1888 1532 +41900 1431 1519 +41900 1441 1464 +41900 1538 1524 +41900 1558 1468 +41900 1559 1574 +41900 1617 1464 +41900 1617 1441 +41900 1790 1888 +41900 1790 1805 +41900 1805 1828 +41900 1805 1912 +41900 1840 1489 +41900 1863 1912 +41900 1888 1524 +41900 1888 1916 +41900 1538 1888 +41900 1538 1805 +41900 1606 1431 +41900 1731 1888 +41900 1731 1805 +41900 1805 1863 +41900 1805 1532 +41900 1805 1916 +41900 1871 1517 +41900 1500 1511 +41900 1546 1519 +41900 1546 1431 +41900 1603 1449 +41900 1731 1828 +41900 1767 1779 +41900 1828 1916 +41900 1863 1888 +41900 1466 1486 +41900 1512 1531 +41900 1541 1555 +41900 1731 1532 +41900 1790 1828 +41900 1467 1504 +41900 1790 1532 +41900 1912 1532 +41900 1916 1532 +41900 1592 1742 +41900 1700 1528 +41900 1790 1912 +41900 1828 1912 +41900 1900 1920 +41900 1650 1762 +41900 1668 1762 +41900 1731 1912 +41900 1648 1696 +41900 1731 1790 +41900 1790 1916 +41900 1731 1916 +41900 1912 1916 +41900 1731 1863 +41900 1650 1668 +41920 1538 1731 +41920 1538 1524 +41920 1545 1430 +41920 1548 1904 +41920 1549 1525 +41920 1549 1599 +41920 1554 1752 +41920 1554 1766 +41920 1556 1771 +41920 1558 1468 +41920 1559 1574 +41920 1569 1688 +41920 1579 1676 +41920 1596 1716 +41920 1617 1464 +41920 1617 1441 +41920 1648 1529 +41920 1655 1764 +41920 1790 1888 +41920 1790 1805 +41920 1805 1828 +41920 1805 1912 +41920 1825 1525 +41920 1840 1489 +41920 1863 1912 +41920 1888 1524 +41920 1888 1912 +41920 1888 1916 +41920 1538 1888 +41920 1538 1805 +41920 1554 1448 +41920 1606 1825 +41920 1606 1431 +41920 1731 1888 +41920 1731 1805 +41920 1805 1888 +41920 1805 1863 +41920 1805 1532 +41920 1805 1916 +41920 1825 1431 +41920 1871 1517 +41920 1496 1505 +41920 1500 1511 +41920 1541 1533 +41920 1546 1825 +41920 1546 1519 +41920 1546 1431 +41920 1599 1525 +41920 1603 1449 +41920 1731 1828 +41920 1767 1779 +41920 1828 1916 +41920 1863 1888 +41920 1548 1468 +41920 1466 1486 +41920 1512 1531 +41920 1541 1555 +41920 1604 1616 +41920 1731 1532 +41920 1752 1766 +41920 1790 1828 +41920 1467 1504 +41920 1790 1532 +41920 1912 1532 +41920 1916 1532 +41920 1592 1742 +41920 1700 1528 +41920 1707 1764 +41920 1790 1912 +41920 1828 1912 +41920 1900 1920 +41920 1650 1762 +41920 1668 1762 +41920 1731 1912 +41920 1648 1696 +41920 1731 1790 +41920 1790 1916 +41920 1790 1863 +41920 1731 1916 +41920 1912 1916 +41920 1731 1863 +41920 1650 1668 +41940 1538 1888 +41940 1538 1916 +41940 1538 1805 +41940 1554 1448 +41940 1582 1496 +41940 1585 1752 +41940 1593 1521 +41940 1599 1600 +41940 1603 1441 +41940 1606 1825 +41940 1606 1516 +41940 1606 1431 +41940 1627 1641 +41940 1644 1525 +41940 1688 1457 +41940 1731 1888 +41940 1731 1805 +41940 1749 1757 +41940 1805 1888 +41940 1805 1863 +41940 1805 1532 +41940 1805 1916 +41940 1825 1519 +41940 1825 1431 +41940 1834 1525 +41940 1853 1919 +41940 1871 1517 +41940 1433 1487 +41940 1441 1514 +41940 1496 1505 +41940 1498 1526 +41940 1500 1511 +41940 1541 1533 +41940 1544 1644 +41940 1546 1825 +41940 1546 1519 +41940 1546 1431 +41940 1549 1600 +41940 1568 1587 +41940 1599 1525 +41940 1603 1449 +41940 1731 1828 +41940 1767 1779 +41940 1828 1532 +41940 1853 1510 +41940 1507 1522 +41940 1644 1834 +41940 1828 1916 +41940 1863 1888 +41940 1548 1468 +41940 1767 1489 +41940 1466 1486 +41940 1512 1531 +41940 1541 1555 +41940 1604 1616 +41940 1731 1532 +41940 1752 1766 +41940 1790 1828 +41940 1467 1504 +41940 1790 1532 +41940 1912 1532 +41940 1916 1532 +41940 1592 1742 +41940 1700 1528 +41940 1707 1764 +41940 1790 1912 +41940 1828 1912 +41940 1599 1834 +41940 1599 1644 +41940 1599 1648 +41940 1676 1470 +41940 1900 1920 +41940 1650 1762 +41940 1668 1762 +41940 1731 1912 +41940 1648 1696 +41940 1731 1790 +41940 1790 1916 +41940 1790 1863 +41940 1731 1916 +41940 1912 1916 +41940 1731 1863 +41940 1650 1668 +41960 1539 1545 +41960 1541 1533 +41960 1544 1644 +41960 1544 1525 +41960 1544 1599 +41960 1546 1825 +41960 1546 1519 +41960 1546 1431 +41960 1549 1600 +41960 1549 1523 +41960 1568 1587 +41960 1599 1696 +41960 1599 1525 +41960 1600 1756 +41960 1600 1645 +41960 1603 1449 +41960 1609 1871 +41960 1644 1696 +41960 1644 1772 +41960 1696 1834 +41960 1731 1828 +41960 1756 1525 +41960 1767 1779 +41960 1805 1828 +41960 1828 1532 +41960 1839 1915 +41960 1853 1510 +41960 1919 1510 +41960 1507 1522 +41960 1538 1828 +41960 1548 1558 +41960 1603 1512 +41960 1603 1531 +41960 1617 1514 +41960 1644 1834 +41960 1828 1916 +41960 1863 1888 +41960 1548 1468 +41960 1558 1468 +41960 1767 1489 +41960 1466 1486 +41960 1512 1531 +41960 1541 1555 +41960 1604 1616 +41960 1731 1532 +41960 1752 1766 +41960 1790 1828 +41960 1467 1504 +41960 1790 1532 +41960 1840 1489 +41960 1912 1532 +41960 1916 1532 +41960 1548 1516 +41960 1592 1742 +41960 1700 1528 +41960 1707 1764 +41960 1790 1912 +41960 1828 1912 +41960 1558 1516 +41960 1599 1834 +41960 1599 1644 +41960 1599 1648 +41960 1676 1470 +41960 1900 1920 +41960 1549 1525 +41960 1650 1762 +41960 1668 1762 +41960 1731 1912 +41960 1648 1696 +41960 1731 1790 +41960 1790 1916 +41960 1790 1863 +41960 1731 1916 +41960 1863 1916 +41960 1912 1916 +41960 1731 1863 +41960 1650 1668 +41980 1538 1916 +41980 1538 1828 +41980 1548 1558 +41980 1552 1469 +41980 1555 1533 +41980 1559 1596 +41980 1574 1581 +41980 1602 1603 +41980 1603 1512 +41980 1603 1531 +41980 1609 1619 +41980 1617 1514 +41980 1641 1441 +41980 1644 1648 +41980 1644 1834 +41980 1648 1834 +41980 1659 1842 +41980 1688 1466 +41980 1698 1707 +41980 1700 1511 +41980 1707 1772 +41980 1731 1888 +41980 1805 1863 +41980 1828 1888 +41980 1828 1863 +41980 1828 1916 +41980 1863 1888 +41980 1496 1505 +41980 1548 1468 +41980 1558 1468 +41980 1606 1431 +41980 1655 1707 +41980 1706 1522 +41980 1767 1489 +41980 1779 1489 +41980 1466 1486 +41980 1512 1531 +41980 1541 1555 +41980 1604 1616 +41980 1731 1532 +41980 1752 1766 +41980 1790 1828 +41980 1467 1504 +41980 1617 1441 +41980 1790 1532 +41980 1840 1489 +41980 1912 1532 +41980 1916 1532 +41980 1548 1516 +41980 1592 1742 +41980 1700 1528 +41980 1707 1764 +41980 1790 1912 +41980 1828 1912 +41980 1558 1516 +41980 1599 1834 +41980 1599 1644 +41980 1599 1648 +41980 1676 1470 +41980 1900 1920 +41980 1549 1525 +41980 1650 1762 +41980 1668 1762 +41980 1731 1912 +41980 1441 1514 +41980 1648 1696 +41980 1731 1790 +41980 1790 1916 +41980 1790 1863 +41980 1731 1916 +41980 1863 1912 +41980 1863 1916 +41980 1912 1916 +41980 1731 1863 +41980 1650 1668 +42000 1547 1752 +42000 1548 1468 +42000 1554 1853 +42000 1558 1468 +42000 1558 1606 +42000 1559 1743 +42000 1596 1678 +42000 1600 1756 +42000 1606 1431 +42000 1609 1503 +42000 1641 1773 +42000 1655 1707 +42000 1688 1457 +42000 1700 1858 +42000 1706 1522 +42000 1706 1507 +42000 1767 1840 +42000 1767 1489 +42000 1767 1779 +42000 1779 1489 +42000 1828 1524 +42000 1828 1532 +42000 1431 1468 +42000 1466 1486 +42000 1498 1526 +42000 1512 1531 +42000 1541 1555 +42000 1604 1616 +42000 1698 1764 +42000 1716 1743 +42000 1731 1532 +42000 1752 1766 +42000 1762 1463 +42000 1790 1828 +42000 1863 1532 +42000 1467 1504 +42000 1617 1441 +42000 1790 1532 +42000 1840 1489 +42000 1912 1532 +42000 1916 1532 +42000 1548 1516 +42000 1592 1742 +42000 1700 1528 +42000 1707 1764 +42000 1790 1912 +42000 1828 1912 +42000 1546 1825 +42000 1558 1516 +42000 1599 1834 +42000 1599 1644 +42000 1599 1648 +42000 1628 1463 +42000 1676 1470 +42000 1900 1920 +42000 1549 1525 +42000 1650 1762 +42000 1668 1762 +42000 1731 1912 +42000 1441 1514 +42000 1648 1696 +42000 1731 1790 +42000 1547 1743 +42000 1790 1916 +42000 1790 1863 +42000 1731 1916 +42000 1863 1912 +42000 1863 1916 +42000 1912 1916 +42000 1731 1863 +42000 1650 1668 +42020 1538 1828 +42020 1541 1555 +42020 1544 1698 +42020 1545 1430 +42020 1559 1871 +42020 1560 1466 +42020 1602 1512 +42020 1602 1688 +42020 1603 1512 +42020 1603 1511 +42020 1604 1616 +42020 1641 1441 +42020 1644 1834 +42020 1655 1764 +42020 1668 1463 +42020 1688 1528 +42020 1688 1700 +42020 1688 1500 +42020 1698 1764 +42020 1716 1743 +42020 1724 1903 +42020 1731 1532 +42020 1752 1766 +42020 1762 1463 +42020 1783 1443 +42020 1783 1527 +42020 1790 1828 +42020 1863 1532 +42020 1467 1504 +42020 1511 1531 +42020 1538 1524 +42020 1602 1437 +42020 1617 1441 +42020 1700 1457 +42020 1790 1532 +42020 1840 1489 +42020 1912 1532 +42020 1916 1532 +42020 1443 1527 +42020 1457 1528 +42020 1507 1522 +42020 1547 1716 +42020 1548 1516 +42020 1592 1742 +42020 1700 1528 +42020 1707 1764 +42020 1790 1912 +42020 1828 1912 +42020 1451 1458 +42020 1546 1825 +42020 1558 1516 +42020 1579 1501 +42020 1599 1834 +42020 1599 1644 +42020 1599 1648 +42020 1628 1463 +42020 1676 1470 +42020 1900 1920 +42020 1549 1525 +42020 1650 1762 +42020 1668 1762 +42020 1828 1916 +42020 1731 1912 +42020 1698 1707 +42020 1441 1514 +42020 1648 1696 +42020 1731 1790 +42020 1547 1743 +42020 1790 1916 +42020 1790 1863 +42020 1731 1916 +42020 1863 1912 +42020 1863 1916 +42020 1912 1916 +42020 1731 1863 +42020 1650 1668 +42040 1538 1524 +42040 1538 1916 +42040 1544 1676 +42040 1548 1431 +42040 1554 1853 +42040 1554 1590 +42040 1560 1531 +42040 1593 1521 +42040 1599 1529 +42040 1602 1603 +42040 1602 1437 +42040 1617 1441 +42040 1641 1858 +42040 1688 1531 +42040 1700 1457 +42040 1707 1752 +42040 1767 1779 +42040 1790 1532 +42040 1834 1529 +42040 1840 1489 +42040 1847 1879 +42040 1857 1500 +42040 1912 1532 +42040 1916 1532 +42040 1443 1527 +42040 1457 1528 +42040 1466 1500 +42040 1507 1522 +42040 1522 1531 +42040 1547 1716 +42040 1548 1516 +42040 1592 1742 +42040 1596 1609 +42040 1600 1645 +42040 1700 1528 +42040 1707 1764 +42040 1790 1912 +42040 1828 1912 +42040 1919 1510 +42040 1451 1458 +42040 1546 1825 +42040 1558 1516 +42040 1579 1501 +42040 1599 1834 +42040 1599 1644 +42040 1599 1648 +42040 1628 1463 +42040 1676 1470 +42040 1688 1507 +42040 1828 1524 +42040 1900 1920 +42040 1549 1525 +42040 1650 1762 +42040 1668 1762 +42040 1828 1916 +42040 1578 1920 +42040 1603 1688 +42040 1731 1912 +42040 1698 1707 +42040 1767 1489 +42040 1441 1514 +42040 1648 1696 +42040 1731 1790 +42040 1547 1743 +42040 1790 1916 +42040 1790 1863 +42040 1871 1517 +42040 1731 1916 +42040 1863 1912 +42040 1863 1916 +42040 1912 1916 +42040 1731 1863 +42040 1650 1668 +42060 1545 1430 +42060 1547 1716 +42060 1548 1516 +42060 1549 1523 +42060 1573 1452 +42060 1580 1531 +42060 1581 1441 +42060 1592 1742 +42060 1596 1609 +42060 1600 1756 +42060 1600 1645 +42060 1603 1457 +42060 1700 1528 +42060 1707 1770 +42060 1707 1764 +42060 1716 1743 +42060 1752 1920 +42060 1790 1912 +42060 1790 1828 +42060 1828 1912 +42060 1874 1496 +42060 1919 1510 +42060 1448 1465 +42060 1451 1458 +42060 1468 1516 +42060 1546 1825 +42060 1558 1516 +42060 1569 1592 +42060 1579 1501 +42060 1599 1834 +42060 1599 1644 +42060 1599 1648 +42060 1628 1463 +42060 1676 1470 +42060 1688 1512 +42060 1688 1507 +42060 1783 1527 +42060 1828 1524 +42060 1900 1920 +42060 1523 1525 +42060 1538 1532 +42060 1549 1525 +42060 1558 1468 +42060 1650 1762 +42060 1668 1762 +42060 1828 1916 +42060 1512 1531 +42060 1578 1920 +42060 1603 1688 +42060 1603 1522 +42060 1644 1834 +42060 1688 1522 +42060 1731 1912 +42060 1752 1766 +42060 1652 1747 +42060 1698 1707 +42060 1767 1489 +42060 1441 1514 +42060 1648 1696 +42060 1604 1616 +42060 1731 1790 +42060 1547 1743 +42060 1790 1916 +42060 1790 1863 +42060 1871 1517 +42060 1731 1916 +42060 1863 1912 +42060 1863 1916 +42060 1912 1916 +42060 1731 1863 +42060 1650 1668 +42080 1541 1555 +42080 1546 1825 +42080 1552 1872 +42080 1558 1516 +42080 1559 1617 +42080 1559 1581 +42080 1559 1441 +42080 1569 1592 +42080 1573 1771 +42080 1578 1900 +42080 1579 1501 +42080 1596 1771 +42080 1598 1622 +42080 1599 1696 +42080 1599 1834 +42080 1599 1644 +42080 1599 1648 +42080 1599 1529 +42080 1622 1752 +42080 1628 1465 +42080 1628 1463 +42080 1644 1523 +42080 1676 1470 +42080 1688 1512 +42080 1688 1507 +42080 1731 1828 +42080 1767 1840 +42080 1767 1779 +42080 1783 1527 +42080 1828 1524 +42080 1840 1489 +42080 1900 1920 +42080 1919 1468 +42080 1449 1531 +42080 1465 1510 +42080 1467 1504 +42080 1498 1526 +42080 1507 1522 +42080 1523 1525 +42080 1538 1532 +42080 1549 1525 +42080 1558 1468 +42080 1603 1531 +42080 1650 1762 +42080 1668 1762 +42080 1779 1489 +42080 1828 1916 +42080 1512 1531 +42080 1578 1920 +42080 1603 1688 +42080 1603 1522 +42080 1644 1834 +42080 1688 1522 +42080 1731 1912 +42080 1752 1766 +42080 1496 1505 +42080 1652 1747 +42080 1698 1707 +42080 1767 1489 +42080 1558 1919 +42080 1441 1514 +42080 1587 1535 +42080 1599 1523 +42080 1648 1696 +42080 1604 1616 +42080 1731 1790 +42080 1547 1743 +42080 1790 1916 +42080 1790 1863 +42080 1871 1517 +42080 1731 1916 +42080 1863 1912 +42080 1863 1916 +42080 1912 1916 +42080 1731 1863 +42080 1650 1668 +42100 1538 1532 +42100 1541 1434 +42100 1549 1525 +42100 1558 1468 +42100 1560 1457 +42100 1560 1437 +42100 1563 1459 +42100 1581 1772 +42100 1599 1525 +42100 1603 1531 +42100 1631 1652 +42100 1650 1762 +42100 1668 1762 +42100 1676 1448 +42100 1700 1467 +42100 1752 1771 +42100 1762 1463 +42100 1779 1489 +42100 1790 1828 +42100 1828 1916 +42100 1874 1459 +42100 1512 1522 +42100 1512 1531 +42100 1578 1920 +42100 1579 1510 +42100 1580 1531 +42100 1603 1688 +42100 1603 1522 +42100 1644 1834 +42100 1688 1522 +42100 1716 1743 +42100 1731 1912 +42100 1752 1766 +42100 1496 1505 +42100 1652 1747 +42100 1698 1707 +42100 1700 1504 +42100 1790 1912 +42100 1767 1489 +42100 1558 1919 +42100 1603 1507 +42100 1441 1514 +42100 1676 1465 +42100 1579 1448 +42100 1587 1535 +42100 1599 1523 +42100 1648 1696 +42100 1604 1616 +42100 1731 1790 +42100 1547 1743 +42100 1790 1916 +42100 1790 1863 +42100 1871 1517 +42100 1731 1916 +42100 1863 1912 +42100 1863 1916 +42100 1912 1916 +42100 1731 1863 +42100 1650 1668 +42120 1541 1533 +42120 1546 1558 +42120 1559 1512 +42120 1578 1920 +42120 1579 1510 +42120 1580 1531 +42120 1581 1448 +42120 1581 1762 +42120 1581 1468 +42120 1591 1858 +42120 1599 1712 +42120 1603 1688 +42120 1603 1457 +42120 1603 1522 +42120 1617 1688 +42120 1630 1742 +42120 1644 1834 +42120 1688 1457 +42120 1688 1522 +42120 1688 1531 +42120 1716 1743 +42120 1731 1912 +42120 1752 1766 +42120 1761 1920 +42120 1771 1501 +42120 1783 1527 +42120 1457 1522 +42120 1457 1531 +42120 1496 1505 +42120 1507 1522 +42120 1580 1688 +42120 1652 1747 +42120 1698 1707 +42120 1700 1504 +42120 1790 1912 +42120 1698 1764 +42120 1559 1580 +42120 1581 1628 +42120 1767 1489 +42120 1828 1524 +42120 1558 1919 +42120 1603 1507 +42120 1441 1514 +42120 1676 1465 +42120 1579 1448 +42120 1587 1535 +42120 1599 1523 +42120 1648 1696 +42120 1604 1616 +42120 1731 1790 +42120 1547 1743 +42120 1790 1916 +42120 1790 1863 +42120 1871 1517 +42120 1731 1916 +42120 1863 1912 +42120 1863 1916 +42120 1912 1916 +42120 1731 1863 +42120 1650 1668 +42140 1546 1519 +42140 1572 1517 +42140 1572 1871 +42140 1579 1676 +42140 1580 1688 +42140 1600 1756 +42140 1602 1631 +42140 1617 1441 +42140 1622 1904 +42140 1628 1463 +42140 1652 1747 +42140 1688 1498 +42140 1696 1525 +42140 1698 1707 +42140 1700 1504 +42140 1707 1764 +42140 1790 1912 +42140 1581 1463 +42140 1617 1857 +42140 1698 1764 +42140 1767 1840 +42140 1519 1525 +42140 1559 1580 +42140 1581 1628 +42140 1628 1762 +42140 1712 1739 +42140 1756 1525 +42140 1767 1489 +42140 1828 1524 +42140 1544 1644 +42140 1558 1919 +42140 1603 1507 +42140 1441 1514 +42140 1572 1622 +42140 1676 1465 +42140 1579 1448 +42140 1587 1535 +42140 1599 1523 +42140 1622 1517 +42140 1622 1871 +42140 1648 1696 +42140 1661 1739 +42140 1599 1657 +42140 1604 1616 +42140 1661 1712 +42140 1731 1790 +42140 1547 1743 +42140 1790 1916 +42140 1790 1863 +42140 1500 1511 +42140 1871 1517 +42140 1731 1916 +42140 1554 1470 +42140 1863 1912 +42140 1863 1916 +42140 1912 1916 +42140 1731 1863 +42140 1650 1668 +42160 1538 1828 +42160 1559 1531 +42160 1580 1747 +42160 1581 1463 +42160 1591 1858 +42160 1599 1825 +42160 1600 1645 +42160 1603 1449 +42160 1617 1857 +42160 1657 1523 +42160 1698 1764 +42160 1706 1426 +42160 1716 1743 +42160 1767 1840 +42160 1791 1505 +42160 1519 1525 +42160 1559 1580 +42160 1578 1920 +42160 1581 1762 +42160 1581 1628 +42160 1628 1762 +42160 1712 1739 +42160 1731 1828 +42160 1752 1766 +42160 1756 1525 +42160 1767 1489 +42160 1828 1524 +42160 1544 1644 +42160 1558 1919 +42160 1603 1507 +42160 1441 1514 +42160 1572 1622 +42160 1599 1710 +42160 1676 1465 +42160 1579 1448 +42160 1587 1535 +42160 1599 1523 +42160 1622 1517 +42160 1622 1871 +42160 1648 1696 +42160 1661 1739 +42160 1538 1524 +42160 1599 1657 +42160 1604 1616 +42160 1661 1712 +42160 1541 1555 +42160 1731 1790 +42160 1547 1743 +42160 1790 1916 +42160 1790 1863 +42160 1500 1511 +42160 1871 1517 +42160 1731 1916 +42160 1554 1470 +42160 1863 1912 +42160 1863 1916 +42160 1912 1916 +42160 1731 1863 +42160 1650 1668 +42180 1546 1448 +42180 1559 1580 +42180 1560 1619 +42180 1563 1592 +42180 1578 1920 +42180 1580 1779 +42180 1581 1762 +42180 1581 1628 +42180 1628 1762 +42180 1631 1771 +42180 1676 1688 +42180 1676 1448 +42180 1707 1764 +42180 1712 1739 +42180 1731 1828 +42180 1752 1766 +42180 1756 1525 +42180 1767 1489 +42180 1771 1466 +42180 1790 1912 +42180 1790 1828 +42180 1828 1912 +42180 1828 1524 +42180 1828 1916 +42180 1863 1524 +42180 1544 1644 +42180 1558 1919 +42180 1603 1522 +42180 1603 1507 +42180 1698 1707 +42180 1783 1527 +42180 1441 1514 +42180 1489 1500 +42180 1572 1622 +42180 1599 1710 +42180 1600 1756 +42180 1617 1441 +42180 1644 1834 +42180 1676 1465 +42180 1688 1457 +42180 1496 1505 +42180 1579 1448 +42180 1587 1535 +42180 1599 1523 +42180 1622 1517 +42180 1622 1871 +42180 1648 1696 +42180 1661 1739 +42180 1538 1524 +42180 1599 1657 +42180 1604 1616 +42180 1661 1712 +42180 1541 1555 +42180 1731 1790 +42180 1547 1743 +42180 1560 1716 +42180 1790 1916 +42180 1790 1863 +42180 1500 1511 +42180 1652 1747 +42180 1871 1517 +42180 1731 1916 +42180 1554 1470 +42180 1731 1912 +42180 1863 1912 +42180 1863 1916 +42180 1912 1916 +42180 1731 1863 +42180 1650 1668 +42200 1541 1533 +42200 1544 1644 +42200 1546 1688 +42200 1558 1919 +42200 1559 1602 +42200 1578 1604 +42200 1596 1532 +42200 1599 1496 +42200 1602 1631 +42200 1602 1652 +42200 1603 1522 +42200 1603 1507 +42200 1617 1779 +42200 1622 1839 +42200 1648 1529 +42200 1652 1441 +42200 1655 1525 +42200 1688 1468 +42200 1698 1707 +42200 1762 1463 +42200 1773 1531 +42200 1783 1527 +42200 1441 1514 +42200 1489 1500 +42200 1572 1622 +42200 1591 1858 +42200 1599 1710 +42200 1600 1756 +42200 1617 1441 +42200 1644 1834 +42200 1676 1465 +42200 1688 1457 +42200 1496 1505 +42200 1579 1448 +42200 1587 1535 +42200 1599 1523 +42200 1622 1517 +42200 1622 1871 +42200 1648 1696 +42200 1661 1739 +42200 1538 1524 +42200 1599 1657 +42200 1604 1616 +42200 1661 1712 +42200 1541 1555 +42200 1731 1790 +42200 1547 1743 +42200 1549 1525 +42200 1560 1716 +42200 1790 1916 +42200 1790 1863 +42200 1500 1511 +42200 1652 1747 +42200 1871 1517 +42200 1731 1916 +42200 1554 1470 +42200 1507 1522 +42200 1731 1912 +42200 1863 1912 +42200 1863 1916 +42200 1912 1916 +42200 1731 1863 +42200 1650 1668 +42220 1538 1828 +42220 1541 1501 +42220 1546 1448 +42220 1572 1622 +42220 1581 1644 +42220 1586 1639 +42220 1591 1858 +42220 1599 1710 +42220 1599 1505 +42220 1600 1756 +42220 1603 1512 +42220 1603 1449 +42220 1617 1441 +42220 1644 1834 +42220 1676 1465 +42220 1688 1457 +42220 1696 1529 +42220 1771 1532 +42220 1789 1497 +42220 1825 1525 +42220 1496 1505 +42220 1579 1448 +42220 1587 1535 +42220 1599 1523 +42220 1622 1517 +42220 1622 1871 +42220 1648 1696 +42220 1648 1681 +42220 1657 1681 +42220 1661 1739 +42220 1712 1739 +42220 1756 1525 +42220 1767 1489 +42220 1825 1519 +42220 1538 1524 +42220 1599 1657 +42220 1603 1531 +42220 1604 1616 +42220 1661 1712 +42220 1828 1524 +42220 1541 1555 +42220 1593 1521 +42220 1599 1681 +42220 1668 1463 +42220 1731 1790 +42220 1547 1743 +42220 1549 1525 +42220 1560 1716 +42220 1790 1912 +42220 1790 1916 +42220 1790 1863 +42220 1500 1511 +42220 1652 1747 +42220 1871 1517 +42220 1731 1916 +42220 1554 1470 +42220 1512 1531 +42220 1507 1522 +42220 1731 1912 +42220 1863 1912 +42220 1863 1916 +42220 1912 1916 +42220 1731 1863 +42220 1650 1668 +42240 1537 1740 +42240 1572 1771 +42240 1572 1517 +42240 1578 1920 +42240 1579 1448 +42240 1587 1535 +42240 1599 1523 +42240 1602 1517 +42240 1622 1771 +42240 1622 1517 +42240 1622 1871 +42240 1648 1696 +42240 1648 1681 +42240 1657 1681 +42240 1661 1739 +42240 1698 1707 +42240 1698 1495 +42240 1712 1739 +42240 1756 1525 +42240 1767 1489 +42240 1771 1517 +42240 1825 1519 +42240 1434 1457 +42240 1449 1512 +42240 1538 1524 +42240 1599 1657 +42240 1603 1531 +42240 1604 1616 +42240 1648 1529 +42240 1661 1712 +42240 1668 1762 +42240 1707 1764 +42240 1752 1847 +42240 1828 1524 +42240 1448 1465 +42240 1541 1555 +42240 1593 1521 +42240 1599 1681 +42240 1668 1463 +42240 1698 1764 +42240 1731 1790 +42240 1790 1828 +42240 1828 1912 +42240 1547 1743 +42240 1549 1525 +42240 1558 1919 +42240 1559 1580 +42240 1560 1716 +42240 1762 1463 +42240 1790 1912 +42240 1790 1916 +42240 1790 1863 +42240 1546 1743 +42240 1449 1531 +42240 1500 1511 +42240 1652 1747 +42240 1871 1517 +42240 1731 1916 +42240 1783 1527 +42240 1554 1470 +42240 1512 1531 +42240 1507 1522 +42240 1731 1912 +42240 1863 1912 +42240 1863 1916 +42240 1912 1916 +42240 1731 1863 +42240 1650 1668 +42260 1538 1828 +42260 1538 1524 +42260 1549 1712 +42260 1572 1585 +42260 1599 1657 +42260 1599 1710 +42260 1603 1531 +42260 1604 1616 +42260 1645 1756 +42260 1648 1529 +42260 1661 1712 +42260 1668 1762 +42260 1707 1764 +42260 1752 1847 +42260 1770 1434 +42260 1770 1771 +42260 1828 1524 +42260 1840 1489 +42260 1842 1467 +42260 1441 1514 +42260 1448 1465 +42260 1541 1555 +42260 1546 1547 +42260 1591 1467 +42260 1593 1521 +42260 1599 1681 +42260 1602 1688 +42260 1668 1463 +42260 1681 1523 +42260 1698 1764 +42260 1731 1828 +42260 1731 1790 +42260 1790 1828 +42260 1828 1912 +42260 1858 1467 +42260 1547 1743 +42260 1549 1525 +42260 1558 1919 +42260 1559 1580 +42260 1560 1716 +42260 1688 1457 +42260 1688 1496 +42260 1762 1463 +42260 1790 1912 +42260 1790 1916 +42260 1790 1863 +42260 1842 1858 +42260 1546 1743 +42260 1449 1531 +42260 1500 1511 +42260 1652 1747 +42260 1871 1517 +42260 1731 1916 +42260 1783 1527 +42260 1554 1470 +42260 1512 1531 +42260 1507 1522 +42260 1731 1912 +42260 1863 1912 +42260 1863 1916 +42260 1912 1916 +42260 1731 1863 +42260 1650 1668 +42280 1541 1555 +42280 1541 1533 +42280 1546 1547 +42280 1569 1459 +42280 1579 1448 +42280 1591 1467 +42280 1593 1521 +42280 1599 1681 +42280 1602 1688 +42280 1602 1496 +42280 1622 1770 +42280 1631 1648 +42280 1648 1696 +42280 1668 1463 +42280 1681 1523 +42280 1696 1811 +42280 1698 1764 +42280 1706 1426 +42280 1731 1828 +42280 1731 1790 +42280 1790 1828 +42280 1828 1912 +42280 1828 1916 +42280 1839 1517 +42280 1839 1871 +42280 1858 1467 +42280 1496 1505 +42280 1547 1743 +42280 1549 1525 +42280 1558 1919 +42280 1559 1580 +42280 1560 1716 +42280 1655 1811 +42280 1688 1457 +42280 1688 1496 +42280 1762 1463 +42280 1790 1912 +42280 1790 1916 +42280 1790 1863 +42280 1842 1858 +42280 1463 1526 +42280 1546 1743 +42280 1449 1531 +42280 1500 1511 +42280 1652 1747 +42280 1871 1517 +42280 1596 1503 +42280 1731 1916 +42280 1783 1527 +42280 1554 1470 +42280 1599 1525 +42280 1512 1531 +42280 1591 1858 +42280 1507 1522 +42280 1731 1912 +42280 1863 1912 +42280 1863 1916 +42280 1912 1916 +42280 1731 1863 +42280 1650 1668 +42300 1547 1743 +42300 1549 1525 +42300 1553 1599 +42300 1558 1919 +42300 1559 1580 +42300 1560 1716 +42300 1580 1441 +42300 1590 1853 +42300 1599 1638 +42300 1602 1648 +42300 1604 1920 +42300 1628 1463 +42300 1631 1761 +42300 1648 1688 +42300 1652 1770 +42300 1655 1811 +42300 1688 1457 +42300 1688 1496 +42300 1706 1770 +42300 1740 1496 +42300 1762 1463 +42300 1773 1532 +42300 1790 1912 +42300 1790 1916 +42300 1790 1863 +42300 1842 1858 +42300 1900 1920 +42300 1448 1465 +42300 1449 1512 +42300 1463 1526 +42300 1546 1743 +42300 1604 1616 +42300 1628 1526 +42300 1638 1525 +42300 1752 1766 +42300 1767 1489 +42300 1449 1531 +42300 1538 1790 +42300 1441 1514 +42300 1500 1511 +42300 1538 1524 +42300 1652 1747 +42300 1871 1517 +42300 1596 1503 +42300 1731 1916 +42300 1783 1527 +42300 1554 1470 +42300 1599 1525 +42300 1602 1631 +42300 1512 1531 +42300 1591 1858 +42300 1507 1522 +42300 1731 1912 +42300 1863 1912 +42300 1863 1916 +42300 1912 1916 +42300 1731 1863 +42300 1650 1668 +42320 1546 1743 +42320 1549 1529 +42320 1549 1523 +42320 1558 1811 +42320 1559 1831 +42320 1579 1771 +42320 1581 1470 +42320 1596 1434 +42320 1598 1464 +42320 1599 1761 +42320 1599 1769 +42320 1599 1657 +42320 1604 1616 +42320 1628 1526 +42320 1638 1525 +42320 1648 1696 +42320 1676 1811 +42320 1752 1766 +42320 1752 1847 +42320 1761 1811 +42320 1767 1489 +42320 1769 1825 +42320 1811 1448 +42320 1449 1531 +42320 1523 1529 +42320 1538 1790 +42320 1572 1500 +42320 1593 1521 +42320 1599 1825 +42320 1603 1531 +42320 1661 1712 +42320 1546 1547 +42320 1441 1514 +42320 1500 1511 +42320 1538 1524 +42320 1549 1599 +42320 1652 1747 +42320 1676 1761 +42320 1871 1517 +42320 1591 1467 +42320 1596 1503 +42320 1731 1916 +42320 1783 1527 +42320 1858 1467 +42320 1554 1470 +42320 1599 1525 +42320 1602 1631 +42320 1617 1441 +42320 1512 1531 +42320 1591 1858 +42320 1507 1522 +42320 1731 1912 +42320 1863 1912 +42320 1863 1916 +42320 1912 1916 +42320 1731 1863 +42320 1650 1668 +42340 1538 1790 +42340 1546 1716 +42340 1547 1431 +42340 1558 1771 +42340 1572 1500 +42340 1578 1920 +42340 1583 1523 +42340 1593 1521 +42340 1599 1825 +42340 1599 1655 +42340 1603 1531 +42340 1628 1762 +42340 1644 1700 +42340 1655 1525 +42340 1661 1712 +42340 1681 1825 +42340 1761 1771 +42340 1269 1453 +42340 1831 1433 +42340 1831 1487 +42340 1467 1531 +42340 1523 1525 +42340 1546 1547 +42340 1580 1628 +42340 1580 1463 +42340 1858 1531 +42340 1441 1514 +42340 1496 1505 +42340 1500 1511 +42340 1538 1524 +42340 1549 1599 +42340 1652 1747 +42340 1676 1761 +42340 1871 1517 +42340 1591 1467 +42340 1596 1503 +42340 1731 1916 +42340 1783 1527 +42340 1858 1467 +42340 1554 1470 +42340 1599 1525 +42340 1602 1631 +42340 1617 1441 +42340 1512 1531 +42340 1591 1858 +42340 1507 1522 +42340 1731 1912 +42340 1863 1912 +42340 1863 1916 +42340 1912 1916 +42340 1731 1863 +42340 1650 1668 +42360 1537 1505 +42360 1546 1547 +42360 1578 1900 +42360 1580 1628 +42360 1580 1463 +42360 1586 1639 +42360 1602 1740 +42360 1628 1463 +42360 1655 1523 +42360 1657 1769 +42360 1858 1531 +42360 1441 1514 +42360 1496 1505 +42360 1500 1511 +42360 1538 1524 +42360 1549 1523 +42360 1549 1525 +42360 1549 1599 +42360 1558 1919 +42360 1585 1466 +42360 1652 1747 +42360 1676 1761 +42360 1700 1467 +42360 1449 1531 +42360 1825 1523 +42360 1871 1517 +42360 1579 1688 +42360 1631 1448 +42360 1591 1467 +42360 1596 1503 +42360 1602 1448 +42360 1731 1916 +42360 1783 1527 +42360 1840 1489 +42360 1858 1467 +42360 1554 1470 +42360 1599 1525 +42360 1602 1631 +42360 1617 1441 +42360 1604 1616 +42360 1512 1531 +42360 1591 1858 +42360 1507 1522 +42360 1731 1912 +42360 1863 1912 +42360 1863 1916 +42360 1716 1431 +42360 1912 1916 +42360 1731 1863 +42360 1650 1668 +42380 1538 1524 +42380 1538 1790 +42380 1544 1600 +42380 1549 1674 +42380 1549 1523 +42380 1549 1525 +42380 1549 1599 +42380 1554 1834 +42380 1558 1919 +42380 1559 1441 +42380 1563 1569 +42380 1577 1489 +42380 1578 1920 +42380 1583 1825 +42380 1585 1466 +42380 1600 1758 +42380 1603 1512 +42380 1628 1650 +42380 1628 1668 +42380 1638 1465 +42380 1652 1747 +42380 1676 1761 +42380 1700 1467 +42380 1742 1520 +42380 1756 1505 +42380 1834 1470 +42380 1449 1531 +42380 1558 1468 +42380 1583 1523 +42380 1825 1523 +42380 1871 1517 +42380 1544 1614 +42380 1579 1688 +42380 1631 1448 +42380 1591 1467 +42380 1596 1503 +42380 1602 1448 +42380 1731 1916 +42380 1783 1527 +42380 1840 1489 +42380 1858 1467 +42380 1554 1470 +42380 1599 1525 +42380 1602 1631 +42380 1674 1525 +42380 1617 1441 +42380 1604 1616 +42380 1599 1674 +42380 1512 1531 +42380 1591 1858 +42380 1507 1522 +42380 1731 1912 +42380 1771 1529 +42380 1863 1912 +42380 1863 1916 +42380 1716 1431 +42380 1912 1916 +42380 1731 1863 +42380 1650 1668 +42400 1546 1716 +42400 1549 1583 +42400 1550 1630 +42400 1558 1468 +42400 1583 1523 +42400 1657 1769 +42400 1661 1712 +42400 1688 1496 +42400 1761 1463 +42400 1789 1834 +42400 1825 1523 +42400 1871 1517 +42400 1541 1555 +42400 1544 1614 +42400 1579 1688 +42400 1593 1521 +42400 1631 1448 +42400 1591 1467 +42400 1596 1503 +42400 1602 1448 +42400 1645 1756 +42400 1731 1916 +42400 1761 1489 +42400 1783 1527 +42400 1840 1489 +42400 1858 1467 +42400 1554 1470 +42400 1599 1525 +42400 1602 1631 +42400 1674 1525 +42400 1617 1441 +42400 1604 1616 +42400 1599 1674 +42400 1512 1531 +42400 1731 1790 +42400 1790 1912 +42400 1790 1916 +42400 1790 1863 +42400 1591 1858 +42400 1507 1522 +42400 1731 1912 +42400 1771 1529 +42400 1863 1912 +42400 1863 1916 +42400 1681 1771 +42400 1716 1431 +42400 1912 1916 +42400 1731 1863 +42400 1650 1668 +42420 1541 1555 +42420 1544 1614 +42420 1563 1581 +42420 1579 1688 +42420 1590 1688 +42420 1592 1747 +42420 1593 1521 +42420 1631 1448 +42420 1688 1505 +42420 1712 1458 +42420 1767 1770 +42420 1434 1496 +42420 1547 1431 +42420 1591 1467 +42420 1596 1503 +42420 1602 1448 +42420 1645 1756 +42420 1681 1529 +42420 1731 1916 +42420 1761 1489 +42420 1783 1527 +42420 1496 1505 +42420 1580 1761 +42420 1770 1489 +42420 1840 1489 +42420 1858 1467 +42420 1554 1470 +42420 1599 1525 +42420 1602 1631 +42420 1674 1525 +42420 1546 1547 +42420 1578 1920 +42420 1617 1441 +42420 1604 1616 +42420 1599 1674 +42420 1512 1531 +42420 1731 1790 +42420 1790 1912 +42420 1790 1916 +42420 1790 1863 +42420 1591 1858 +42420 1507 1522 +42420 1731 1912 +42420 1771 1529 +42420 1863 1912 +42420 1863 1916 +42420 1269 1453 +42420 1681 1771 +42420 1716 1431 +42420 1912 1916 +42420 1731 1863 +42420 1650 1668 +42440 1547 1431 +42440 1558 1919 +42440 1559 1457 +42440 1559 1434 +42440 1577 1489 +42440 1591 1467 +42440 1596 1503 +42440 1602 1448 +42440 1644 1700 +42440 1645 1756 +42440 1661 1712 +42440 1667 1735 +42440 1681 1529 +42440 1700 1504 +42440 1716 1505 +42440 1731 1916 +42440 1761 1840 +42440 1761 1489 +42440 1783 1527 +42440 1791 1501 +42440 1496 1505 +42440 1500 1511 +42440 1550 1630 +42440 1580 1761 +42440 1770 1489 +42440 1840 1489 +42440 1858 1467 +42440 1919 1468 +42440 1554 1470 +42440 1599 1525 +42440 1602 1631 +42440 1674 1525 +42440 1546 1547 +42440 1578 1920 +42440 1617 1441 +42440 1604 1616 +42440 1558 1468 +42440 1599 1674 +42440 1512 1531 +42440 1731 1790 +42440 1790 1912 +42440 1790 1916 +42440 1790 1863 +42440 1591 1858 +42440 1507 1522 +42440 1731 1912 +42440 1771 1529 +42440 1863 1912 +42440 1863 1916 +42440 1770 1840 +42440 1269 1453 +42440 1681 1771 +42440 1716 1431 +42440 1912 1916 +42440 1716 1496 +42440 1731 1863 +42440 1650 1668 +42460 1550 1630 +42460 1579 1434 +42460 1580 1761 +42460 1631 1465 +42460 1770 1489 +42460 1831 1433 +42460 1840 1489 +42460 1858 1467 +42460 1919 1468 +42460 1554 1470 +42460 1599 1525 +42460 1602 1631 +42460 1674 1525 +42460 1853 1459 +42460 1431 1496 +42460 1546 1547 +42460 1578 1920 +42460 1617 1441 +42460 1548 1516 +42460 1604 1616 +42460 1558 1468 +42460 1599 1674 +42460 1512 1531 +42460 1731 1790 +42460 1790 1912 +42460 1790 1916 +42460 1790 1863 +42460 1591 1858 +42460 1507 1522 +42460 1731 1912 +42460 1771 1529 +42460 1863 1912 +42460 1863 1916 +42460 1770 1840 +42460 1269 1453 +42460 1681 1771 +42460 1716 1431 +42460 1912 1916 +42460 1716 1496 +42460 1731 1863 +42460 1650 1668 +42480 1554 1470 +42480 1578 1616 +42480 1599 1525 +42480 1602 1631 +42480 1604 1920 +42480 1674 1525 +42480 1681 1529 +42480 1767 1770 +42480 1853 1459 +42480 1871 1517 +42480 1431 1496 +42480 1523 1525 +42480 1538 1524 +42480 1546 1547 +42480 1578 1920 +42480 1593 1766 +42480 1617 1441 +42480 1649 1791 +42480 1649 1655 +42480 1688 1434 +42480 1706 1466 +42480 1496 1505 +42480 1500 1511 +42480 1676 1767 +42480 1716 1505 +42480 1548 1516 +42480 1604 1616 +42480 1558 1468 +42480 1599 1674 +42480 1512 1531 +42480 1731 1790 +42480 1790 1912 +42480 1790 1916 +42480 1790 1863 +42480 1591 1858 +42480 1507 1522 +42480 1731 1912 +42480 1731 1916 +42480 1771 1529 +42480 1863 1912 +42480 1863 1916 +42480 1770 1840 +42480 1269 1453 +42480 1681 1771 +42480 1676 1770 +42480 1716 1431 +42480 1912 1916 +42480 1716 1496 +42480 1731 1863 +42480 1650 1668 +42500 1538 1524 +42500 1546 1547 +42500 1578 1920 +42500 1579 1688 +42500 1583 1525 +42500 1593 1766 +42500 1606 1448 +42500 1617 1441 +42500 1631 1743 +42500 1649 1791 +42500 1649 1655 +42500 1688 1434 +42500 1706 1466 +42500 1437 1522 +42500 1449 1531 +42500 1493 1526 +42500 1496 1505 +42500 1500 1511 +42500 1550 1630 +42500 1655 1791 +42500 1676 1767 +42500 1716 1505 +42500 1767 1489 +42500 1548 1516 +42500 1604 1616 +42500 1858 1467 +42500 1558 1468 +42500 1599 1674 +42500 1676 1840 +42500 1783 1527 +42500 1512 1531 +42500 1731 1790 +42500 1790 1912 +42500 1790 1916 +42500 1790 1863 +42500 1591 1858 +42500 1507 1522 +42500 1731 1912 +42500 1731 1916 +42500 1771 1529 +42500 1863 1912 +42500 1863 1916 +42500 1645 1756 +42500 1676 1489 +42500 1770 1840 +42500 1770 1489 +42500 1269 1453 +42500 1681 1771 +42500 1840 1489 +42500 1676 1770 +42500 1716 1431 +42500 1912 1916 +42500 1716 1496 +42500 1731 1863 +42500 1650 1668 +42520 1538 1731 +42520 1549 1519 +42520 1550 1630 +42520 1554 1514 +42520 1603 1449 +42520 1603 1858 +42520 1603 1531 +42520 1644 1700 +42520 1655 1791 +42520 1676 1767 +42520 1681 1758 +42520 1688 1779 +42520 1716 1505 +42520 1761 1463 +42520 1767 1489 +42520 1811 1831 +42520 1523 1525 +42520 1548 1516 +42520 1602 1631 +42520 1604 1616 +42520 1853 1470 +42520 1858 1467 +42520 1538 1790 +42520 1558 1468 +42520 1599 1674 +42520 1676 1840 +42520 1783 1527 +42520 1512 1531 +42520 1731 1790 +42520 1790 1912 +42520 1790 1916 +42520 1790 1863 +42520 1591 1858 +42520 1853 1459 +42520 1507 1522 +42520 1731 1912 +42520 1731 1916 +42520 1771 1529 +42520 1863 1912 +42520 1863 1916 +42520 1645 1756 +42520 1676 1489 +42520 1770 1840 +42520 1770 1489 +42520 1269 1453 +42520 1681 1771 +42520 1840 1489 +42520 1676 1770 +42520 1716 1431 +42520 1912 1916 +42520 1716 1496 +42520 1731 1863 +42520 1650 1668 +42540 1544 1465 +42540 1544 1549 +42540 1547 1505 +42540 1548 1516 +42540 1554 1602 +42540 1554 1631 +42540 1583 1523 +42540 1590 1761 +42540 1592 1652 +42540 1602 1631 +42540 1603 1441 +42540 1603 1526 +42540 1604 1616 +42540 1638 1500 +42540 1767 1770 +42540 1853 1470 +42540 1858 1467 +42540 1538 1790 +42540 1546 1441 +42540 1558 1468 +42540 1599 1674 +42540 1652 1747 +42540 1676 1840 +42540 1783 1527 +42540 1512 1531 +42540 1603 1461 +42540 1661 1712 +42540 1731 1790 +42540 1790 1912 +42540 1790 1916 +42540 1790 1863 +42540 1505 1528 +42540 1591 1858 +42540 1853 1459 +42540 1507 1522 +42540 1731 1912 +42540 1731 1916 +42540 1771 1529 +42540 1863 1912 +42540 1863 1916 +42540 1645 1756 +42540 1676 1489 +42540 1770 1840 +42540 1770 1489 +42540 1269 1453 +42540 1500 1511 +42540 1681 1771 +42540 1840 1489 +42540 1676 1770 +42540 1716 1431 +42540 1912 1916 +42540 1496 1505 +42540 1716 1496 +42540 1731 1863 +42540 1650 1668 +42560 1538 1790 +42560 1538 1863 +42560 1546 1441 +42560 1553 1599 +42560 1558 1468 +42560 1572 1470 +42560 1599 1674 +42560 1616 1920 +42560 1626 1811 +42560 1652 1747 +42560 1676 1840 +42560 1681 1529 +42560 1681 1523 +42560 1783 1527 +42560 1919 1468 +42560 1512 1531 +42560 1549 1599 +42560 1587 1535 +42560 1603 1461 +42560 1661 1712 +42560 1700 1467 +42560 1731 1790 +42560 1790 1912 +42560 1790 1916 +42560 1790 1863 +42560 1443 1493 +42560 1449 1512 +42560 1496 1528 +42560 1505 1528 +42560 1579 1706 +42560 1591 1858 +42560 1853 1459 +42560 1507 1522 +42560 1731 1912 +42560 1731 1916 +42560 1771 1529 +42560 1831 1433 +42560 1863 1912 +42560 1863 1916 +42560 1645 1756 +42560 1676 1489 +42560 1770 1840 +42560 1770 1489 +42560 1269 1453 +42560 1500 1511 +42560 1681 1771 +42560 1840 1489 +42560 1676 1770 +42560 1716 1431 +42560 1912 1916 +42560 1599 1821 +42560 1805 1888 +42560 1496 1505 +42560 1716 1496 +42560 1731 1863 +42560 1650 1668 +42580 1549 1599 +42580 1554 1457 +42580 1580 1761 +42580 1583 1825 +42580 1587 1535 +42580 1590 1437 +42580 1600 1519 +42580 1603 1461 +42580 1617 1514 +42580 1628 1761 +42580 1628 1463 +42580 1661 1712 +42580 1700 1467 +42580 1731 1790 +42580 1769 1443 +42580 1769 1467 +42580 1790 1912 +42580 1790 1916 +42580 1790 1863 +42580 1858 1467 +42580 1443 1493 +42580 1449 1512 +42580 1493 1526 +42580 1496 1528 +42580 1505 1528 +42580 1541 1555 +42580 1541 1533 +42580 1579 1706 +42580 1591 1858 +42580 1700 1858 +42580 1853 1459 +42580 1507 1522 +42580 1523 1525 +42580 1604 1616 +42580 1731 1912 +42580 1731 1916 +42580 1771 1529 +42580 1831 1433 +42580 1863 1912 +42580 1863 1916 +42580 1645 1756 +42580 1676 1489 +42580 1770 1840 +42580 1770 1489 +42580 1269 1453 +42580 1467 1493 +42580 1500 1511 +42580 1681 1771 +42580 1735 1465 +42580 1840 1489 +42580 1443 1467 +42580 1676 1770 +42580 1716 1431 +42580 1912 1916 +42580 1599 1821 +42580 1805 1888 +42580 1496 1505 +42580 1716 1496 +42580 1731 1863 +42580 1650 1668 +42600 1541 1555 +42600 1541 1533 +42600 1548 1516 +42600 1572 1470 +42600 1579 1706 +42600 1591 1858 +42600 1652 1747 +42600 1681 1529 +42600 1700 1858 +42600 1716 1505 +42600 1779 1514 +42600 1825 1525 +42600 1853 1459 +42600 1858 1443 +42600 1858 1493 +42600 1871 1517 +42600 1449 1531 +42600 1458 1503 +42600 1501 1516 +42600 1507 1522 +42600 1512 1531 +42600 1523 1525 +42600 1546 1770 +42600 1549 1674 +42600 1604 1616 +42600 1630 1520 +42600 1676 1840 +42600 1731 1912 +42600 1731 1916 +42600 1771 1529 +42600 1831 1433 +42600 1863 1912 +42600 1863 1916 +42600 1645 1756 +42600 1676 1489 +42600 1770 1840 +42600 1770 1489 +42600 1269 1453 +42600 1467 1493 +42600 1500 1511 +42600 1538 1790 +42600 1681 1771 +42600 1735 1465 +42600 1840 1489 +42600 1443 1467 +42600 1676 1770 +42600 1716 1431 +42600 1912 1916 +42600 1599 1821 +42600 1767 1489 +42600 1805 1888 +42600 1496 1505 +42600 1783 1527 +42600 1716 1496 +42600 1731 1863 +42600 1650 1668 +42620 1546 1770 +42620 1549 1674 +42620 1600 1519 +42620 1604 1616 +42620 1630 1520 +42620 1661 1712 +42620 1676 1840 +42620 1676 1767 +42620 1681 1525 +42620 1700 1504 +42620 1731 1912 +42620 1731 1916 +42620 1761 1791 +42620 1767 1770 +42620 1771 1529 +42620 1831 1433 +42620 1863 1912 +42620 1863 1916 +42620 1645 1756 +42620 1676 1489 +42620 1770 1840 +42620 1770 1489 +42620 1269 1453 +42620 1467 1493 +42620 1500 1511 +42620 1505 1528 +42620 1538 1790 +42620 1558 1468 +42620 1681 1771 +42620 1735 1465 +42620 1840 1489 +42620 1443 1467 +42620 1587 1535 +42620 1676 1770 +42620 1716 1431 +42620 1912 1916 +42620 1599 1821 +42620 1617 1857 +42620 1767 1489 +42620 1805 1888 +42620 1496 1505 +42620 1783 1527 +42620 1716 1496 +42620 1731 1863 +42620 1650 1668 +42640 1586 1771 +42640 1590 1522 +42640 1591 1858 +42640 1602 1471 +42640 1628 1791 +42640 1645 1756 +42640 1676 1489 +42640 1700 1858 +42640 1700 1443 +42640 1740 1501 +42640 1769 1443 +42640 1770 1840 +42640 1770 1489 +42640 1269 1453 +42640 1791 1463 +42640 1831 1470 +42640 1871 1517 +42640 1467 1493 +42640 1500 1511 +42640 1505 1528 +42640 1512 1531 +42640 1538 1790 +42640 1558 1468 +42640 1585 1772 +42640 1617 1676 +42640 1667 1434 +42640 1681 1771 +42640 1735 1465 +42640 1769 1467 +42640 1790 1912 +42640 1840 1489 +42640 1858 1493 +42640 1443 1467 +42640 1587 1535 +42640 1676 1770 +42640 1716 1431 +42640 1912 1916 +42640 1599 1821 +42640 1617 1857 +42640 1767 1489 +42640 1599 1664 +42640 1603 1507 +42640 1853 1459 +42640 1858 1467 +42640 1549 1735 +42640 1549 1465 +42640 1805 1888 +42640 1507 1522 +42640 1496 1505 +42640 1783 1527 +42640 1716 1496 +42640 1603 1522 +42640 1664 1821 +42640 1731 1863 +42640 1650 1668 +42660 1538 1790 +42660 1544 1599 +42660 1553 1599 +42660 1558 1468 +42660 1585 1772 +42660 1596 1598 +42660 1598 1920 +42660 1601 1761 +42660 1617 1770 +42660 1617 1676 +42660 1664 1713 +42660 1667 1434 +42660 1674 1735 +42660 1681 1529 +42660 1681 1771 +42660 1735 1465 +42660 1752 1766 +42660 1769 1467 +42660 1790 1912 +42660 1840 1489 +42660 1858 1493 +42660 1919 1468 +42660 1443 1467 +42660 1449 1512 +42660 1538 1912 +42660 1538 1916 +42660 1559 1655 +42660 1587 1535 +42660 1599 1713 +42660 1630 1520 +42660 1676 1770 +42660 1700 1504 +42660 1716 1431 +42660 1731 1916 +42660 1863 1916 +42660 1912 1916 +42660 1599 1821 +42660 1617 1857 +42660 1688 1706 +42660 1767 1489 +42660 1523 1525 +42660 1599 1664 +42660 1603 1507 +42660 1853 1459 +42660 1858 1467 +42660 1549 1735 +42660 1549 1465 +42660 1647 1666 +42660 1805 1888 +42660 1507 1522 +42660 1496 1505 +42660 1783 1527 +42660 1716 1496 +42660 1603 1522 +42660 1604 1616 +42660 1664 1821 +42660 1652 1747 +42660 1731 1863 +42660 1650 1668 +42680 1538 1912 +42680 1538 1916 +42680 1559 1655 +42680 1587 1535 +42680 1599 1713 +42680 1600 1519 +42680 1630 1520 +42680 1664 1701 +42680 1674 1465 +42680 1676 1770 +42680 1700 1504 +42680 1716 1431 +42680 1731 1912 +42680 1731 1916 +42680 1767 1840 +42680 1770 1489 +42680 1772 1466 +42680 1772 1443 +42680 1774 1524 +42680 1863 1916 +42680 1912 1916 +42680 1443 1487 +42680 1544 1523 +42680 1591 1858 +42680 1598 1847 +42680 1599 1821 +42680 1617 1857 +42680 1688 1706 +42680 1761 1489 +42680 1767 1489 +42680 1523 1525 +42680 1544 1525 +42680 1599 1664 +42680 1603 1507 +42680 1701 1713 +42680 1769 1443 +42680 1853 1459 +42680 1858 1467 +42680 1549 1735 +42680 1549 1465 +42680 1647 1666 +42680 1805 1888 +42680 1507 1522 +42680 1496 1505 +42680 1783 1527 +42680 1716 1496 +42680 1716 1505 +42680 1603 1522 +42680 1604 1616 +42680 1664 1821 +42680 1652 1747 +42680 1731 1863 +42680 1650 1668 +42700 1538 1790 +42700 1544 1523 +42700 1544 1701 +42700 1549 1559 +42700 1559 1604 +42700 1591 1858 +42700 1598 1847 +42700 1599 1821 +42700 1616 1655 +42700 1617 1857 +42700 1617 1441 +42700 1645 1756 +42700 1688 1706 +42700 1701 1523 +42700 1756 1448 +42700 1761 1489 +42700 1767 1489 +42700 1769 1487 +42700 1847 1920 +42700 1857 1441 +42700 1871 1517 +42700 1489 1511 +42700 1498 1526 +42700 1523 1525 +42700 1544 1525 +42700 1569 1742 +42700 1599 1664 +42700 1603 1507 +42700 1701 1713 +42700 1769 1443 +42700 1853 1459 +42700 1858 1467 +42700 1544 1713 +42700 1549 1735 +42700 1549 1465 +42700 1602 1631 +42700 1701 1525 +42700 1713 1525 +42700 1470 1526 +42700 1647 1666 +42700 1805 1888 +42700 1840 1489 +42700 1507 1522 +42700 1496 1505 +42700 1783 1527 +42700 1716 1496 +42700 1716 1505 +42700 1603 1522 +42700 1604 1616 +42700 1512 1531 +42700 1664 1821 +42700 1652 1747 +42700 1731 1863 +42700 1650 1668 +42720 1544 1525 +42720 1544 1583 +42720 1553 1599 +42720 1569 1742 +42720 1596 1464 +42720 1599 1664 +42720 1599 1523 +42720 1603 1507 +42720 1627 1505 +42720 1644 1700 +42720 1664 1681 +42720 1677 1523 +42720 1701 1713 +42720 1767 1500 +42720 1769 1443 +42720 1791 1463 +42720 1821 1519 +42720 1840 1511 +42720 1840 1500 +42720 1847 1501 +42720 1853 1459 +42720 1858 1467 +42720 1500 1511 +42720 1544 1713 +42720 1549 1735 +42720 1549 1465 +42720 1602 1631 +42720 1664 1519 +42720 1701 1525 +42720 1713 1525 +42720 1470 1526 +42720 1647 1666 +42720 1805 1888 +42720 1840 1489 +42720 1507 1522 +42720 1700 1504 +42720 1496 1505 +42720 1583 1713 +42720 1783 1527 +42720 1767 1840 +42720 1716 1496 +42720 1716 1505 +42720 1603 1522 +42720 1604 1616 +42720 1512 1531 +42720 1600 1664 +42720 1559 1599 +42720 1664 1821 +42720 1652 1747 +42720 1731 1863 +42720 1650 1668 +42740 1544 1713 +42740 1549 1713 +42740 1549 1735 +42740 1549 1465 +42740 1558 1468 +42740 1559 1655 +42740 1600 1821 +42740 1601 1630 +42740 1602 1631 +42740 1664 1519 +42740 1677 1713 +42740 1742 1520 +42740 1847 1904 +42740 1467 1493 +42740 1489 1500 +42740 1523 1525 +42740 1735 1465 +42740 1449 1512 +42740 1701 1525 +42740 1713 1525 +42740 1269 1453 +42740 1449 1531 +42740 1470 1526 +42740 1591 1858 +42740 1647 1666 +42740 1805 1888 +42740 1840 1489 +42740 1507 1522 +42740 1700 1504 +42740 1713 1523 +42740 1847 1920 +42740 1496 1505 +42740 1583 1713 +42740 1783 1527 +42740 1767 1840 +42740 1716 1496 +42740 1716 1505 +42740 1767 1489 +42740 1603 1522 +42740 1604 1616 +42740 1512 1531 +42740 1600 1664 +42740 1559 1599 +42740 1664 1821 +42740 1652 1747 +42740 1731 1863 +42740 1650 1668 +42760 1544 1599 +42760 1544 1559 +42760 1555 1533 +42760 1598 1688 +42760 1627 1505 +42760 1700 1495 +42760 1735 1465 +42760 1437 1470 +42760 1449 1512 +42760 1537 1437 +42760 1645 1756 +42760 1688 1772 +42760 1701 1713 +42760 1701 1525 +42760 1713 1525 +42760 1269 1453 +42760 1449 1531 +42760 1470 1526 +42760 1537 1603 +42760 1591 1858 +42760 1647 1666 +42760 1805 1888 +42760 1840 1489 +42760 1507 1522 +42760 1700 1504 +42760 1713 1523 +42760 1847 1920 +42760 1467 1495 +42760 1496 1505 +42760 1500 1511 +42760 1583 1713 +42760 1603 1507 +42760 1783 1527 +42760 1767 1840 +42760 1431 1516 +42760 1716 1496 +42760 1716 1505 +42760 1767 1489 +42760 1603 1522 +42760 1604 1616 +42760 1512 1531 +42760 1600 1664 +42760 1559 1599 +42760 1664 1821 +42760 1652 1747 +42760 1731 1863 +42760 1650 1668 +42780 1537 1437 +42780 1546 1563 +42780 1574 1596 +42780 1583 1525 +42780 1596 1772 +42780 1598 1772 +42780 1599 1525 +42780 1617 1857 +42780 1628 1761 +42780 1644 1495 +42780 1645 1756 +42780 1681 1525 +42780 1688 1772 +42780 1701 1713 +42780 1701 1525 +42780 1713 1525 +42780 1269 1453 +42780 1449 1531 +42780 1470 1526 +42780 1489 1500 +42780 1523 1525 +42780 1537 1603 +42780 1549 1713 +42780 1591 1858 +42780 1601 1630 +42780 1644 1700 +42780 1647 1666 +42780 1805 1888 +42780 1840 1489 +42780 1507 1522 +42780 1538 1524 +42780 1700 1504 +42780 1713 1523 +42780 1847 1920 +42780 1467 1495 +42780 1496 1505 +42780 1500 1511 +42780 1583 1713 +42780 1603 1507 +42780 1677 1701 +42780 1783 1527 +42780 1767 1840 +42780 1431 1516 +42780 1676 1770 +42780 1716 1496 +42780 1716 1505 +42780 1767 1489 +42780 1544 1549 +42780 1603 1522 +42780 1604 1616 +42780 1512 1531 +42780 1600 1664 +42780 1559 1599 +42780 1664 1821 +42780 1652 1747 +42780 1731 1863 +42780 1650 1668 +42800 1537 1603 +42800 1544 1559 +42800 1549 1713 +42800 1563 1592 +42800 1580 1628 +42800 1580 1463 +42800 1591 1858 +42800 1595 1599 +42800 1601 1630 +42800 1644 1700 +42800 1647 1666 +42800 1650 1463 +42800 1668 1463 +42800 1756 1524 +42800 1805 1888 +42800 1840 1489 +42800 1871 1517 +42800 1507 1522 +42800 1522 1526 +42800 1538 1524 +42800 1544 1599 +42800 1595 1655 +42800 1664 1519 +42800 1700 1504 +42800 1713 1523 +42800 1847 1920 +42800 1874 1493 +42800 1467 1495 +42800 1496 1505 +42800 1500 1511 +42800 1583 1713 +42800 1603 1507 +42800 1628 1463 +42800 1677 1701 +42800 1783 1527 +42800 1548 1516 +42800 1767 1840 +42800 1431 1516 +42800 1676 1770 +42800 1716 1496 +42800 1716 1505 +42800 1767 1489 +42800 1544 1549 +42800 1603 1522 +42800 1604 1616 +42800 1512 1531 +42800 1600 1664 +42800 1600 1821 +42800 1559 1599 +42800 1664 1821 +42800 1652 1747 +42800 1731 1863 +42800 1650 1668 +42820 1537 1526 +42820 1538 1524 +42820 1544 1599 +42820 1583 1525 +42820 1595 1654 +42820 1595 1655 +42820 1627 1716 +42820 1664 1519 +42820 1688 1527 +42820 1700 1504 +42820 1700 1467 +42820 1713 1523 +42820 1847 1920 +42820 1874 1493 +42820 1467 1495 +42820 1496 1505 +42820 1500 1511 +42820 1583 1713 +42820 1603 1507 +42820 1628 1463 +42820 1677 1701 +42820 1700 1495 +42820 1735 1465 +42820 1783 1527 +42820 1548 1516 +42820 1688 1465 +42820 1713 1525 +42820 1767 1840 +42820 1431 1516 +42820 1676 1770 +42820 1716 1496 +42820 1716 1505 +42820 1767 1489 +42820 1544 1549 +42820 1603 1522 +42820 1617 1857 +42820 1701 1525 +42820 1604 1616 +42820 1512 1531 +42820 1600 1664 +42820 1600 1821 +42820 1559 1599 +42820 1664 1821 +42820 1652 1747 +42820 1731 1863 +42820 1650 1668 +42840 1547 1578 +42840 1563 1592 +42840 1583 1713 +42840 1600 1681 +42840 1600 1523 +42840 1603 1507 +42840 1627 1528 +42840 1628 1650 +42840 1628 1463 +42840 1647 1666 +42840 1664 1529 +42840 1668 1463 +42840 1677 1701 +42840 1700 1458 +42840 1700 1495 +42840 1701 1713 +42840 1713 1825 +42840 1735 1465 +42840 1756 1526 +42840 1783 1527 +42840 1840 1489 +42840 1548 1516 +42840 1601 1630 +42840 1602 1631 +42840 1628 1668 +42840 1677 1525 +42840 1688 1465 +42840 1713 1525 +42840 1767 1840 +42840 1871 1517 +42840 1919 1510 +42840 1591 1858 +42840 1431 1516 +42840 1676 1770 +42840 1716 1496 +42840 1716 1505 +42840 1767 1489 +42840 1544 1549 +42840 1433 1443 +42840 1603 1522 +42840 1617 1857 +42840 1664 1681 +42840 1701 1525 +42840 1604 1616 +42840 1512 1531 +42840 1600 1664 +42840 1761 1493 +42840 1805 1888 +42840 1600 1821 +42840 1559 1599 +42840 1664 1821 +42840 1652 1747 +42840 1731 1863 +42840 1650 1668 +42860 1544 1825 +42860 1548 1516 +42860 1553 1599 +42860 1559 1825 +42860 1583 1825 +42860 1595 1654 +42860 1599 1825 +42860 1601 1630 +42860 1602 1631 +42860 1628 1668 +42860 1665 1525 +42860 1677 1525 +42860 1688 1465 +42860 1701 1523 +42860 1713 1523 +42860 1713 1525 +42860 1716 1528 +42860 1716 1791 +42860 1767 1840 +42860 1825 1525 +42860 1853 1459 +42860 1871 1517 +42860 1919 1510 +42860 1591 1858 +42860 1431 1516 +42860 1470 1526 +42860 1599 1665 +42860 1676 1770 +42860 1716 1496 +42860 1716 1505 +42860 1767 1489 +42860 1467 1495 +42860 1544 1549 +42860 1433 1443 +42860 1603 1522 +42860 1617 1857 +42860 1664 1681 +42860 1701 1525 +42860 1604 1616 +42860 1512 1531 +42860 1600 1664 +42860 1761 1493 +42860 1805 1888 +42860 1600 1821 +42860 1559 1599 +42860 1664 1821 +42860 1858 1495 +42860 1652 1747 +42860 1731 1863 +42860 1650 1668 +42880 1538 1563 +42880 1538 1524 +42880 1559 1523 +42880 1578 1791 +42880 1591 1858 +42880 1599 1821 +42880 1666 1772 +42880 1700 1458 +42880 1767 1811 +42880 1783 1527 +42880 1431 1516 +42880 1470 1526 +42880 1525 1529 +42880 1558 1468 +42880 1592 1524 +42880 1599 1665 +42880 1603 1507 +42880 1665 1677 +42880 1665 1701 +42880 1676 1770 +42880 1716 1496 +42880 1716 1505 +42880 1767 1489 +42880 1449 1531 +42880 1467 1495 +42880 1544 1549 +42880 1628 1463 +42880 1665 1523 +42880 1433 1443 +42880 1507 1522 +42880 1603 1522 +42880 1563 1524 +42880 1617 1857 +42880 1664 1681 +42880 1681 1821 +42880 1701 1525 +42880 1604 1616 +42880 1512 1531 +42880 1544 1713 +42880 1600 1664 +42880 1761 1493 +42880 1537 1443 +42880 1805 1888 +42880 1600 1821 +42880 1769 1487 +42880 1559 1599 +42880 1664 1821 +42880 1858 1495 +42880 1652 1747 +42880 1731 1863 +42880 1650 1668 +42900 1558 1468 +42900 1559 1665 +42900 1563 1592 +42900 1578 1505 +42900 1592 1524 +42900 1599 1665 +42900 1599 1523 +42900 1599 1701 +42900 1603 1507 +42900 1665 1677 +42900 1665 1701 +42900 1676 1770 +42900 1716 1496 +42900 1716 1505 +42900 1767 1489 +42900 1825 1529 +42900 1840 1489 +42900 1449 1531 +42900 1461 1467 +42900 1467 1495 +42900 1496 1505 +42900 1544 1549 +42900 1549 1713 +42900 1628 1463 +42900 1665 1523 +42900 1676 1756 +42900 1853 1459 +42900 1919 1427 +42900 1433 1443 +42900 1507 1522 +42900 1578 1716 +42900 1591 1495 +42900 1603 1522 +42900 1627 1716 +42900 1716 1528 +42900 1563 1524 +42900 1617 1857 +42900 1645 1526 +42900 1664 1681 +42900 1681 1821 +42900 1701 1525 +42900 1767 1840 +42900 1604 1616 +42900 1645 1756 +42900 1512 1531 +42900 1544 1713 +42900 1600 1664 +42900 1761 1493 +42900 1537 1443 +42900 1805 1888 +42900 1600 1821 +42900 1769 1487 +42900 1559 1599 +42900 1664 1821 +42900 1858 1495 +42900 1652 1747 +42900 1731 1863 +42900 1650 1668 +42920 1544 1549 +42920 1547 1716 +42920 1549 1713 +42920 1553 1599 +42920 1566 1665 +42920 1599 1825 +42920 1617 1441 +42920 1628 1463 +42920 1665 1523 +42920 1676 1842 +42920 1676 1756 +42920 1677 1701 +42920 1700 1496 +42920 1756 1526 +42920 1779 1811 +42920 1842 1470 +42920 1853 1459 +42920 1919 1427 +42920 1433 1443 +42920 1507 1522 +42920 1578 1716 +42920 1591 1495 +42920 1603 1522 +42920 1627 1716 +42920 1716 1528 +42920 1783 1527 +42920 1791 1528 +42920 1563 1524 +42920 1617 1857 +42920 1645 1526 +42920 1664 1681 +42920 1681 1821 +42920 1701 1525 +42920 1767 1840 +42920 1549 1665 +42920 1604 1616 +42920 1645 1756 +42920 1512 1531 +42920 1544 1713 +42920 1600 1664 +42920 1761 1493 +42920 1871 1517 +42920 1537 1443 +42920 1566 1525 +42920 1805 1888 +42920 1600 1821 +42920 1769 1487 +42920 1559 1599 +42920 1664 1821 +42920 1858 1495 +42920 1652 1747 +42920 1731 1863 +42920 1650 1668 +42940 1550 1700 +42940 1566 1642 +42940 1578 1716 +42940 1591 1495 +42940 1595 1654 +42940 1599 1701 +42940 1600 1681 +42940 1602 1631 +42940 1603 1522 +42940 1627 1716 +42940 1642 1701 +42940 1665 1713 +42940 1666 1772 +42940 1676 1441 +42940 1676 1811 +42940 1716 1528 +42940 1269 1453 +42940 1783 1527 +42940 1791 1528 +42940 1825 1529 +42940 1461 1467 +42940 1470 1526 +42940 1544 1665 +42940 1559 1525 +42940 1563 1524 +42940 1566 1701 +42940 1599 1525 +42940 1601 1630 +42940 1617 1857 +42940 1642 1525 +42940 1645 1526 +42940 1664 1681 +42940 1681 1821 +42940 1700 1528 +42940 1701 1525 +42940 1767 1840 +42940 1549 1665 +42940 1566 1523 +42940 1604 1616 +42940 1645 1756 +42940 1512 1531 +42940 1544 1713 +42940 1600 1664 +42940 1603 1507 +42940 1761 1493 +42940 1871 1517 +42940 1537 1443 +42940 1566 1525 +42940 1805 1888 +42940 1600 1821 +42940 1769 1487 +42940 1559 1599 +42940 1664 1821 +42940 1858 1495 +42940 1652 1747 +42940 1731 1863 +42940 1650 1668 +42960 1544 1665 +42960 1544 1525 +42960 1546 1701 +42960 1547 1716 +42960 1553 1664 +42960 1553 1642 +42960 1559 1525 +42960 1563 1524 +42960 1566 1701 +42960 1566 1599 +42960 1593 1811 +42960 1599 1525 +42960 1601 1630 +42960 1603 1811 +42960 1617 1857 +42960 1642 1525 +42960 1645 1526 +42960 1664 1681 +42960 1674 1920 +42960 1676 1779 +42960 1681 1821 +42960 1700 1528 +42960 1701 1525 +42960 1752 1766 +42960 1756 1526 +42960 1767 1840 +42960 1767 1489 +42960 1431 1516 +42960 1549 1665 +42960 1549 1713 +42960 1566 1523 +42960 1580 1628 +42960 1599 1642 +42960 1604 1616 +42960 1645 1756 +42960 1713 1758 +42960 1842 1433 +42960 1919 1427 +42960 1449 1531 +42960 1512 1531 +42960 1544 1713 +42960 1544 1549 +42960 1600 1664 +42960 1603 1507 +42960 1628 1463 +42960 1761 1493 +42960 1871 1517 +42960 1537 1443 +42960 1538 1524 +42960 1566 1525 +42960 1805 1888 +42960 1840 1489 +42960 1600 1821 +42960 1769 1487 +42960 1559 1599 +42960 1664 1821 +42960 1858 1495 +42960 1652 1747 +42960 1731 1863 +42960 1650 1668 +42980 1544 1701 +42980 1549 1665 +42980 1549 1713 +42980 1566 1523 +42980 1580 1628 +42980 1598 1674 +42980 1599 1642 +42980 1604 1616 +42980 1606 1716 +42980 1617 1441 +42980 1627 1716 +42980 1645 1756 +42980 1665 1713 +42980 1665 1701 +42980 1713 1758 +42980 1716 1459 +42980 1740 1453 +42980 1825 1529 +42980 1842 1433 +42980 1919 1427 +42980 1449 1531 +42980 1512 1531 +42980 1523 1525 +42980 1544 1713 +42980 1544 1549 +42980 1549 1701 +42980 1600 1664 +42980 1603 1522 +42980 1603 1507 +42980 1628 1463 +42980 1761 1493 +42980 1871 1517 +42980 1507 1522 +42980 1537 1443 +42980 1538 1524 +42980 1547 1578 +42980 1566 1525 +42980 1805 1888 +42980 1840 1489 +42980 1600 1821 +42980 1769 1487 +42980 1647 1675 +42980 1779 1441 +42980 1559 1599 +42980 1664 1821 +42980 1591 1495 +42980 1858 1495 +42980 1578 1716 +42980 1652 1747 +42980 1731 1863 +42980 1650 1668 +43000 1538 1563 +43000 1544 1713 +43000 1544 1549 +43000 1549 1701 +43000 1566 1701 +43000 1594 1696 +43000 1595 1654 +43000 1599 1651 +43000 1600 1664 +43000 1603 1522 +43000 1603 1507 +43000 1617 1857 +43000 1628 1463 +43000 1630 1842 +43000 1664 1681 +43000 1665 1531 +43000 1761 1493 +43000 1831 1443 +43000 1871 1517 +43000 1507 1522 +43000 1537 1443 +43000 1538 1524 +43000 1547 1578 +43000 1549 1525 +43000 1566 1525 +43000 1583 1523 +43000 1599 1675 +43000 1601 1630 +43000 1666 1772 +43000 1805 1888 +43000 1544 1616 +43000 1544 1604 +43000 1572 1742 +43000 1767 1489 +43000 1840 1489 +43000 1600 1821 +43000 1769 1487 +43000 1647 1675 +43000 1647 1651 +43000 1651 1675 +43000 1779 1441 +43000 1559 1599 +43000 1664 1821 +43000 1591 1495 +43000 1858 1495 +43000 1578 1716 +43000 1652 1747 +43000 1731 1863 +43000 1650 1668 +43020 1537 1443 +43020 1538 1524 +43020 1544 1523 +43020 1544 1651 +43020 1544 1531 +43020 1547 1578 +43020 1549 1525 +43020 1559 1525 +43020 1566 1525 +43020 1583 1523 +43020 1599 1642 +43020 1599 1675 +43020 1601 1630 +43020 1604 1512 +43020 1604 1531 +43020 1606 1716 +43020 1616 1531 +43020 1616 1758 +43020 1622 1520 +43020 1642 1523 +43020 1655 1731 +43020 1655 1863 +43020 1666 1772 +43020 1805 1888 +43020 1500 1511 +43020 1512 1531 +43020 1544 1616 +43020 1544 1604 +43020 1559 1642 +43020 1572 1742 +43020 1603 1470 +43020 1681 1825 +43020 1767 1489 +43020 1840 1489 +43020 1523 1525 +43020 1600 1821 +43020 1603 1526 +43020 1628 1756 +43020 1769 1487 +43020 1544 1529 +43020 1647 1675 +43020 1647 1651 +43020 1701 1525 +43020 1651 1675 +43020 1779 1441 +43020 1559 1599 +43020 1664 1821 +43020 1591 1495 +43020 1858 1495 +43020 1578 1716 +43020 1652 1747 +43020 1731 1863 +43020 1650 1668 +43040 1544 1664 +43040 1544 1616 +43040 1544 1604 +43040 1545 1791 +43040 1559 1642 +43040 1572 1742 +43040 1595 1654 +43040 1603 1470 +43040 1617 1779 +43040 1617 1441 +43040 1681 1825 +43040 1767 1489 +43040 1821 1825 +43040 1831 1458 +43040 1840 1489 +43040 1507 1522 +43040 1523 1525 +43040 1600 1821 +43040 1603 1526 +43040 1628 1756 +43040 1769 1487 +43040 1544 1529 +43040 1617 1857 +43040 1647 1675 +43040 1604 1616 +43040 1647 1651 +43040 1701 1525 +43040 1871 1517 +43040 1783 1531 +43040 1527 1531 +43040 1566 1531 +43040 1651 1675 +43040 1779 1441 +43040 1559 1599 +43040 1600 1664 +43040 1590 1811 +43040 1664 1821 +43040 1591 1495 +43040 1858 1495 +43040 1578 1716 +43040 1652 1747 +43040 1731 1863 +43040 1650 1668 +43060 1538 1563 +43060 1549 1525 +43060 1549 1599 +43060 1559 1523 +43060 1566 1783 +43060 1595 1740 +43060 1595 1678 +43060 1600 1821 +43060 1603 1526 +43060 1604 1664 +43060 1622 1520 +43060 1628 1756 +43060 1761 1526 +43060 1769 1487 +43060 1919 1427 +43060 1495 1532 +43060 1496 1505 +43060 1500 1511 +43060 1544 1529 +43060 1563 1524 +43060 1617 1857 +43060 1647 1675 +43060 1767 1840 +43060 1604 1616 +43060 1647 1651 +43060 1701 1525 +43060 1871 1517 +43060 1783 1531 +43060 1805 1888 +43060 1527 1531 +43060 1566 1531 +43060 1651 1675 +43060 1779 1441 +43060 1559 1599 +43060 1600 1664 +43060 1590 1811 +43060 1664 1821 +43060 1591 1495 +43060 1858 1495 +43060 1578 1716 +43060 1652 1747 +43060 1538 1524 +43060 1731 1863 +43060 1650 1668 +43080 1544 1529 +43080 1544 1642 +43080 1559 1642 +43080 1563 1524 +43080 1566 1527 +43080 1606 1716 +43080 1617 1857 +43080 1647 1675 +43080 1664 1529 +43080 1677 1525 +43080 1767 1840 +43080 1595 1654 +43080 1599 1642 +43080 1604 1616 +43080 1644 1467 +43080 1647 1651 +43080 1701 1525 +43080 1840 1489 +43080 1871 1517 +43080 1783 1531 +43080 1805 1888 +43080 1527 1531 +43080 1566 1531 +43080 1651 1675 +43080 1779 1441 +43080 1559 1599 +43080 1600 1664 +43080 1590 1811 +43080 1664 1821 +43080 1591 1495 +43080 1858 1495 +43080 1578 1716 +43080 1652 1747 +43080 1538 1524 +43080 1731 1863 +43080 1650 1668 +43100 1595 1654 +43100 1599 1681 +43100 1599 1642 +43100 1600 1529 +43100 1601 1630 +43100 1604 1616 +43100 1617 1441 +43100 1642 1525 +43100 1644 1467 +43100 1647 1651 +43100 1666 1772 +43100 1701 1525 +43100 1840 1489 +43100 1871 1517 +43100 1538 1563 +43100 1544 1616 +43100 1544 1604 +43100 1546 1770 +43100 1769 1487 +43100 1783 1531 +43100 1805 1888 +43100 1527 1531 +43100 1566 1531 +43100 1651 1675 +43100 1500 1514 +43100 1779 1441 +43100 1470 1526 +43100 1559 1599 +43100 1600 1664 +43100 1600 1821 +43100 1590 1811 +43100 1664 1821 +43100 1591 1495 +43100 1858 1495 +43100 1578 1716 +43100 1652 1747 +43100 1538 1524 +43100 1731 1863 +43100 1650 1668 +43120 1538 1563 +43120 1544 1616 +43120 1544 1604 +43120 1546 1770 +43120 1563 1524 +43120 1581 1842 +43120 1661 1857 +43120 1712 1857 +43120 1769 1487 +43120 1783 1531 +43120 1805 1888 +43120 1493 1532 +43120 1496 1505 +43120 1527 1531 +43120 1566 1531 +43120 1645 1756 +43120 1651 1675 +43120 1761 1443 +43120 1500 1514 +43120 1566 1527 +43120 1677 1701 +43120 1779 1441 +43120 1857 1526 +43120 1467 1504 +43120 1470 1526 +43120 1559 1599 +43120 1600 1664 +43120 1600 1821 +43120 1590 1811 +43120 1664 1821 +43120 1591 1495 +43120 1858 1495 +43120 1578 1716 +43120 1652 1747 +43120 1857 1470 +43120 1644 1504 +43120 1538 1524 +43120 1731 1863 +43120 1650 1668 +43140 1541 1789 +43140 1544 1783 +43140 1549 1599 +43140 1566 1531 +43140 1606 1716 +43140 1645 1756 +43140 1651 1675 +43140 1654 1839 +43140 1677 1525 +43140 1761 1443 +43140 1500 1514 +43140 1566 1527 +43140 1604 1616 +43140 1677 1701 +43140 1701 1525 +43140 1767 1840 +43140 1779 1441 +43140 1857 1526 +43140 1467 1504 +43140 1470 1526 +43140 1500 1511 +43140 1512 1525 +43140 1549 1681 +43140 1559 1599 +43140 1600 1664 +43140 1600 1821 +43140 1590 1811 +43140 1664 1821 +43140 1591 1495 +43140 1858 1495 +43140 1578 1716 +43140 1603 1740 +43140 1652 1747 +43140 1857 1470 +43140 1644 1504 +43140 1538 1524 +43140 1644 1467 +43140 1840 1489 +43140 1731 1863 +43140 1650 1668 +43160 1549 1586 +43160 1563 1524 +43160 1566 1527 +43160 1593 1449 +43160 1598 1713 +43160 1604 1616 +43160 1664 1519 +43160 1677 1701 +43160 1685 1771 +43160 1701 1525 +43160 1767 1840 +43160 1767 1489 +43160 1779 1441 +43160 1825 1529 +43160 1825 1519 +43160 1857 1526 +43160 1467 1504 +43160 1470 1526 +43160 1500 1511 +43160 1512 1525 +43160 1549 1681 +43160 1559 1599 +43160 1600 1664 +43160 1600 1821 +43160 1617 1441 +43160 1590 1811 +43160 1664 1821 +43160 1783 1527 +43160 1591 1495 +43160 1858 1495 +43160 1544 1527 +43160 1578 1716 +43160 1603 1740 +43160 1652 1747 +43160 1857 1470 +43160 1644 1504 +43160 1769 1487 +43160 1538 1524 +43160 1644 1467 +43160 1840 1489 +43160 1731 1863 +43160 1650 1668 +43180 1540 1779 +43180 1541 1649 +43180 1549 1681 +43180 1559 1599 +43180 1595 1654 +43180 1599 1642 +43180 1600 1664 +43180 1600 1821 +43180 1603 1858 +43180 1617 1441 +43180 1639 1681 +43180 1740 1467 +43180 1512 1531 +43180 1544 1783 +43180 1548 1431 +43180 1590 1811 +43180 1664 1821 +43180 1783 1527 +43180 1591 1495 +43180 1616 1617 +43180 1858 1495 +43180 1459 1468 +43180 1544 1527 +43180 1578 1716 +43180 1496 1505 +43180 1538 1563 +43180 1603 1740 +43180 1652 1747 +43180 1857 1470 +43180 1644 1504 +43180 1769 1487 +43180 1538 1524 +43180 1644 1467 +43180 1840 1489 +43180 1645 1756 +43180 1731 1863 +43180 1650 1668 +43200 1544 1783 +43200 1548 1516 +43200 1548 1431 +43200 1549 1599 +43200 1559 1531 +43200 1563 1524 +43200 1590 1811 +43200 1591 1647 +43200 1664 1821 +43200 1665 1495 +43200 1676 1821 +43200 1783 1527 +43200 1431 1516 +43200 1467 1504 +43200 1591 1495 +43200 1616 1617 +43200 1647 1495 +43200 1783 1531 +43200 1858 1495 +43200 1459 1468 +43200 1500 1511 +43200 1544 1527 +43200 1578 1716 +43200 1606 1716 +43200 1496 1505 +43200 1538 1563 +43200 1603 1740 +43200 1652 1747 +43200 1857 1526 +43200 1857 1470 +43200 1644 1504 +43200 1769 1487 +43200 1591 1740 +43200 1538 1524 +43200 1644 1467 +43200 1840 1489 +43200 1767 1489 +43200 1549 1525 +43200 1645 1756 +43200 1731 1863 +43200 1665 1858 +43200 1650 1668 +43220 1546 1590 +43220 1547 1716 +43220 1568 1842 +43220 1591 1495 +43220 1602 1631 +43220 1616 1617 +43220 1626 1904 +43220 1627 1461 +43220 1647 1495 +43220 1761 1443 +43220 1783 1531 +43220 1858 1495 +43220 1919 1427 +43220 1434 1514 +43220 1459 1468 +43220 1500 1511 +43220 1544 1527 +43220 1547 1606 +43220 1549 1681 +43220 1578 1716 +43220 1604 1616 +43220 1606 1716 +43220 1681 1525 +43220 1770 1489 +43220 1496 1505 +43220 1538 1563 +43220 1603 1740 +43220 1652 1747 +43220 1712 1463 +43220 1857 1526 +43220 1628 1712 +43220 1740 1858 +43220 1857 1470 +43220 1644 1504 +43220 1769 1487 +43220 1591 1740 +43220 1538 1524 +43220 1644 1467 +43220 1840 1489 +43220 1767 1840 +43220 1767 1489 +43220 1549 1525 +43220 1645 1756 +43220 1591 1665 +43220 1731 1863 +43220 1591 1858 +43220 1665 1858 +43220 1650 1668 +43240 1544 1531 +43240 1544 1527 +43240 1547 1606 +43240 1549 1681 +43240 1553 1599 +43240 1559 1531 +43240 1578 1716 +43240 1581 1761 +43240 1596 1920 +43240 1596 1497 +43240 1604 1616 +43240 1606 1716 +43240 1661 1712 +43240 1681 1525 +43240 1770 1489 +43240 1430 1501 +43240 1431 1516 +43240 1441 1489 +43240 1496 1505 +43240 1512 1527 +43240 1538 1563 +43240 1603 1740 +43240 1652 1747 +43240 1665 1740 +43240 1712 1463 +43240 1857 1526 +43240 1595 1654 +43240 1628 1712 +43240 1630 1761 +43240 1727 1845 +43240 1740 1858 +43240 1857 1470 +43240 1591 1603 +43240 1603 1665 +43240 1603 1858 +43240 1644 1504 +43240 1769 1487 +43240 1467 1504 +43240 1545 1501 +43240 1591 1740 +43240 1538 1524 +43240 1644 1467 +43240 1840 1489 +43240 1767 1840 +43240 1767 1489 +43240 1549 1525 +43240 1645 1756 +43240 1591 1665 +43240 1731 1863 +43240 1591 1858 +43240 1665 1858 +43240 1650 1668 +43260 1538 1563 +43260 1544 1549 +43260 1545 1430 +43260 1599 1825 +43260 1603 1740 +43260 1652 1747 +43260 1655 1434 +43260 1655 1727 +43260 1665 1740 +43260 1712 1463 +43260 1727 1512 +43260 1735 1465 +43260 1857 1526 +43260 1437 1470 +43260 1449 1531 +43260 1527 1531 +43260 1595 1654 +43260 1628 1712 +43260 1630 1761 +43260 1727 1434 +43260 1727 1845 +43260 1740 1858 +43260 1857 1470 +43260 1437 1526 +43260 1470 1526 +43260 1591 1603 +43260 1603 1665 +43260 1603 1858 +43260 1644 1504 +43260 1769 1487 +43260 1467 1504 +43260 1545 1501 +43260 1559 1527 +43260 1591 1740 +43260 1655 1845 +43260 1845 1434 +43260 1538 1524 +43260 1644 1467 +43260 1840 1489 +43260 1767 1840 +43260 1767 1489 +43260 1549 1525 +43260 1459 1468 +43260 1647 1495 +43260 1645 1756 +43260 1591 1665 +43260 1731 1863 +43260 1591 1858 +43260 1665 1858 +43260 1650 1668 +43280 1548 1431 +43280 1549 1681 +43280 1558 1459 +43280 1569 1742 +43280 1595 1654 +43280 1599 1529 +43280 1604 1616 +43280 1628 1712 +43280 1630 1761 +43280 1674 1495 +43280 1681 1825 +43280 1727 1434 +43280 1727 1845 +43280 1740 1858 +43280 1770 1489 +43280 1783 1527 +43280 1857 1470 +43280 1437 1526 +43280 1470 1526 +43280 1591 1603 +43280 1603 1665 +43280 1603 1858 +43280 1644 1504 +43280 1655 1512 +43280 1664 1821 +43280 1769 1487 +43280 1467 1504 +43280 1545 1501 +43280 1559 1527 +43280 1591 1740 +43280 1496 1505 +43280 1655 1845 +43280 1845 1434 +43280 1538 1524 +43280 1644 1467 +43280 1840 1489 +43280 1767 1840 +43280 1767 1489 +43280 1549 1525 +43280 1459 1468 +43280 1647 1495 +43280 1645 1756 +43280 1591 1665 +43280 1731 1863 +43280 1591 1858 +43280 1665 1858 +43280 1650 1668 +43300 1545 1430 +43300 1577 1511 +43300 1591 1603 +43300 1603 1665 +43300 1603 1858 +43300 1617 1470 +43300 1644 1504 +43300 1655 1512 +43300 1664 1821 +43300 1688 1761 +43300 1727 1512 +43300 1742 1770 +43300 1769 1487 +43300 1791 1453 +43300 1467 1504 +43300 1500 1511 +43300 1545 1501 +43300 1558 1468 +43300 1559 1527 +43300 1591 1740 +43300 1496 1505 +43300 1546 1459 +43300 1546 1558 +43300 1559 1599 +43300 1655 1845 +43300 1845 1434 +43300 1578 1857 +43300 1538 1524 +43300 1644 1467 +43300 1840 1489 +43300 1767 1840 +43300 1767 1489 +43300 1549 1525 +43300 1459 1468 +43300 1647 1495 +43300 1645 1756 +43300 1591 1665 +43300 1731 1863 +43300 1591 1858 +43300 1665 1858 +43300 1650 1668 +43320 1538 1592 +43320 1545 1501 +43320 1546 1606 +43320 1549 1531 +43320 1558 1468 +43320 1559 1527 +43320 1563 1592 +43320 1578 1617 +43320 1591 1740 +43320 1592 1524 +43320 1600 1529 +43320 1606 1459 +43320 1617 1857 +43320 1712 1463 +43320 1430 1501 +43320 1496 1505 +43320 1538 1563 +43320 1546 1459 +43320 1546 1558 +43320 1559 1599 +43320 1655 1845 +43320 1845 1434 +43320 1578 1857 +43320 1630 1761 +43320 1538 1524 +43320 1644 1467 +43320 1840 1489 +43320 1767 1840 +43320 1767 1489 +43320 1549 1525 +43320 1459 1468 +43320 1647 1495 +43320 1645 1756 +43320 1591 1665 +43320 1731 1863 +43320 1591 1858 +43320 1665 1858 +43320 1650 1668 +43340 1538 1563 +43340 1546 1459 +43340 1546 1558 +43340 1559 1599 +43340 1580 1463 +43340 1604 1616 +43340 1655 1845 +43340 1769 1487 +43340 1519 1525 +43340 1599 1449 +43340 1845 1434 +43340 1578 1857 +43340 1630 1761 +43340 1538 1524 +43340 1644 1467 +43340 1840 1489 +43340 1767 1840 +43340 1767 1489 +43340 1549 1525 +43340 1459 1468 +43340 1544 1659 +43340 1647 1495 +43340 1645 1756 +43340 1591 1665 +43340 1731 1863 +43340 1591 1858 +43340 1665 1858 +43340 1650 1668 +43360 1583 1523 +43360 1599 1449 +43360 1688 1496 +43360 1688 1831 +43360 1735 1465 +43360 1779 1500 +43360 1783 1449 +43360 1845 1434 +43360 1449 1531 +43360 1545 1501 +43360 1563 1524 +43360 1569 1742 +43360 1449 1532 +43360 1578 1857 +43360 1630 1761 +43360 1467 1504 +43360 1538 1524 +43360 1644 1467 +43360 1443 1487 +43360 1840 1489 +43360 1767 1840 +43360 1767 1489 +43360 1549 1525 +43360 1459 1468 +43360 1544 1659 +43360 1647 1495 +43360 1645 1756 +43360 1591 1665 +43360 1731 1863 +43360 1591 1858 +43360 1665 1858 +43360 1650 1668 +43380 1538 1563 +43380 1545 1501 +43380 1546 1606 +43380 1559 1599 +43380 1559 1527 +43380 1563 1524 +43380 1569 1622 +43380 1569 1742 +43380 1617 1511 +43380 1622 1742 +43380 1644 1674 +43380 1666 1688 +43380 1667 1520 +43380 1791 1453 +43380 1449 1532 +43380 1505 1526 +43380 1599 1527 +43380 1617 1500 +43380 1578 1857 +43380 1630 1761 +43380 1467 1504 +43380 1538 1524 +43380 1550 1448 +43380 1644 1467 +43380 1443 1487 +43380 1840 1489 +43380 1767 1840 +43380 1767 1489 +43380 1549 1525 +43380 1459 1468 +43380 1544 1659 +43380 1647 1495 +43380 1645 1756 +43380 1591 1665 +43380 1731 1863 +43380 1591 1858 +43380 1665 1858 +43380 1650 1668 +43400 1599 1825 +43400 1599 1527 +43400 1600 1519 +43400 1617 1500 +43400 1651 1532 +43400 1664 1821 +43400 1681 1523 +43400 1716 1845 +43400 1716 1727 +43400 1761 1487 +43400 1825 1523 +43400 1825 1525 +43400 1825 1527 +43400 1531 1532 +43400 1547 1845 +43400 1578 1857 +43400 1630 1761 +43400 1467 1504 +43400 1538 1524 +43400 1550 1448 +43400 1644 1467 +43400 1706 1501 +43400 1443 1487 +43400 1840 1489 +43400 1767 1840 +43400 1767 1489 +43400 1549 1525 +43400 1459 1468 +43400 1544 1659 +43400 1647 1495 +43400 1665 1740 +43400 1598 1676 +43400 1645 1756 +43400 1591 1665 +43400 1731 1863 +43400 1740 1858 +43400 1591 1858 +43400 1591 1740 +43400 1665 1858 +43400 1650 1668 +43420 1547 1845 +43420 1559 1825 +43420 1559 1599 +43420 1578 1857 +43420 1630 1761 +43420 1655 1531 +43420 1688 1503 +43420 1871 1517 +43420 1467 1504 +43420 1652 1747 +43420 1538 1524 +43420 1546 1606 +43420 1550 1448 +43420 1644 1467 +43420 1706 1501 +43420 1443 1487 +43420 1840 1489 +43420 1559 1527 +43420 1767 1840 +43420 1767 1489 +43420 1523 1527 +43420 1716 1434 +43420 1549 1525 +43420 1459 1468 +43420 1500 1511 +43420 1544 1659 +43420 1496 1505 +43420 1647 1495 +43420 1665 1740 +43420 1598 1676 +43420 1645 1756 +43420 1591 1665 +43420 1731 1863 +43420 1740 1858 +43420 1591 1858 +43420 1591 1740 +43420 1665 1858 +43420 1650 1668 +43440 1538 1592 +43440 1552 1842 +43440 1559 1523 +43440 1603 1526 +43440 1642 1643 +43440 1643 1739 +43440 1652 1747 +43440 1664 1448 +43440 1664 1821 +43440 1701 1443 +43440 1716 1845 +43440 1772 1459 +43440 1805 1531 +43440 1538 1524 +43440 1546 1606 +43440 1550 1448 +43440 1642 1739 +43440 1644 1467 +43440 1706 1501 +43440 1443 1487 +43440 1596 1920 +43440 1840 1489 +43440 1559 1527 +43440 1716 1727 +43440 1767 1840 +43440 1767 1489 +43440 1523 1527 +43440 1599 1689 +43440 1716 1434 +43440 1549 1525 +43440 1585 1599 +43440 1459 1468 +43440 1500 1511 +43440 1544 1659 +43440 1496 1505 +43440 1647 1495 +43440 1665 1740 +43440 1598 1676 +43440 1645 1756 +43440 1591 1665 +43440 1731 1863 +43440 1740 1858 +43440 1591 1858 +43440 1591 1740 +43440 1665 1858 +43440 1650 1668 +43460 1538 1524 +43460 1546 1606 +43460 1550 1448 +43460 1550 1501 +43460 1604 1616 +43460 1604 1501 +43460 1642 1739 +43460 1706 1448 +43460 1805 1888 +43460 1563 1524 +43460 1644 1467 +43460 1706 1501 +43460 1443 1487 +43460 1448 1501 +43460 1467 1504 +43460 1596 1920 +43460 1840 1489 +43460 1559 1527 +43460 1716 1727 +43460 1767 1840 +43460 1767 1489 +43460 1523 1527 +43460 1599 1689 +43460 1716 1434 +43460 1549 1525 +43460 1585 1599 +43460 1459 1468 +43460 1500 1511 +43460 1544 1659 +43460 1496 1505 +43460 1647 1495 +43460 1665 1740 +43460 1598 1676 +43460 1645 1756 +43460 1591 1665 +43460 1731 1863 +43460 1740 1858 +43460 1591 1858 +43460 1591 1740 +43460 1665 1858 +43460 1650 1668 +43480 1563 1524 +43480 1630 1821 +43480 1644 1467 +43480 1664 1448 +43480 1664 1706 +43480 1664 1501 +43480 1706 1501 +43480 1431 1516 +43480 1443 1487 +43480 1448 1501 +43480 1467 1504 +43480 1596 1920 +43480 1840 1489 +43480 1559 1523 +43480 1559 1527 +43480 1716 1727 +43480 1767 1840 +43480 1767 1489 +43480 1523 1527 +43480 1599 1689 +43480 1716 1434 +43480 1558 1459 +43480 1716 1845 +43480 1549 1525 +43480 1585 1599 +43480 1459 1468 +43480 1500 1511 +43480 1544 1659 +43480 1496 1505 +43480 1647 1495 +43480 1665 1740 +43480 1598 1676 +43480 1645 1756 +43480 1591 1665 +43480 1731 1863 +43480 1740 1858 +43480 1591 1858 +43480 1591 1740 +43480 1665 1858 +43480 1650 1668 +43500 1550 1791 +43500 1568 1524 +43500 1586 1639 +43500 1596 1920 +43500 1666 1701 +43500 1840 1489 +43500 1511 1520 +43500 1559 1523 +43500 1559 1527 +43500 1642 1739 +43500 1716 1727 +43500 1767 1840 +43500 1767 1489 +43500 1523 1527 +43500 1576 1599 +43500 1599 1689 +43500 1716 1434 +43500 1547 1845 +43500 1558 1459 +43500 1716 1845 +43500 1549 1525 +43500 1585 1599 +43500 1459 1468 +43500 1500 1511 +43500 1544 1659 +43500 1496 1505 +43500 1647 1495 +43500 1665 1740 +43500 1598 1676 +43500 1645 1756 +43500 1591 1665 +43500 1731 1863 +43500 1740 1858 +43500 1591 1858 +43500 1591 1740 +43500 1665 1858 +43500 1650 1668 +43520 1543 1622 +43520 1548 1516 +43520 1550 1448 +43520 1555 1664 +43520 1555 1501 +43520 1559 1523 +43520 1559 1527 +43520 1578 1523 +43520 1642 1739 +43520 1664 1501 +43520 1677 1701 +43520 1681 1523 +43520 1688 1904 +43520 1716 1727 +43520 1767 1840 +43520 1767 1489 +43520 1523 1527 +43520 1576 1599 +43520 1599 1689 +43520 1600 1519 +43520 1716 1434 +43520 1547 1845 +43520 1558 1459 +43520 1716 1845 +43520 1549 1525 +43520 1578 1681 +43520 1585 1599 +43520 1459 1468 +43520 1449 1531 +43520 1500 1511 +43520 1544 1659 +43520 1496 1505 +43520 1647 1495 +43520 1665 1740 +43520 1598 1676 +43520 1645 1756 +43520 1591 1665 +43520 1731 1863 +43520 1740 1858 +43520 1591 1858 +43520 1591 1740 +43520 1665 1858 +43520 1650 1668 +43540 1538 1563 +43540 1576 1599 +43540 1599 1689 +43540 1600 1519 +43540 1689 1443 +43540 1716 1434 +43540 1727 1434 +43540 1761 1493 +43540 1825 1519 +43540 1845 1434 +43540 1547 1845 +43540 1558 1459 +43540 1577 1441 +43540 1628 1463 +43540 1716 1845 +43540 1549 1525 +43540 1578 1681 +43540 1585 1599 +43540 1644 1467 +43540 1857 1441 +43540 1459 1468 +43540 1449 1531 +43540 1500 1511 +43540 1544 1659 +43540 1617 1441 +43540 1496 1505 +43540 1527 1531 +43540 1647 1495 +43540 1665 1740 +43540 1598 1676 +43540 1645 1756 +43540 1591 1665 +43540 1731 1863 +43540 1740 1858 +43540 1591 1858 +43540 1591 1740 +43540 1665 1858 +43540 1650 1668 +43560 1547 1845 +43560 1558 1459 +43560 1577 1617 +43560 1577 1441 +43560 1578 1527 +43560 1582 1513 +43560 1599 1443 +43560 1600 1825 +43560 1628 1463 +43560 1681 1527 +43560 1716 1845 +43560 1549 1525 +43560 1550 1448 +43560 1578 1681 +43560 1585 1599 +43560 1644 1467 +43560 1857 1441 +43560 1459 1468 +43560 1681 1523 +43560 1449 1531 +43560 1500 1511 +43560 1543 1622 +43560 1544 1659 +43560 1617 1441 +43560 1496 1505 +43560 1527 1531 +43560 1647 1495 +43560 1665 1740 +43560 1598 1676 +43560 1645 1756 +43560 1591 1665 +43560 1731 1863 +43560 1740 1858 +43560 1591 1858 +43560 1591 1740 +43560 1665 1858 +43560 1650 1668 +43580 1547 1716 +43580 1549 1525 +43580 1550 1448 +43580 1576 1599 +43580 1578 1681 +43580 1581 1831 +43580 1585 1599 +43580 1642 1739 +43580 1644 1467 +43580 1689 1443 +43580 1767 1489 +43580 1779 1903 +43580 1857 1441 +43580 1459 1468 +43580 1642 1834 +43580 1681 1523 +43580 1761 1493 +43580 1449 1531 +43580 1500 1511 +43580 1543 1622 +43580 1544 1659 +43580 1617 1441 +43580 1496 1505 +43580 1655 1911 +43580 1527 1531 +43580 1647 1495 +43580 1665 1740 +43580 1598 1676 +43580 1645 1756 +43580 1591 1665 +43580 1731 1863 +43580 1740 1858 +43580 1591 1858 +43580 1591 1740 +43580 1665 1858 +43580 1650 1668 +43600 1538 1563 +43600 1608 1700 +43600 1642 1834 +43600 1681 1523 +43600 1761 1493 +43600 1774 1459 +43600 1449 1531 +43600 1497 1526 +43600 1500 1511 +43600 1543 1622 +43600 1544 1659 +43600 1600 1825 +43600 1617 1857 +43600 1617 1441 +43600 1655 1784 +43600 1784 1911 +43600 1853 1513 +43600 1496 1505 +43600 1603 1834 +43600 1655 1911 +43600 1527 1531 +43600 1647 1495 +43600 1600 1519 +43600 1665 1740 +43600 1598 1676 +43600 1645 1756 +43600 1591 1665 +43600 1731 1863 +43600 1740 1858 +43600 1591 1858 +43600 1591 1740 +43600 1665 1858 +43600 1650 1668 +43620 1543 1622 +43620 1544 1659 +43620 1549 1553 +43620 1600 1825 +43620 1617 1857 +43620 1617 1441 +43620 1655 1784 +43620 1688 1443 +43620 1784 1911 +43620 1853 1513 +43620 1919 1427 +43620 1496 1505 +43620 1523 1525 +43620 1578 1681 +43620 1603 1834 +43620 1655 1911 +43620 1716 1784 +43620 1568 1825 +43620 1677 1701 +43620 1527 1531 +43620 1647 1495 +43620 1600 1519 +43620 1665 1740 +43620 1598 1676 +43620 1645 1756 +43620 1591 1665 +43620 1731 1863 +43620 1740 1858 +43620 1591 1858 +43620 1591 1740 +43620 1665 1858 +43620 1650 1668 +43640 1578 1681 +43640 1591 1831 +43640 1599 1531 +43640 1603 1834 +43640 1642 1739 +43640 1644 1467 +43640 1655 1911 +43640 1707 1524 +43640 1716 1784 +43640 1761 1493 +43640 1568 1825 +43640 1647 1831 +43640 1677 1701 +43640 1527 1531 +43640 1647 1495 +43640 1831 1495 +43640 1599 1655 +43640 1600 1519 +43640 1665 1740 +43640 1598 1676 +43640 1645 1756 +43640 1591 1665 +43640 1731 1863 +43640 1740 1858 +43640 1591 1858 +43640 1591 1740 +43640 1665 1858 +43640 1650 1668 +43660 1539 1789 +43660 1568 1825 +43660 1583 1523 +43660 1591 1495 +43660 1594 1696 +43660 1630 1524 +43660 1647 1831 +43660 1655 1527 +43660 1677 1701 +43660 1808 1464 +43660 1527 1531 +43660 1544 1659 +43660 1547 1716 +43660 1603 1643 +43660 1647 1495 +43660 1698 1707 +43660 1831 1495 +43660 1599 1655 +43660 1600 1519 +43660 1665 1740 +43660 1716 1911 +43660 1784 1911 +43660 1496 1505 +43660 1598 1676 +43660 1645 1756 +43660 1591 1665 +43660 1731 1863 +43660 1740 1858 +43660 1591 1858 +43660 1591 1740 +43660 1665 1858 +43660 1650 1668 +43680 1538 1563 +43680 1539 1707 +43680 1544 1659 +43680 1547 1716 +43680 1559 1574 +43680 1577 1599 +43680 1603 1643 +43680 1644 1467 +43680 1647 1495 +43680 1650 1463 +43680 1698 1707 +43680 1698 1764 +43680 1707 1764 +43680 1716 1784 +43680 1761 1493 +43680 1767 1489 +43680 1467 1495 +43680 1543 1622 +43680 1831 1495 +43680 1599 1655 +43680 1600 1519 +43680 1665 1740 +43680 1716 1911 +43680 1784 1911 +43680 1630 1648 +43680 1496 1505 +43680 1598 1676 +43680 1628 1783 +43680 1645 1756 +43680 1591 1665 +43680 1731 1863 +43680 1716 1458 +43680 1740 1858 +43680 1591 1858 +43680 1591 1740 +43680 1665 1858 +43680 1650 1668 +43700 1543 1622 +43700 1547 1458 +43700 1577 1655 +43700 1617 1857 +43700 1617 1441 +43700 1630 1524 +43700 1642 1643 +43700 1642 1739 +43700 1644 1831 +43700 1688 1527 +43700 1831 1495 +43700 1500 1511 +43700 1527 1531 +43700 1599 1655 +43700 1600 1519 +43700 1665 1740 +43700 1716 1911 +43700 1770 1489 +43700 1784 1911 +43700 1630 1648 +43700 1496 1505 +43700 1598 1676 +43700 1628 1783 +43700 1645 1756 +43700 1857 1441 +43700 1591 1665 +43700 1731 1863 +43700 1716 1458 +43700 1740 1858 +43700 1591 1858 +43700 1591 1740 +43700 1665 1858 +43700 1650 1668 +43720 1538 1563 +43720 1568 1674 +43720 1599 1655 +43720 1600 1519 +43720 1628 1489 +43720 1644 1467 +43720 1648 1524 +43720 1665 1740 +43720 1716 1911 +43720 1770 1489 +43720 1784 1911 +43720 1842 1526 +43720 1857 1503 +43720 1911 1458 +43720 1523 1525 +43720 1630 1648 +43720 1681 1529 +43720 1698 1866 +43720 1496 1505 +43720 1577 1599 +43720 1598 1676 +43720 1628 1783 +43720 1645 1756 +43720 1857 1441 +43720 1591 1665 +43720 1731 1863 +43720 1716 1458 +43720 1740 1858 +43720 1591 1858 +43720 1591 1740 +43720 1665 1858 +43720 1650 1668 +43740 1543 1622 +43740 1558 1459 +43740 1580 1463 +43740 1630 1648 +43740 1681 1529 +43740 1698 1866 +43740 1698 1764 +43740 1784 1459 +43740 1825 1519 +43740 1845 1434 +43740 1465 1503 +43740 1496 1505 +43740 1577 1599 +43740 1598 1676 +43740 1628 1783 +43740 1645 1756 +43740 1665 1831 +43740 1676 1434 +43740 1857 1441 +43740 1591 1665 +43740 1647 1495 +43740 1731 1863 +43740 1716 1458 +43740 1740 1858 +43740 1591 1858 +43740 1591 1740 +43740 1665 1858 +43740 1650 1668 +43760 1547 1459 +43760 1577 1599 +43760 1593 1503 +43760 1630 1789 +43760 1642 1739 +43760 1644 1858 +43760 1676 1845 +43760 1681 1523 +43760 1700 1487 +43760 1716 1459 +43760 1767 1489 +43760 1825 1525 +43760 1598 1676 +43760 1628 1783 +43760 1645 1756 +43760 1661 1712 +43760 1665 1831 +43760 1676 1434 +43760 1716 1468 +43760 1857 1441 +43760 1591 1665 +43760 1644 1467 +43760 1647 1495 +43760 1700 1528 +43760 1731 1863 +43760 1665 1740 +43760 1547 1458 +43760 1716 1458 +43760 1740 1858 +43760 1538 1563 +43760 1591 1858 +43760 1591 1740 +43760 1665 1858 +43760 1650 1668 +43780 1598 1676 +43780 1628 1783 +43780 1645 1756 +43780 1661 1712 +43780 1665 1831 +43780 1676 1434 +43780 1676 1470 +43780 1700 1464 +43780 1716 1468 +43780 1831 1465 +43780 1857 1441 +43780 1449 1496 +43780 1458 1468 +43780 1467 1504 +43780 1583 1600 +43780 1591 1665 +43780 1644 1467 +43780 1647 1495 +43780 1700 1528 +43780 1825 1519 +43780 1496 1505 +43780 1731 1863 +43780 1770 1437 +43780 1840 1489 +43780 1665 1740 +43780 1698 1764 +43780 1547 1458 +43780 1716 1458 +43780 1740 1858 +43780 1784 1441 +43780 1458 1459 +43780 1538 1563 +43780 1591 1858 +43780 1591 1740 +43780 1665 1858 +43780 1650 1668 +43800 1577 1599 +43800 1583 1600 +43800 1591 1665 +43800 1599 1779 +43800 1617 1465 +43800 1644 1467 +43800 1647 1495 +43800 1700 1528 +43800 1779 1489 +43800 1825 1519 +43800 1449 1505 +43800 1496 1505 +43800 1519 1529 +43800 1549 1583 +43800 1716 1459 +43800 1731 1863 +43800 1770 1437 +43800 1840 1489 +43800 1459 1468 +43800 1665 1740 +43800 1698 1764 +43800 1547 1558 +43800 1547 1458 +43800 1716 1458 +43800 1740 1858 +43800 1784 1441 +43800 1458 1459 +43800 1538 1563 +43800 1547 1459 +43800 1544 1659 +43800 1591 1858 +43800 1591 1740 +43800 1665 1858 +43800 1650 1668 +43820 1549 1583 +43820 1600 1519 +43820 1645 1756 +43820 1648 1524 +43820 1681 1525 +43820 1716 1459 +43820 1731 1863 +43820 1770 1437 +43820 1840 1489 +43820 1863 1512 +43820 1459 1468 +43820 1519 1523 +43820 1665 1740 +43820 1698 1764 +43820 1731 1512 +43820 1547 1558 +43820 1716 1526 +43820 1547 1458 +43820 1716 1458 +43820 1740 1858 +43820 1784 1441 +43820 1599 1449 +43820 1458 1459 +43820 1538 1563 +43820 1547 1459 +43820 1544 1659 +43820 1591 1858 +43820 1591 1740 +43820 1665 1858 +43820 1650 1668 +43840 1540 1542 +43840 1547 1468 +43840 1665 1740 +43840 1681 1529 +43840 1698 1764 +43840 1731 1512 +43840 1770 1495 +43840 1784 1911 +43840 1853 1532 +43840 1458 1526 +43840 1459 1526 +43840 1547 1558 +43840 1596 1779 +43840 1716 1526 +43840 1547 1458 +43840 1716 1458 +43840 1740 1858 +43840 1784 1441 +43840 1599 1449 +43840 1647 1495 +43840 1458 1459 +43840 1538 1563 +43840 1547 1459 +43840 1500 1511 +43840 1558 1468 +43840 1544 1659 +43840 1591 1858 +43840 1591 1740 +43840 1665 1858 +43840 1650 1668 +43860 1547 1558 +43860 1558 1459 +43860 1596 1779 +43860 1600 1519 +43860 1644 1740 +43860 1671 1911 +43860 1681 1525 +43860 1707 1517 +43860 1716 1526 +43860 1727 1434 +43860 1911 1441 +43860 1919 1427 +43860 1523 1525 +43860 1547 1458 +43860 1676 1434 +43860 1681 1825 +43860 1716 1458 +43860 1740 1858 +43860 1784 1441 +43860 1459 1468 +43860 1599 1449 +43860 1647 1495 +43860 1458 1459 +43860 1538 1563 +43860 1547 1459 +43860 1628 1783 +43860 1731 1863 +43860 1840 1489 +43860 1645 1756 +43860 1500 1511 +43860 1558 1468 +43860 1544 1659 +43860 1591 1858 +43860 1591 1740 +43860 1665 1858 +43860 1650 1668 +43880 1537 1576 +43880 1547 1458 +43880 1563 1592 +43880 1595 1853 +43880 1617 1911 +43880 1676 1434 +43880 1681 1825 +43880 1681 1523 +43880 1716 1458 +43880 1731 1512 +43880 1740 1858 +43880 1784 1441 +43880 1825 1523 +43880 1458 1468 +43880 1459 1468 +43880 1537 1585 +43880 1547 1716 +43880 1599 1449 +43880 1642 1643 +43880 1647 1495 +43880 1665 1740 +43880 1458 1459 +43880 1538 1563 +43880 1547 1459 +43880 1591 1665 +43880 1628 1783 +43880 1731 1863 +43880 1840 1489 +43880 1645 1756 +43880 1500 1511 +43880 1558 1468 +43880 1544 1659 +43880 1591 1858 +43880 1591 1740 +43880 1665 1858 +43880 1650 1668 +43900 1537 1585 +43900 1547 1716 +43900 1549 1553 +43900 1586 1639 +43900 1599 1449 +43900 1642 1643 +43900 1644 1504 +43900 1644 1740 +43900 1647 1495 +43900 1665 1740 +43900 1676 1439 +43900 1784 1911 +43900 1839 1911 +43900 1919 1427 +43900 1434 1439 +43900 1458 1459 +43900 1538 1563 +43900 1547 1459 +43900 1558 1716 +43900 1591 1665 +43900 1628 1783 +43900 1523 1525 +43900 1731 1863 +43900 1840 1489 +43900 1645 1756 +43900 1500 1511 +43900 1558 1468 +43900 1544 1659 +43900 1591 1858 +43900 1591 1740 +43900 1665 1858 +43900 1650 1668 +43920 1538 1563 +43920 1547 1459 +43920 1558 1716 +43920 1591 1665 +43920 1596 1598 +43920 1628 1463 +43920 1628 1783 +43920 1644 1874 +43920 1713 1514 +43920 1783 1463 +43920 1523 1525 +43920 1577 1655 +43920 1599 1655 +43920 1731 1863 +43920 1840 1489 +43920 1645 1756 +43920 1716 1468 +43920 1500 1511 +43920 1558 1468 +43920 1740 1858 +43920 1544 1659 +43920 1591 1858 +43920 1591 1740 +43920 1665 1858 +43920 1650 1668 +43940 1547 1716 +43940 1577 1655 +43940 1592 1600 +43940 1598 1659 +43940 1599 1655 +43940 1731 1512 +43940 1731 1863 +43940 1784 1911 +43940 1840 1489 +43940 1874 1495 +43940 1582 1600 +43940 1645 1756 +43940 1716 1459 +43940 1716 1468 +43940 1547 1558 +43940 1500 1511 +43940 1544 1598 +43940 1558 1468 +43940 1740 1858 +43940 1544 1659 +43940 1577 1599 +43940 1591 1858 +43940 1591 1740 +43940 1665 1858 +43940 1467 1495 +43940 1650 1668 +43960 1549 1553 +43960 1582 1600 +43960 1582 1825 +43960 1592 1911 +43960 1645 1756 +43960 1716 1459 +43960 1716 1468 +43960 1459 1468 +43960 1507 1522 +43960 1523 1525 +43960 1547 1459 +43960 1547 1468 +43960 1547 1558 +43960 1573 1452 +43960 1596 1920 +43960 1500 1511 +43960 1544 1598 +43960 1558 1468 +43960 1740 1858 +43960 1544 1659 +43960 1577 1599 +43960 1591 1858 +43960 1591 1740 +43960 1665 1858 +43960 1467 1495 +43960 1600 1519 +43960 1650 1668 +43980 1547 1459 +43980 1547 1468 +43980 1547 1558 +43980 1549 1523 +43980 1549 1525 +43980 1549 1583 +43980 1550 1791 +43980 1558 1716 +43980 1573 1452 +43980 1596 1920 +43980 1665 1740 +43980 1853 1513 +43980 1500 1511 +43980 1544 1598 +43980 1558 1468 +43980 1700 1528 +43980 1740 1858 +43980 1840 1489 +43980 1857 1441 +43980 1544 1659 +43980 1577 1599 +43980 1591 1858 +43980 1591 1740 +43980 1665 1858 +43980 1467 1495 +43980 1591 1665 +43980 1582 1628 +43980 1600 1519 +43980 1441 1489 +43980 1650 1668 +44000 1544 1598 +44000 1558 1459 +44000 1558 1468 +44000 1700 1528 +44000 1740 1858 +44000 1840 1489 +44000 1857 1441 +44000 1459 1468 +44000 1544 1659 +44000 1577 1599 +44000 1591 1858 +44000 1591 1740 +44000 1665 1858 +44000 1467 1495 +44000 1591 1665 +44000 1582 1628 +44000 1600 1519 +44000 1441 1489 +44000 1650 1668 +44020 1544 1659 +44020 1577 1599 +44020 1591 1858 +44020 1591 1740 +44020 1665 1858 +44020 1666 1495 +44020 1716 1495 +44020 1467 1495 +44020 1495 1521 +44020 1523 1525 +44020 1547 1716 +44020 1591 1665 +44020 1655 1899 +44020 1582 1628 +44020 1600 1519 +44020 1441 1489 +44020 1500 1511 +44020 1650 1668 +44040 1547 1716 +44040 1591 1665 +44040 1643 1645 +44040 1655 1899 +44040 1700 1497 +44040 1582 1628 +44040 1600 1519 +44040 1857 1489 +44040 1441 1489 +44040 1645 1756 +44040 1500 1511 +44040 1650 1668 +44060 1665 1858 +44060 1681 1525 +44060 1700 1497 +44060 1700 1505 +44060 1899 1459 +44060 1582 1628 +44060 1600 1519 +44060 1767 1840 +44060 1857 1489 +44060 1467 1495 +44060 1523 1525 +44060 1544 1659 +44060 1655 1459 +44060 1441 1489 +44060 1645 1756 +44060 1500 1511 +44060 1650 1668 +44080 1558 1678 +44080 1582 1628 +44080 1600 1519 +44080 1603 1899 +44080 1681 1523 +44080 1700 1727 +44080 1767 1840 +44080 1857 1489 +44080 1857 1441 +44080 1467 1495 +44080 1523 1525 +44080 1582 1643 +44080 1591 1665 +44080 1593 1847 +44080 1678 1468 +44080 1544 1659 +44080 1547 1716 +44080 1655 1459 +44080 1441 1489 +44080 1847 1470 +44080 1645 1756 +44080 1647 1713 +44080 1500 1511 +44080 1650 1668 +44100 1577 1599 +44100 1582 1643 +44100 1591 1665 +44100 1593 1847 +44100 1651 1523 +44100 1665 1858 +44100 1678 1468 +44100 1700 1434 +44100 1825 1525 +44100 1840 1489 +44100 1497 1505 +44100 1544 1659 +44100 1547 1716 +44100 1591 1858 +44100 1655 1459 +44100 1673 1680 +44100 1673 1732 +44100 1441 1489 +44100 1847 1470 +44100 1645 1756 +44100 1680 1732 +44100 1647 1713 +44100 1500 1511 +44100 1650 1668 +44120 1543 1842 +44120 1544 1659 +44120 1547 1716 +44120 1562 1467 +44120 1591 1858 +44120 1591 1532 +44120 1655 1459 +44120 1673 1680 +44120 1673 1732 +44120 1673 1765 +44120 1767 1840 +44120 1842 1888 +44120 1858 1532 +44120 1441 1489 +44120 1740 1857 +44120 1847 1470 +44120 1645 1756 +44120 1680 1732 +44120 1562 1574 +44120 1647 1713 +44120 1582 1628 +44120 1500 1511 +44120 1650 1668 +44140 1581 1467 +44140 1583 1523 +44140 1740 1857 +44140 1847 1470 +44140 1467 1495 +44140 1645 1756 +44140 1680 1732 +44140 1840 1489 +44140 1562 1574 +44140 1647 1713 +44140 1582 1628 +44140 1500 1511 +44140 1650 1668 +44160 1573 1452 +44160 1586 1758 +44160 1591 1858 +44160 1645 1756 +44160 1651 1905 +44160 1655 1905 +44160 1680 1765 +44160 1689 1762 +44160 1905 1523 +44160 1655 1523 +44160 1680 1732 +44160 1681 1525 +44160 1840 1489 +44160 1562 1574 +44160 1647 1713 +44160 1582 1628 +44160 1500 1511 +44160 1650 1668 +44180 1543 1842 +44180 1562 1433 +44180 1562 1527 +44180 1600 1519 +44180 1655 1523 +44180 1673 1765 +44180 1731 1863 +44180 1847 1470 +44180 1433 1527 +44180 1580 1463 +44180 1680 1732 +44180 1681 1525 +44180 1825 1519 +44180 1840 1489 +44180 1544 1659 +44180 1562 1574 +44180 1647 1713 +44180 1582 1628 +44180 1500 1511 +44180 1650 1668 +44200 1580 1463 +44200 1591 1665 +44200 1591 1510 +44200 1600 1825 +44200 1622 1727 +44200 1665 1858 +44200 1680 1732 +44200 1681 1525 +44200 1825 1519 +44200 1831 1498 +44200 1840 1489 +44200 1544 1659 +44200 1562 1574 +44200 1647 1713 +44200 1582 1628 +44200 1500 1511 +44200 1650 1668 +44220 1591 1517 +44220 1747 1433 +44220 1784 1911 +44220 1544 1659 +44220 1562 1574 +44220 1647 1713 +44220 1582 1628 +44220 1500 1511 +44220 1650 1668 +44240 1544 1659 +44240 1562 1574 +44240 1617 1441 +44240 1622 1505 +44240 1622 1842 +44240 1647 1713 +44240 1661 1712 +44240 1680 1732 +44240 1582 1628 +44240 1500 1511 +44240 1650 1668 +44260 1600 1519 +44260 1622 1727 +44260 1582 1628 +44260 1599 1655 +44260 1840 1489 +44260 1500 1511 +44260 1650 1668 +44280 1563 1532 +44280 1573 1452 +44280 1593 1521 +44280 1606 1516 +44280 1673 1765 +44280 1740 1857 +44280 1582 1628 +44280 1599 1655 +44280 1617 1740 +44280 1661 1712 +44280 1840 1489 +44280 1500 1511 +44280 1650 1668 +44300 1582 1628 +44300 1599 1655 +44300 1617 1740 +44300 1661 1712 +44300 1840 1489 +44300 1500 1511 +44300 1650 1668 +44320 1582 1628 +44320 1599 1655 +44320 1496 1497 +44320 1582 1603 +44320 1617 1740 +44320 1661 1712 +44320 1740 1857 +44320 1840 1489 +44320 1500 1511 +44320 1650 1668 +44340 1582 1603 +44340 1603 1463 +44340 1617 1740 +44340 1661 1712 +44340 1740 1857 +44340 1840 1489 +44340 1500 1511 +44340 1650 1668 +44360 1681 1825 +44360 1716 1808 +44360 1470 1525 +44360 1582 1628 +44360 1840 1489 +44360 1500 1511 +44360 1650 1668 +44380 1599 1655 +44380 1651 1523 +44380 1731 1863 +44380 1767 1489 +44380 1905 1523 +44380 1651 1905 +44380 1582 1628 +44380 1840 1489 +44380 1500 1511 +44380 1650 1668 +44400 1651 1825 +44400 1651 1905 +44400 1655 1678 +44400 1740 1857 +44400 1853 1513 +44400 1544 1659 +44400 1582 1628 +44400 1716 1808 +44400 1617 1857 +44400 1617 1740 +44400 1840 1489 +44400 1500 1511 +44400 1650 1668 +44420 1544 1659 +44420 1582 1628 +44420 1582 1655 +44420 1661 1712 +44420 1731 1811 +44420 1716 1808 +44420 1617 1857 +44420 1617 1740 +44420 1840 1489 +44420 1599 1655 +44420 1500 1511 +44420 1547 1643 +44420 1650 1668 +44440 1591 1517 +44440 1598 1770 +44440 1599 1825 +44440 1645 1756 +44440 1655 1523 +44440 1716 1808 +44440 1731 1831 +44440 1905 1511 +44440 1507 1522 +44440 1617 1857 +44440 1617 1740 +44440 1655 1681 +44440 1740 1857 +44440 1840 1489 +44440 1599 1681 +44440 1599 1523 +44440 1599 1655 +44440 1500 1511 +44440 1547 1643 +44440 1650 1668 +44460 1617 1857 +44460 1617 1740 +44460 1655 1681 +44460 1661 1712 +44460 1740 1857 +44460 1840 1489 +44460 1579 1678 +44460 1599 1681 +44460 1599 1523 +44460 1582 1628 +44460 1435 1532 +44460 1599 1655 +44460 1500 1511 +44460 1547 1643 +44460 1650 1668 +44480 1544 1659 +44480 1579 1678 +44480 1582 1463 +44480 1583 1523 +44480 1599 1681 +44480 1599 1523 +44480 1666 1767 +44480 1678 1503 +44480 1758 1853 +44480 1582 1628 +44480 1655 1523 +44480 1716 1808 +44480 1435 1532 +44480 1599 1655 +44480 1500 1511 +44480 1547 1643 +44480 1650 1668 +44500 1586 1853 +44500 1731 1863 +44500 1756 1770 +44500 1758 1853 +44500 1582 1628 +44500 1617 1857 +44500 1655 1523 +44500 1617 1740 +44500 1716 1808 +44500 1740 1857 +44500 1435 1532 +44500 1599 1655 +44500 1544 1529 +44500 1500 1511 +44500 1547 1643 +44500 1650 1668 +44520 1582 1628 +44520 1582 1463 +44520 1599 1813 +44520 1617 1857 +44520 1617 1666 +44520 1651 1905 +44520 1655 1523 +44520 1767 1489 +44520 1599 1683 +44520 1617 1740 +44520 1666 1857 +44520 1716 1808 +44520 1740 1857 +44520 1435 1532 +44520 1681 1813 +44520 1599 1655 +44520 1544 1529 +44520 1500 1511 +44520 1547 1643 +44520 1599 1523 +44520 1650 1668 +44540 1582 1905 +44540 1599 1683 +44540 1617 1740 +44540 1666 1857 +44540 1681 1683 +44540 1683 1704 +44540 1716 1808 +44540 1740 1857 +44540 1435 1532 +44540 1582 1651 +44540 1681 1813 +44540 1704 1813 +44540 1580 1668 +44540 1599 1655 +44540 1628 1463 +44540 1683 1813 +44540 1544 1529 +44540 1500 1511 +44540 1547 1643 +44540 1599 1523 +44540 1650 1668 +44560 1582 1651 +44560 1599 1600 +44560 1599 1825 +44560 1603 1513 +44560 1666 1489 +44560 1681 1813 +44560 1704 1813 +44560 1580 1668 +44560 1617 1857 +44560 1651 1905 +44560 1562 1463 +44560 1599 1655 +44560 1628 1463 +44560 1683 1813 +44560 1544 1529 +44560 1500 1511 +44560 1547 1643 +44560 1593 1521 +44560 1562 1628 +44560 1599 1523 +44560 1538 1920 +44560 1650 1668 +44580 1580 1668 +44580 1617 1857 +44580 1651 1905 +44580 1562 1463 +44580 1599 1655 +44580 1628 1463 +44580 1683 1813 +44580 1544 1529 +44580 1558 1516 +44580 1582 1905 +44580 1500 1511 +44580 1547 1643 +44580 1593 1521 +44580 1562 1628 +44580 1599 1523 +44580 1538 1920 +44580 1650 1668 +44600 1549 1599 +44600 1562 1463 +44600 1582 1651 +44600 1599 1655 +44600 1628 1463 +44600 1683 1813 +44600 1544 1529 +44600 1558 1516 +44600 1582 1905 +44600 1500 1511 +44600 1547 1643 +44600 1593 1521 +44600 1562 1628 +44600 1599 1523 +44600 1538 1920 +44600 1920 1522 +44600 1650 1668 +44620 1544 1529 +44620 1558 1516 +44620 1582 1905 +44620 1857 1441 +44620 1500 1511 +44620 1547 1643 +44620 1593 1521 +44620 1562 1628 +44620 1599 1523 +44620 1579 1678 +44620 1538 1920 +44620 1920 1522 +44620 1650 1668 +44640 1547 1643 +44640 1593 1521 +44640 1562 1628 +44640 1840 1489 +44640 1599 1523 +44640 1579 1678 +44640 1538 1920 +44640 1920 1522 +44640 1650 1668 +44660 1544 1659 +44660 1558 1516 +44660 1562 1628 +44660 1655 1523 +44660 1767 1489 +44660 1840 1489 +44660 1538 1522 +44660 1599 1523 +44660 1599 1655 +44660 1628 1463 +44660 1579 1678 +44660 1538 1920 +44660 1920 1522 +44660 1650 1668 +44680 1716 1808 +44680 1558 1468 +44680 1857 1441 +44680 1538 1522 +44680 1599 1523 +44680 1599 1655 +44680 1628 1463 +44680 1579 1678 +44680 1538 1920 +44680 1920 1522 +44680 1650 1668 +44700 1544 1513 +44700 1558 1468 +44700 1651 1905 +44700 1767 1489 +44700 1857 1441 +44700 1538 1522 +44700 1599 1523 +44700 1599 1655 +44700 1628 1463 +44700 1579 1678 +44700 1538 1920 +44700 1920 1522 +44700 1650 1668 +44720 1538 1522 +44720 1544 1659 +44720 1558 1606 +44720 1599 1523 +44720 1599 1655 +44720 1606 1468 +44720 1628 1463 +44720 1668 1825 +44720 1681 1683 +44720 1920 1507 +44720 1716 1808 +44720 1579 1678 +44720 1500 1511 +44720 1538 1920 +44720 1920 1522 +44720 1650 1668 +44740 1547 1765 +44740 1558 1459 +44740 1558 1468 +44740 1606 1516 +44740 1655 1523 +44740 1825 1523 +44740 1459 1468 +44740 1468 1516 +44740 1716 1808 +44740 1579 1678 +44740 1500 1511 +44740 1538 1920 +44740 1920 1522 +44740 1650 1668 +44760 1538 1522 +44760 1716 1808 +44760 1920 1507 +44760 1579 1678 +44760 1600 1519 +44760 1500 1511 +44760 1538 1920 +44760 1920 1522 +44760 1650 1668 +44780 1579 1678 +44780 1586 1758 +44780 1599 1529 +44780 1617 1666 +44780 1645 1756 +44780 1731 1831 +44780 1647 1459 +44780 1599 1525 +44780 1600 1519 +44780 1500 1511 +44780 1538 1920 +44780 1920 1522 +44780 1767 1489 +44780 1650 1668 +44800 1580 1628 +44800 1647 1459 +44800 1599 1525 +44800 1600 1519 +44800 1500 1511 +44800 1538 1920 +44800 1920 1522 +44800 1920 1507 +44800 1767 1489 +44800 1650 1668 +44820 1563 1511 +44820 1599 1525 +44820 1600 1519 +44820 1696 1920 +44820 1731 1513 +44820 1500 1511 +44820 1857 1441 +44820 1538 1920 +44820 1920 1522 +44820 1920 1507 +44820 1767 1489 +44820 1650 1668 +44840 1583 1529 +44840 1599 1529 +44840 1678 1532 +44840 1857 1441 +44840 1538 1920 +44840 1920 1522 +44840 1920 1507 +44840 1767 1489 +44840 1650 1668 +44860 1580 1628 +44860 1598 1463 +44860 1857 1441 +44860 1538 1920 +44860 1519 1523 +44860 1825 1519 +44860 1920 1522 +44860 1920 1507 +44860 1767 1489 +44860 1650 1668 +44880 1583 1529 +44880 1599 1529 +44880 1655 1754 +44880 1669 1754 +44880 1825 1523 +44880 1538 1920 +44880 1713 1762 +44880 1519 1523 +44880 1825 1519 +44880 1572 1628 +44880 1599 1525 +44880 1920 1522 +44880 1562 1603 +44880 1920 1507 +44880 1767 1489 +44880 1650 1668 +44900 1538 1920 +44900 1600 1519 +44900 1655 1825 +44900 1713 1762 +44900 1716 1770 +44900 1519 1523 +44900 1600 1655 +44900 1825 1519 +44900 1572 1628 +44900 1599 1525 +44900 1920 1522 +44900 1562 1603 +44900 1920 1507 +44900 1767 1489 +44900 1650 1668 +44920 1538 1522 +44920 1544 1659 +44920 1582 1831 +44920 1600 1523 +44920 1600 1655 +44920 1651 1905 +44920 1825 1519 +44920 1572 1628 +44920 1716 1808 +44920 1572 1580 +44920 1669 1754 +44920 1678 1716 +44920 1599 1525 +44920 1920 1522 +44920 1562 1603 +44920 1920 1507 +44920 1767 1489 +44920 1650 1668 +44940 1572 1628 +44940 1580 1628 +44940 1583 1529 +44940 1586 1758 +44940 1592 1920 +44940 1606 1468 +44940 1716 1808 +44940 1813 1489 +44940 1572 1580 +44940 1599 1529 +44940 1669 1754 +44940 1678 1716 +44940 1599 1525 +44940 1920 1522 +44940 1562 1603 +44940 1920 1507 +44940 1767 1489 +44940 1650 1668 +44960 1572 1668 +44960 1572 1580 +44960 1599 1529 +44960 1669 1754 +44960 1678 1716 +44960 1713 1762 +44960 1538 1522 +44960 1599 1525 +44960 1920 1522 +44960 1547 1808 +44960 1562 1603 +44960 1920 1507 +44960 1767 1489 +44960 1650 1668 +44980 1538 1522 +44980 1548 1431 +44980 1599 1525 +44980 1920 1522 +44980 1547 1808 +44980 1576 1689 +44980 1857 1441 +44980 1562 1603 +44980 1920 1507 +44980 1767 1489 +44980 1538 1920 +44980 1650 1668 +45000 1544 1659 +45000 1547 1808 +45000 1576 1689 +45000 1606 1468 +45000 1643 1704 +45000 1740 1905 +45000 1857 1441 +45000 1562 1603 +45000 1920 1507 +45000 1767 1489 +45000 1538 1920 +45000 1650 1668 +45020 1548 1431 +45020 1586 1758 +45020 1600 1529 +45020 1731 1863 +45020 1740 1905 +45020 1825 1519 +45020 1857 1441 +45020 1547 1716 +45020 1562 1603 +45020 1920 1507 +45020 1825 1872 +45020 1920 1522 +45020 1767 1489 +45020 1538 1920 +45020 1650 1668 +45040 1547 1716 +45040 1605 1636 +45040 1669 1754 +45040 1678 1704 +45040 1507 1522 +45040 1547 1808 +45040 1580 1628 +45040 1538 1522 +45040 1562 1603 +45040 1920 1507 +45040 1825 1872 +45040 1920 1522 +45040 1767 1489 +45040 1538 1920 +45040 1650 1668 +45060 1547 1808 +45060 1580 1628 +45060 1592 1731 +45060 1599 1600 +45060 1606 1468 +45060 1643 1704 +45060 1716 1808 +45060 1731 1863 +45060 1538 1522 +45060 1562 1603 +45060 1572 1628 +45060 1920 1507 +45060 1740 1905 +45060 1825 1872 +45060 1920 1522 +45060 1767 1489 +45060 1538 1920 +45060 1650 1668 +45080 1538 1522 +45080 1548 1431 +45080 1562 1603 +45080 1572 1628 +45080 1599 1831 +45080 1605 1636 +45080 1617 1468 +45080 1920 1507 +45080 1740 1905 +45080 1825 1872 +45080 1920 1522 +45080 1767 1489 +45080 1587 1716 +45080 1538 1920 +45080 1599 1437 +45080 1547 1587 +45080 1650 1668 +45100 1592 1716 +45100 1643 1704 +45100 1712 1532 +45100 1740 1905 +45100 1825 1872 +45100 1920 1522 +45100 1547 1716 +45100 1767 1489 +45100 1547 1808 +45100 1587 1716 +45100 1731 1863 +45100 1507 1522 +45100 1538 1920 +45100 1599 1437 +45100 1547 1587 +45100 1650 1668 +45120 1547 1716 +45120 1716 1808 +45120 1767 1489 +45120 1547 1808 +45120 1562 1603 +45120 1587 1716 +45120 1600 1529 +45120 1605 1636 +45120 1731 1863 +45120 1507 1522 +45120 1587 1808 +45120 1825 1519 +45120 1538 1920 +45120 1599 1437 +45120 1547 1587 +45120 1650 1668 +45140 1547 1808 +45140 1562 1603 +45140 1587 1716 +45140 1600 1825 +45140 1600 1519 +45140 1600 1529 +45140 1605 1636 +45140 1731 1863 +45140 1507 1522 +45140 1587 1808 +45140 1825 1519 +45140 1538 1920 +45140 1599 1437 +45140 1547 1587 +45140 1544 1659 +45140 1650 1668 +45160 1587 1808 +45160 1643 1704 +45160 1651 1905 +45160 1669 1754 +45160 1825 1519 +45160 1538 1920 +45160 1599 1437 +45160 1617 1857 +45160 1547 1587 +45160 1544 1659 +45160 1650 1668 +45180 1538 1920 +45180 1549 1825 +45180 1549 1583 +45180 1599 1437 +45180 1600 1825 +45180 1825 1529 +45180 1519 1529 +45180 1575 1679 +45180 1617 1857 +45180 1547 1587 +45180 1740 1905 +45180 1544 1659 +45180 1650 1668 +45200 1549 1523 +45200 1563 1592 +45200 1575 1679 +45200 1617 1857 +45200 1572 1628 +45200 1547 1587 +45200 1740 1905 +45200 1544 1659 +45200 1587 1808 +45200 1825 1519 +45200 1650 1668 +45220 1617 1857 +45220 1825 1529 +45220 1507 1522 +45220 1547 1808 +45220 1572 1628 +45220 1731 1863 +45220 1547 1587 +45220 1740 1905 +45220 1544 1659 +45220 1587 1808 +45220 1825 1519 +45220 1650 1668 +45240 1538 1519 +45240 1547 1808 +45240 1553 1655 +45240 1572 1628 +45240 1731 1863 +45240 1547 1587 +45240 1740 1905 +45240 1544 1659 +45240 1587 1808 +45240 1825 1519 +45240 1650 1668 +45260 1538 1825 +45260 1587 1716 +45260 1617 1857 +45260 1731 1863 +45260 1547 1587 +45260 1740 1905 +45260 1767 1489 +45260 1544 1659 +45260 1587 1808 +45260 1669 1754 +45260 1825 1519 +45260 1650 1668 +45280 1547 1808 +45280 1547 1587 +45280 1549 1525 +45280 1572 1668 +45280 1576 1872 +45280 1599 1512 +45280 1740 1905 +45280 1767 1489 +45280 1825 1529 +45280 1459 1516 +45280 1538 1655 +45280 1544 1659 +45280 1549 1519 +45280 1558 1459 +45280 1587 1808 +45280 1669 1754 +45280 1825 1519 +45280 1650 1668 +45300 1538 1655 +45300 1544 1659 +45300 1549 1523 +45300 1549 1519 +45300 1558 1459 +45300 1587 1808 +45300 1587 1716 +45300 1825 1523 +45300 1519 1523 +45300 1669 1754 +45300 1758 1847 +45300 1825 1519 +45300 1600 1529 +45300 1650 1668 +45320 1549 1600 +45320 1563 1592 +45320 1586 1847 +45320 1606 1468 +45320 1639 1847 +45320 1669 1754 +45320 1758 1847 +45320 1767 1857 +45320 1825 1519 +45320 1600 1529 +45320 1740 1905 +45320 1650 1668 +45340 1587 1716 +45340 1599 1512 +45340 1600 1529 +45340 1600 1825 +45340 1617 1441 +45340 1740 1905 +45340 1587 1808 +45340 1650 1668 +45360 1538 1523 +45360 1582 1593 +45360 1857 1441 +45360 1740 1905 +45360 1813 1441 +45360 1825 1523 +45360 1587 1808 +45360 1547 1587 +45360 1650 1668 +45380 1547 1808 +45380 1587 1716 +45380 1669 1754 +45380 1765 1441 +45380 1871 1517 +45380 1740 1905 +45380 1813 1441 +45380 1825 1523 +45380 1587 1808 +45380 1600 1529 +45380 1547 1587 +45380 1544 1659 +45380 1731 1863 +45380 1650 1668 +45400 1740 1905 +45400 1813 1441 +45400 1825 1523 +45400 1507 1522 +45400 1587 1808 +45400 1600 1529 +45400 1547 1587 +45400 1538 1825 +45400 1544 1659 +45400 1731 1863 +45400 1650 1668 +45420 1549 1525 +45420 1587 1716 +45420 1605 1636 +45420 1655 1806 +45420 1825 1523 +45420 1507 1522 +45420 1552 1668 +45420 1587 1808 +45420 1600 1529 +45420 1547 1587 +45420 1538 1825 +45420 1544 1659 +45420 1731 1863 +45420 1650 1668 +45440 1552 1668 +45440 1587 1808 +45440 1600 1529 +45440 1655 1529 +45440 1563 1592 +45440 1547 1587 +45440 1538 1825 +45440 1544 1659 +45440 1731 1863 +45440 1650 1668 +45460 1549 1525 +45460 1563 1592 +45460 1598 1489 +45460 1598 1617 +45460 1547 1808 +45460 1547 1587 +45460 1538 1825 +45460 1544 1659 +45460 1825 1523 +45460 1813 1441 +45460 1731 1863 +45460 1650 1668 +45480 1547 1808 +45480 1547 1587 +45480 1549 1529 +45480 1565 1655 +45480 1600 1529 +45480 1600 1525 +45480 1813 1857 +45480 1857 1441 +45480 1538 1825 +45480 1538 1523 +45480 1544 1659 +45480 1825 1523 +45480 1813 1441 +45480 1731 1863 +45480 1650 1668 +45500 1549 1600 +45500 1617 1489 +45500 1767 1489 +45500 1813 1857 +45500 1825 1529 +45500 1857 1441 +45500 1538 1825 +45500 1538 1523 +45500 1544 1659 +45500 1825 1523 +45500 1813 1441 +45500 1731 1863 +45500 1650 1668 +45520 1586 1765 +45520 1758 1765 +45520 1857 1441 +45520 1538 1825 +45520 1538 1523 +45520 1544 1659 +45520 1549 1529 +45520 1563 1592 +45520 1565 1655 +45520 1825 1523 +45520 1813 1441 +45520 1628 1808 +45520 1731 1863 +45520 1650 1668 +45540 1538 1825 +45540 1538 1523 +45540 1544 1659 +45540 1549 1529 +45540 1563 1592 +45540 1598 1659 +45540 1565 1655 +45540 1825 1523 +45540 1544 1598 +45540 1813 1441 +45540 1628 1808 +45540 1731 1863 +45540 1650 1668 +45560 1565 1655 +45560 1605 1636 +45560 1678 1679 +45560 1507 1522 +45560 1735 1465 +45560 1825 1523 +45560 1544 1598 +45560 1813 1441 +45560 1628 1808 +45560 1731 1863 +45560 1650 1668 +45580 1735 1465 +45580 1767 1489 +45580 1825 1523 +45580 1552 1668 +45580 1544 1598 +45580 1563 1592 +45580 1813 1441 +45580 1544 1659 +45580 1549 1525 +45580 1679 1716 +45580 1628 1808 +45580 1731 1863 +45580 1650 1668 +45600 1552 1668 +45600 1831 1847 +45600 1544 1598 +45600 1563 1592 +45600 1813 1441 +45600 1544 1659 +45600 1598 1659 +45600 1549 1525 +45600 1679 1716 +45600 1628 1808 +45600 1731 1863 +45600 1650 1668 +45620 1544 1598 +45620 1563 1592 +45620 1603 1825 +45620 1813 1441 +45620 1544 1659 +45620 1598 1659 +45620 1549 1525 +45620 1600 1603 +45620 1679 1716 +45620 1605 1636 +45620 1628 1808 +45620 1731 1863 +45620 1650 1668 +45640 1544 1659 +45640 1552 1668 +45640 1580 1463 +45640 1598 1659 +45640 1651 1905 +45640 1549 1525 +45640 1600 1603 +45640 1679 1716 +45640 1605 1636 +45640 1628 1808 +45640 1731 1863 +45640 1650 1668 +45660 1575 1716 +45660 1549 1525 +45660 1600 1603 +45660 1813 1857 +45660 1507 1522 +45660 1679 1716 +45660 1857 1441 +45660 1563 1592 +45660 1605 1636 +45660 1628 1808 +45660 1731 1863 +45660 1650 1668 +45680 1549 1600 +45680 1549 1525 +45680 1600 1603 +45680 1603 1825 +45680 1603 1525 +45680 1813 1857 +45680 1507 1522 +45680 1679 1716 +45680 1857 1441 +45680 1563 1592 +45680 1605 1636 +45680 1628 1808 +45680 1731 1863 +45680 1650 1668 +45700 1552 1668 +45700 1583 1523 +45700 1679 1716 +45700 1699 1523 +45700 1857 1441 +45700 1563 1592 +45700 1655 1699 +45700 1605 1636 +45700 1628 1808 +45700 1731 1863 +45700 1650 1668 +45720 1549 1600 +45720 1563 1592 +45720 1655 1699 +45720 1735 1465 +45720 1825 1529 +45720 1507 1522 +45720 1605 1636 +45720 1628 1808 +45720 1731 1863 +45720 1650 1668 +45740 1603 1523 +45740 1605 1636 +45740 1813 1441 +45740 1552 1650 +45740 1857 1441 +45740 1628 1808 +45740 1549 1523 +45740 1523 1525 +45740 1731 1863 +45740 1549 1525 +45740 1650 1668 +45760 1552 1650 +45760 1580 1463 +45760 1585 1847 +45760 1600 1825 +45760 1655 1699 +45760 1813 1857 +45760 1847 1437 +45760 1857 1441 +45760 1628 1808 +45760 1825 1529 +45760 1549 1523 +45760 1569 1742 +45760 1523 1525 +45760 1731 1863 +45760 1549 1525 +45760 1650 1668 +45780 1547 1716 +45780 1628 1808 +45780 1825 1529 +45780 1544 1659 +45780 1549 1523 +45780 1569 1742 +45780 1598 1659 +45780 1605 1636 +45780 1523 1525 +45780 1617 1857 +45780 1731 1863 +45780 1549 1525 +45780 1650 1668 +45800 1544 1659 +45800 1544 1598 +45800 1549 1523 +45800 1563 1592 +45800 1569 1742 +45800 1586 1758 +45800 1598 1659 +45800 1603 1523 +45800 1605 1636 +45800 1617 1441 +45800 1813 1441 +45800 1523 1525 +45800 1603 1825 +45800 1617 1857 +45800 1617 1813 +45800 1655 1699 +45800 1731 1863 +45800 1549 1525 +45800 1650 1668 +45820 1572 1643 +45820 1603 1825 +45820 1617 1857 +45820 1617 1813 +45820 1643 1704 +45820 1655 1699 +45820 1731 1863 +45820 1549 1525 +45820 1650 1668 +45840 1538 1666 +45840 1563 1592 +45840 1605 1636 +45840 1731 1863 +45840 1549 1525 +45840 1650 1668 +45860 1563 1592 +45860 1598 1659 +45860 1655 1825 +45860 1507 1522 +45860 1605 1636 +45860 1731 1863 +45860 1549 1525 +45860 1650 1668 +45880 1605 1636 +45880 1617 1857 +45880 1699 1489 +45880 1825 1529 +45880 1617 1441 +45880 1731 1863 +45880 1544 1598 +45880 1549 1525 +45880 1650 1668 +45900 1598 1659 +45900 1600 1825 +45900 1606 1468 +45900 1784 1911 +45900 1617 1441 +45900 1731 1863 +45900 1544 1598 +45900 1549 1525 +45900 1650 1668 +45920 1617 1813 +45920 1712 1911 +45920 1767 1489 +45920 1871 1530 +45920 1519 1529 +45920 1643 1739 +45920 1813 1441 +45920 1617 1441 +45920 1643 1704 +45920 1731 1863 +45920 1544 1598 +45920 1549 1525 +45920 1650 1668 +45940 1606 1468 +45940 1628 1808 +45940 1643 1739 +45940 1813 1441 +45940 1825 1529 +45940 1911 1530 +45940 1617 1441 +45940 1643 1704 +45940 1666 1857 +45940 1731 1863 +45940 1600 1519 +45940 1544 1598 +45940 1507 1522 +45940 1549 1525 +45940 1650 1668 +45960 1547 1716 +45960 1547 1582 +45960 1600 1655 +45960 1696 1920 +45960 1617 1441 +45960 1643 1704 +45960 1666 1857 +45960 1731 1863 +45960 1600 1519 +45960 1655 1825 +45960 1544 1598 +45960 1507 1522 +45960 1549 1525 +45960 1650 1668 +45980 1606 1468 +45980 1617 1441 +45980 1643 1704 +45980 1643 1739 +45980 1666 1857 +45980 1731 1863 +45980 1600 1519 +45980 1617 1857 +45980 1655 1825 +45980 1857 1441 +45980 1544 1598 +45980 1507 1522 +45980 1549 1525 +45980 1650 1668 +46000 1553 1600 +46000 1562 1489 +46000 1593 1599 +46000 1600 1519 +46000 1617 1857 +46000 1655 1825 +46000 1857 1441 +46000 1544 1598 +46000 1825 1519 +46000 1507 1522 +46000 1549 1525 +46000 1666 1441 +46000 1650 1668 +46020 1544 1598 +46020 1576 1503 +46020 1582 1732 +46020 1825 1519 +46020 1519 1529 +46020 1643 1739 +46020 1731 1863 +46020 1579 1441 +46020 1507 1522 +46020 1549 1525 +46020 1666 1441 +46020 1650 1668 +46040 1563 1592 +46040 1617 1857 +46040 1638 1825 +46040 1643 1739 +46040 1731 1863 +46040 1579 1617 +46040 1579 1441 +46040 1579 1857 +46040 1600 1519 +46040 1507 1522 +46040 1549 1525 +46040 1628 1808 +46040 1666 1441 +46040 1650 1668 +46060 1579 1617 +46060 1579 1441 +46060 1579 1857 +46060 1606 1468 +46060 1600 1519 +46060 1507 1522 +46060 1549 1525 +46060 1628 1808 +46060 1666 1441 +46060 1587 1598 +46060 1650 1668 +46080 1600 1519 +46080 1638 1825 +46080 1666 1857 +46080 1731 1863 +46080 1857 1441 +46080 1507 1522 +46080 1549 1525 +46080 1580 1628 +46080 1628 1808 +46080 1666 1441 +46080 1587 1598 +46080 1650 1668 +46100 1579 1441 +46100 1579 1617 +46100 1507 1522 +46100 1549 1525 +46100 1580 1628 +46100 1628 1808 +46100 1666 1441 +46100 1587 1598 +46100 1650 1668 +46120 1549 1525 +46120 1580 1628 +46120 1638 1825 +46120 1628 1808 +46120 1666 1441 +46120 1655 1759 +46120 1695 1759 +46120 1587 1598 +46120 1650 1668 +46140 1549 1519 +46140 1580 1628 +46140 1638 1825 +46140 1643 1853 +46140 1643 1879 +46140 1507 1522 +46140 1628 1808 +46140 1666 1441 +46140 1655 1759 +46140 1695 1759 +46140 1600 1519 +46140 1655 1695 +46140 1587 1598 +46140 1650 1668 +46160 1539 1458 +46160 1549 1529 +46160 1549 1583 +46160 1579 1617 +46160 1470 1517 +46160 1507 1522 +46160 1628 1808 +46160 1666 1441 +46160 1655 1759 +46160 1695 1759 +46160 1600 1519 +46160 1655 1695 +46160 1587 1598 +46160 1650 1668 +46180 1549 1759 +46180 1598 1831 +46180 1628 1808 +46180 1643 1853 +46180 1666 1441 +46180 1857 1441 +46180 1655 1759 +46180 1695 1759 +46180 1600 1519 +46180 1825 1519 +46180 1655 1695 +46180 1587 1598 +46180 1650 1668 +46200 1549 1529 +46200 1598 1603 +46200 1857 1441 +46200 1617 1857 +46200 1655 1759 +46200 1695 1759 +46200 1600 1519 +46200 1825 1519 +46200 1655 1695 +46200 1587 1598 +46200 1650 1668 +46220 1549 1525 +46220 1617 1857 +46220 1628 1808 +46220 1655 1759 +46220 1668 1825 +46220 1695 1759 +46220 1600 1519 +46220 1825 1519 +46220 1655 1695 +46220 1587 1598 +46220 1650 1668 +46240 1549 1523 +46240 1580 1808 +46240 1580 1628 +46240 1583 1529 +46240 1600 1519 +46240 1643 1853 +46240 1825 1519 +46240 1655 1695 +46240 1587 1598 +46240 1650 1668 +46260 1628 1808 +46260 1666 1767 +46260 1669 1754 +46260 1695 1759 +46260 1655 1529 +46260 1655 1759 +46260 1655 1695 +46260 1572 1871 +46260 1617 1857 +46260 1587 1598 +46260 1650 1668 +46280 1605 1636 +46280 1695 1529 +46280 1759 1529 +46280 1655 1529 +46280 1655 1759 +46280 1655 1695 +46280 1572 1871 +46280 1617 1857 +46280 1587 1598 +46280 1650 1668 +46300 1547 1716 +46300 1600 1523 +46300 1628 1463 +46300 1655 1529 +46300 1655 1759 +46300 1655 1825 +46300 1655 1695 +46300 1666 1767 +46300 1825 1519 +46300 1572 1871 +46300 1695 1759 +46300 1507 1522 +46300 1617 1857 +46300 1587 1598 +46300 1650 1668 +46320 1572 1871 +46320 1669 1754 +46320 1695 1759 +46320 1643 1853 +46320 1507 1522 +46320 1695 1529 +46320 1617 1857 +46320 1587 1598 +46320 1650 1668 +46340 1593 1599 +46340 1643 1853 +46340 1507 1522 +46340 1596 1762 +46340 1593 1521 +46340 1695 1529 +46340 1617 1857 +46340 1587 1598 +46340 1650 1668 +46360 1580 1655 +46360 1596 1762 +46360 1593 1521 +46360 1600 1695 +46360 1695 1529 +46360 1695 1759 +46360 1617 1857 +46360 1759 1529 +46360 1587 1598 +46360 1669 1754 +46360 1650 1668 +46380 1547 1716 +46380 1593 1521 +46380 1600 1695 +46380 1666 1767 +46380 1695 1529 +46380 1695 1759 +46380 1617 1857 +46380 1759 1529 +46380 1825 1519 +46380 1857 1441 +46380 1696 1920 +46380 1587 1598 +46380 1669 1754 +46380 1643 1853 +46380 1650 1668 +46400 1617 1857 +46400 1617 1441 +46400 1628 1463 +46400 1759 1529 +46400 1825 1519 +46400 1857 1441 +46400 1655 1523 +46400 1696 1920 +46400 1587 1598 +46400 1669 1754 +46400 1579 1582 +46400 1643 1853 +46400 1650 1668 +46420 1549 1825 +46420 1580 1603 +46420 1655 1523 +46420 1696 1920 +46420 1523 1529 +46420 1587 1598 +46420 1669 1754 +46420 1759 1523 +46420 1579 1582 +46420 1643 1853 +46420 1650 1668 +46440 1547 1808 +46440 1549 1519 +46440 1587 1598 +46440 1593 1521 +46440 1619 1866 +46440 1669 1754 +46440 1759 1523 +46440 1659 1519 +46440 1507 1522 +46440 1617 1857 +46440 1579 1582 +46440 1643 1853 +46440 1650 1668 +46460 1549 1529 +46460 1628 1463 +46460 1659 1519 +46460 1669 1441 +46460 1857 1920 +46460 1470 1517 +46460 1507 1522 +46460 1617 1857 +46460 1579 1582 +46460 1643 1853 +46460 1666 1767 +46460 1650 1668 +46480 1574 1783 +46480 1583 1825 +46480 1587 1598 +46480 1617 1857 +46480 1692 1519 +46480 1759 1523 +46480 1579 1582 +46480 1643 1853 +46480 1660 1692 +46480 1666 1767 +46480 1650 1668 +46500 1547 1808 +46500 1549 1668 +46500 1579 1441 +46500 1692 1523 +46500 1732 1503 +46500 1759 1523 +46500 1507 1522 +46500 1579 1582 +46500 1669 1754 +46500 1643 1853 +46500 1660 1692 +46500 1666 1767 +46500 1655 1692 +46500 1650 1668 +46520 1539 1458 +46520 1547 1585 +46520 1553 1519 +46520 1579 1582 +46520 1669 1754 +46520 1643 1853 +46520 1660 1692 +46520 1666 1767 +46520 1655 1692 +46520 1650 1668 +46540 1549 1759 +46540 1579 1582 +46540 1669 1754 +46540 1692 1759 +46540 1759 1523 +46540 1759 1519 +46540 1547 1808 +46540 1549 1523 +46540 1587 1598 +46540 1643 1853 +46540 1660 1692 +46540 1666 1767 +46540 1655 1660 +46540 1655 1692 +46540 1650 1668 +46560 1539 1458 +46560 1547 1808 +46560 1547 1585 +46560 1547 1576 +46560 1549 1523 +46560 1587 1598 +46560 1757 1765 +46560 1643 1853 +46560 1660 1692 +46560 1666 1767 +46560 1507 1522 +46560 1655 1660 +46560 1655 1692 +46560 1650 1668 +46580 1643 1853 +46580 1660 1692 +46580 1666 1767 +46580 1759 1523 +46580 1507 1522 +46580 1655 1660 +46580 1655 1692 +46580 1669 1754 +46580 1549 1759 +46580 1650 1668 +46600 1547 1576 +46600 1549 1523 +46600 1576 1808 +46600 1692 1519 +46600 1784 1911 +46600 1507 1522 +46600 1599 1512 +46600 1655 1660 +46600 1655 1692 +46600 1669 1754 +46600 1549 1759 +46600 1650 1668 +46620 1544 1732 +46620 1549 1529 +46620 1599 1512 +46620 1628 1754 +46620 1655 1660 +46620 1655 1692 +46620 1655 1825 +46620 1692 1825 +46620 1857 1441 +46620 1669 1754 +46620 1759 1523 +46620 1549 1759 +46620 1660 1692 +46620 1666 1767 +46620 1650 1668 +46640 1596 1762 +46640 1692 1523 +46640 1692 1503 +46640 1707 1470 +46640 1759 1825 +46640 1669 1754 +46640 1759 1523 +46640 1549 1523 +46640 1549 1759 +46640 1660 1692 +46640 1544 1519 +46640 1587 1598 +46640 1666 1767 +46640 1650 1668 +46660 1544 1825 +46660 1549 1695 +46660 1563 1618 +46660 1599 1512 +46660 1600 1825 +46660 1669 1754 +46660 1692 1825 +46660 1759 1523 +46660 1825 1519 +46660 1549 1523 +46660 1549 1759 +46660 1660 1692 +46660 1544 1519 +46660 1587 1598 +46660 1507 1522 +46660 1617 1857 +46660 1617 1441 +46660 1666 1767 +46660 1650 1668 +46680 1549 1523 +46680 1549 1759 +46680 1563 1525 +46680 1643 1853 +46680 1660 1692 +46680 1544 1519 +46680 1587 1598 +46680 1507 1522 +46680 1617 1857 +46680 1857 1441 +46680 1617 1441 +46680 1666 1767 +46680 1650 1668 +46700 1544 1519 +46700 1596 1762 +46700 1470 1517 +46700 1587 1598 +46700 1669 1754 +46700 1507 1522 +46700 1617 1857 +46700 1819 1512 +46700 1857 1441 +46700 1617 1441 +46700 1920 1512 +46700 1666 1767 +46700 1599 1655 +46700 1650 1668 +46720 1587 1598 +46720 1659 1519 +46720 1669 1754 +46720 1754 1489 +46720 1759 1529 +46720 1507 1522 +46720 1617 1857 +46720 1819 1512 +46720 1857 1441 +46720 1617 1441 +46720 1643 1853 +46720 1660 1692 +46720 1819 1920 +46720 1920 1512 +46720 1549 1759 +46720 1628 1489 +46720 1666 1767 +46720 1599 1655 +46720 1549 1523 +46720 1759 1523 +46720 1650 1668 +46740 1574 1783 +46740 1617 1857 +46740 1819 1512 +46740 1857 1441 +46740 1470 1517 +46740 1617 1441 +46740 1643 1853 +46740 1660 1692 +46740 1819 1920 +46740 1920 1512 +46740 1549 1759 +46740 1628 1489 +46740 1666 1767 +46740 1599 1655 +46740 1549 1523 +46740 1759 1523 +46740 1650 1668 +46760 1617 1441 +46760 1643 1853 +46760 1661 1712 +46760 1825 1519 +46760 1628 1857 +46760 1660 1692 +46760 1819 1920 +46760 1857 1489 +46760 1920 1512 +46760 1669 1754 +46760 1549 1759 +46760 1628 1489 +46760 1666 1767 +46760 1599 1655 +46760 1599 1512 +46760 1549 1523 +46760 1759 1523 +46760 1650 1668 +46780 1628 1857 +46780 1660 1692 +46780 1754 1831 +46780 1819 1920 +46780 1857 1489 +46780 1920 1512 +46780 1669 1754 +46780 1549 1759 +46780 1628 1489 +46780 1666 1767 +46780 1599 1655 +46780 1599 1512 +46780 1549 1523 +46780 1544 1519 +46780 1759 1523 +46780 1650 1668 +46800 1554 1707 +46800 1661 1712 +46800 1669 1754 +46800 1507 1522 +46800 1549 1759 +46800 1628 1489 +46800 1666 1767 +46800 1659 1825 +46800 1599 1655 +46800 1655 1512 +46800 1599 1512 +46800 1549 1523 +46800 1544 1519 +46800 1759 1523 +46800 1650 1668 +46820 1549 1759 +46820 1605 1636 +46820 1628 1489 +46820 1643 1853 +46820 1666 1767 +46820 1659 1825 +46820 1660 1692 +46820 1599 1655 +46820 1655 1512 +46820 1599 1512 +46820 1549 1523 +46820 1544 1519 +46820 1759 1523 +46820 1650 1668 +46840 1582 1592 +46840 1605 1636 +46840 1628 1489 +46840 1628 1767 +46840 1643 1853 +46840 1666 1767 +46840 1831 1503 +46840 1659 1825 +46840 1660 1692 +46840 1599 1655 +46840 1655 1512 +46840 1599 1512 +46840 1549 1523 +46840 1544 1519 +46840 1759 1523 +46840 1650 1668 +46860 1628 1463 +46860 1659 1825 +46860 1660 1692 +46860 1754 1463 +46860 1759 1529 +46860 1575 1679 +46860 1599 1655 +46860 1603 1847 +46860 1655 1512 +46860 1599 1512 +46860 1767 1489 +46860 1549 1523 +46860 1549 1759 +46860 1544 1519 +46860 1759 1523 +46860 1650 1668 +46880 1575 1679 +46880 1599 1655 +46880 1603 1847 +46880 1655 1512 +46880 1679 1522 +46880 1679 1731 +46880 1599 1512 +46880 1643 1853 +46880 1767 1489 +46880 1808 1847 +46880 1549 1523 +46880 1549 1759 +46880 1544 1519 +46880 1759 1523 +46880 1770 1819 +46880 1770 1920 +46880 1650 1668 +46900 1538 1679 +46900 1547 1716 +46900 1547 1847 +46900 1592 1441 +46900 1599 1512 +46900 1643 1853 +46900 1507 1522 +46900 1767 1489 +46900 1808 1847 +46900 1549 1523 +46900 1549 1759 +46900 1660 1692 +46900 1669 1754 +46900 1605 1636 +46900 1544 1519 +46900 1759 1523 +46900 1770 1819 +46900 1770 1920 +46900 1650 1668 +46920 1767 1489 +46920 1808 1847 +46920 1549 1523 +46920 1549 1759 +46920 1660 1692 +46920 1669 1754 +46920 1605 1636 +46920 1544 1519 +46920 1716 1847 +46920 1759 1523 +46920 1770 1819 +46920 1770 1920 +46920 1650 1668 +46940 1582 1603 +46940 1603 1872 +46940 1692 1831 +46940 1839 1503 +46940 1847 1503 +46940 1507 1522 +46940 1808 1847 +46940 1549 1523 +46940 1549 1759 +46940 1660 1692 +46940 1669 1754 +46940 1605 1636 +46940 1819 1920 +46940 1544 1519 +46940 1716 1847 +46940 1759 1523 +46940 1770 1819 +46940 1770 1920 +46940 1650 1668 +46960 1692 1839 +46960 1808 1847 +46960 1549 1523 +46960 1549 1759 +46960 1655 1512 +46960 1660 1692 +46960 1669 1754 +46960 1605 1636 +46960 1819 1920 +46960 1544 1519 +46960 1716 1847 +46960 1759 1523 +46960 1770 1819 +46960 1770 1920 +46960 1650 1668 +46980 1549 1523 +46980 1549 1759 +46980 1600 1659 +46980 1655 1512 +46980 1660 1692 +46980 1666 1740 +46980 1669 1754 +46980 1695 1825 +46980 1759 1825 +46980 1549 1825 +46980 1605 1636 +46980 1767 1489 +46980 1643 1853 +46980 1819 1920 +46980 1544 1519 +46980 1716 1847 +46980 1759 1523 +46980 1770 1819 +46980 1770 1920 +46980 1650 1668 +47000 1549 1825 +47000 1579 1519 +47000 1580 1603 +47000 1605 1636 +47000 1767 1489 +47000 1808 1847 +47000 1600 1530 +47000 1643 1853 +47000 1819 1920 +47000 1544 1519 +47000 1579 1825 +47000 1716 1847 +47000 1759 1523 +47000 1770 1819 +47000 1770 1920 +47000 1650 1668 +47020 1547 1716 +47020 1549 1523 +47020 1579 1759 +47020 1582 1593 +47020 1582 1603 +47020 1600 1530 +47020 1617 1441 +47020 1643 1853 +47020 1655 1512 +47020 1692 1839 +47020 1759 1825 +47020 1441 1489 +47020 1549 1759 +47020 1819 1920 +47020 1544 1519 +47020 1579 1825 +47020 1716 1847 +47020 1759 1523 +47020 1770 1819 +47020 1770 1920 +47020 1650 1668 +47040 1544 1600 +47040 1549 1636 +47040 1549 1759 +47040 1563 1666 +47040 1600 1759 +47040 1669 1754 +47040 1767 1489 +47040 1819 1920 +47040 1544 1519 +47040 1579 1825 +47040 1716 1847 +47040 1759 1523 +47040 1770 1819 +47040 1770 1920 +47040 1650 1668 +47060 1507 1522 +47060 1655 1512 +47060 1544 1519 +47060 1579 1825 +47060 1716 1847 +47060 1759 1523 +47060 1770 1819 +47060 1770 1920 +47060 1650 1668 +47080 1538 1575 +47080 1582 1603 +47080 1660 1847 +47080 1678 1489 +47080 1600 1759 +47080 1669 1754 +47080 1819 1920 +47080 1731 1863 +47080 1655 1512 +47080 1544 1519 +47080 1579 1825 +47080 1716 1847 +47080 1759 1523 +47080 1770 1819 +47080 1770 1920 +47080 1650 1668 +47100 1563 1666 +47100 1600 1759 +47100 1507 1522 +47100 1669 1754 +47100 1819 1920 +47100 1731 1863 +47100 1655 1512 +47100 1544 1519 +47100 1579 1825 +47100 1716 1847 +47100 1759 1523 +47100 1770 1819 +47100 1770 1920 +47100 1650 1668 +47120 1538 1575 +47120 1549 1636 +47120 1549 1605 +47120 1600 1530 +47120 1660 1692 +47120 1669 1754 +47120 1692 1839 +47120 1819 1920 +47120 1582 1603 +47120 1731 1863 +47120 1617 1441 +47120 1655 1512 +47120 1544 1519 +47120 1579 1825 +47120 1716 1847 +47120 1759 1523 +47120 1770 1819 +47120 1770 1920 +47120 1650 1668 +47140 1582 1603 +47140 1636 1759 +47140 1731 1863 +47140 1617 1441 +47140 1655 1512 +47140 1544 1519 +47140 1507 1522 +47140 1643 1853 +47140 1579 1825 +47140 1716 1847 +47140 1759 1523 +47140 1770 1819 +47140 1770 1920 +47140 1650 1668 +47160 1563 1666 +47160 1617 1441 +47160 1655 1512 +47160 1544 1519 +47160 1600 1530 +47160 1507 1522 +47160 1643 1853 +47160 1549 1605 +47160 1579 1825 +47160 1716 1847 +47160 1759 1523 +47160 1770 1819 +47160 1770 1920 +47160 1650 1668 +47180 1544 1519 +47180 1600 1530 +47180 1650 1463 +47180 1507 1522 +47180 1643 1853 +47180 1731 1863 +47180 1549 1605 +47180 1579 1825 +47180 1716 1847 +47180 1759 1523 +47180 1770 1819 +47180 1770 1920 +47180 1650 1668 +47200 1554 1707 +47200 1582 1603 +47200 1643 1853 +47200 1668 1463 +47200 1731 1863 +47200 1600 1759 +47200 1549 1605 +47200 1579 1825 +47200 1716 1847 +47200 1759 1523 +47200 1770 1819 +47200 1770 1920 +47200 1650 1668 +47220 1544 1519 +47220 1592 1831 +47220 1600 1759 +47220 1666 1740 +47220 1819 1920 +47220 1549 1605 +47220 1919 1427 +47220 1579 1825 +47220 1716 1847 +47220 1759 1523 +47220 1770 1819 +47220 1770 1920 +47220 1650 1668 +47240 1549 1605 +47240 1554 1707 +47240 1579 1600 +47240 1587 1731 +47240 1605 1636 +47240 1919 1427 +47240 1549 1636 +47240 1579 1825 +47240 1643 1853 +47240 1716 1847 +47240 1759 1523 +47240 1547 1716 +47240 1770 1819 +47240 1617 1441 +47240 1770 1920 +47240 1650 1668 +47260 1549 1636 +47260 1579 1825 +47260 1643 1853 +47260 1819 1920 +47260 1716 1847 +47260 1759 1523 +47260 1547 1716 +47260 1770 1819 +47260 1617 1441 +47260 1770 1920 +47260 1544 1519 +47260 1650 1668 +47280 1600 1759 +47280 1660 1692 +47280 1716 1847 +47280 1547 1847 +47280 1692 1428 +47280 1759 1523 +47280 1547 1716 +47280 1549 1605 +47280 1770 1819 +47280 1617 1441 +47280 1770 1920 +47280 1544 1519 +47280 1650 1668 +47300 1547 1847 +47300 1579 1463 +47300 1643 1853 +47300 1692 1428 +47300 1759 1523 +47300 1547 1716 +47300 1549 1605 +47300 1770 1819 +47300 1617 1441 +47300 1770 1920 +47300 1544 1519 +47300 1650 1668 +47320 1547 1716 +47320 1549 1636 +47320 1549 1605 +47320 1770 1819 +47320 1617 1441 +47320 1770 1920 +47320 1716 1847 +47320 1544 1519 +47320 1650 1668 +47340 1731 1863 +47340 1770 1819 +47340 1617 1441 +47340 1770 1920 +47340 1819 1920 +47340 1716 1847 +47340 1759 1523 +47340 1544 1519 +47340 1650 1668 +47360 1579 1592 +47360 1617 1441 +47360 1650 1463 +47360 1692 1428 +47360 1770 1920 +47360 1819 1920 +47360 1643 1853 +47360 1716 1847 +47360 1759 1523 +47360 1544 1519 +47360 1650 1668 +47380 1563 1592 +47380 1678 1872 +47380 1549 1605 +47380 1655 1759 +47380 1770 1920 +47380 1819 1920 +47380 1643 1853 +47380 1716 1847 +47380 1759 1523 +47380 1770 1819 +47380 1544 1519 +47380 1650 1668 +47400 1549 1605 +47400 1655 1759 +47400 1563 1579 +47400 1770 1920 +47400 1819 1920 +47400 1643 1853 +47400 1716 1847 +47400 1759 1523 +47400 1770 1819 +47400 1544 1519 +47400 1600 1519 +47400 1650 1668 +47420 1549 1759 +47420 1563 1579 +47420 1698 1764 +47420 1731 1863 +47420 1770 1920 +47420 1819 1920 +47420 1643 1853 +47420 1716 1847 +47420 1759 1523 +47420 1770 1819 +47420 1605 1636 +47420 1544 1519 +47420 1600 1519 +47420 1650 1668 +47440 1562 1678 +47440 1562 1847 +47440 1731 1920 +47440 1819 1920 +47440 1643 1853 +47440 1699 1441 +47440 1716 1847 +47440 1759 1523 +47440 1770 1819 +47440 1605 1636 +47440 1549 1605 +47440 1544 1519 +47440 1600 1519 +47440 1650 1668 +47460 1563 1592 +47460 1579 1441 +47460 1643 1853 +47460 1660 1716 +47460 1699 1441 +47460 1716 1847 +47460 1770 1920 +47460 1847 1428 +47460 1579 1592 +47460 1759 1523 +47460 1770 1819 +47460 1660 1692 +47460 1605 1636 +47460 1563 1579 +47460 1549 1605 +47460 1544 1519 +47460 1600 1519 +47460 1650 1668 +47480 1544 1600 +47480 1547 1617 +47480 1579 1592 +47480 1590 1871 +47480 1698 1764 +47480 1759 1523 +47480 1770 1819 +47480 1549 1636 +47480 1628 1463 +47480 1660 1692 +47480 1605 1636 +47480 1669 1754 +47480 1563 1579 +47480 1549 1605 +47480 1544 1519 +47480 1600 1519 +47480 1650 1668 +47500 1544 1825 +47500 1549 1636 +47500 1562 1603 +47500 1562 1582 +47500 1628 1463 +47500 1660 1692 +47500 1605 1636 +47500 1669 1754 +47500 1563 1579 +47500 1549 1605 +47500 1544 1519 +47500 1600 1519 +47500 1650 1668 +47520 1579 1592 +47520 1599 1441 +47520 1605 1636 +47520 1669 1754 +47520 1770 1819 +47520 1847 1441 +47520 1563 1579 +47520 1698 1764 +47520 1549 1605 +47520 1544 1519 +47520 1759 1523 +47520 1600 1519 +47520 1650 1668 +47540 1563 1579 +47540 1628 1463 +47540 1655 1512 +47540 1692 1847 +47540 1698 1764 +47540 1731 1863 +47540 1549 1605 +47540 1544 1519 +47540 1759 1523 +47540 1600 1519 +47540 1549 1636 +47540 1650 1668 +47560 1698 1704 +47560 1698 1905 +47560 1698 1805 +47560 1716 1441 +47560 1549 1605 +47560 1544 1519 +47560 1759 1523 +47560 1580 1628 +47560 1600 1519 +47560 1549 1636 +47560 1650 1668 +47580 1549 1605 +47580 1573 1452 +47580 1599 1759 +47580 1544 1519 +47580 1759 1523 +47580 1580 1628 +47580 1600 1519 +47580 1605 1636 +47580 1549 1636 +47580 1563 1579 +47580 1650 1668 +47600 1544 1519 +47600 1731 1489 +47600 1759 1523 +47600 1467 1531 +47600 1580 1628 +47600 1600 1519 +47600 1544 1825 +47600 1605 1636 +47600 1549 1636 +47600 1563 1579 +47600 1770 1819 +47600 1650 1668 +47620 1579 1592 +47620 1580 1628 +47620 1591 1470 +47620 1598 1441 +47620 1600 1519 +47620 1643 1853 +47620 1669 1754 +47620 1920 1441 +47620 1470 1517 +47620 1544 1825 +47620 1871 1517 +47620 1605 1636 +47620 1549 1636 +47620 1563 1579 +47620 1549 1605 +47620 1770 1819 +47620 1650 1668 +47640 1544 1825 +47640 1575 1679 +47640 1770 1441 +47640 1819 1441 +47640 1871 1517 +47640 1467 1531 +47640 1605 1636 +47640 1549 1636 +47640 1563 1579 +47640 1549 1605 +47640 1770 1819 +47640 1650 1668 +47660 1605 1636 +47660 1659 1441 +47660 1669 1754 +47660 1544 1519 +47660 1549 1636 +47660 1563 1579 +47660 1580 1628 +47660 1549 1605 +47660 1770 1819 +47660 1650 1668 +47680 1544 1519 +47680 1547 1716 +47680 1549 1636 +47680 1554 1707 +47680 1563 1579 +47680 1580 1628 +47680 1655 1847 +47680 1449 1512 +47680 1643 1853 +47680 1549 1605 +47680 1871 1517 +47680 1770 1819 +47680 1650 1668 +47700 1591 1470 +47700 1759 1523 +47700 1819 1920 +47700 1731 1863 +47700 1770 1920 +47700 1643 1853 +47700 1549 1605 +47700 1871 1517 +47700 1770 1819 +47700 1650 1668 +47720 1538 1544 +47720 1544 1655 +47720 1731 1863 +47720 1544 1519 +47720 1583 1523 +47720 1770 1920 +47720 1580 1628 +47720 1643 1853 +47720 1449 1512 +47720 1549 1605 +47720 1871 1517 +47720 1770 1819 +47720 1650 1668 +47740 1544 1519 +47740 1549 1523 +47740 1563 1441 +47740 1563 1579 +47740 1579 1441 +47740 1583 1523 +47740 1591 1470 +47740 1692 1847 +47740 1770 1920 +47740 1847 1489 +47740 1580 1628 +47740 1599 1655 +47740 1643 1853 +47740 1449 1512 +47740 1549 1605 +47740 1871 1517 +47740 1770 1819 +47740 1650 1668 +47760 1538 1523 +47760 1547 1716 +47760 1549 1583 +47760 1580 1628 +47760 1599 1655 +47760 1643 1853 +47760 1692 1839 +47760 1449 1512 +47760 1549 1605 +47760 1617 1857 +47760 1538 1544 +47760 1871 1517 +47760 1770 1819 +47760 1650 1668 +47780 1549 1636 +47780 1549 1605 +47780 1574 1731 +47780 1600 1523 +47780 1617 1857 +47780 1551 1269 +47780 1538 1544 +47780 1871 1517 +47780 1591 1470 +47780 1770 1819 +47780 1650 1668 +47800 1543 1700 +47800 1544 1519 +47800 1551 1269 +47800 1591 1665 +47800 1605 1636 +47800 1606 1468 +47800 1669 1754 +47800 1538 1544 +47800 1840 1489 +47800 1871 1517 +47800 1591 1470 +47800 1770 1819 +47800 1650 1668 +47820 1538 1544 +47820 1600 1759 +47820 1689 1525 +47820 1759 1523 +47820 1767 1840 +47820 1767 1489 +47820 1840 1489 +47820 1871 1517 +47820 1549 1605 +47820 1591 1470 +47820 1770 1819 +47820 1650 1668 +47840 1544 1825 +47840 1591 1665 +47840 1600 1519 +47840 1840 1489 +47840 1871 1517 +47840 1549 1605 +47840 1825 1519 +47840 1544 1659 +47840 1605 1636 +47840 1544 1519 +47840 1591 1470 +47840 1770 1819 +47840 1643 1853 +47840 1650 1668 +47860 1549 1605 +47860 1580 1628 +47860 1659 1825 +47860 1685 1771 +47860 1759 1523 +47860 1770 1489 +47860 1825 1519 +47860 1920 1489 +47860 1544 1659 +47860 1548 1516 +47860 1605 1636 +47860 1544 1519 +47860 1591 1470 +47860 1431 1516 +47860 1770 1819 +47860 1643 1853 +47860 1650 1668 +47880 1544 1659 +47880 1548 1516 +47880 1554 1707 +47880 1591 1665 +47880 1605 1636 +47880 1544 1519 +47880 1591 1470 +47880 1431 1516 +47880 1770 1819 +47880 1643 1853 +47880 1650 1668 +47900 1538 1659 +47900 1544 1519 +47900 1575 1679 +47900 1600 1759 +47900 1606 1468 +47900 1759 1523 +47900 1871 1517 +47900 1591 1470 +47900 1431 1516 +47900 1770 1819 +47900 1643 1853 +47900 1650 1668 +47920 1544 1605 +47920 1544 1549 +47920 1554 1707 +47920 1600 1529 +47920 1600 1519 +47920 1659 1825 +47920 1731 1863 +47920 1825 1519 +47920 1871 1517 +47920 1591 1470 +47920 1431 1516 +47920 1858 1872 +47920 1549 1605 +47920 1770 1819 +47920 1643 1853 +47920 1650 1668 +47940 1548 1431 +47940 1549 1636 +47940 1591 1470 +47940 1431 1516 +47940 1605 1636 +47940 1669 1754 +47940 1858 1872 +47940 1549 1605 +47940 1770 1819 +47940 1643 1853 +47940 1650 1668 +47960 1544 1553 +47960 1544 1605 +47960 1547 1716 +47960 1551 1269 +47960 1600 1529 +47960 1605 1636 +47960 1548 1516 +47960 1669 1754 +47960 1858 1872 +47960 1549 1605 +47960 1770 1819 +47960 1643 1853 +47960 1650 1668 +47980 1544 1523 +47980 1547 1808 +47980 1548 1516 +47980 1617 1857 +47980 1783 1449 +47980 1819 1920 +47980 1513 1516 +47980 1519 1523 +47980 1669 1754 +47980 1858 1872 +47980 1549 1605 +47980 1770 1819 +47980 1547 1626 +47980 1643 1853 +47980 1650 1668 +48000 1538 1825 +48000 1669 1754 +48000 1678 1831 +48000 1731 1863 +48000 1431 1516 +48000 1858 1872 +48000 1549 1605 +48000 1770 1819 +48000 1547 1626 +48000 1643 1853 +48000 1650 1668 +48020 1544 1523 +48020 1660 1839 +48020 1825 1519 +48020 1858 1872 +48020 1544 1519 +48020 1549 1605 +48020 1574 1762 +48020 1605 1636 +48020 1548 1516 +48020 1770 1819 +48020 1547 1626 +48020 1643 1853 +48020 1650 1668 +48040 1544 1519 +48040 1545 1430 +48040 1549 1605 +48040 1574 1762 +48040 1605 1636 +48040 1606 1468 +48040 1664 1501 +48040 1759 1523 +48040 1920 1489 +48040 1669 1754 +48040 1548 1516 +48040 1759 1525 +48040 1770 1819 +48040 1431 1516 +48040 1547 1626 +48040 1643 1853 +48040 1650 1668 +48060 1669 1754 +48060 1731 1863 +48060 1858 1872 +48060 1548 1516 +48060 1660 1692 +48060 1660 1839 +48060 1759 1525 +48060 1770 1819 +48060 1431 1516 +48060 1547 1626 +48060 1600 1519 +48060 1643 1853 +48060 1650 1668 +48080 1548 1516 +48080 1660 1692 +48080 1660 1839 +48080 1689 1813 +48080 1759 1525 +48080 1770 1819 +48080 1825 1519 +48080 1431 1516 +48080 1547 1626 +48080 1626 1716 +48080 1600 1519 +48080 1643 1853 +48080 1650 1668 +48100 1547 1626 +48100 1600 1525 +48100 1759 1523 +48100 1523 1525 +48100 1626 1716 +48100 1666 1489 +48100 1731 1863 +48100 1600 1519 +48100 1643 1853 +48100 1650 1668 +48120 1549 1636 +48120 1606 1468 +48120 1626 1716 +48120 1666 1489 +48120 1431 1516 +48120 1759 1525 +48120 1731 1863 +48120 1547 1716 +48120 1600 1519 +48120 1643 1853 +48120 1770 1819 +48120 1650 1668 +48140 1759 1525 +48140 1847 1489 +48140 1858 1872 +48140 1731 1863 +48140 1547 1716 +48140 1600 1519 +48140 1643 1853 +48140 1770 1819 +48140 1650 1668 +48160 1549 1636 +48160 1617 1441 +48160 1628 1668 +48160 1666 1489 +48160 1858 1872 +48160 1655 1694 +48160 1731 1863 +48160 1538 1825 +48160 1547 1716 +48160 1600 1519 +48160 1643 1853 +48160 1770 1819 +48160 1650 1668 +48180 1541 1619 +48180 1596 1512 +48180 1600 1825 +48180 1655 1694 +48180 1660 1839 +48180 1731 1863 +48180 1759 1525 +48180 1847 1489 +48180 1441 1489 +48180 1523 1525 +48180 1538 1825 +48180 1609 1915 +48180 1547 1716 +48180 1600 1519 +48180 1643 1853 +48180 1770 1819 +48180 1650 1668 +48200 1549 1636 +48200 1558 1698 +48200 1558 1516 +48200 1698 1516 +48200 1538 1825 +48200 1609 1915 +48200 1547 1716 +48200 1600 1519 +48200 1643 1853 +48200 1770 1819 +48200 1574 1762 +48200 1549 1605 +48200 1650 1668 +48220 1538 1825 +48220 1609 1915 +48220 1655 1825 +48220 1767 1840 +48220 1840 1441 +48220 1547 1716 +48220 1759 1525 +48220 1600 1519 +48220 1643 1853 +48220 1770 1819 +48220 1574 1762 +48220 1549 1605 +48220 1650 1668 +48240 1547 1716 +48240 1590 1530 +48240 1666 1489 +48240 1727 1743 +48240 1759 1529 +48240 1759 1525 +48240 1600 1519 +48240 1643 1853 +48240 1770 1819 +48240 1574 1762 +48240 1549 1605 +48240 1650 1668 +48260 1538 1825 +48260 1600 1519 +48260 1643 1853 +48260 1784 1911 +48260 1825 1519 +48260 1770 1819 +48260 1574 1762 +48260 1549 1605 +48260 1650 1668 +48280 1605 1636 +48280 1770 1819 +48280 1840 1441 +48280 1840 1489 +48280 1441 1489 +48280 1547 1716 +48280 1574 1762 +48280 1549 1605 +48280 1650 1668 +48300 1558 1431 +48300 1583 1523 +48300 1606 1468 +48300 1669 1754 +48300 1695 1759 +48300 1759 1529 +48300 1547 1716 +48300 1574 1762 +48300 1784 1911 +48300 1549 1605 +48300 1519 1525 +48300 1650 1668 +48320 1547 1716 +48320 1574 1762 +48320 1626 1770 +48320 1643 1853 +48320 1784 1911 +48320 1549 1605 +48320 1871 1517 +48320 1519 1525 +48320 1650 1668 +48340 1549 1636 +48340 1554 1655 +48340 1558 1606 +48340 1643 1853 +48340 1784 1911 +48340 1840 1489 +48340 1549 1605 +48340 1574 1783 +48340 1606 1468 +48340 1871 1517 +48340 1519 1525 +48340 1650 1668 +48360 1558 1431 +48360 1574 1762 +48360 1619 1678 +48360 1660 1692 +48360 1784 1911 +48360 1819 1920 +48360 1840 1489 +48360 1549 1605 +48360 1574 1783 +48360 1600 1519 +48360 1606 1468 +48360 1660 1839 +48360 1871 1517 +48360 1549 1683 +48360 1606 1431 +48360 1519 1525 +48360 1650 1668 +48380 1547 1716 +48380 1549 1605 +48380 1574 1783 +48380 1600 1519 +48380 1606 1468 +48380 1660 1839 +48380 1747 1433 +48380 1871 1517 +48380 1549 1683 +48380 1549 1636 +48380 1606 1431 +48380 1519 1525 +48380 1650 1668 +48400 1606 1516 +48400 1825 1529 +48400 1547 1619 +48400 1619 1716 +48400 1871 1517 +48400 1549 1683 +48400 1549 1636 +48400 1605 1683 +48400 1606 1431 +48400 1636 1683 +48400 1519 1525 +48400 1650 1668 +48420 1547 1619 +48420 1574 1762 +48420 1619 1716 +48420 1871 1517 +48420 1549 1683 +48420 1549 1636 +48420 1840 1489 +48420 1605 1683 +48420 1606 1431 +48420 1636 1683 +48420 1519 1525 +48420 1650 1668 +48440 1605 1636 +48440 1606 1516 +48440 1871 1517 +48440 1549 1683 +48440 1549 1636 +48440 1840 1489 +48440 1605 1683 +48440 1606 1431 +48440 1636 1683 +48440 1591 1470 +48440 1519 1525 +48440 1650 1668 +48460 1549 1683 +48460 1549 1636 +48460 1598 1783 +48460 1600 1525 +48460 1840 1489 +48460 1605 1683 +48460 1819 1920 +48460 1606 1431 +48460 1547 1716 +48460 1636 1683 +48460 1549 1605 +48460 1600 1519 +48460 1591 1470 +48460 1519 1525 +48460 1650 1668 +48480 1605 1683 +48480 1606 1516 +48480 1871 1517 +48480 1619 1489 +48480 1819 1920 +48480 1606 1431 +48480 1547 1716 +48480 1636 1683 +48480 1538 1825 +48480 1549 1605 +48480 1600 1519 +48480 1591 1470 +48480 1519 1525 +48480 1650 1668 +48500 1558 1606 +48500 1598 1783 +48500 1600 1525 +48500 1619 1489 +48500 1716 1740 +48500 1819 1920 +48500 1857 1441 +48500 1431 1516 +48500 1599 1512 +48500 1606 1431 +48500 1547 1716 +48500 1636 1683 +48500 1857 1489 +48500 1538 1825 +48500 1549 1605 +48500 1600 1519 +48500 1591 1470 +48500 1519 1525 +48500 1549 1636 +48500 1549 1683 +48500 1650 1668 +48520 1572 1467 +48520 1599 1512 +48520 1605 1683 +48520 1606 1516 +48520 1606 1431 +48520 1655 1684 +48520 1547 1716 +48520 1636 1683 +48520 1857 1489 +48520 1538 1825 +48520 1549 1605 +48520 1600 1519 +48520 1591 1470 +48520 1519 1525 +48520 1549 1636 +48520 1549 1683 +48520 1650 1668 +48540 1547 1716 +48540 1636 1683 +48540 1643 1853 +48540 1857 1489 +48540 1538 1825 +48540 1545 1684 +48540 1549 1605 +48540 1600 1519 +48540 1591 1470 +48540 1519 1525 +48540 1549 1636 +48540 1549 1683 +48540 1650 1668 +48560 1583 1759 +48560 1605 1636 +48560 1684 1430 +48560 1707 1470 +48560 1857 1489 +48560 1871 1517 +48560 1605 1683 +48560 1619 1489 +48560 1538 1825 +48560 1545 1684 +48560 1545 1655 +48560 1606 1431 +48560 1549 1605 +48560 1600 1519 +48560 1619 1857 +48560 1591 1470 +48560 1606 1516 +48560 1519 1525 +48560 1549 1636 +48560 1549 1683 +48560 1650 1668 +48580 1547 1716 +48580 1548 1516 +48580 1605 1683 +48580 1619 1489 +48580 1660 1839 +48580 1825 1519 +48580 1538 1825 +48580 1545 1684 +48580 1545 1655 +48580 1599 1512 +48580 1606 1468 +48580 1606 1431 +48580 1698 1747 +48580 1549 1605 +48580 1600 1519 +48580 1655 1684 +48580 1825 1529 +48580 1858 1872 +48580 1619 1857 +48580 1591 1470 +48580 1606 1516 +48580 1519 1525 +48580 1549 1636 +48580 1549 1683 +48580 1650 1668 +48600 1538 1825 +48600 1545 1684 +48600 1545 1655 +48600 1548 1606 +48600 1599 1512 +48600 1606 1468 +48600 1606 1431 +48600 1636 1683 +48600 1698 1747 +48600 1698 1765 +48600 1549 1605 +48600 1600 1519 +48600 1655 1684 +48600 1655 1703 +48600 1684 1703 +48600 1825 1529 +48600 1858 1872 +48600 1545 1574 +48600 1558 1606 +48600 1574 1655 +48600 1619 1857 +48600 1698 1764 +48600 1767 1489 +48600 1591 1470 +48600 1606 1516 +48600 1655 1430 +48600 1519 1525 +48600 1549 1636 +48600 1549 1683 +48600 1650 1668 +48620 1549 1605 +48620 1574 1703 +48620 1600 1519 +48620 1605 1683 +48620 1655 1684 +48620 1655 1703 +48620 1684 1703 +48620 1825 1529 +48620 1858 1872 +48620 1545 1574 +48620 1545 1759 +48620 1558 1606 +48620 1574 1655 +48620 1619 1857 +48620 1643 1853 +48620 1698 1764 +48620 1767 1489 +48620 1591 1470 +48620 1606 1516 +48620 1655 1430 +48620 1519 1525 +48620 1549 1636 +48620 1549 1683 +48620 1650 1668 +48640 1545 1695 +48640 1545 1574 +48640 1545 1759 +48640 1554 1740 +48640 1558 1606 +48640 1574 1759 +48640 1574 1684 +48640 1574 1655 +48640 1619 1857 +48640 1643 1853 +48640 1698 1764 +48640 1764 1765 +48640 1767 1489 +48640 1819 1920 +48640 1545 1684 +48640 1684 1759 +48640 1591 1470 +48640 1606 1516 +48640 1655 1430 +48640 1519 1525 +48640 1549 1636 +48640 1606 1431 +48640 1871 1517 +48640 1549 1683 +48640 1650 1668 +48660 1545 1684 +48660 1545 1430 +48660 1545 1655 +48660 1605 1636 +48660 1619 1489 +48660 1644 1664 +48660 1655 1684 +48660 1655 1695 +48660 1664 1791 +48660 1684 1430 +48660 1684 1759 +48660 1269 1440 +48660 1871 1504 +48660 1591 1470 +48660 1606 1516 +48660 1655 1430 +48660 1857 1489 +48660 1431 1516 +48660 1504 1517 +48660 1519 1525 +48660 1600 1519 +48660 1619 1767 +48660 1549 1636 +48660 1606 1431 +48660 1605 1683 +48660 1549 1605 +48660 1871 1517 +48660 1549 1683 +48660 1650 1668 +48680 1548 1516 +48680 1548 1431 +48680 1591 1470 +48680 1599 1512 +48680 1606 1516 +48680 1626 1740 +48680 1655 1430 +48680 1857 1489 +48680 1431 1516 +48680 1504 1517 +48680 1519 1525 +48680 1538 1825 +48680 1600 1519 +48680 1619 1767 +48680 1698 1764 +48680 1549 1636 +48680 1606 1431 +48680 1605 1683 +48680 1549 1605 +48680 1871 1517 +48680 1549 1683 +48680 1650 1668 +48700 1538 1825 +48700 1545 1759 +48700 1606 1468 +48700 1269 1440 +48700 1825 1519 +48700 1857 1441 +48700 1600 1519 +48700 1619 1767 +48700 1698 1764 +48700 1548 1606 +48700 1549 1636 +48700 1643 1853 +48700 1558 1606 +48700 1606 1431 +48700 1605 1683 +48700 1549 1605 +48700 1871 1517 +48700 1549 1683 +48700 1650 1668 +48720 1545 1684 +48720 1545 1430 +48720 1548 1516 +48720 1554 1740 +48720 1600 1519 +48720 1619 1767 +48720 1545 1525 +48720 1606 1516 +48720 1626 1740 +48720 1698 1764 +48720 1548 1606 +48720 1549 1636 +48720 1643 1853 +48720 1655 1430 +48720 1558 1606 +48720 1606 1431 +48720 1591 1470 +48720 1605 1683 +48720 1549 1605 +48720 1871 1517 +48720 1549 1683 +48720 1650 1668 +48740 1545 1525 +48740 1554 1626 +48740 1558 1431 +48740 1583 1825 +48740 1606 1516 +48740 1626 1740 +48740 1628 1463 +48740 1660 1759 +48740 1698 1764 +48740 1857 1489 +48740 1857 1441 +48740 1545 1655 +48740 1548 1606 +48740 1549 1636 +48740 1643 1853 +48740 1655 1430 +48740 1858 1872 +48740 1558 1606 +48740 1599 1512 +48740 1606 1431 +48740 1591 1470 +48740 1605 1683 +48740 1549 1605 +48740 1871 1517 +48740 1549 1683 +48740 1650 1668 +48760 1545 1684 +48760 1545 1655 +48760 1548 1606 +48760 1549 1636 +48760 1606 1468 +48760 1643 1853 +48760 1655 1430 +48760 1858 1872 +48760 1558 1606 +48760 1599 1512 +48760 1606 1431 +48760 1619 1767 +48760 1545 1430 +48760 1591 1470 +48760 1605 1683 +48760 1549 1605 +48760 1655 1684 +48760 1871 1517 +48760 1549 1683 +48760 1650 1668 +48780 1558 1606 +48780 1599 1512 +48780 1606 1431 +48780 1619 1767 +48780 1643 1504 +48780 1650 1463 +48780 1507 1522 +48780 1545 1430 +48780 1591 1470 +48780 1605 1683 +48780 1655 1825 +48780 1668 1463 +48780 1684 1825 +48780 1549 1605 +48780 1655 1684 +48780 1871 1517 +48780 1549 1683 +48780 1650 1668 +48800 1545 1430 +48800 1580 1463 +48800 1591 1470 +48800 1605 1683 +48800 1655 1825 +48800 1668 1463 +48800 1684 1825 +48800 1269 1440 +48800 1857 1489 +48800 1428 1525 +48800 1858 1872 +48800 1549 1605 +48800 1655 1684 +48800 1871 1517 +48800 1698 1764 +48800 1549 1683 +48800 1650 1668 +48820 1545 1525 +48820 1548 1606 +48820 1600 1684 +48820 1605 1525 +48820 1636 1525 +48820 1643 1510 +48820 1683 1525 +48820 1858 1872 +48820 1549 1605 +48820 1606 1516 +48820 1606 1431 +48820 1655 1684 +48820 1871 1517 +48820 1698 1764 +48820 1549 1636 +48820 1549 1683 +48820 1650 1668 +48840 1545 1628 +48840 1549 1605 +48840 1703 1489 +48840 1825 1428 +48840 1857 1489 +48840 1428 1519 +48840 1545 1783 +48840 1558 1606 +48840 1606 1516 +48840 1606 1431 +48840 1655 1684 +48840 1871 1517 +48840 1698 1764 +48840 1549 1636 +48840 1825 1525 +48840 1549 1683 +48840 1650 1668 +48860 1545 1430 +48860 1545 1783 +48860 1558 1606 +48860 1573 1452 +48860 1580 1463 +48860 1606 1516 +48860 1703 1857 +48860 1619 1441 +48860 1548 1606 +48860 1606 1431 +48860 1655 1684 +48860 1871 1517 +48860 1698 1764 +48860 1605 1683 +48860 1549 1636 +48860 1825 1525 +48860 1549 1683 +48860 1650 1668 +48880 1545 1580 +48880 1545 1463 +48880 1548 1431 +48880 1558 1431 +48880 1591 1470 +48880 1619 1441 +48880 1858 1872 +48880 1548 1606 +48880 1606 1431 +48880 1655 1684 +48880 1871 1517 +48880 1698 1764 +48880 1605 1683 +48880 1549 1636 +48880 1825 1525 +48880 1549 1605 +48880 1549 1683 +48880 1650 1668 +48900 1539 1458 +48900 1545 1628 +48900 1548 1606 +48900 1599 1774 +48900 1606 1516 +48900 1606 1431 +48900 1655 1684 +48900 1655 1911 +48900 1660 1692 +48900 1660 1839 +48900 1684 1911 +48900 1692 1839 +48900 1871 1517 +48900 1507 1522 +48900 1599 1512 +48900 1599 1449 +48900 1840 1857 +48900 1698 1764 +48900 1840 1489 +48900 1605 1683 +48900 1857 1489 +48900 1549 1636 +48900 1599 1787 +48900 1825 1525 +48900 1628 1463 +48900 1549 1605 +48900 1549 1683 +48900 1650 1668 +48920 1545 1430 +48920 1558 1431 +48920 1599 1512 +48920 1599 1449 +48920 1606 1468 +48920 1619 1703 +48920 1650 1463 +48920 1668 1463 +48920 1831 1504 +48920 1840 1857 +48920 1628 1668 +48920 1698 1764 +48920 1787 1851 +48920 1840 1489 +48920 1858 1872 +48920 1605 1683 +48920 1857 1489 +48920 1599 1851 +48920 1549 1636 +48920 1599 1787 +48920 1825 1525 +48920 1628 1463 +48920 1549 1605 +48920 1549 1683 +48920 1650 1668 +48940 1628 1668 +48940 1698 1764 +48940 1787 1851 +48940 1840 1489 +48940 1858 1872 +48940 1510 1521 +48940 1605 1683 +48940 1619 1441 +48940 1857 1489 +48940 1599 1851 +48940 1857 1441 +48940 1549 1636 +48940 1579 1819 +48940 1599 1787 +48940 1825 1525 +48940 1628 1463 +48940 1549 1605 +48940 1549 1683 +48940 1650 1668 +48960 1599 1449 +48960 1605 1683 +48960 1619 1441 +48960 1656 1684 +48960 1787 1449 +48960 1857 1489 +48960 1591 1470 +48960 1599 1851 +48960 1857 1441 +48960 1507 1522 +48960 1549 1636 +48960 1579 1819 +48960 1599 1787 +48960 1825 1525 +48960 1628 1463 +48960 1549 1605 +48960 1549 1683 +48960 1650 1668 +48980 1545 1911 +48980 1579 1920 +48980 1587 1699 +48980 1591 1470 +48980 1599 1851 +48980 1703 1441 +48980 1840 1489 +48980 1857 1441 +48980 1858 1872 +48980 1507 1522 +48980 1549 1636 +48980 1579 1819 +48980 1599 1787 +48980 1825 1525 +48980 1628 1463 +48980 1545 1430 +48980 1549 1605 +48980 1549 1683 +48980 1650 1668 +49000 1549 1636 +49000 1574 1430 +49000 1579 1819 +49000 1668 1463 +49000 1441 1489 +49000 1599 1787 +49000 1650 1463 +49000 1655 1684 +49000 1787 1851 +49000 1573 1452 +49000 1825 1525 +49000 1628 1463 +49000 1655 1656 +49000 1656 1682 +49000 1656 1684 +49000 1682 1684 +49000 1545 1430 +49000 1549 1605 +49000 1549 1683 +49000 1650 1668 +49020 1574 1762 +49020 1591 1470 +49020 1599 1851 +49020 1599 1787 +49020 1650 1463 +49020 1655 1684 +49020 1767 1840 +49020 1787 1851 +49020 1911 1430 +49020 1573 1452 +49020 1600 1428 +49020 1825 1525 +49020 1857 1441 +49020 1628 1463 +49020 1655 1656 +49020 1655 1682 +49020 1656 1682 +49020 1656 1684 +49020 1682 1684 +49020 1599 1512 +49020 1545 1430 +49020 1549 1605 +49020 1819 1920 +49020 1549 1683 +49020 1650 1668 +49040 1573 1452 +49040 1600 1428 +49040 1668 1463 +49040 1825 1428 +49040 1825 1525 +49040 1840 1441 +49040 1853 1866 +49040 1857 1441 +49040 1628 1463 +49040 1655 1656 +49040 1655 1682 +49040 1656 1682 +49040 1656 1684 +49040 1682 1684 +49040 1767 1489 +49040 1599 1512 +49040 1605 1683 +49040 1545 1430 +49040 1857 1489 +49040 1549 1605 +49040 1819 1920 +49040 1549 1683 +49040 1650 1668 +49060 1628 1463 +49060 1655 1656 +49060 1655 1682 +49060 1656 1682 +49060 1656 1684 +49060 1682 1684 +49060 1767 1489 +49060 1767 1857 +49060 1811 1521 +49060 1811 1853 +49060 1853 1521 +49060 1599 1512 +49060 1605 1683 +49060 1655 1684 +49060 1545 1430 +49060 1857 1489 +49060 1549 1605 +49060 1574 1762 +49060 1591 1470 +49060 1819 1920 +49060 1549 1683 +49060 1650 1668 +49080 1574 1592 +49080 1599 1512 +49080 1605 1683 +49080 1628 1433 +49080 1655 1684 +49080 1811 1510 +49080 1840 1489 +49080 1545 1430 +49080 1857 1489 +49080 1441 1489 +49080 1825 1525 +49080 1549 1605 +49080 1574 1762 +49080 1591 1470 +49080 1819 1920 +49080 1549 1683 +49080 1650 1668 +49100 1545 1430 +49100 1656 1682 +49100 1825 1433 +49100 1857 1489 +49100 1441 1489 +49100 1767 1840 +49100 1825 1525 +49100 1549 1605 +49100 1574 1762 +49100 1591 1470 +49100 1819 1920 +49100 1549 1683 +49100 1650 1668 +49120 1548 1516 +49120 1549 1636 +49120 1573 1452 +49120 1599 1512 +49120 1605 1683 +49120 1671 1427 +49120 1767 1840 +49120 1767 1489 +49120 1825 1525 +49120 1468 1516 +49120 1549 1605 +49120 1707 1470 +49120 1574 1762 +49120 1840 1489 +49120 1591 1470 +49120 1660 1692 +49120 1819 1920 +49120 1549 1683 +49120 1650 1668 +49140 1545 1430 +49140 1549 1605 +49140 1551 1440 +49140 1551 1269 +49140 1574 1911 +49140 1575 1847 +49140 1606 1468 +49140 1636 1683 +49140 1679 1847 +49140 1707 1470 +49140 1767 1857 +49140 1840 1857 +49140 1574 1762 +49140 1840 1489 +49140 1591 1470 +49140 1660 1692 +49140 1819 1920 +49140 1549 1683 +49140 1650 1668 +49160 1574 1762 +49160 1600 1428 +49160 1619 1519 +49160 1671 1427 +49160 1840 1489 +49160 1847 1486 +49160 1857 1489 +49160 1441 1489 +49160 1563 1592 +49160 1591 1470 +49160 1660 1692 +49160 1857 1441 +49160 1656 1682 +49160 1819 1920 +49160 1919 1510 +49160 1547 1716 +49160 1549 1683 +49160 1650 1668 +49180 1558 1606 +49180 1563 1592 +49180 1591 1470 +49180 1606 1516 +49180 1655 1684 +49180 1656 1449 +49180 1660 1692 +49180 1667 1757 +49180 1669 1754 +49180 1857 1441 +49180 1574 1489 +49180 1656 1682 +49180 1819 1920 +49180 1606 1468 +49180 1919 1510 +49180 1547 1716 +49180 1549 1683 +49180 1599 1787 +49180 1650 1668 +49200 1574 1489 +49200 1599 1851 +49200 1656 1489 +49200 1656 1682 +49200 1694 1489 +49200 1819 1920 +49200 1606 1468 +49200 1767 1489 +49200 1919 1510 +49200 1547 1716 +49200 1549 1683 +49200 1599 1787 +49200 1767 1840 +49200 1573 1452 +49200 1650 1668 +49220 1551 1269 +49220 1563 1592 +49220 1606 1468 +49220 1669 1754 +49220 1692 1839 +49220 1767 1489 +49220 1919 1510 +49220 1547 1716 +49220 1549 1683 +49220 1599 1787 +49220 1606 1516 +49220 1698 1847 +49220 1840 1489 +49220 1767 1840 +49220 1660 1692 +49220 1573 1452 +49220 1650 1668 +49240 1545 1656 +49240 1547 1716 +49240 1548 1606 +49240 1549 1683 +49240 1599 1787 +49240 1606 1516 +49240 1606 1431 +49240 1626 1695 +49240 1656 1911 +49240 1698 1847 +49240 1840 1489 +49240 1441 1489 +49240 1819 1920 +49240 1767 1840 +49240 1549 1525 +49240 1656 1682 +49240 1660 1692 +49240 1573 1452 +49240 1650 1668 +49260 1551 1269 +49260 1563 1592 +49260 1599 1851 +49260 1700 1758 +49260 1774 1851 +49260 1819 1920 +49260 1669 1754 +49260 1767 1840 +49260 1549 1525 +49260 1606 1468 +49260 1656 1682 +49260 1660 1692 +49260 1600 1428 +49260 1573 1452 +49260 1650 1668 +49280 1549 1683 +49280 1591 1470 +49280 1627 1851 +49280 1669 1754 +49280 1716 1441 +49280 1716 1489 +49280 1731 1427 +49280 1767 1840 +49280 1919 1510 +49280 1655 1684 +49280 1840 1489 +49280 1441 1489 +49280 1549 1525 +49280 1606 1468 +49280 1431 1516 +49280 1656 1682 +49280 1767 1489 +49280 1599 1512 +49280 1660 1692 +49280 1600 1428 +49280 1740 1853 +49280 1573 1452 +49280 1650 1668 +49300 1549 1523 +49300 1655 1684 +49300 1684 1489 +49300 1684 1911 +49300 1840 1489 +49300 1441 1489 +49300 1549 1525 +49300 1606 1468 +49300 1683 1523 +49300 1819 1920 +49300 1431 1516 +49300 1656 1682 +49300 1767 1489 +49300 1599 1512 +49300 1660 1692 +49300 1600 1428 +49300 1740 1853 +49300 1573 1452 +49300 1650 1668 +49320 1548 1606 +49320 1549 1525 +49320 1551 1269 +49320 1606 1468 +49320 1606 1431 +49320 1683 1523 +49320 1684 1441 +49320 1684 1716 +49320 1787 1851 +49320 1819 1920 +49320 1851 1464 +49320 1911 1441 +49320 1431 1516 +49320 1656 1682 +49320 1767 1489 +49320 1919 1510 +49320 1599 1512 +49320 1669 1754 +49320 1660 1692 +49320 1667 1787 +49320 1600 1428 +49320 1740 1853 +49320 1545 1430 +49320 1573 1452 +49320 1650 1668 +49340 1537 1772 +49340 1538 1825 +49340 1656 1682 +49340 1667 1851 +49340 1700 1526 +49340 1767 1489 +49340 1825 1523 +49340 1919 1510 +49340 1441 1489 +49340 1599 1512 +49340 1669 1754 +49340 1840 1489 +49340 1660 1692 +49340 1667 1787 +49340 1522 1524 +49340 1600 1428 +49340 1740 1853 +49340 1683 1525 +49340 1545 1430 +49340 1573 1452 +49340 1650 1668 +49360 1591 1470 +49360 1599 1512 +49360 1600 1825 +49360 1669 1754 +49360 1684 1489 +49360 1684 1911 +49360 1716 1489 +49360 1754 1840 +49360 1840 1489 +49360 1507 1524 +49360 1563 1592 +49360 1599 1787 +49360 1660 1692 +49360 1667 1787 +49360 1522 1524 +49360 1543 1727 +49360 1551 1269 +49360 1600 1428 +49360 1740 1853 +49360 1683 1525 +49360 1545 1430 +49360 1573 1452 +49360 1549 1683 +49360 1650 1668 +49380 1563 1592 +49380 1599 1787 +49380 1660 1692 +49380 1667 1787 +49380 1767 1840 +49380 1507 1522 +49380 1522 1524 +49380 1543 1727 +49380 1551 1269 +49380 1600 1428 +49380 1656 1682 +49380 1740 1853 +49380 1911 1441 +49380 1683 1525 +49380 1825 1428 +49380 1545 1430 +49380 1573 1452 +49380 1549 1683 +49380 1650 1668 +49400 1543 1727 +49400 1551 1269 +49400 1591 1470 +49400 1592 1920 +49400 1599 1667 +49400 1600 1428 +49400 1605 1692 +49400 1656 1682 +49400 1684 1441 +49400 1694 1716 +49400 1600 1519 +49400 1605 1636 +49400 1619 1703 +49400 1684 1911 +49400 1740 1853 +49400 1911 1441 +49400 1683 1525 +49400 1825 1428 +49400 1545 1430 +49400 1573 1452 +49400 1549 1683 +49400 1650 1668 +49420 1549 1525 +49420 1600 1519 +49420 1605 1636 +49420 1619 1703 +49420 1622 1626 +49420 1626 1858 +49420 1667 1787 +49420 1684 1911 +49420 1692 1523 +49420 1700 1466 +49420 1754 1847 +49420 1767 1911 +49420 1740 1853 +49420 1911 1441 +49420 1683 1525 +49420 1538 1428 +49420 1825 1428 +49420 1545 1430 +49420 1573 1452 +49420 1549 1683 +49420 1819 1920 +49420 1660 1692 +49420 1650 1668 +49440 1541 1735 +49440 1613 1749 +49440 1740 1853 +49440 1759 1858 +49440 1840 1441 +49440 1857 1441 +49440 1911 1441 +49440 1599 1787 +49440 1656 1682 +49440 1683 1525 +49440 1684 1840 +49440 1507 1522 +49440 1538 1428 +49440 1825 1428 +49440 1545 1430 +49440 1573 1452 +49440 1549 1683 +49440 1630 1438 +49440 1819 1920 +49440 1660 1692 +49440 1650 1668 +49460 1546 1470 +49460 1599 1787 +49460 1613 1700 +49460 1656 1682 +49460 1683 1525 +49460 1684 1840 +49460 1684 1441 +49460 1507 1522 +49460 1538 1428 +49460 1825 1428 +49460 1545 1430 +49460 1573 1452 +49460 1549 1683 +49460 1630 1438 +49460 1819 1920 +49460 1660 1692 +49460 1650 1668 +49480 1538 1428 +49480 1605 1636 +49480 1619 1703 +49480 1667 1847 +49480 1825 1428 +49480 1851 1433 +49480 1545 1430 +49480 1573 1452 +49480 1599 1512 +49480 1600 1428 +49480 1549 1683 +49480 1740 1853 +49480 1676 1700 +49480 1551 1269 +49480 1630 1438 +49480 1819 1920 +49480 1660 1692 +49480 1650 1668 +49500 1545 1430 +49500 1573 1452 +49500 1583 1600 +49500 1599 1512 +49500 1600 1825 +49500 1600 1819 +49500 1600 1428 +49500 1684 1911 +49500 1857 1441 +49500 1912 1916 +49500 1549 1683 +49500 1683 1525 +49500 1740 1853 +49500 1676 1700 +49500 1551 1269 +49500 1630 1438 +49500 1819 1920 +49500 1660 1692 +49500 1656 1682 +49500 1650 1668 +49520 1549 1683 +49520 1563 1425 +49520 1683 1525 +49520 1687 1920 +49520 1740 1853 +49520 1840 1441 +49520 1676 1700 +49520 1551 1269 +49520 1635 1655 +49520 1851 1433 +49520 1619 1703 +49520 1630 1438 +49520 1819 1920 +49520 1660 1692 +49520 1656 1682 +49520 1650 1668 +49540 1537 1840 +49540 1546 1431 +49540 1554 1772 +49540 1676 1700 +49540 1551 1269 +49540 1635 1655 +49540 1702 1920 +49540 1851 1433 +49540 1619 1703 +49540 1625 1523 +49540 1630 1438 +49540 1600 1519 +49540 1754 1787 +49540 1819 1920 +49540 1573 1452 +49540 1660 1692 +49540 1656 1682 +49540 1545 1430 +49540 1625 1519 +49540 1650 1668 +49560 1538 1825 +49560 1551 1269 +49560 1635 1425 +49560 1635 1428 +49560 1635 1655 +49560 1655 1425 +49560 1692 1441 +49560 1702 1920 +49560 1702 1819 +49560 1787 1433 +49560 1851 1433 +49560 1522 1524 +49560 1619 1703 +49560 1625 1523 +49560 1630 1438 +49560 1635 1920 +49560 1687 1920 +49560 1600 1519 +49560 1754 1787 +49560 1819 1920 +49560 1573 1452 +49560 1695 1759 +49560 1660 1692 +49560 1656 1682 +49560 1545 1430 +49560 1625 1519 +49560 1650 1668 +49580 1543 1438 +49580 1600 1625 +49580 1619 1703 +49580 1625 1523 +49580 1630 1438 +49580 1635 1920 +49580 1635 1819 +49580 1659 1853 +49580 1687 1920 +49580 1687 1819 +49580 1687 1702 +49580 1692 1858 +49580 1700 1504 +49580 1727 1434 +49580 1735 1466 +49580 1519 1523 +49580 1568 1825 +49580 1600 1519 +49580 1754 1787 +49580 1819 1920 +49580 1538 1568 +49580 1573 1452 +49580 1449 1512 +49580 1676 1700 +49580 1695 1759 +49580 1613 1526 +49580 1660 1692 +49580 1656 1682 +49580 1545 1430 +49580 1625 1519 +49580 1650 1668 +49600 1568 1825 +49600 1599 1787 +49600 1600 1825 +49600 1600 1519 +49600 1702 1920 +49600 1754 1787 +49600 1819 1920 +49600 1840 1911 +49600 1538 1568 +49600 1573 1452 +49600 1449 1512 +49600 1676 1700 +49600 1695 1759 +49600 1613 1526 +49600 1549 1683 +49600 1660 1692 +49600 1551 1269 +49600 1656 1682 +49600 1545 1430 +49600 1625 1519 +49600 1857 1441 +49600 1650 1668 +49620 1538 1568 +49620 1539 1770 +49620 1547 1716 +49620 1573 1452 +49620 1600 1625 +49620 1635 1825 +49620 1912 1916 +49620 1449 1512 +49620 1459 1516 +49620 1599 1754 +49620 1676 1700 +49620 1695 1759 +49620 1613 1526 +49620 1549 1683 +49620 1605 1636 +49620 1660 1692 +49620 1551 1269 +49620 1655 1523 +49620 1656 1682 +49620 1545 1430 +49620 1625 1519 +49620 1857 1441 +49620 1650 1668 +49640 1539 1466 +49640 1539 1602 +49640 1568 1655 +49640 1586 1639 +49640 1599 1754 +49640 1600 1519 +49640 1602 1466 +49640 1602 1700 +49640 1676 1466 +49640 1676 1700 +49640 1695 1759 +49640 1700 1772 +49640 1735 1427 +49640 1772 1466 +49640 1613 1526 +49640 1819 1920 +49640 1549 1683 +49640 1605 1636 +49640 1660 1692 +49640 1551 1269 +49640 1568 1825 +49640 1655 1523 +49640 1656 1682 +49640 1545 1430 +49640 1625 1519 +49640 1857 1441 +49640 1650 1668 +49660 1539 1749 +49660 1548 1468 +49660 1579 1617 +49660 1613 1526 +49660 1754 1787 +49660 1772 1427 +49660 1819 1920 +49660 1543 1438 +49660 1549 1683 +49660 1605 1636 +49660 1660 1692 +49660 1787 1449 +49660 1551 1269 +49660 1568 1825 +49660 1573 1452 +49660 1655 1523 +49660 1656 1682 +49660 1545 1430 +49660 1625 1519 +49660 1857 1441 +49660 1650 1668 +49680 1538 1568 +49680 1543 1438 +49680 1549 1683 +49680 1605 1636 +49680 1660 1692 +49680 1671 1521 +49680 1727 1434 +49680 1787 1449 +49680 1840 1911 +49680 1551 1269 +49680 1568 1825 +49680 1548 1516 +49680 1573 1452 +49680 1655 1523 +49680 1656 1682 +49680 1545 1430 +49680 1537 1825 +49680 1625 1519 +49680 1857 1441 +49680 1650 1668 +49700 1551 1269 +49700 1568 1825 +49700 1575 1679 +49700 1676 1700 +49700 1700 1770 +49700 1548 1516 +49700 1573 1452 +49700 1655 1523 +49700 1656 1682 +49700 1545 1430 +49700 1676 1770 +49700 1537 1825 +49700 1613 1526 +49700 1625 1519 +49700 1857 1441 +49700 1650 1668 +49720 1543 1438 +49720 1548 1516 +49720 1549 1683 +49720 1573 1452 +49720 1655 1523 +49720 1656 1682 +49720 1660 1692 +49720 1671 1521 +49720 1911 1441 +49720 1545 1430 +49720 1676 1770 +49720 1537 1825 +49720 1613 1526 +49720 1673 1747 +49720 1625 1519 +49720 1857 1441 +49720 1650 1668 +49740 1545 1430 +49740 1549 1525 +49740 1676 1770 +49740 1683 1525 +49740 1700 1452 +49740 1767 1840 +49740 1819 1920 +49740 1470 1530 +49740 1496 1505 +49740 1537 1825 +49740 1538 1568 +49740 1613 1526 +49740 1673 1747 +49740 1625 1519 +49740 1857 1441 +49740 1650 1668 +49760 1537 1825 +49760 1538 1568 +49760 1543 1438 +49760 1549 1683 +49760 1551 1269 +49760 1558 1468 +49760 1613 1526 +49760 1645 1756 +49760 1660 1692 +49760 1673 1747 +49760 1496 1497 +49760 1605 1636 +49760 1625 1519 +49760 1541 1512 +49760 1599 1512 +49760 1676 1700 +49760 1857 1441 +49760 1656 1682 +49760 1650 1668 +49780 1545 1430 +49780 1605 1636 +49780 1625 1519 +49780 1671 1903 +49780 1677 1899 +49780 1677 1701 +49780 1701 1899 +49780 1767 1840 +49780 1541 1512 +49780 1599 1512 +49780 1825 1525 +49780 1496 1505 +49780 1676 1700 +49780 1857 1441 +49780 1656 1682 +49780 1650 1668 +49800 1541 1512 +49800 1548 1516 +49800 1573 1452 +49800 1599 1512 +49800 1655 1523 +49800 1683 1825 +49800 1819 1920 +49800 1825 1525 +49800 1496 1505 +49800 1617 1857 +49800 1617 1441 +49800 1676 1700 +49800 1911 1441 +49800 1459 1516 +49800 1857 1441 +49800 1537 1549 +49800 1537 1525 +49800 1541 1851 +49800 1656 1682 +49800 1549 1683 +49800 1549 1525 +49800 1650 1668 +49820 1537 1619 +49820 1541 1599 +49820 1581 1495 +49820 1606 1516 +49820 1617 1857 +49820 1617 1441 +49820 1676 1700 +49820 1911 1441 +49820 1431 1516 +49820 1459 1516 +49820 1568 1825 +49820 1599 1787 +49820 1857 1441 +49820 1537 1549 +49820 1537 1525 +49820 1545 1430 +49820 1541 1851 +49820 1673 1747 +49820 1660 1692 +49820 1656 1682 +49820 1671 1821 +49820 1549 1683 +49820 1549 1525 +49820 1650 1668 +49840 1538 1568 +49840 1568 1825 +49840 1591 1665 +49840 1599 1787 +49840 1645 1756 +49840 1857 1441 +49840 1496 1505 +49840 1496 1497 +49840 1537 1549 +49840 1537 1525 +49840 1545 1430 +49840 1541 1851 +49840 1593 1684 +49840 1673 1747 +49840 1660 1692 +49840 1551 1269 +49840 1656 1682 +49840 1671 1821 +49840 1549 1683 +49840 1549 1525 +49840 1650 1668 +49860 1537 1549 +49860 1537 1525 +49860 1545 1430 +49860 1548 1431 +49860 1599 1512 +49860 1613 1526 +49860 1667 1692 +49860 1767 1840 +49860 1541 1851 +49860 1593 1684 +49860 1673 1747 +49860 1660 1692 +49860 1676 1700 +49860 1551 1269 +49860 1656 1682 +49860 1671 1821 +49860 1549 1683 +49860 1549 1525 +49860 1650 1668 +49880 1541 1851 +49880 1541 1787 +49880 1547 1605 +49880 1593 1684 +49880 1606 1431 +49880 1673 1747 +49880 1660 1692 +49880 1676 1700 +49880 1857 1911 +49880 1617 1911 +49880 1599 1787 +49880 1551 1269 +49880 1551 1440 +49880 1656 1682 +49880 1671 1821 +49880 1857 1441 +49880 1669 1754 +49880 1549 1683 +49880 1549 1525 +49880 1650 1668 +49900 1537 1683 +49900 1537 1583 +49900 1660 1692 +49900 1676 1700 +49900 1698 1518 +49900 1857 1911 +49900 1496 1497 +49900 1547 1716 +49900 1553 1683 +49900 1568 1825 +49900 1617 1857 +49900 1617 1911 +49900 1599 1787 +49900 1605 1716 +49900 1551 1269 +49900 1551 1440 +49900 1656 1682 +49900 1671 1821 +49900 1857 1441 +49900 1635 1747 +49900 1669 1754 +49900 1549 1683 +49900 1549 1525 +49900 1650 1668 +49920 1537 1525 +49920 1541 1851 +49920 1545 1489 +49920 1547 1716 +49920 1613 1528 +49920 1655 1711 +49920 1553 1683 +49920 1568 1825 +49920 1617 1441 +49920 1617 1857 +49920 1617 1911 +49920 1547 1684 +49920 1599 1787 +49920 1605 1716 +49920 1684 1716 +49920 1551 1269 +49920 1551 1440 +49920 1656 1682 +49920 1671 1821 +49920 1857 1441 +49920 1635 1747 +49920 1669 1754 +49920 1549 1683 +49920 1625 1519 +49920 1549 1525 +49920 1650 1668 +49940 1553 1683 +49940 1568 1825 +49940 1591 1665 +49940 1617 1441 +49940 1697 1711 +49940 1911 1441 +49940 1459 1516 +49940 1496 1497 +49940 1617 1857 +49940 1617 1911 +49940 1655 1697 +49940 1655 1670 +49940 1767 1840 +49940 1547 1684 +49940 1599 1787 +49940 1605 1716 +49940 1684 1716 +49940 1551 1269 +49940 1551 1440 +49940 1656 1682 +49940 1671 1821 +49940 1857 1441 +49940 1635 1747 +49940 1669 1754 +49940 1549 1683 +49940 1625 1519 +49940 1549 1525 +49940 1650 1668 +49960 1538 1568 +49960 1613 1526 +49960 1617 1857 +49960 1617 1911 +49960 1655 1697 +49960 1655 1670 +49960 1673 1695 +49960 1767 1840 +49960 1496 1505 +49960 1541 1851 +49960 1547 1684 +49960 1599 1787 +49960 1605 1716 +49960 1684 1716 +49960 1727 1434 +49960 1551 1269 +49960 1574 1489 +49960 1551 1440 +49960 1655 1711 +49960 1660 1692 +49960 1656 1682 +49960 1670 1711 +49960 1671 1821 +49960 1857 1441 +49960 1635 1747 +49960 1669 1754 +49960 1549 1683 +49960 1625 1519 +49960 1549 1525 +49960 1650 1668 +49980 1538 1524 +49980 1541 1851 +49980 1547 1684 +49980 1559 1761 +49980 1599 1787 +49980 1605 1427 +49980 1605 1716 +49980 1617 1441 +49980 1684 1716 +49980 1688 1460 +49980 1727 1434 +49980 1459 1516 +49980 1504 1528 +49980 1551 1269 +49980 1574 1489 +49980 1551 1440 +49980 1655 1711 +49980 1660 1692 +49980 1676 1700 +49980 1656 1682 +49980 1670 1711 +49980 1671 1821 +49980 1857 1441 +49980 1635 1747 +49980 1669 1754 +49980 1537 1549 +49980 1549 1683 +49980 1625 1519 +49980 1549 1525 +49980 1650 1668 +50000 1551 1269 +50000 1558 1468 +50000 1574 1489 +50000 1613 1526 +50000 1684 1839 +50000 1500 1511 +50000 1605 1636 +50000 1655 1697 +50000 1655 1670 +50000 1551 1440 +50000 1655 1711 +50000 1660 1692 +50000 1676 1700 +50000 1656 1682 +50000 1670 1711 +50000 1671 1821 +50000 1857 1441 +50000 1635 1747 +50000 1669 1754 +50000 1568 1524 +50000 1537 1549 +50000 1549 1683 +50000 1625 1519 +50000 1547 1716 +50000 1549 1525 +50000 1650 1668 +50020 1545 1443 +50020 1545 1430 +50020 1572 1706 +50020 1605 1636 +50020 1606 1516 +50020 1655 1697 +50020 1655 1670 +50020 1538 1524 +50020 1551 1440 +50020 1655 1711 +50020 1660 1692 +50020 1676 1700 +50020 1700 1528 +50020 1727 1434 +50020 1537 1525 +50020 1617 1441 +50020 1656 1682 +50020 1670 1711 +50020 1671 1821 +50020 1857 1441 +50020 1635 1747 +50020 1669 1754 +50020 1568 1524 +50020 1537 1549 +50020 1549 1683 +50020 1625 1519 +50020 1547 1716 +50020 1549 1525 +50020 1650 1668 +50040 1538 1568 +50040 1538 1524 +50040 1548 1468 +50040 1551 1440 +50040 1574 1839 +50040 1591 1665 +50040 1648 1448 +50040 1655 1711 +50040 1660 1692 +50040 1670 1697 +50040 1671 1448 +50040 1676 1700 +50040 1700 1528 +50040 1727 1434 +50040 1431 1516 +50040 1500 1511 +50040 1537 1525 +50040 1545 1604 +50040 1616 1430 +50040 1617 1441 +50040 1656 1682 +50040 1670 1711 +50040 1671 1821 +50040 1857 1441 +50040 1635 1747 +50040 1669 1754 +50040 1568 1524 +50040 1537 1549 +50040 1549 1683 +50040 1625 1519 +50040 1547 1716 +50040 1549 1525 +50040 1650 1668 +50060 1537 1525 +50060 1545 1604 +50060 1550 1531 +50060 1550 1791 +50060 1616 1430 +50060 1617 1441 +50060 1656 1682 +50060 1670 1711 +50060 1671 1821 +50060 1697 1711 +50060 1857 1441 +50060 1458 1531 +50060 1513 1519 +50060 1551 1269 +50060 1605 1636 +50060 1635 1747 +50060 1684 1911 +50060 1767 1840 +50060 1498 1527 +50060 1669 1754 +50060 1695 1527 +50060 1568 1524 +50060 1695 1498 +50060 1537 1549 +50060 1549 1683 +50060 1625 1519 +50060 1547 1716 +50060 1549 1525 +50060 1650 1668 +50080 1538 1524 +50080 1540 1542 +50080 1551 1269 +50080 1587 1688 +50080 1604 1616 +50080 1605 1636 +50080 1613 1526 +50080 1635 1747 +50080 1684 1911 +50080 1767 1840 +50080 1498 1527 +50080 1538 1568 +50080 1669 1754 +50080 1695 1527 +50080 1568 1524 +50080 1695 1498 +50080 1537 1549 +50080 1549 1683 +50080 1625 1519 +50080 1676 1700 +50080 1547 1716 +50080 1617 1857 +50080 1549 1525 +50080 1650 1668 +50100 1537 1525 +50100 1538 1568 +50100 1550 1531 +50100 1639 1710 +50100 1660 1692 +50100 1669 1754 +50100 1695 1527 +50100 1468 1516 +50100 1537 1683 +50100 1568 1524 +50100 1700 1528 +50100 1431 1516 +50100 1695 1498 +50100 1537 1549 +50100 1549 1683 +50100 1625 1519 +50100 1676 1700 +50100 1547 1716 +50100 1656 1682 +50100 1617 1857 +50100 1549 1525 +50100 1650 1668 +50120 1537 1683 +50120 1538 1825 +50120 1541 1555 +50120 1568 1524 +50120 1655 1825 +50120 1655 1523 +50120 1676 1528 +50120 1700 1528 +50120 1702 1448 +50120 1761 1531 +50120 1431 1516 +50120 1541 1533 +50120 1545 1430 +50120 1695 1498 +50120 1537 1549 +50120 1549 1683 +50120 1625 1519 +50120 1676 1700 +50120 1547 1716 +50120 1656 1682 +50120 1617 1857 +50120 1549 1525 +50120 1650 1668 +50140 1538 1911 +50140 1541 1533 +50140 1639 1710 +50140 1752 1766 +50140 1825 1524 +50140 1845 1434 +50140 1545 1430 +50140 1538 1524 +50140 1695 1498 +50140 1660 1692 +50140 1537 1549 +50140 1549 1683 +50140 1625 1519 +50140 1669 1754 +50140 1676 1700 +50140 1547 1716 +50140 1656 1682 +50140 1617 1857 +50140 1549 1525 +50140 1650 1668 +50160 1538 1568 +50160 1545 1771 +50160 1545 1430 +50160 1563 1592 +50160 1568 1524 +50160 1431 1516 +50160 1538 1524 +50160 1695 1498 +50160 1660 1692 +50160 1537 1549 +50160 1549 1683 +50160 1625 1519 +50160 1669 1754 +50160 1676 1700 +50160 1547 1716 +50160 1655 1523 +50160 1656 1682 +50160 1617 1857 +50160 1549 1525 +50160 1650 1668 +50180 1538 1524 +50180 1568 1825 +50180 1583 1523 +50180 1604 1616 +50180 1642 1752 +50180 1642 1766 +50180 1695 1498 +50180 1702 1466 +50180 1727 1845 +50180 1752 1766 +50180 1660 1692 +50180 1605 1636 +50180 1537 1549 +50180 1537 1525 +50180 1549 1683 +50180 1625 1519 +50180 1669 1754 +50180 1676 1700 +50180 1547 1716 +50180 1655 1523 +50180 1840 1489 +50180 1656 1682 +50180 1617 1857 +50180 1549 1525 +50180 1650 1668 +50200 1550 1493 +50200 1595 1469 +50200 1660 1692 +50200 1706 1863 +50200 1269 1440 +50200 1458 1501 +50200 1513 1523 +50200 1551 1440 +50200 1591 1665 +50200 1605 1636 +50200 1537 1549 +50200 1537 1525 +50200 1538 1825 +50200 1549 1683 +50200 1625 1519 +50200 1669 1754 +50200 1676 1700 +50200 1547 1716 +50200 1655 1523 +50200 1840 1489 +50200 1656 1682 +50200 1617 1857 +50200 1549 1525 +50200 1650 1668 +50220 1541 1688 +50220 1541 1581 +50220 1551 1440 +50220 1560 1688 +50220 1591 1504 +50220 1591 1665 +50220 1605 1636 +50220 1619 1911 +50220 1664 1821 +50220 1706 1501 +50220 1537 1549 +50220 1537 1525 +50220 1538 1825 +50220 1549 1683 +50220 1625 1519 +50220 1669 1754 +50220 1676 1700 +50220 1825 1524 +50220 1547 1716 +50220 1583 1523 +50220 1655 1523 +50220 1840 1489 +50220 1656 1682 +50220 1617 1857 +50220 1549 1525 +50220 1650 1668 +50240 1537 1655 +50240 1537 1683 +50240 1537 1549 +50240 1537 1525 +50240 1538 1825 +50240 1549 1683 +50240 1550 1501 +50240 1550 1706 +50240 1550 1863 +50240 1559 1791 +50240 1563 1513 +50240 1579 1773 +50240 1595 1685 +50240 1625 1519 +50240 1669 1754 +50240 1676 1700 +50240 1684 1489 +50240 1695 1498 +50240 1706 1863 +50240 1825 1524 +50240 1834 1903 +50240 1840 1857 +50240 1541 1533 +50240 1547 1716 +50240 1550 1458 +50240 1583 1523 +50240 1599 1512 +50240 1467 1493 +50240 1655 1523 +50240 1752 1766 +50240 1840 1489 +50240 1656 1682 +50240 1617 1857 +50240 1549 1525 +50240 1650 1668 +50260 1541 1533 +50260 1547 1716 +50260 1550 1458 +50260 1583 1523 +50260 1599 1512 +50260 1664 1821 +50260 1676 1528 +50260 1700 1528 +50260 1467 1493 +50260 1655 1523 +50260 1752 1766 +50260 1840 1489 +50260 1656 1682 +50260 1617 1857 +50260 1549 1525 +50260 1650 1668 +50280 1538 1825 +50280 1549 1683 +50280 1563 1574 +50280 1655 1523 +50280 1676 1504 +50280 1702 1466 +50280 1706 1501 +50280 1752 1766 +50280 1840 1489 +50280 1899 1495 +50280 1504 1528 +50280 1595 1654 +50280 1605 1636 +50280 1656 1682 +50280 1706 1458 +50280 1458 1501 +50280 1617 1857 +50280 1700 1504 +50280 1549 1525 +50280 1625 1519 +50280 1650 1668 +50300 1568 1825 +50300 1574 1441 +50300 1585 1766 +50300 1595 1654 +50300 1597 1504 +50300 1605 1636 +50300 1616 1899 +50300 1656 1682 +50300 1664 1821 +50300 1670 1711 +50300 1688 1457 +50300 1706 1458 +50300 1757 1467 +50300 1441 1489 +50300 1458 1501 +50300 1604 1518 +50300 1617 1857 +50300 1700 1504 +50300 1761 1531 +50300 1562 1449 +50300 1547 1716 +50300 1549 1525 +50300 1625 1519 +50300 1650 1668 +50320 1541 1749 +50320 1549 1683 +50320 1593 1521 +50320 1604 1518 +50320 1617 1857 +50320 1700 1504 +50320 1707 1764 +50320 1752 1766 +50320 1761 1531 +50320 1791 1531 +50320 1504 1528 +50320 1562 1449 +50320 1547 1716 +50320 1549 1525 +50320 1857 1441 +50320 1676 1700 +50320 1625 1519 +50320 1574 1617 +50320 1650 1668 +50340 1562 1449 +50340 1597 1676 +50340 1605 1659 +50340 1605 1636 +50340 1706 1458 +50340 1706 1863 +50340 1774 1512 +50340 1840 1441 +50340 1547 1716 +50340 1549 1525 +50340 1568 1825 +50340 1670 1711 +50340 1574 1857 +50340 1617 1441 +50340 1857 1489 +50340 1857 1441 +50340 1656 1682 +50340 1676 1700 +50340 1625 1519 +50340 1574 1441 +50340 1574 1617 +50340 1650 1668 +50360 1541 1555 +50360 1547 1716 +50360 1549 1525 +50360 1568 1825 +50360 1670 1711 +50360 1727 1845 +50360 1752 1766 +50360 1752 1495 +50360 1574 1857 +50360 1574 1489 +50360 1617 1441 +50360 1617 1489 +50360 1655 1512 +50360 1857 1489 +50360 1857 1441 +50360 1863 1501 +50360 1441 1489 +50360 1458 1501 +50360 1845 1434 +50360 1593 1521 +50360 1656 1682 +50360 1676 1700 +50360 1625 1519 +50360 1574 1441 +50360 1574 1617 +50360 1650 1668 +50380 1550 1752 +50380 1560 1495 +50380 1574 1857 +50380 1574 1489 +50380 1605 1636 +50380 1617 1441 +50380 1617 1489 +50380 1655 1512 +50380 1706 1501 +50380 1707 1764 +50380 1857 1489 +50380 1857 1441 +50380 1863 1458 +50380 1863 1501 +50380 1441 1489 +50380 1458 1501 +50380 1669 1754 +50380 1845 1434 +50380 1593 1521 +50380 1656 1682 +50380 1676 1700 +50380 1569 1742 +50380 1625 1519 +50380 1574 1441 +50380 1538 1524 +50380 1549 1683 +50380 1574 1617 +50380 1650 1668 +50400 1669 1754 +50400 1765 1495 +50400 1845 1434 +50400 1593 1521 +50400 1656 1682 +50400 1671 1523 +50400 1676 1700 +50400 1547 1716 +50400 1569 1742 +50400 1625 1519 +50400 1697 1711 +50400 1574 1441 +50400 1549 1525 +50400 1538 1524 +50400 1549 1683 +50400 1574 1617 +50400 1650 1668 +50420 1593 1521 +50420 1605 1636 +50420 1655 1512 +50420 1656 1682 +50420 1670 1711 +50420 1671 1523 +50420 1676 1700 +50420 1707 1764 +50420 1767 1489 +50420 1863 1501 +50420 1443 1467 +50420 1547 1716 +50420 1569 1742 +50420 1625 1519 +50420 1697 1711 +50420 1712 1523 +50420 1458 1501 +50420 1574 1441 +50420 1842 1439 +50420 1549 1525 +50420 1467 1495 +50420 1538 1524 +50420 1549 1683 +50420 1574 1617 +50420 1650 1668 +50440 1547 1716 +50440 1569 1742 +50440 1625 1519 +50440 1697 1711 +50440 1698 1764 +50440 1706 1501 +50440 1712 1523 +50440 1431 1516 +50440 1458 1501 +50440 1551 1440 +50440 1574 1441 +50440 1698 1707 +50440 1761 1531 +50440 1842 1439 +50440 1493 1495 +50440 1459 1512 +50440 1549 1525 +50440 1669 1754 +50440 1676 1504 +50440 1467 1495 +50440 1538 1524 +50440 1549 1683 +50440 1574 1617 +50440 1650 1668 +50460 1551 1440 +50460 1574 1441 +50460 1606 1516 +50460 1617 1441 +50460 1676 1700 +50460 1698 1707 +50460 1707 1764 +50460 1749 1757 +50460 1761 1531 +50460 1769 1845 +50460 1791 1531 +50460 1825 1524 +50460 1842 1439 +50460 1863 1458 +50460 1493 1495 +50460 1670 1711 +50460 1700 1528 +50460 1459 1512 +50460 1543 1700 +50460 1549 1525 +50460 1669 1754 +50460 1676 1504 +50460 1467 1495 +50460 1538 1524 +50460 1549 1683 +50460 1574 1617 +50460 1605 1636 +50460 1650 1668 +50480 1547 1716 +50480 1551 1269 +50480 1566 1453 +50480 1575 1679 +50480 1579 1701 +50480 1617 1489 +50480 1655 1512 +50480 1670 1711 +50480 1676 1528 +50480 1677 1701 +50480 1678 1503 +50480 1697 1711 +50480 1700 1528 +50480 1459 1512 +50480 1543 1504 +50480 1543 1528 +50480 1543 1700 +50480 1549 1525 +50480 1669 1754 +50480 1676 1504 +50480 1467 1495 +50480 1538 1524 +50480 1549 1683 +50480 1625 1519 +50480 1840 1489 +50480 1574 1617 +50480 1605 1636 +50480 1650 1668 +50500 1543 1504 +50500 1543 1528 +50500 1543 1700 +50500 1545 1430 +50500 1549 1525 +50500 1562 1694 +50500 1579 1642 +50500 1593 1521 +50500 1669 1754 +50500 1676 1504 +50500 1676 1700 +50500 1842 1439 +50500 1863 1458 +50500 1458 1501 +50500 1467 1495 +50500 1538 1524 +50500 1549 1683 +50500 1625 1519 +50500 1840 1489 +50500 1574 1617 +50500 1605 1636 +50500 1650 1668 +50520 1569 1742 +50520 1595 1654 +50520 1684 1489 +50520 1761 1531 +50520 1467 1495 +50520 1547 1808 +50520 1825 1524 +50520 1538 1524 +50520 1551 1269 +50520 1656 1682 +50520 1549 1683 +50520 1566 1453 +50520 1625 1519 +50520 1840 1489 +50520 1574 1617 +50520 1605 1636 +50520 1650 1668 +50540 1539 1701 +50540 1547 1808 +50540 1593 1521 +50540 1695 1759 +50540 1825 1524 +50540 1458 1501 +50540 1538 1524 +50540 1551 1269 +50540 1606 1521 +50540 1656 1682 +50540 1549 1683 +50540 1566 1453 +50540 1676 1504 +50540 1625 1519 +50540 1840 1489 +50540 1574 1617 +50540 1605 1636 +50540 1549 1525 +50540 1543 1700 +50540 1650 1668 +50560 1537 1858 +50560 1538 1524 +50560 1541 1521 +50560 1551 1269 +50560 1593 1526 +50560 1606 1521 +50560 1656 1682 +50560 1684 1489 +50560 1431 1516 +50560 1549 1683 +50560 1566 1453 +50560 1652 1747 +50560 1676 1504 +50560 1559 1531 +50560 1625 1519 +50560 1761 1531 +50560 1840 1489 +50560 1695 1443 +50560 1574 1617 +50560 1605 1636 +50560 1549 1525 +50560 1543 1700 +50560 1650 1668 +50580 1549 1683 +50580 1551 1769 +50580 1566 1453 +50580 1625 1683 +50580 1652 1747 +50580 1676 1504 +50580 1676 1700 +50580 1695 1759 +50580 1706 1458 +50580 1458 1501 +50580 1459 1512 +50580 1559 1761 +50580 1559 1531 +50580 1625 1519 +50580 1677 1701 +50580 1761 1791 +50580 1791 1531 +50580 1761 1531 +50580 1840 1489 +50580 1595 1654 +50580 1695 1443 +50580 1574 1617 +50580 1605 1636 +50580 1549 1524 +50580 1549 1525 +50580 1543 1700 +50580 1650 1668 +50600 1538 1825 +50600 1551 1440 +50600 1559 1761 +50600 1559 1531 +50600 1601 1911 +50600 1625 1519 +50600 1677 1701 +50600 1695 1498 +50600 1761 1791 +50600 1791 1531 +50600 1551 1269 +50600 1697 1711 +50600 1656 1682 +50600 1761 1531 +50600 1840 1489 +50600 1595 1654 +50600 1695 1443 +50600 1574 1617 +50600 1605 1636 +50600 1549 1524 +50600 1549 1525 +50600 1543 1700 +50600 1650 1668 +50620 1551 1269 +50620 1573 1452 +50620 1574 1441 +50620 1635 1684 +50620 1684 1840 +50620 1697 1711 +50620 1656 1682 +50620 1761 1531 +50620 1840 1489 +50620 1595 1654 +50620 1695 1443 +50620 1574 1617 +50620 1605 1636 +50620 1549 1524 +50620 1549 1525 +50620 1549 1683 +50620 1543 1700 +50620 1650 1668 +50640 1543 1676 +50640 1569 1742 +50640 1617 1441 +50640 1635 1840 +50640 1635 1489 +50640 1656 1682 +50640 1716 1808 +50640 1761 1531 +50640 1791 1531 +50640 1840 1489 +50640 1595 1654 +50640 1676 1700 +50640 1695 1443 +50640 1574 1617 +50640 1601 1911 +50640 1605 1636 +50640 1549 1524 +50640 1549 1525 +50640 1524 1525 +50640 1549 1683 +50640 1543 1700 +50640 1650 1668 +50660 1541 1555 +50660 1595 1654 +50660 1635 1441 +50660 1676 1504 +50660 1676 1700 +50660 1695 1443 +50660 1759 1443 +50660 1574 1617 +50660 1601 1911 +50660 1605 1636 +50660 1683 1524 +50660 1549 1524 +50660 1568 1825 +50660 1549 1525 +50660 1537 1678 +50660 1524 1525 +50660 1549 1683 +50660 1543 1700 +50660 1650 1668 +50680 1539 1501 +50680 1541 1691 +50680 1549 1681 +50680 1574 1617 +50680 1574 1489 +50680 1601 1911 +50680 1605 1636 +50680 1617 1441 +50680 1683 1524 +50680 1791 1531 +50680 1600 1519 +50680 1551 1269 +50680 1683 1525 +50680 1549 1524 +50680 1676 1528 +50680 1676 1453 +50680 1568 1825 +50680 1572 1501 +50680 1656 1682 +50680 1549 1525 +50680 1537 1678 +50680 1524 1525 +50680 1549 1683 +50680 1543 1453 +50680 1543 1700 +50680 1681 1683 +50680 1650 1668 +50700 1559 1531 +50700 1563 1711 +50700 1600 1625 +50700 1600 1519 +50700 1635 1489 +50700 1911 1467 +50700 1441 1489 +50700 1551 1269 +50700 1669 1754 +50700 1683 1525 +50700 1543 1528 +50700 1543 1676 +50700 1549 1524 +50700 1676 1528 +50700 1676 1453 +50700 1568 1825 +50700 1572 1501 +50700 1706 1761 +50700 1656 1682 +50700 1549 1525 +50700 1537 1678 +50700 1684 1711 +50700 1524 1525 +50700 1549 1683 +50700 1625 1519 +50700 1543 1453 +50700 1700 1453 +50700 1543 1700 +50700 1681 1683 +50700 1650 1668 +50720 1551 1269 +50720 1569 1742 +50720 1669 1754 +50720 1683 1525 +50720 1695 1759 +50720 1767 1489 +50720 1467 1493 +50720 1543 1528 +50720 1543 1676 +50720 1549 1524 +50720 1676 1528 +50720 1676 1453 +50720 1683 1524 +50720 1857 1441 +50720 1550 1443 +50720 1568 1825 +50720 1572 1501 +50720 1706 1761 +50720 1453 1528 +50720 1563 1592 +50720 1656 1682 +50720 1549 1525 +50720 1537 1678 +50720 1684 1711 +50720 1524 1525 +50720 1549 1683 +50720 1625 1519 +50720 1543 1453 +50720 1700 1453 +50720 1543 1700 +50720 1681 1683 +50720 1650 1668 +50740 1543 1528 +50740 1543 1676 +50740 1549 1524 +50740 1591 1665 +50740 1635 1489 +50740 1656 1671 +50740 1671 1682 +50740 1676 1528 +50740 1676 1700 +50740 1676 1453 +50740 1683 1524 +50740 1711 1467 +50740 1857 1441 +50740 1504 1528 +50740 1550 1443 +50740 1568 1825 +50740 1572 1501 +50740 1617 1489 +50740 1697 1711 +50740 1706 1761 +50740 1453 1528 +50740 1563 1592 +50740 1441 1489 +50740 1656 1682 +50740 1549 1525 +50740 1791 1531 +50740 1537 1678 +50740 1684 1711 +50740 1524 1525 +50740 1549 1683 +50740 1625 1519 +50740 1543 1453 +50740 1700 1453 +50740 1543 1700 +50740 1681 1683 +50740 1650 1668 +50760 1550 1443 +50760 1559 1531 +50760 1568 1825 +50760 1572 1501 +50760 1574 1441 +50760 1617 1489 +50760 1683 1525 +50760 1697 1711 +50760 1706 1761 +50760 1453 1528 +50760 1563 1592 +50760 1655 1519 +50760 1441 1489 +50760 1656 1682 +50760 1625 1655 +50760 1549 1525 +50760 1791 1531 +50760 1537 1678 +50760 1684 1711 +50760 1524 1525 +50760 1549 1683 +50760 1625 1519 +50760 1543 1453 +50760 1700 1453 +50760 1543 1700 +50760 1549 1681 +50760 1681 1524 +50760 1681 1683 +50760 1650 1668 +50780 1541 1555 +50780 1548 1516 +50780 1553 1681 +50780 1563 1592 +50780 1600 1655 +50780 1635 1441 +50780 1655 1519 +50780 1669 1754 +50780 1676 1700 +50780 1683 1524 +50780 1441 1489 +50780 1574 1617 +50780 1656 1682 +50780 1676 1528 +50780 1625 1655 +50780 1546 1606 +50780 1549 1525 +50780 1606 1516 +50780 1791 1531 +50780 1537 1678 +50780 1538 1671 +50780 1684 1711 +50780 1524 1525 +50780 1549 1683 +50780 1549 1524 +50780 1625 1519 +50780 1543 1453 +50780 1700 1453 +50780 1543 1700 +50780 1549 1681 +50780 1681 1524 +50780 1681 1683 +50780 1650 1668 +50800 1545 1430 +50800 1551 1269 +50800 1569 1742 +50800 1572 1501 +50800 1574 1617 +50800 1656 1682 +50800 1676 1528 +50800 1676 1453 +50800 1453 1528 +50800 1625 1655 +50800 1681 1525 +50800 1546 1606 +50800 1700 1528 +50800 1548 1606 +50800 1549 1525 +50800 1606 1516 +50800 1791 1531 +50800 1537 1678 +50800 1538 1671 +50800 1684 1711 +50800 1524 1525 +50800 1549 1683 +50800 1549 1524 +50800 1625 1519 +50800 1543 1453 +50800 1700 1453 +50800 1543 1700 +50800 1549 1681 +50800 1681 1524 +50800 1568 1671 +50800 1681 1683 +50800 1650 1668 +50820 1600 1625 +50820 1606 1468 +50820 1617 1441 +50820 1625 1655 +50820 1635 1489 +50820 1669 1754 +50820 1681 1525 +50820 1546 1606 +50820 1574 1489 +50820 1617 1489 +50820 1700 1528 +50820 1548 1606 +50820 1549 1525 +50820 1606 1516 +50820 1791 1531 +50820 1537 1678 +50820 1538 1671 +50820 1441 1489 +50820 1559 1531 +50820 1591 1665 +50820 1684 1711 +50820 1524 1525 +50820 1549 1683 +50820 1549 1524 +50820 1625 1519 +50820 1543 1453 +50820 1700 1453 +50820 1543 1700 +50820 1549 1681 +50820 1681 1524 +50820 1683 1524 +50820 1568 1671 +50820 1681 1683 +50820 1650 1668 +50840 1546 1606 +50840 1572 1501 +50840 1574 1441 +50840 1574 1635 +50840 1574 1489 +50840 1617 1489 +50840 1700 1528 +50840 1453 1528 +50840 1548 1606 +50840 1549 1525 +50840 1566 1761 +50840 1606 1516 +50840 1791 1531 +50840 1537 1678 +50840 1538 1671 +50840 1441 1489 +50840 1559 1531 +50840 1591 1665 +50840 1655 1477 +50840 1656 1682 +50840 1684 1711 +50840 1524 1525 +50840 1549 1683 +50840 1549 1524 +50840 1625 1519 +50840 1543 1453 +50840 1700 1453 +50840 1600 1519 +50840 1543 1700 +50840 1549 1681 +50840 1681 1524 +50840 1683 1524 +50840 1568 1671 +50840 1681 1683 +50840 1650 1668 +50860 1548 1606 +50860 1549 1525 +50860 1566 1761 +50860 1600 1625 +50860 1600 1655 +50860 1606 1516 +50860 1655 1519 +50860 1683 1525 +50860 1791 1531 +50860 1537 1678 +50860 1538 1671 +50860 1569 1742 +50860 1574 1617 +50860 1635 1489 +50860 1441 1489 +50860 1559 1531 +50860 1591 1665 +50860 1655 1477 +50860 1656 1682 +50860 1684 1711 +50860 1524 1525 +50860 1549 1683 +50860 1549 1524 +50860 1625 1519 +50860 1543 1453 +50860 1700 1453 +50860 1605 1636 +50860 1600 1519 +50860 1543 1700 +50860 1549 1681 +50860 1681 1524 +50860 1683 1524 +50860 1568 1671 +50860 1681 1683 +50860 1650 1668 +50880 1537 1678 +50880 1538 1671 +50880 1569 1742 +50880 1574 1617 +50880 1635 1489 +50880 1682 1688 +50880 1749 1757 +50880 1441 1489 +50880 1453 1528 +50880 1559 1531 +50880 1669 1754 +50880 1670 1697 +50880 1825 1477 +50880 1591 1665 +50880 1655 1477 +50880 1656 1682 +50880 1684 1711 +50880 1524 1525 +50880 1549 1683 +50880 1549 1524 +50880 1625 1519 +50880 1543 1453 +50880 1700 1453 +50880 1605 1636 +50880 1600 1519 +50880 1543 1700 +50880 1549 1681 +50880 1681 1524 +50880 1683 1524 +50880 1568 1671 +50880 1681 1683 +50880 1650 1668 +50900 1543 1676 +50900 1559 1531 +50900 1600 1655 +50900 1609 1857 +50900 1617 1489 +50900 1669 1754 +50900 1670 1697 +50900 1670 1711 +50900 1706 1831 +50900 1825 1477 +50900 1874 1517 +50900 1591 1665 +50900 1655 1477 +50900 1656 1682 +50900 1684 1711 +50900 1524 1525 +50900 1549 1683 +50900 1549 1524 +50900 1549 1525 +50900 1625 1519 +50900 1543 1453 +50900 1700 1453 +50900 1605 1636 +50900 1600 1519 +50900 1543 1700 +50900 1549 1681 +50900 1681 1524 +50900 1683 1524 +50900 1568 1671 +50900 1681 1683 +50900 1650 1668 +50920 1538 1671 +50920 1563 1592 +50920 1591 1665 +50920 1655 1477 +50920 1656 1682 +50920 1676 1528 +50920 1700 1528 +50920 1791 1531 +50920 1537 1678 +50920 1676 1453 +50920 1683 1525 +50920 1684 1711 +50920 1524 1525 +50920 1549 1683 +50920 1549 1524 +50920 1549 1525 +50920 1625 1519 +50920 1543 1453 +50920 1700 1453 +50920 1605 1636 +50920 1600 1519 +50920 1566 1761 +50920 1609 1669 +50920 1543 1700 +50920 1574 1617 +50920 1549 1681 +50920 1681 1524 +50920 1683 1524 +50920 1568 1671 +50920 1681 1683 +50920 1650 1668 +50940 1537 1678 +50940 1539 1858 +50940 1583 1477 +50940 1606 1468 +50940 1672 1706 +50940 1676 1453 +50940 1453 1528 +50940 1591 1858 +50940 1683 1525 +50940 1684 1711 +50940 1524 1525 +50940 1543 1676 +50940 1617 1489 +50940 1549 1683 +50940 1549 1524 +50940 1549 1525 +50940 1625 1519 +50940 1543 1453 +50940 1700 1453 +50940 1676 1700 +50940 1605 1636 +50940 1600 1519 +50940 1566 1761 +50940 1609 1669 +50940 1543 1700 +50940 1574 1617 +50940 1549 1681 +50940 1681 1524 +50940 1683 1524 +50940 1568 1671 +50940 1681 1683 +50940 1650 1668 +50960 1574 1441 +50960 1583 1655 +50960 1591 1858 +50960 1683 1525 +50960 1684 1711 +50960 1700 1528 +50960 1524 1525 +50960 1543 1676 +50960 1617 1489 +50960 1671 1825 +50960 1543 1528 +50960 1549 1683 +50960 1549 1524 +50960 1549 1525 +50960 1625 1519 +50960 1655 1477 +50960 1543 1453 +50960 1700 1453 +50960 1676 1700 +50960 1605 1636 +50960 1600 1519 +50960 1566 1761 +50960 1609 1669 +50960 1543 1700 +50960 1538 1671 +50960 1656 1682 +50960 1574 1617 +50960 1549 1681 +50960 1681 1524 +50960 1683 1524 +50960 1568 1671 +50960 1681 1683 +50960 1650 1668 +50980 1543 1676 +50980 1568 1825 +50980 1617 1489 +50980 1635 1489 +50980 1671 1825 +50980 1677 1501 +50980 1687 1702 +50980 1728 1774 +50980 1681 1525 +50980 1682 1688 +50980 1728 1512 +50980 1537 1678 +50980 1543 1528 +50980 1549 1683 +50980 1549 1524 +50980 1549 1525 +50980 1625 1519 +50980 1655 1477 +50980 1543 1453 +50980 1700 1453 +50980 1670 1711 +50980 1676 1528 +50980 1676 1700 +50980 1605 1636 +50980 1600 1519 +50980 1566 1761 +50980 1609 1669 +50980 1543 1700 +50980 1538 1671 +50980 1656 1682 +50980 1574 1617 +50980 1549 1681 +50980 1681 1524 +50980 1683 1524 +50980 1568 1671 +50980 1681 1683 +50980 1650 1668 +51000 1548 1558 +51000 1591 1858 +51000 1600 1625 +51000 1681 1525 +51000 1682 1688 +51000 1684 1489 +51000 1697 1711 +51000 1700 1528 +51000 1728 1512 +51000 1453 1528 +51000 1537 1678 +51000 1543 1528 +51000 1549 1683 +51000 1549 1524 +51000 1549 1525 +51000 1625 1519 +51000 1655 1477 +51000 1543 1453 +51000 1700 1453 +51000 1670 1711 +51000 1676 1528 +51000 1676 1700 +51000 1559 1531 +51000 1605 1636 +51000 1600 1519 +51000 1566 1761 +51000 1601 1911 +51000 1609 1669 +51000 1543 1700 +51000 1791 1531 +51000 1538 1671 +51000 1656 1682 +51000 1574 1617 +51000 1549 1681 +51000 1681 1524 +51000 1683 1524 +51000 1568 1671 +51000 1681 1683 +51000 1650 1668 +51020 1537 1678 +51020 1543 1528 +51020 1549 1683 +51020 1549 1524 +51020 1549 1525 +51020 1625 1519 +51020 1655 1477 +51020 1670 1697 +51020 1728 1774 +51020 1767 1840 +51020 1543 1676 +51020 1543 1453 +51020 1671 1825 +51020 1700 1453 +51020 1524 1525 +51020 1545 1430 +51020 1670 1711 +51020 1676 1528 +51020 1676 1700 +51020 1559 1531 +51020 1574 1441 +51020 1605 1636 +51020 1600 1519 +51020 1566 1761 +51020 1683 1525 +51020 1601 1911 +51020 1609 1669 +51020 1543 1700 +51020 1791 1531 +51020 1538 1671 +51020 1656 1682 +51020 1574 1617 +51020 1549 1681 +51020 1681 1524 +51020 1683 1524 +51020 1568 1671 +51020 1681 1683 +51020 1650 1668 +51040 1543 1504 +51040 1543 1676 +51040 1543 1453 +51040 1574 1489 +51040 1597 1504 +51040 1597 1528 +51040 1635 1489 +51040 1671 1825 +51040 1700 1453 +51040 1524 1525 +51040 1543 1597 +51040 1545 1430 +51040 1563 1592 +51040 1597 1700 +51040 1670 1711 +51040 1676 1528 +51040 1676 1700 +51040 1700 1504 +51040 1453 1528 +51040 1559 1531 +51040 1574 1441 +51040 1605 1636 +51040 1600 1519 +51040 1684 1489 +51040 1566 1761 +51040 1683 1525 +51040 1601 1911 +51040 1609 1669 +51040 1543 1700 +51040 1791 1531 +51040 1538 1671 +51040 1656 1682 +51040 1574 1617 +51040 1549 1681 +51040 1681 1524 +51040 1683 1524 +51040 1568 1671 +51040 1591 1858 +51040 1681 1683 +51040 1650 1668 +51060 1543 1597 +51060 1545 1430 +51060 1551 1665 +51060 1553 1519 +51060 1563 1592 +51060 1597 1700 +51060 1670 1711 +51060 1676 1528 +51060 1676 1700 +51060 1684 1767 +51060 1700 1504 +51060 1431 1516 +51060 1453 1528 +51060 1559 1531 +51060 1574 1441 +51060 1605 1636 +51060 1767 1489 +51060 1600 1519 +51060 1684 1489 +51060 1549 1525 +51060 1566 1761 +51060 1683 1525 +51060 1601 1911 +51060 1609 1669 +51060 1543 1700 +51060 1791 1531 +51060 1538 1671 +51060 1656 1682 +51060 1681 1525 +51060 1574 1617 +51060 1549 1681 +51060 1549 1683 +51060 1681 1524 +51060 1549 1524 +51060 1683 1524 +51060 1568 1671 +51060 1591 1858 +51060 1681 1683 +51060 1650 1668 +51080 1559 1531 +51080 1574 1441 +51080 1579 1501 +51080 1605 1636 +51080 1767 1489 +51080 1524 1525 +51080 1600 1519 +51080 1684 1489 +51080 1700 1453 +51080 1767 1441 +51080 1825 1477 +51080 1549 1525 +51080 1566 1761 +51080 1683 1525 +51080 1601 1911 +51080 1609 1669 +51080 1700 1528 +51080 1543 1700 +51080 1791 1531 +51080 1538 1671 +51080 1656 1682 +51080 1681 1525 +51080 1574 1617 +51080 1549 1681 +51080 1549 1683 +51080 1681 1524 +51080 1549 1524 +51080 1683 1524 +51080 1568 1671 +51080 1591 1858 +51080 1681 1683 +51080 1650 1668 +51100 1543 1453 +51100 1563 1600 +51100 1583 1825 +51100 1600 1519 +51100 1682 1688 +51100 1684 1489 +51100 1684 1441 +51100 1700 1453 +51100 1767 1441 +51100 1825 1477 +51100 1453 1528 +51100 1549 1525 +51100 1562 1449 +51100 1566 1761 +51100 1645 1756 +51100 1676 1700 +51100 1683 1525 +51100 1583 1477 +51100 1601 1911 +51100 1609 1669 +51100 1676 1528 +51100 1700 1528 +51100 1543 1700 +51100 1791 1531 +51100 1538 1671 +51100 1671 1825 +51100 1656 1682 +51100 1681 1525 +51100 1574 1617 +51100 1549 1681 +51100 1549 1683 +51100 1681 1524 +51100 1549 1524 +51100 1683 1524 +51100 1568 1671 +51100 1591 1858 +51100 1681 1683 +51100 1650 1668 +51120 1538 1568 +51120 1549 1525 +51120 1554 1564 +51120 1562 1449 +51120 1566 1761 +51120 1574 1489 +51120 1574 1441 +51120 1617 1489 +51120 1635 1857 +51120 1645 1756 +51120 1676 1700 +51120 1683 1525 +51120 1684 1857 +51120 1441 1489 +51120 1462 1512 +51120 1541 1691 +51120 1543 1676 +51120 1583 1477 +51120 1601 1911 +51120 1609 1669 +51120 1676 1528 +51120 1700 1528 +51120 1857 1441 +51120 1543 1700 +51120 1601 1629 +51120 1524 1525 +51120 1791 1531 +51120 1538 1671 +51120 1671 1825 +51120 1656 1682 +51120 1681 1525 +51120 1574 1617 +51120 1549 1681 +51120 1549 1683 +51120 1681 1524 +51120 1549 1524 +51120 1683 1524 +51120 1568 1671 +51120 1591 1858 +51120 1605 1636 +51120 1681 1683 +51120 1650 1668 +51140 1541 1691 +51140 1543 1676 +51140 1583 1477 +51140 1601 1911 +51140 1609 1669 +51140 1629 1911 +51140 1655 1477 +51140 1676 1528 +51140 1700 1528 +51140 1857 1441 +51140 1857 1489 +51140 1543 1700 +51140 1551 1269 +51140 1601 1629 +51140 1767 1489 +51140 1524 1525 +51140 1791 1531 +51140 1538 1671 +51140 1574 1857 +51140 1671 1825 +51140 1562 1593 +51140 1669 1754 +51140 1656 1682 +51140 1681 1525 +51140 1574 1617 +51140 1549 1681 +51140 1549 1683 +51140 1681 1524 +51140 1549 1524 +51140 1683 1524 +51140 1568 1671 +51140 1591 1858 +51140 1605 1636 +51140 1681 1683 +51140 1650 1668 +51160 1543 1700 +51160 1551 1269 +51160 1559 1531 +51160 1593 1449 +51160 1601 1629 +51160 1609 1911 +51160 1676 1700 +51160 1761 1453 +51160 1767 1489 +51160 1787 1851 +51160 1524 1525 +51160 1538 1568 +51160 1549 1525 +51160 1566 1761 +51160 1684 1489 +51160 1791 1531 +51160 1538 1671 +51160 1574 1857 +51160 1617 1857 +51160 1671 1825 +51160 1562 1593 +51160 1645 1756 +51160 1669 1754 +51160 1683 1525 +51160 1656 1682 +51160 1681 1525 +51160 1574 1617 +51160 1549 1681 +51160 1549 1683 +51160 1681 1524 +51160 1549 1524 +51160 1683 1524 +51160 1568 1671 +51160 1591 1858 +51160 1605 1636 +51160 1681 1683 +51160 1650 1668 +51180 1562 1449 +51180 1767 1840 +51180 1524 1525 +51180 1538 1568 +51180 1541 1691 +51180 1549 1525 +51180 1563 1592 +51180 1566 1761 +51180 1684 1489 +51180 1728 1911 +51180 1791 1531 +51180 1538 1671 +51180 1574 1857 +51180 1617 1857 +51180 1671 1825 +51180 1562 1593 +51180 1600 1519 +51180 1645 1756 +51180 1669 1754 +51180 1683 1525 +51180 1656 1682 +51180 1681 1525 +51180 1574 1617 +51180 1549 1681 +51180 1549 1683 +51180 1681 1524 +51180 1549 1524 +51180 1683 1524 +51180 1568 1671 +51180 1591 1858 +51180 1605 1636 +51180 1681 1683 +51180 1650 1668 +51200 1538 1568 +51200 1541 1691 +51200 1543 1528 +51200 1546 1431 +51200 1549 1525 +51200 1551 1269 +51200 1563 1592 +51200 1566 1761 +51200 1566 1453 +51200 1568 1825 +51200 1676 1700 +51200 1684 1489 +51200 1728 1911 +51200 1761 1453 +51200 1791 1531 +51200 1538 1671 +51200 1574 1857 +51200 1599 1512 +51200 1617 1857 +51200 1657 1769 +51200 1671 1825 +51200 1562 1593 +51200 1600 1519 +51200 1645 1756 +51200 1669 1754 +51200 1683 1525 +51200 1656 1682 +51200 1681 1525 +51200 1574 1617 +51200 1549 1681 +51200 1549 1683 +51200 1681 1524 +51200 1549 1524 +51200 1683 1524 +51200 1568 1671 +51200 1591 1858 +51200 1605 1636 +51200 1681 1683 +51200 1650 1668 +51220 1538 1671 +51220 1574 1857 +51220 1583 1825 +51220 1599 1512 +51220 1617 1857 +51220 1635 1857 +51220 1657 1769 +51220 1671 1825 +51220 1697 1711 +51220 1840 1441 +51220 1840 1857 +51220 1857 1441 +51220 1562 1449 +51220 1562 1593 +51220 1600 1519 +51220 1684 1857 +51220 1767 1489 +51220 1645 1756 +51220 1695 1449 +51220 1669 1754 +51220 1683 1525 +51220 1656 1682 +51220 1681 1525 +51220 1574 1617 +51220 1549 1681 +51220 1549 1683 +51220 1681 1524 +51220 1549 1524 +51220 1683 1524 +51220 1568 1671 +51220 1591 1858 +51220 1605 1636 +51220 1681 1683 +51220 1650 1668 +51240 1541 1691 +51240 1549 1525 +51240 1562 1449 +51240 1562 1593 +51240 1563 1667 +51240 1574 1635 +51240 1574 1441 +51240 1583 1477 +51240 1600 1519 +51240 1617 1441 +51240 1684 1857 +51240 1767 1840 +51240 1767 1489 +51240 1840 1489 +51240 1635 1489 +51240 1645 1756 +51240 1695 1449 +51240 1791 1531 +51240 1507 1522 +51240 1543 1528 +51240 1669 1754 +51240 1683 1525 +51240 1656 1682 +51240 1524 1525 +51240 1681 1525 +51240 1574 1617 +51240 1549 1681 +51240 1549 1683 +51240 1681 1524 +51240 1549 1524 +51240 1683 1524 +51240 1568 1671 +51240 1591 1858 +51240 1605 1636 +51240 1681 1683 +51240 1650 1668 +51260 1563 1592 +51260 1602 1531 +51260 1635 1489 +51260 1645 1756 +51260 1676 1700 +51260 1684 1489 +51260 1695 1449 +51260 1791 1531 +51260 1441 1489 +51260 1507 1522 +51260 1543 1528 +51260 1568 1825 +51260 1669 1754 +51260 1671 1825 +51260 1683 1525 +51260 1656 1682 +51260 1524 1525 +51260 1857 1489 +51260 1655 1477 +51260 1681 1525 +51260 1574 1617 +51260 1549 1681 +51260 1549 1683 +51260 1681 1524 +51260 1549 1524 +51260 1683 1524 +51260 1568 1671 +51260 1591 1858 +51260 1605 1636 +51260 1681 1683 +51260 1650 1668 +51280 1543 1528 +51280 1562 1521 +51280 1566 1761 +51280 1568 1825 +51280 1657 1769 +51280 1669 1754 +51280 1671 1825 +51280 1683 1525 +51280 1684 1767 +51280 1787 1851 +51280 1656 1682 +51280 1524 1525 +51280 1761 1453 +51280 1767 1840 +51280 1857 1489 +51280 1655 1477 +51280 1677 1701 +51280 1681 1525 +51280 1684 1840 +51280 1574 1617 +51280 1549 1681 +51280 1549 1683 +51280 1681 1524 +51280 1538 1671 +51280 1549 1524 +51280 1683 1524 +51280 1568 1671 +51280 1591 1858 +51280 1605 1636 +51280 1681 1683 +51280 1650 1668 +51300 1548 1516 +51300 1635 1441 +51300 1645 1756 +51300 1656 1682 +51300 1700 1528 +51300 1468 1516 +51300 1524 1525 +51300 1563 1592 +51300 1583 1477 +51300 1507 1522 +51300 1761 1453 +51300 1767 1840 +51300 1857 1489 +51300 1566 1453 +51300 1655 1477 +51300 1677 1701 +51300 1681 1525 +51300 1684 1840 +51300 1574 1617 +51300 1549 1681 +51300 1549 1683 +51300 1681 1524 +51300 1538 1671 +51300 1549 1524 +51300 1683 1524 +51300 1568 1671 +51300 1591 1858 +51300 1605 1636 +51300 1681 1683 +51300 1650 1668 +51320 1538 1568 +51320 1549 1525 +51320 1563 1592 +51320 1574 1857 +51320 1583 1477 +51320 1669 1754 +51320 1694 1440 +51320 1507 1522 +51320 1761 1453 +51320 1767 1840 +51320 1857 1489 +51320 1566 1453 +51320 1655 1825 +51320 1655 1477 +51320 1677 1701 +51320 1681 1525 +51320 1684 1767 +51320 1684 1840 +51320 1825 1477 +51320 1574 1617 +51320 1683 1525 +51320 1549 1681 +51320 1549 1683 +51320 1657 1769 +51320 1681 1524 +51320 1538 1671 +51320 1549 1524 +51320 1683 1524 +51320 1568 1671 +51320 1591 1858 +51320 1605 1636 +51320 1681 1683 +51320 1650 1668 +51340 1543 1700 +51340 1545 1430 +51340 1551 1269 +51340 1562 1593 +51340 1676 1700 +51340 1749 1757 +51340 1761 1453 +51340 1767 1840 +51340 1857 1489 +51340 1441 1489 +51340 1566 1453 +51340 1579 1501 +51340 1655 1825 +51340 1655 1477 +51340 1677 1701 +51340 1681 1525 +51340 1684 1767 +51340 1819 1920 +51340 1656 1682 +51340 1684 1840 +51340 1825 1477 +51340 1574 1617 +51340 1683 1525 +51340 1549 1681 +51340 1549 1683 +51340 1657 1769 +51340 1681 1524 +51340 1524 1525 +51340 1538 1671 +51340 1549 1524 +51340 1683 1524 +51340 1568 1671 +51340 1566 1761 +51340 1591 1858 +51340 1605 1636 +51340 1681 1683 +51340 1650 1668 +51360 1558 1516 +51360 1566 1453 +51360 1574 1857 +51360 1579 1501 +51360 1601 1629 +51360 1655 1825 +51360 1655 1477 +51360 1677 1701 +51360 1681 1525 +51360 1684 1767 +51360 1774 1531 +51360 1819 1920 +51360 1656 1682 +51360 1684 1840 +51360 1825 1477 +51360 1574 1617 +51360 1683 1525 +51360 1549 1681 +51360 1549 1683 +51360 1645 1756 +51360 1538 1568 +51360 1657 1769 +51360 1681 1524 +51360 1524 1525 +51360 1538 1671 +51360 1549 1524 +51360 1683 1524 +51360 1568 1671 +51360 1539 1635 +51360 1566 1761 +51360 1591 1858 +51360 1605 1636 +51360 1681 1683 +51360 1650 1668 +51380 1541 1691 +51380 1655 1911 +51380 1656 1682 +51380 1656 1911 +51380 1684 1840 +51380 1825 1477 +51380 1512 1531 +51380 1779 1834 +51380 1563 1592 +51380 1574 1617 +51380 1683 1525 +51380 1840 1489 +51380 1549 1681 +51380 1549 1683 +51380 1645 1756 +51380 1538 1568 +51380 1657 1769 +51380 1681 1524 +51380 1524 1525 +51380 1538 1671 +51380 1549 1524 +51380 1683 1524 +51380 1568 1671 +51380 1539 1635 +51380 1566 1761 +51380 1591 1858 +51380 1605 1636 +51380 1681 1683 +51380 1650 1668 +51400 1587 1535 +51400 1669 1754 +51400 1716 1808 +51400 1779 1834 +51400 1449 1531 +51400 1563 1592 +51400 1574 1617 +51400 1677 1701 +51400 1683 1525 +51400 1761 1453 +51400 1819 1920 +51400 1840 1489 +51400 1549 1681 +51400 1549 1683 +51400 1645 1756 +51400 1538 1568 +51400 1657 1769 +51400 1681 1524 +51400 1857 1489 +51400 1524 1525 +51400 1538 1671 +51400 1549 1524 +51400 1683 1524 +51400 1568 1671 +51400 1539 1635 +51400 1566 1761 +51400 1591 1858 +51400 1681 1525 +51400 1684 1767 +51400 1605 1636 +51400 1681 1683 +51400 1650 1668 +51420 1563 1592 +51420 1566 1453 +51420 1574 1617 +51420 1574 1857 +51420 1677 1701 +51420 1683 1525 +51420 1761 1453 +51420 1819 1920 +51420 1840 1489 +51420 1549 1681 +51420 1549 1683 +51420 1645 1756 +51420 1656 1682 +51420 1825 1477 +51420 1538 1568 +51420 1657 1769 +51420 1681 1524 +51420 1857 1489 +51420 1512 1531 +51420 1524 1525 +51420 1538 1671 +51420 1549 1524 +51420 1600 1519 +51420 1683 1524 +51420 1568 1671 +51420 1539 1635 +51420 1566 1761 +51420 1591 1858 +51420 1681 1525 +51420 1684 1767 +51420 1605 1636 +51420 1681 1683 +51420 1650 1668 +51440 1549 1681 +51440 1549 1683 +51440 1551 1269 +51440 1553 1683 +51440 1617 1857 +51440 1645 1756 +51440 1656 1682 +51440 1697 1711 +51440 1716 1808 +51440 1825 1477 +51440 1538 1568 +51440 1657 1769 +51440 1681 1524 +51440 1857 1489 +51440 1507 1522 +51440 1512 1531 +51440 1524 1525 +51440 1538 1671 +51440 1549 1524 +51440 1600 1519 +51440 1683 1524 +51440 1568 1671 +51440 1539 1635 +51440 1566 1761 +51440 1591 1858 +51440 1681 1525 +51440 1684 1767 +51440 1605 1636 +51440 1681 1683 +51440 1650 1668 +51460 1538 1568 +51460 1556 1791 +51460 1655 1531 +51460 1657 1769 +51460 1681 1524 +51460 1754 1840 +51460 1779 1834 +51460 1857 1489 +51460 1507 1522 +51460 1512 1531 +51460 1524 1525 +51460 1538 1671 +51460 1549 1524 +51460 1600 1519 +51460 1683 1524 +51460 1825 1519 +51460 1441 1489 +51460 1568 1671 +51460 1655 1774 +51460 1539 1635 +51460 1566 1761 +51460 1591 1665 +51460 1574 1617 +51460 1591 1858 +51460 1681 1525 +51460 1684 1767 +51460 1665 1858 +51460 1605 1636 +51460 1681 1683 +51460 1650 1668 +51480 1538 1671 +51480 1548 1516 +51480 1549 1524 +51480 1600 1519 +51480 1601 1629 +51480 1655 1512 +51480 1656 1682 +51480 1671 1524 +51480 1677 1701 +51480 1683 1524 +51480 1683 1525 +51480 1779 1903 +51480 1791 1464 +51480 1825 1519 +51480 1441 1489 +51480 1449 1531 +51480 1538 1524 +51480 1549 1681 +51480 1568 1671 +51480 1655 1774 +51480 1761 1453 +51480 1574 1857 +51480 1539 1635 +51480 1566 1761 +51480 1591 1665 +51480 1645 1756 +51480 1563 1688 +51480 1574 1617 +51480 1591 1858 +51480 1549 1683 +51480 1681 1525 +51480 1684 1767 +51480 1606 1516 +51480 1665 1858 +51480 1605 1636 +51480 1681 1683 +51480 1650 1668 +51500 1538 1524 +51500 1539 1769 +51500 1541 1555 +51500 1549 1681 +51500 1558 1606 +51500 1566 1453 +51500 1568 1671 +51500 1617 1857 +51500 1655 1774 +51500 1684 1840 +51500 1761 1453 +51500 1574 1857 +51500 1655 1531 +51500 1539 1635 +51500 1562 1531 +51500 1566 1761 +51500 1591 1665 +51500 1645 1756 +51500 1563 1688 +51500 1574 1617 +51500 1548 1606 +51500 1591 1858 +51500 1549 1683 +51500 1681 1525 +51500 1684 1767 +51500 1606 1516 +51500 1665 1858 +51500 1605 1636 +51500 1681 1683 +51500 1650 1668 +51520 1574 1857 +51520 1592 1688 +51520 1655 1531 +51520 1676 1700 +51520 1779 1834 +51520 1449 1531 +51520 1539 1635 +51520 1562 1531 +51520 1566 1761 +51520 1591 1665 +51520 1645 1756 +51520 1655 1512 +51520 1563 1688 +51520 1574 1617 +51520 1441 1489 +51520 1548 1606 +51520 1591 1858 +51520 1549 1683 +51520 1681 1525 +51520 1684 1767 +51520 1606 1516 +51520 1665 1858 +51520 1605 1636 +51520 1681 1683 +51520 1650 1668 +51540 1539 1635 +51540 1548 1516 +51540 1549 1681 +51540 1562 1449 +51540 1562 1531 +51540 1566 1761 +51540 1591 1665 +51540 1635 1769 +51540 1645 1756 +51540 1655 1512 +51540 1683 1525 +51540 1754 1851 +51540 1539 1769 +51540 1563 1688 +51540 1574 1617 +51540 1606 1468 +51540 1761 1453 +51540 1819 1920 +51540 1441 1489 +51540 1548 1606 +51540 1591 1858 +51540 1549 1683 +51540 1681 1525 +51540 1563 1592 +51540 1684 1767 +51540 1606 1516 +51540 1665 1858 +51540 1541 1691 +51540 1605 1636 +51540 1681 1683 +51540 1650 1668 +51560 1539 1769 +51560 1551 1269 +51560 1563 1688 +51560 1574 1617 +51560 1574 1857 +51560 1592 1688 +51560 1606 1468 +51560 1761 1453 +51560 1819 1920 +51560 1441 1489 +51560 1548 1606 +51560 1449 1531 +51560 1591 1858 +51560 1549 1683 +51560 1566 1453 +51560 1681 1525 +51560 1563 1592 +51560 1617 1857 +51560 1684 1767 +51560 1606 1516 +51560 1665 1858 +51560 1541 1691 +51560 1605 1636 +51560 1681 1683 +51560 1650 1668 +51580 1545 1430 +51580 1546 1606 +51580 1548 1606 +51580 1551 1858 +51580 1558 1606 +51580 1645 1756 +51580 1672 1706 +51580 1684 1840 +51580 1684 1489 +51580 1449 1531 +51580 1566 1761 +51580 1591 1665 +51580 1591 1858 +51580 1549 1683 +51580 1566 1453 +51580 1681 1525 +51580 1840 1489 +51580 1563 1592 +51580 1617 1857 +51580 1684 1767 +51580 1549 1681 +51580 1606 1516 +51580 1665 1858 +51580 1541 1691 +51580 1605 1636 +51580 1681 1683 +51580 1650 1668 +51600 1566 1761 +51600 1591 1665 +51600 1591 1858 +51600 1697 1711 +51600 1779 1903 +51600 1787 1851 +51600 1441 1489 +51600 1549 1683 +51600 1566 1453 +51600 1681 1525 +51600 1840 1489 +51600 1922 1512 +51600 1507 1522 +51600 1563 1592 +51600 1617 1857 +51600 1684 1767 +51600 1549 1681 +51600 1606 1516 +51600 1665 1858 +51600 1541 1691 +51600 1563 1688 +51600 1605 1636 +51600 1681 1683 +51600 1650 1668 +51620 1538 1562 +51620 1549 1683 +51620 1566 1453 +51620 1645 1756 +51620 1677 1701 +51620 1681 1525 +51620 1716 1808 +51620 1767 1489 +51620 1840 1489 +51620 1922 1512 +51620 1507 1522 +51620 1538 1524 +51620 1563 1592 +51620 1617 1857 +51620 1683 1525 +51620 1684 1840 +51620 1684 1767 +51620 1549 1681 +51620 1606 1516 +51620 1665 1858 +51620 1541 1691 +51620 1563 1688 +51620 1684 1489 +51620 1605 1636 +51620 1681 1683 +51620 1650 1668 +51640 1538 1524 +51640 1558 1606 +51640 1563 1592 +51640 1617 1857 +51640 1683 1525 +51640 1684 1840 +51640 1684 1767 +51640 1761 1453 +51640 1779 1834 +51640 1549 1681 +51640 1606 1516 +51640 1665 1858 +51640 1541 1691 +51640 1563 1688 +51640 1684 1489 +51640 1605 1636 +51640 1681 1683 +51640 1650 1668 +51660 1549 1681 +51660 1579 1501 +51660 1606 1516 +51660 1665 1858 +51660 1819 1477 +51660 1857 1441 +51660 1512 1531 +51660 1541 1691 +51660 1819 1920 +51660 1617 1441 +51660 1681 1525 +51660 1767 1840 +51660 1441 1489 +51660 1563 1688 +51660 1840 1489 +51660 1684 1489 +51660 1767 1489 +51660 1605 1636 +51660 1681 1683 +51660 1650 1668 +51680 1541 1691 +51680 1548 1516 +51680 1684 1767 +51680 1772 1874 +51680 1819 1920 +51680 1507 1522 +51680 1562 1524 +51680 1617 1441 +51680 1645 1756 +51680 1681 1525 +51680 1449 1531 +51680 1592 1688 +51680 1767 1840 +51680 1441 1489 +51680 1563 1688 +51680 1840 1489 +51680 1684 1489 +51680 1767 1489 +51680 1605 1636 +51680 1563 1592 +51680 1681 1683 +51680 1650 1668 +51700 1549 1600 +51700 1562 1524 +51700 1566 1761 +51700 1595 1654 +51700 1617 1441 +51700 1645 1756 +51700 1681 1525 +51700 1683 1525 +51700 1449 1531 +51700 1539 1441 +51700 1592 1688 +51700 1600 1683 +51700 1767 1840 +51700 1441 1489 +51700 1539 1617 +51700 1563 1688 +51700 1840 1489 +51700 1512 1531 +51700 1684 1489 +51700 1767 1489 +51700 1605 1636 +51700 1563 1592 +51700 1681 1683 +51700 1650 1668 +51720 1539 1441 +51720 1592 1688 +51720 1600 1683 +51720 1767 1840 +51720 1834 1903 +51720 1441 1489 +51720 1539 1617 +51720 1563 1688 +51720 1655 1512 +51720 1681 1477 +51720 1840 1489 +51720 1507 1522 +51720 1512 1531 +51720 1549 1683 +51720 1477 1525 +51720 1684 1489 +51720 1767 1489 +51720 1605 1636 +51720 1549 1477 +51720 1683 1477 +51720 1655 1531 +51720 1563 1592 +51720 1677 1701 +51720 1681 1683 +51720 1650 1668 +51740 1539 1617 +51740 1563 1688 +51740 1566 1761 +51740 1655 1512 +51740 1668 1825 +51740 1681 1477 +51740 1681 1525 +51740 1684 1767 +51740 1840 1489 +51740 1507 1522 +51740 1512 1531 +51740 1549 1683 +51740 1645 1756 +51740 1761 1453 +51740 1477 1525 +51740 1617 1441 +51740 1657 1769 +51740 1684 1489 +51740 1767 1489 +51740 1605 1636 +51740 1579 1501 +51740 1683 1525 +51740 1871 1517 +51740 1549 1477 +51740 1683 1477 +51740 1655 1531 +51740 1563 1592 +51740 1677 1701 +51740 1681 1683 +51740 1650 1668 +51760 1539 1441 +51760 1549 1681 +51760 1549 1683 +51760 1568 1863 +51760 1645 1756 +51760 1684 1840 +51760 1688 1879 +51760 1761 1453 +51760 1477 1525 +51760 1617 1441 +51760 1657 1769 +51760 1684 1489 +51760 1767 1489 +51760 1605 1636 +51760 1579 1501 +51760 1683 1525 +51760 1871 1517 +51760 1549 1477 +51760 1683 1477 +51760 1655 1531 +51760 1563 1592 +51760 1677 1701 +51760 1681 1683 +51760 1650 1668 +51780 1671 1740 +51780 1740 1911 +51780 1477 1525 +51780 1617 1441 +51780 1657 1769 +51780 1684 1489 +51780 1767 1489 +51780 1547 1808 +51780 1605 1636 +51780 1579 1501 +51780 1655 1512 +51780 1683 1525 +51780 1871 1517 +51780 1549 1477 +51780 1683 1477 +51780 1655 1531 +51780 1563 1592 +51780 1677 1701 +51780 1681 1525 +51780 1681 1683 +51780 1650 1668 +51800 1563 1635 +51800 1617 1441 +51800 1657 1769 +51800 1684 1489 +51800 1688 1769 +51800 1767 1489 +51800 1547 1808 +51800 1549 1683 +51800 1605 1636 +51800 1617 1489 +51800 1681 1477 +51800 1761 1453 +51800 1787 1449 +51800 1579 1501 +51800 1655 1512 +51800 1683 1525 +51800 1549 1681 +51800 1871 1517 +51800 1549 1477 +51800 1683 1477 +51800 1655 1531 +51800 1563 1592 +51800 1677 1701 +51800 1681 1525 +51800 1681 1683 +51800 1650 1668 +51820 1547 1808 +51820 1549 1683 +51820 1566 1761 +51820 1605 1636 +51820 1609 1678 +51820 1617 1489 +51820 1617 1767 +51820 1681 1477 +51820 1761 1453 +51820 1787 1449 +51820 1920 1517 +51820 1541 1691 +51820 1579 1501 +51820 1645 1756 +51820 1655 1512 +51820 1507 1522 +51820 1683 1525 +51820 1549 1681 +51820 1871 1517 +51820 1512 1531 +51820 1477 1525 +51820 1549 1477 +51820 1683 1477 +51820 1655 1531 +51820 1563 1592 +51820 1677 1701 +51820 1681 1525 +51820 1681 1683 +51820 1650 1668 +51840 1538 1524 +51840 1541 1691 +51840 1579 1501 +51840 1606 1516 +51840 1617 1840 +51840 1645 1756 +51840 1655 1512 +51840 1684 1840 +51840 1507 1522 +51840 1566 1453 +51840 1657 1769 +51840 1671 1740 +51840 1683 1525 +51840 1857 1441 +51840 1767 1489 +51840 1549 1681 +51840 1599 1512 +51840 1871 1517 +51840 1512 1531 +51840 1477 1525 +51840 1549 1477 +51840 1683 1477 +51840 1655 1531 +51840 1563 1592 +51840 1677 1701 +51840 1681 1525 +51840 1599 1655 +51840 1681 1683 +51840 1650 1668 +51860 1549 1525 +51860 1566 1453 +51860 1617 1684 +51860 1635 1671 +51860 1657 1769 +51860 1671 1740 +51860 1683 1525 +51860 1857 1441 +51860 1767 1489 +51860 1549 1681 +51860 1599 1512 +51860 1871 1517 +51860 1512 1531 +51860 1605 1636 +51860 1767 1840 +51860 1840 1489 +51860 1477 1525 +51860 1549 1477 +51860 1683 1477 +51860 1655 1531 +51860 1761 1453 +51860 1549 1683 +51860 1563 1592 +51860 1677 1701 +51860 1681 1525 +51860 1599 1655 +51860 1681 1683 +51860 1650 1668 +51880 1857 1441 +51880 1767 1489 +51880 1549 1681 +51880 1599 1512 +51880 1871 1517 +51880 1512 1531 +51880 1605 1636 +51880 1767 1840 +51880 1840 1489 +51880 1477 1525 +51880 1549 1477 +51880 1681 1477 +51880 1683 1477 +51880 1599 1531 +51880 1655 1531 +51880 1761 1453 +51880 1549 1683 +51880 1563 1592 +51880 1539 1669 +51880 1677 1701 +51880 1681 1525 +51880 1599 1655 +51880 1681 1683 +51880 1650 1668 +51900 1600 1911 +51900 1676 1700 +51900 1728 1911 +51900 1767 1489 +51900 1789 1911 +51900 1549 1681 +51900 1599 1512 +51900 1655 1512 +51900 1671 1703 +51900 1871 1517 +51900 1512 1531 +51900 1605 1636 +51900 1767 1840 +51900 1840 1489 +51900 1477 1525 +51900 1549 1477 +51900 1681 1477 +51900 1683 1477 +51900 1566 1453 +51900 1599 1531 +51900 1655 1531 +51900 1761 1453 +51900 1549 1683 +51900 1563 1592 +51900 1539 1669 +51900 1677 1701 +51900 1681 1525 +51900 1599 1655 +51900 1681 1683 +51900 1650 1668 +51920 1549 1681 +51920 1587 1535 +51920 1599 1512 +51920 1655 1512 +51920 1671 1703 +51920 1716 1771 +51920 1871 1517 +51920 1512 1531 +51920 1605 1636 +51920 1767 1840 +51920 1840 1489 +51920 1477 1525 +51920 1507 1522 +51920 1549 1477 +51920 1681 1477 +51920 1683 1477 +51920 1566 1453 +51920 1599 1531 +51920 1655 1531 +51920 1761 1453 +51920 1549 1683 +51920 1563 1592 +51920 1683 1525 +51920 1539 1669 +51920 1677 1701 +51920 1681 1525 +51920 1599 1655 +51920 1681 1683 +51920 1650 1668 +51940 1547 1716 +51940 1583 1911 +51940 1605 1636 +51940 1657 1769 +51940 1681 1519 +51940 1703 1740 +51940 1767 1840 +51940 1767 1489 +51940 1840 1489 +51940 1857 1441 +51940 1477 1525 +51940 1507 1522 +51940 1519 1525 +51940 1549 1477 +51940 1681 1477 +51940 1683 1477 +51940 1541 1555 +51940 1566 1453 +51940 1599 1531 +51940 1655 1531 +51940 1671 1740 +51940 1761 1453 +51940 1549 1683 +51940 1563 1592 +51940 1683 1525 +51940 1911 1519 +51940 1539 1669 +51940 1677 1701 +51940 1681 1525 +51940 1617 1684 +51940 1599 1655 +51940 1681 1683 +51940 1650 1668 +51960 1549 1477 +51960 1563 1771 +51960 1587 1787 +51960 1681 1477 +51960 1683 1477 +51960 1684 1840 +51960 1851 1535 +51960 1541 1555 +51960 1566 1453 +51960 1599 1531 +51960 1655 1531 +51960 1671 1740 +51960 1754 1851 +51960 1761 1453 +51960 1754 1787 +51960 1549 1683 +51960 1563 1592 +51960 1683 1525 +51960 1911 1519 +51960 1539 1669 +51960 1871 1517 +51960 1677 1701 +51960 1681 1525 +51960 1617 1684 +51960 1599 1655 +51960 1681 1683 +51960 1650 1668 +51980 1541 1555 +51980 1547 1716 +51980 1549 1519 +51980 1566 1453 +51980 1587 1535 +51980 1599 1531 +51980 1601 1629 +51980 1655 1531 +51980 1671 1740 +51980 1703 1740 +51980 1754 1851 +51980 1761 1453 +51980 1825 1477 +51980 1671 1703 +51980 1754 1787 +51980 1787 1535 +51980 1549 1683 +51980 1563 1592 +51980 1655 1512 +51980 1683 1525 +51980 1911 1519 +51980 1539 1669 +51980 1871 1517 +51980 1677 1701 +51980 1681 1525 +51980 1599 1512 +51980 1617 1684 +51980 1599 1655 +51980 1549 1681 +51980 1681 1683 +51980 1650 1668 +52000 1553 1477 +52000 1593 1754 +52000 1671 1703 +52000 1754 1787 +52000 1787 1851 +52000 1787 1535 +52000 1549 1683 +52000 1563 1592 +52000 1655 1512 +52000 1683 1525 +52000 1676 1700 +52000 1911 1519 +52000 1539 1669 +52000 1871 1517 +52000 1677 1701 +52000 1681 1525 +52000 1599 1512 +52000 1617 1684 +52000 1599 1655 +52000 1549 1681 +52000 1681 1683 +52000 1650 1668 +52020 1549 1683 +52020 1563 1592 +52020 1566 1453 +52020 1605 1636 +52020 1655 1512 +52020 1683 1525 +52020 1761 1453 +52020 1789 1519 +52020 1676 1700 +52020 1911 1519 +52020 1539 1669 +52020 1599 1531 +52020 1655 1531 +52020 1803 1477 +52020 1871 1517 +52020 1902 1477 +52020 1677 1701 +52020 1681 1525 +52020 1599 1512 +52020 1617 1684 +52020 1599 1655 +52020 1549 1681 +52020 1681 1683 +52020 1650 1668 +52040 1657 1769 +52040 1676 1700 +52040 1789 1803 +52040 1911 1519 +52040 1539 1669 +52040 1599 1531 +52040 1655 1531 +52040 1803 1477 +52040 1871 1517 +52040 1902 1477 +52040 1677 1701 +52040 1681 1525 +52040 1599 1512 +52040 1617 1684 +52040 1803 1902 +52040 1599 1655 +52040 1549 1681 +52040 1681 1683 +52040 1650 1668 +52060 1539 1669 +52060 1549 1683 +52060 1587 1535 +52060 1599 1531 +52060 1601 1629 +52060 1655 1512 +52060 1655 1531 +52060 1803 1477 +52060 1871 1517 +52060 1902 1477 +52060 1677 1701 +52060 1681 1525 +52060 1787 1535 +52060 1562 1449 +52060 1599 1512 +52060 1617 1684 +52060 1716 1808 +52060 1803 1902 +52060 1767 1840 +52060 1599 1655 +52060 1683 1525 +52060 1549 1681 +52060 1681 1683 +52060 1650 1668 +52080 1541 1691 +52080 1548 1516 +52080 1635 1740 +52080 1657 1769 +52080 1677 1701 +52080 1681 1525 +52080 1684 1840 +52080 1761 1453 +52080 1787 1535 +52080 1911 1477 +52080 1562 1449 +52080 1563 1592 +52080 1599 1512 +52080 1617 1684 +52080 1676 1700 +52080 1716 1808 +52080 1789 1902 +52080 1803 1902 +52080 1522 1524 +52080 1538 1522 +52080 1767 1840 +52080 1579 1501 +52080 1599 1655 +52080 1911 1519 +52080 1683 1525 +52080 1549 1681 +52080 1681 1683 +52080 1650 1668 +52100 1549 1683 +52100 1562 1449 +52100 1563 1592 +52100 1599 1512 +52100 1617 1684 +52100 1676 1700 +52100 1716 1808 +52100 1789 1902 +52100 1803 1902 +52100 1522 1524 +52100 1538 1522 +52100 1767 1840 +52100 1541 1555 +52100 1579 1501 +52100 1599 1655 +52100 1911 1519 +52100 1683 1525 +52100 1549 1681 +52100 1681 1683 +52100 1650 1668 +52120 1538 1522 +52120 1605 1636 +52120 1645 1756 +52120 1683 1789 +52120 1767 1840 +52120 1825 1826 +52120 1825 1911 +52120 1541 1555 +52120 1579 1501 +52120 1600 1789 +52120 1595 1654 +52120 1599 1655 +52120 1826 1477 +52120 1911 1519 +52120 1683 1525 +52120 1549 1681 +52120 1562 1593 +52120 1681 1683 +52120 1650 1668 +52140 1541 1555 +52140 1549 1683 +52140 1579 1501 +52140 1677 1701 +52140 1681 1525 +52140 1761 1453 +52140 1468 1516 +52140 1600 1789 +52140 1595 1654 +52140 1599 1655 +52140 1803 1902 +52140 1826 1477 +52140 1857 1441 +52140 1871 1517 +52140 1625 1728 +52140 1563 1592 +52140 1911 1519 +52140 1683 1525 +52140 1549 1681 +52140 1562 1593 +52140 1681 1683 +52140 1650 1668 +52160 1551 1458 +52160 1600 1789 +52160 1635 1740 +52160 1640 1684 +52160 1676 1700 +52160 1683 1789 +52160 1787 1851 +52160 1789 1902 +52160 1826 1911 +52160 1507 1524 +52160 1538 1524 +52160 1566 1453 +52160 1595 1654 +52160 1599 1655 +52160 1803 1902 +52160 1826 1477 +52160 1857 1441 +52160 1871 1517 +52160 1625 1728 +52160 1563 1592 +52160 1684 1857 +52160 1911 1519 +52160 1683 1525 +52160 1549 1681 +52160 1562 1593 +52160 1681 1683 +52160 1650 1668 +52180 1538 1522 +52180 1538 1524 +52180 1566 1453 +52180 1595 1654 +52180 1599 1655 +52180 1684 1441 +52180 1803 1902 +52180 1826 1477 +52180 1857 1441 +52180 1871 1517 +52180 1549 1683 +52180 1625 1728 +52180 1563 1592 +52180 1640 1441 +52180 1684 1857 +52180 1911 1519 +52180 1683 1525 +52180 1549 1681 +52180 1677 1701 +52180 1522 1524 +52180 1562 1593 +52180 1681 1683 +52180 1650 1668 +52200 1547 1808 +52200 1547 1716 +52200 1549 1683 +52200 1625 1728 +52200 1683 1789 +52200 1716 1808 +52200 1787 1851 +52200 1825 1531 +52200 1507 1524 +52200 1563 1592 +52200 1579 1501 +52200 1657 1769 +52200 1640 1441 +52200 1684 1857 +52200 1911 1519 +52200 1683 1525 +52200 1549 1681 +52200 1677 1701 +52200 1477 1531 +52200 1522 1524 +52200 1600 1683 +52200 1562 1593 +52200 1681 1683 +52200 1650 1668 +52220 1541 1555 +52220 1553 1600 +52220 1562 1920 +52220 1563 1592 +52220 1566 1453 +52220 1579 1501 +52220 1657 1769 +52220 1771 1787 +52220 1803 1902 +52220 1826 1477 +52220 1871 1517 +52220 1902 1531 +52220 1911 1531 +52220 1599 1655 +52220 1600 1525 +52220 1640 1441 +52220 1684 1857 +52220 1911 1519 +52220 1562 1449 +52220 1681 1525 +52220 1683 1525 +52220 1600 1681 +52220 1549 1681 +52220 1677 1701 +52220 1477 1531 +52220 1522 1524 +52220 1600 1683 +52220 1562 1593 +52220 1681 1683 +52220 1650 1668 +52240 1539 1769 +52240 1546 1606 +52240 1547 1716 +52240 1548 1606 +52240 1549 1683 +52240 1551 1458 +52240 1559 1920 +52240 1599 1655 +52240 1600 1525 +52240 1606 1468 +52240 1640 1441 +52240 1645 1756 +52240 1684 1857 +52240 1911 1519 +52240 1562 1449 +52240 1606 1516 +52240 1681 1525 +52240 1683 1525 +52240 1600 1681 +52240 1549 1681 +52240 1677 1701 +52240 1477 1531 +52240 1522 1524 +52240 1600 1683 +52240 1562 1593 +52240 1681 1683 +52240 1650 1668 +52260 1558 1431 +52260 1657 1769 +52260 1684 1441 +52260 1911 1519 +52260 1431 1468 +52260 1562 1449 +52260 1606 1516 +52260 1606 1431 +52260 1681 1525 +52260 1683 1525 +52260 1803 1531 +52260 1857 1441 +52260 1593 1449 +52260 1803 1902 +52260 1549 1525 +52260 1553 1600 +52260 1600 1681 +52260 1771 1787 +52260 1549 1681 +52260 1677 1701 +52260 1477 1531 +52260 1871 1517 +52260 1522 1524 +52260 1600 1683 +52260 1562 1593 +52260 1681 1683 +52260 1650 1668 +52280 1538 1522 +52280 1545 1430 +52280 1546 1606 +52280 1548 1606 +52280 1558 1606 +52280 1562 1449 +52280 1606 1516 +52280 1606 1431 +52280 1606 1468 +52280 1681 1525 +52280 1683 1531 +52280 1683 1525 +52280 1803 1531 +52280 1857 1441 +52280 1902 1477 +52280 1902 1531 +52280 1593 1449 +52280 1803 1902 +52280 1826 1911 +52280 1911 1531 +52280 1600 1525 +52280 1549 1600 +52280 1549 1525 +52280 1553 1600 +52280 1600 1681 +52280 1613 1526 +52280 1771 1787 +52280 1549 1681 +52280 1549 1683 +52280 1677 1701 +52280 1566 1453 +52280 1477 1531 +52280 1871 1517 +52280 1522 1524 +52280 1605 1636 +52280 1600 1683 +52280 1562 1593 +52280 1681 1683 +52280 1650 1668 +52300 1563 1769 +52300 1593 1449 +52300 1771 1851 +52300 1803 1902 +52300 1826 1477 +52300 1826 1911 +52300 1911 1531 +52300 1539 1769 +52300 1600 1525 +52300 1683 1911 +52300 1772 1874 +52300 1549 1600 +52300 1549 1525 +52300 1553 1600 +52300 1600 1681 +52300 1613 1526 +52300 1771 1787 +52300 1549 1681 +52300 1549 1683 +52300 1871 1503 +52300 1677 1701 +52300 1566 1453 +52300 1911 1519 +52300 1477 1531 +52300 1871 1517 +52300 1522 1524 +52300 1605 1636 +52300 1600 1683 +52300 1562 1593 +52300 1681 1683 +52300 1650 1668 +52320 1539 1769 +52320 1541 1691 +52320 1562 1449 +52320 1600 1525 +52320 1645 1756 +52320 1683 1911 +52320 1772 1874 +52320 1468 1516 +52320 1525 1531 +52320 1549 1600 +52320 1549 1525 +52320 1553 1600 +52320 1600 1681 +52320 1613 1526 +52320 1657 1769 +52320 1771 1787 +52320 1549 1681 +52320 1549 1683 +52320 1683 1525 +52320 1871 1503 +52320 1503 1517 +52320 1677 1701 +52320 1566 1453 +52320 1911 1519 +52320 1477 1531 +52320 1871 1517 +52320 1522 1524 +52320 1538 1522 +52320 1605 1636 +52320 1600 1683 +52320 1562 1593 +52320 1681 1525 +52320 1681 1683 +52320 1650 1668 +52340 1549 1600 +52340 1549 1525 +52340 1553 1600 +52340 1600 1681 +52340 1613 1526 +52340 1657 1769 +52340 1716 1808 +52340 1771 1787 +52340 1549 1681 +52340 1549 1683 +52340 1683 1525 +52340 1871 1503 +52340 1503 1517 +52340 1677 1701 +52340 1507 1524 +52340 1566 1453 +52340 1911 1519 +52340 1477 1531 +52340 1871 1517 +52340 1522 1524 +52340 1857 1441 +52340 1538 1522 +52340 1605 1636 +52340 1600 1683 +52340 1562 1593 +52340 1681 1525 +52340 1681 1683 +52340 1650 1668 +52360 1539 1769 +52360 1549 1681 +52360 1549 1683 +52360 1553 1683 +52360 1574 1770 +52360 1683 1525 +52360 1787 1851 +52360 1871 1503 +52360 1879 1531 +52360 1503 1517 +52360 1677 1701 +52360 1507 1524 +52360 1566 1453 +52360 1911 1519 +52360 1477 1531 +52360 1871 1517 +52360 1522 1524 +52360 1857 1441 +52360 1538 1522 +52360 1605 1636 +52360 1600 1683 +52360 1562 1593 +52360 1681 1525 +52360 1681 1683 +52360 1650 1668 +52380 1677 1701 +52380 1789 1902 +52380 1507 1524 +52380 1566 1453 +52380 1911 1519 +52380 1477 1531 +52380 1871 1517 +52380 1522 1524 +52380 1857 1441 +52380 1645 1756 +52380 1538 1522 +52380 1547 1716 +52380 1605 1636 +52380 1600 1683 +52380 1562 1593 +52380 1599 1655 +52380 1681 1525 +52380 1681 1683 +52380 1650 1668 +52400 1600 1525 +52400 1613 1526 +52400 1769 1517 +52400 1787 1851 +52400 1549 1826 +52400 1566 1453 +52400 1911 1519 +52400 1477 1531 +52400 1679 1517 +52400 1679 1871 +52400 1871 1517 +52400 1522 1524 +52400 1857 1441 +52400 1645 1756 +52400 1669 1754 +52400 1538 1522 +52400 1547 1716 +52400 1605 1636 +52400 1600 1681 +52400 1600 1683 +52400 1683 1525 +52400 1562 1593 +52400 1599 1655 +52400 1681 1525 +52400 1681 1683 +52400 1650 1668 +52420 1545 1430 +52420 1547 1808 +52420 1549 1826 +52420 1553 1683 +52420 1562 1701 +52420 1566 1453 +52420 1593 1701 +52420 1761 1803 +52420 1911 1519 +52420 1477 1531 +52420 1507 1524 +52420 1543 1526 +52420 1679 1517 +52420 1679 1871 +52420 1789 1902 +52420 1871 1517 +52420 1522 1524 +52420 1857 1441 +52420 1645 1756 +52420 1669 1754 +52420 1538 1522 +52420 1547 1716 +52420 1605 1636 +52420 1600 1681 +52420 1600 1683 +52420 1683 1525 +52420 1562 1593 +52420 1599 1655 +52420 1681 1525 +52420 1681 1683 +52420 1650 1668 +52440 1543 1526 +52440 1550 1552 +52440 1613 1526 +52440 1617 1441 +52440 1676 1526 +52440 1679 1517 +52440 1679 1871 +52440 1769 1871 +52440 1787 1851 +52440 1789 1902 +52440 1851 1521 +52440 1866 1469 +52440 1871 1517 +52440 1522 1524 +52440 1857 1441 +52440 1597 1526 +52440 1645 1756 +52440 1669 1754 +52440 1538 1522 +52440 1547 1716 +52440 1605 1636 +52440 1600 1681 +52440 1600 1683 +52440 1683 1525 +52440 1562 1593 +52440 1599 1655 +52440 1681 1525 +52440 1681 1683 +52440 1650 1668 +52460 1549 1525 +52460 1563 1517 +52460 1563 1871 +52460 1600 1525 +52460 1825 1477 +52460 1857 1441 +52460 1497 1505 +52460 1550 1531 +52460 1552 1531 +52460 1597 1526 +52460 1645 1756 +52460 1669 1754 +52460 1538 1522 +52460 1538 1524 +52460 1547 1716 +52460 1605 1636 +52460 1600 1681 +52460 1600 1683 +52460 1683 1525 +52460 1562 1593 +52460 1599 1655 +52460 1681 1525 +52460 1681 1683 +52460 1650 1668 +52480 1549 1683 +52480 1550 1531 +52480 1552 1531 +52480 1563 1427 +52480 1597 1526 +52480 1617 1857 +52480 1617 1441 +52480 1635 1517 +52480 1645 1756 +52480 1669 1754 +52480 1761 1803 +52480 1761 1789 +52480 1871 1517 +52480 1549 1681 +52480 1553 1600 +52480 1761 1879 +52480 1789 1902 +52480 1538 1522 +52480 1538 1524 +52480 1547 1716 +52480 1550 1872 +52480 1605 1636 +52480 1769 1826 +52480 1549 1600 +52480 1600 1681 +52480 1600 1683 +52480 1566 1453 +52480 1683 1525 +52480 1562 1593 +52480 1522 1524 +52480 1599 1655 +52480 1681 1525 +52480 1681 1683 +52480 1650 1668 +52500 1549 1681 +52500 1553 1600 +52500 1560 1754 +52500 1740 1517 +52500 1761 1879 +52500 1772 1874 +52500 1789 1902 +52500 1851 1521 +52500 1857 1441 +52500 1431 1516 +52500 1497 1505 +52500 1538 1522 +52500 1538 1524 +52500 1547 1716 +52500 1550 1872 +52500 1605 1636 +52500 1769 1826 +52500 1549 1600 +52500 1600 1681 +52500 1600 1683 +52500 1600 1525 +52500 1566 1453 +52500 1825 1477 +52500 1683 1525 +52500 1562 1593 +52500 1522 1524 +52500 1599 1655 +52500 1681 1525 +52500 1681 1683 +52500 1650 1668 +52520 1538 1522 +52520 1538 1524 +52520 1547 1716 +52520 1550 1872 +52520 1551 1269 +52520 1563 1728 +52520 1579 1501 +52520 1605 1636 +52520 1606 1516 +52520 1617 1857 +52520 1667 1441 +52520 1769 1826 +52520 1549 1600 +52520 1600 1681 +52520 1600 1683 +52520 1600 1525 +52520 1566 1453 +52520 1477 1519 +52520 1740 1761 +52520 1645 1756 +52520 1825 1477 +52520 1683 1525 +52520 1562 1593 +52520 1522 1524 +52520 1599 1655 +52520 1871 1517 +52520 1681 1525 +52520 1681 1683 +52520 1650 1668 +52540 1549 1600 +52540 1600 1681 +52540 1600 1683 +52540 1600 1525 +52540 1626 1467 +52540 1630 1467 +52540 1667 1767 +52540 1431 1516 +52540 1566 1453 +52540 1597 1526 +52540 1716 1808 +52540 1857 1441 +52540 1477 1519 +52540 1504 1526 +52540 1740 1761 +52540 1617 1441 +52540 1789 1902 +52540 1645 1756 +52540 1825 1477 +52540 1683 1525 +52540 1562 1593 +52540 1522 1524 +52540 1599 1655 +52540 1871 1517 +52540 1681 1525 +52540 1681 1683 +52540 1650 1668 +52560 1550 1671 +52560 1552 1740 +52560 1562 1520 +52560 1566 1453 +52560 1597 1526 +52560 1626 1630 +52560 1716 1808 +52560 1857 1441 +52560 1477 1519 +52560 1504 1526 +52560 1507 1522 +52560 1740 1761 +52560 1617 1441 +52560 1617 1857 +52560 1789 1902 +52560 1605 1636 +52560 1645 1756 +52560 1825 1477 +52560 1683 1525 +52560 1562 1593 +52560 1522 1524 +52560 1599 1655 +52560 1871 1517 +52560 1681 1525 +52560 1681 1683 +52560 1650 1668 +52580 1547 1716 +52580 1549 1681 +52580 1560 1769 +52580 1657 1769 +52580 1740 1761 +52580 1803 1902 +52580 1468 1516 +52580 1617 1441 +52580 1617 1857 +52580 1667 1767 +52580 1789 1902 +52580 1605 1636 +52580 1645 1756 +52580 1825 1477 +52580 1683 1525 +52580 1562 1593 +52580 1600 1681 +52580 1522 1524 +52580 1599 1655 +52580 1677 1701 +52580 1871 1517 +52580 1681 1525 +52580 1681 1683 +52580 1650 1668 +52600 1549 1683 +52600 1550 1552 +52600 1562 1685 +52600 1617 1441 +52600 1617 1857 +52600 1667 1767 +52600 1789 1902 +52600 1512 1531 +52600 1626 1761 +52600 1716 1808 +52600 1761 1467 +52600 1605 1636 +52600 1626 1467 +52600 1629 1911 +52600 1645 1756 +52600 1825 1477 +52600 1600 1525 +52600 1683 1525 +52600 1538 1522 +52600 1562 1593 +52600 1600 1681 +52600 1522 1524 +52600 1599 1655 +52600 1677 1701 +52600 1871 1517 +52600 1681 1525 +52600 1681 1683 +52600 1650 1668 +52620 1626 1761 +52620 1635 1517 +52620 1716 1808 +52620 1761 1467 +52620 1566 1453 +52620 1605 1636 +52620 1626 1467 +52620 1629 1911 +52620 1630 1740 +52620 1645 1756 +52620 1825 1477 +52620 1600 1525 +52620 1683 1525 +52620 1579 1501 +52620 1538 1522 +52620 1562 1593 +52620 1600 1681 +52620 1600 1683 +52620 1522 1524 +52620 1599 1655 +52620 1677 1701 +52620 1871 1517 +52620 1681 1525 +52620 1681 1683 +52620 1650 1668 +52640 1543 1700 +52640 1550 1552 +52640 1550 1872 +52640 1563 1699 +52640 1566 1453 +52640 1605 1636 +52640 1626 1467 +52640 1629 1911 +52640 1630 1740 +52640 1645 1756 +52640 1707 1764 +52640 1597 1526 +52640 1630 1761 +52640 1825 1477 +52640 1600 1525 +52640 1683 1525 +52640 1579 1501 +52640 1601 1911 +52640 1538 1522 +52640 1562 1593 +52640 1600 1681 +52640 1600 1683 +52640 1522 1524 +52640 1599 1655 +52640 1677 1701 +52640 1871 1517 +52640 1667 1767 +52640 1681 1525 +52640 1681 1683 +52640 1650 1668 +52660 1562 1685 +52660 1597 1526 +52660 1626 1630 +52660 1630 1761 +52660 1740 1467 +52660 1825 1477 +52660 1600 1525 +52660 1683 1525 +52660 1538 1524 +52660 1579 1501 +52660 1601 1911 +52660 1630 1467 +52660 1538 1522 +52660 1562 1593 +52660 1600 1681 +52660 1600 1683 +52660 1669 1754 +52660 1522 1524 +52660 1825 1469 +52660 1599 1655 +52660 1677 1701 +52660 1871 1517 +52660 1667 1767 +52660 1681 1525 +52660 1681 1683 +52660 1650 1668 +52680 1600 1525 +52680 1683 1525 +52680 1512 1531 +52680 1538 1524 +52680 1579 1501 +52680 1601 1911 +52680 1630 1467 +52680 1538 1522 +52680 1547 1716 +52680 1645 1756 +52680 1707 1764 +52680 1716 1808 +52680 1562 1593 +52680 1600 1681 +52680 1549 1600 +52680 1600 1683 +52680 1669 1754 +52680 1522 1524 +52680 1617 1441 +52680 1626 1467 +52680 1825 1469 +52680 1599 1655 +52680 1677 1701 +52680 1871 1517 +52680 1667 1767 +52680 1681 1525 +52680 1681 1683 +52680 1650 1668 +52700 1538 1524 +52700 1543 1783 +52700 1553 1600 +52700 1566 1453 +52700 1579 1501 +52700 1601 1911 +52700 1630 1467 +52700 1468 1516 +52700 1507 1522 +52700 1538 1522 +52700 1547 1716 +52700 1645 1756 +52700 1707 1764 +52700 1716 1808 +52700 1507 1524 +52700 1562 1593 +52700 1600 1681 +52700 1549 1600 +52700 1600 1683 +52700 1626 1630 +52700 1669 1754 +52700 1522 1524 +52700 1477 1519 +52700 1617 1441 +52700 1626 1467 +52700 1825 1469 +52700 1599 1655 +52700 1677 1701 +52700 1871 1517 +52700 1667 1767 +52700 1681 1525 +52700 1681 1683 +52700 1650 1668 +52720 1538 1522 +52720 1547 1716 +52720 1600 1525 +52720 1645 1756 +52720 1698 1707 +52720 1700 1783 +52720 1707 1764 +52720 1716 1808 +52720 1507 1524 +52720 1512 1531 +52720 1562 1593 +52720 1600 1681 +52720 1683 1525 +52720 1501 1507 +52720 1549 1600 +52720 1600 1683 +52720 1626 1630 +52720 1669 1754 +52720 1522 1524 +52720 1477 1519 +52720 1617 1441 +52720 1626 1467 +52720 1825 1469 +52720 1599 1655 +52720 1677 1701 +52720 1871 1517 +52720 1667 1767 +52720 1681 1525 +52720 1681 1683 +52720 1650 1668 +52740 1562 1593 +52740 1600 1681 +52740 1605 1636 +52740 1683 1525 +52740 1501 1507 +52740 1538 1524 +52740 1549 1600 +52740 1600 1683 +52740 1626 1630 +52740 1648 1819 +52740 1669 1754 +52740 1501 1522 +52740 1501 1524 +52740 1522 1524 +52740 1477 1519 +52740 1617 1441 +52740 1626 1467 +52740 1541 1691 +52740 1825 1469 +52740 1599 1655 +52740 1677 1701 +52740 1871 1517 +52740 1630 1467 +52740 1667 1767 +52740 1681 1525 +52740 1681 1683 +52740 1650 1668 +52760 1538 1524 +52760 1549 1600 +52760 1600 1683 +52760 1626 1630 +52760 1648 1819 +52760 1669 1754 +52760 1803 1902 +52760 1501 1522 +52760 1501 1524 +52760 1507 1522 +52760 1522 1524 +52760 1538 1522 +52760 1477 1519 +52760 1549 1681 +52760 1562 1579 +52760 1562 1574 +52760 1617 1441 +52760 1574 1579 +52760 1626 1467 +52760 1541 1691 +52760 1825 1469 +52760 1599 1655 +52760 1677 1701 +52760 1871 1517 +52760 1630 1467 +52760 1667 1767 +52760 1449 1477 +52760 1681 1525 +52760 1681 1683 +52760 1650 1668 +52780 1538 1522 +52780 1538 1501 +52780 1547 1716 +52780 1553 1600 +52780 1707 1764 +52780 1789 1902 +52780 1477 1519 +52780 1549 1681 +52780 1562 1579 +52780 1562 1574 +52780 1617 1441 +52780 1507 1524 +52780 1574 1579 +52780 1626 1467 +52780 1541 1691 +52780 1566 1453 +52780 1825 1469 +52780 1599 1655 +52780 1677 1701 +52780 1501 1507 +52780 1549 1683 +52780 1871 1517 +52780 1630 1467 +52780 1667 1767 +52780 1683 1525 +52780 1645 1756 +52780 1449 1477 +52780 1681 1525 +52780 1681 1683 +52780 1650 1668 +52800 1549 1681 +52800 1550 1552 +52800 1562 1579 +52800 1562 1574 +52800 1617 1441 +52800 1783 1526 +52800 1501 1522 +52800 1507 1524 +52800 1574 1579 +52800 1626 1467 +52800 1541 1691 +52800 1566 1453 +52800 1550 1872 +52800 1825 1469 +52800 1599 1655 +52800 1677 1701 +52800 1501 1507 +52800 1549 1683 +52800 1600 1681 +52800 1871 1517 +52800 1630 1467 +52800 1667 1767 +52800 1683 1525 +52800 1600 1683 +52800 1645 1756 +52800 1449 1477 +52800 1681 1525 +52800 1681 1683 +52800 1650 1668 +52820 1553 1600 +52820 1574 1579 +52820 1574 1453 +52820 1657 1769 +52820 1698 1707 +52820 1825 1477 +52820 1921 1531 +52820 1512 1531 +52820 1538 1524 +52820 1626 1467 +52820 1630 1707 +52820 1698 1467 +52820 1707 1467 +52820 1921 1512 +52820 1522 1524 +52820 1541 1691 +52820 1547 1716 +52820 1566 1453 +52820 1538 1522 +52820 1669 1754 +52820 1550 1872 +52820 1789 1902 +52820 1825 1469 +52820 1599 1655 +52820 1677 1701 +52820 1501 1507 +52820 1549 1600 +52820 1549 1683 +52820 1562 1453 +52820 1562 1566 +52820 1600 1681 +52820 1871 1517 +52820 1630 1467 +52820 1667 1767 +52820 1683 1525 +52820 1600 1683 +52820 1645 1756 +52820 1449 1477 +52820 1681 1525 +52820 1681 1683 +52820 1650 1668 +52840 1538 1524 +52840 1553 1683 +52840 1597 1526 +52840 1626 1467 +52840 1626 1707 +52840 1630 1707 +52840 1698 1467 +52840 1707 1467 +52840 1921 1512 +52840 1468 1516 +52840 1522 1524 +52840 1541 1691 +52840 1547 1716 +52840 1549 1681 +52840 1566 1453 +52840 1600 1525 +52840 1617 1441 +52840 1538 1522 +52840 1669 1754 +52840 1550 1872 +52840 1789 1803 +52840 1789 1902 +52840 1825 1469 +52840 1599 1655 +52840 1677 1701 +52840 1501 1507 +52840 1549 1600 +52840 1549 1683 +52840 1562 1453 +52840 1562 1566 +52840 1600 1681 +52840 1871 1517 +52840 1477 1519 +52840 1630 1467 +52840 1449 1519 +52840 1667 1767 +52840 1683 1525 +52840 1600 1683 +52840 1645 1756 +52840 1449 1477 +52840 1681 1525 +52840 1681 1683 +52840 1650 1668 +52860 1541 1691 +52860 1547 1716 +52860 1549 1681 +52860 1566 1453 +52860 1574 1465 +52860 1600 1525 +52860 1617 1441 +52860 1699 1826 +52860 1707 1764 +52860 1716 1808 +52860 1787 1521 +52860 1825 1449 +52860 1921 1531 +52860 1462 1531 +52860 1501 1522 +52860 1501 1524 +52860 1538 1522 +52860 1669 1754 +52860 1825 1477 +52860 1550 1872 +52860 1789 1803 +52860 1789 1902 +52860 1825 1469 +52860 1599 1655 +52860 1677 1701 +52860 1501 1507 +52860 1549 1600 +52860 1549 1683 +52860 1562 1453 +52860 1562 1566 +52860 1600 1681 +52860 1626 1630 +52860 1871 1517 +52860 1477 1519 +52860 1630 1467 +52860 1449 1519 +52860 1667 1767 +52860 1683 1525 +52860 1600 1683 +52860 1645 1756 +52860 1449 1477 +52860 1681 1525 +52860 1681 1683 +52860 1650 1668 +52880 1538 1522 +52880 1550 1552 +52880 1669 1754 +52880 1825 1477 +52880 1826 1871 +52880 1857 1441 +52880 1441 1467 +52880 1550 1872 +52880 1789 1803 +52880 1789 1902 +52880 1825 1469 +52880 1599 1655 +52880 1677 1701 +52880 1468 1516 +52880 1501 1507 +52880 1549 1600 +52880 1549 1683 +52880 1562 1453 +52880 1562 1566 +52880 1600 1681 +52880 1626 1630 +52880 1871 1517 +52880 1477 1519 +52880 1630 1467 +52880 1449 1519 +52880 1667 1767 +52880 1683 1525 +52880 1600 1683 +52880 1645 1756 +52880 1449 1477 +52880 1681 1525 +52880 1681 1683 +52880 1650 1668 +52900 1538 1501 +52900 1545 1430 +52900 1550 1872 +52900 1630 1857 +52900 1698 1764 +52900 1787 1521 +52900 1789 1803 +52900 1789 1902 +52900 1803 1902 +52900 1825 1469 +52900 1847 1921 +52900 1921 1462 +52900 1922 1517 +52900 1566 1453 +52900 1599 1655 +52900 1677 1701 +52900 1698 1707 +52900 1819 1911 +52900 1826 1517 +52900 1468 1516 +52900 1501 1507 +52900 1549 1600 +52900 1549 1683 +52900 1562 1453 +52900 1562 1566 +52900 1600 1681 +52900 1600 1525 +52900 1626 1630 +52900 1871 1517 +52900 1477 1519 +52900 1549 1681 +52900 1630 1467 +52900 1449 1519 +52900 1667 1767 +52900 1683 1525 +52900 1600 1683 +52900 1645 1756 +52900 1449 1477 +52900 1681 1525 +52900 1681 1683 +52900 1650 1668 +52920 1541 1691 +52920 1545 1428 +52920 1546 1516 +52920 1566 1453 +52920 1599 1655 +52920 1677 1701 +52920 1698 1707 +52920 1819 1911 +52920 1826 1517 +52920 1826 1871 +52920 1468 1516 +52920 1501 1507 +52920 1507 1524 +52920 1549 1600 +52920 1549 1683 +52920 1562 1453 +52920 1562 1566 +52920 1600 1681 +52920 1600 1525 +52920 1626 1630 +52920 1501 1524 +52920 1871 1517 +52920 1477 1519 +52920 1512 1531 +52920 1549 1681 +52920 1630 1467 +52920 1449 1519 +52920 1617 1857 +52920 1667 1767 +52920 1683 1525 +52920 1600 1683 +52920 1645 1756 +52920 1669 1754 +52920 1449 1477 +52920 1681 1525 +52920 1681 1683 +52920 1650 1668 +52940 1545 1430 +52940 1549 1600 +52940 1549 1683 +52940 1562 1453 +52940 1562 1566 +52940 1563 1605 +52940 1566 1579 +52940 1575 1679 +52940 1600 1681 +52940 1600 1525 +52940 1626 1630 +52940 1825 1477 +52940 1501 1522 +52940 1501 1524 +52940 1522 1524 +52940 1789 1803 +52940 1871 1517 +52940 1477 1519 +52940 1512 1531 +52940 1549 1681 +52940 1630 1467 +52940 1449 1519 +52940 1617 1857 +52940 1667 1767 +52940 1683 1525 +52940 1803 1902 +52940 1600 1683 +52940 1825 1469 +52940 1538 1522 +52940 1645 1756 +52940 1669 1754 +52940 1449 1477 +52940 1681 1525 +52940 1681 1683 +52940 1650 1668 +52960 1605 1636 +52960 1687 1702 +52960 1789 1803 +52960 1819 1920 +52960 1871 1517 +52960 1921 1462 +52960 1431 1516 +52960 1468 1516 +52960 1477 1519 +52960 1507 1524 +52960 1512 1531 +52960 1549 1681 +52960 1630 1467 +52960 1449 1519 +52960 1541 1691 +52960 1617 1857 +52960 1667 1767 +52960 1683 1525 +52960 1789 1902 +52960 1803 1902 +52960 1600 1683 +52960 1825 1469 +52960 1538 1522 +52960 1671 1684 +52960 1645 1756 +52960 1669 1754 +52960 1449 1477 +52960 1599 1655 +52960 1681 1525 +52960 1681 1683 +52960 1650 1668 +52980 1549 1681 +52980 1562 1566 +52980 1605 1462 +52980 1626 1467 +52980 1626 1630 +52980 1630 1467 +52980 1688 1477 +52980 1698 1707 +52980 1707 1764 +52980 1740 1839 +52980 1764 1771 +52980 1819 1911 +52980 1922 1517 +52980 1449 1519 +52980 1449 1469 +52980 1469 1519 +52980 1501 1507 +52980 1541 1691 +52980 1549 1683 +52980 1553 1600 +52980 1716 1808 +52980 1617 1857 +52980 1667 1767 +52980 1683 1525 +52980 1789 1902 +52980 1803 1902 +52980 1522 1524 +52980 1549 1600 +52980 1600 1681 +52980 1600 1683 +52980 1825 1469 +52980 1538 1522 +52980 1671 1684 +52980 1645 1756 +52980 1669 1754 +52980 1449 1477 +52980 1599 1655 +52980 1681 1525 +52980 1681 1683 +52980 1650 1668 +53000 1541 1691 +53000 1545 1579 +53000 1549 1683 +53000 1553 1600 +53000 1575 1679 +53000 1595 1654 +53000 1678 1731 +53000 1687 1702 +53000 1698 1764 +53000 1716 1808 +53000 1871 1517 +53000 1431 1516 +53000 1545 1430 +53000 1550 1826 +53000 1562 1430 +53000 1617 1857 +53000 1667 1767 +53000 1683 1525 +53000 1688 1769 +53000 1767 1840 +53000 1789 1803 +53000 1789 1902 +53000 1803 1902 +53000 1522 1524 +53000 1549 1600 +53000 1577 1655 +53000 1600 1681 +53000 1600 1683 +53000 1825 1469 +53000 1538 1522 +53000 1563 1688 +53000 1671 1684 +53000 1577 1599 +53000 1645 1756 +53000 1669 1754 +53000 1449 1477 +53000 1599 1655 +53000 1681 1525 +53000 1681 1683 +53000 1650 1668 +53020 1541 1555 +53020 1545 1430 +53020 1550 1826 +53020 1555 1691 +53020 1562 1430 +53020 1563 1769 +53020 1617 1857 +53020 1667 1840 +53020 1667 1767 +53020 1679 1921 +53020 1683 1525 +53020 1688 1769 +53020 1767 1840 +53020 1778 1466 +53020 1789 1803 +53020 1789 1902 +53020 1803 1902 +53020 1507 1524 +53020 1512 1531 +53020 1522 1524 +53020 1549 1600 +53020 1562 1566 +53020 1577 1655 +53020 1600 1525 +53020 1549 1681 +53020 1600 1681 +53020 1600 1683 +53020 1825 1469 +53020 1538 1522 +53020 1563 1688 +53020 1671 1684 +53020 1577 1599 +53020 1630 1467 +53020 1677 1701 +53020 1501 1507 +53020 1645 1756 +53020 1669 1754 +53020 1921 1462 +53020 1698 1707 +53020 1449 1477 +53020 1599 1655 +53020 1681 1525 +53020 1681 1683 +53020 1650 1668 +53040 1549 1600 +53040 1549 1683 +53040 1553 1600 +53040 1562 1566 +53040 1577 1655 +53040 1600 1525 +53040 1707 1764 +53040 1477 1519 +53040 1538 1524 +53040 1549 1681 +53040 1600 1681 +53040 1600 1683 +53040 1606 1516 +53040 1767 1441 +53040 1825 1469 +53040 1840 1441 +53040 1538 1522 +53040 1563 1688 +53040 1657 1688 +53040 1671 1684 +53040 1577 1599 +53040 1630 1467 +53040 1677 1701 +53040 1871 1517 +53040 1501 1507 +53040 1645 1756 +53040 1669 1754 +53040 1921 1462 +53040 1698 1707 +53040 1563 1657 +53040 1449 1477 +53040 1599 1655 +53040 1681 1525 +53040 1681 1683 +53040 1650 1668 +53060 1538 1524 +53060 1546 1606 +53060 1549 1681 +53060 1600 1681 +53060 1600 1683 +53060 1606 1516 +53060 1606 1431 +53060 1626 1630 +53060 1667 1771 +53060 1667 1677 +53060 1684 1701 +53060 1767 1840 +53060 1767 1441 +53060 1803 1902 +53060 1825 1469 +53060 1826 1853 +53060 1840 1441 +53060 1507 1524 +53060 1512 1531 +53060 1538 1522 +53060 1563 1688 +53060 1657 1688 +53060 1671 1684 +53060 1688 1769 +53060 1699 1707 +53060 1707 1517 +53060 1716 1808 +53060 1771 1462 +53060 1496 1505 +53060 1577 1599 +53060 1630 1467 +53060 1677 1701 +53060 1871 1517 +53060 1501 1507 +53060 1645 1756 +53060 1669 1754 +53060 1501 1522 +53060 1921 1462 +53060 1522 1524 +53060 1698 1707 +53060 1563 1657 +53060 1449 1477 +53060 1599 1655 +53060 1681 1525 +53060 1683 1525 +53060 1681 1683 +53060 1650 1668 +53080 1538 1522 +53080 1538 1501 +53080 1563 1688 +53080 1563 1769 +53080 1563 1803 +53080 1657 1688 +53080 1671 1684 +53080 1687 1702 +53080 1688 1769 +53080 1688 1803 +53080 1688 1902 +53080 1698 1699 +53080 1699 1707 +53080 1699 1764 +53080 1707 1517 +53080 1707 1871 +53080 1716 1808 +53080 1771 1462 +53080 1789 1826 +53080 1431 1516 +53080 1496 1505 +53080 1541 1691 +53080 1577 1599 +53080 1617 1441 +53080 1630 1467 +53080 1677 1701 +53080 1702 1842 +53080 1871 1517 +53080 1501 1507 +53080 1617 1857 +53080 1645 1756 +53080 1669 1754 +53080 1501 1522 +53080 1921 1462 +53080 1477 1519 +53080 1522 1524 +53080 1577 1655 +53080 1698 1707 +53080 1501 1524 +53080 1563 1657 +53080 1449 1477 +53080 1599 1655 +53080 1681 1525 +53080 1683 1525 +53080 1681 1683 +53080 1650 1668 +53100 1539 1789 +53100 1541 1691 +53100 1546 1606 +53100 1546 1558 +53100 1550 1552 +53100 1550 1761 +53100 1577 1599 +53100 1617 1441 +53100 1626 1467 +53100 1626 1630 +53100 1630 1467 +53100 1677 1701 +53100 1688 1707 +53100 1699 1517 +53100 1699 1871 +53100 1702 1842 +53100 1707 1761 +53100 1707 1803 +53100 1761 1764 +53100 1761 1517 +53100 1761 1871 +53100 1764 1517 +53100 1764 1871 +53100 1803 1902 +53100 1825 1477 +53100 1857 1441 +53100 1871 1517 +53100 1501 1507 +53100 1507 1524 +53100 1617 1857 +53100 1645 1756 +53100 1669 1754 +53100 1501 1522 +53100 1553 1683 +53100 1921 1462 +53100 1477 1519 +53100 1522 1524 +53100 1577 1655 +53100 1684 1701 +53100 1698 1707 +53100 1698 1764 +53100 1819 1920 +53100 1677 1684 +53100 1501 1524 +53100 1563 1657 +53100 1449 1477 +53100 1599 1655 +53100 1671 1767 +53100 1825 1469 +53100 1681 1525 +53100 1683 1525 +53100 1681 1683 +53100 1650 1668 +53120 1563 1592 +53120 1568 1694 +53120 1600 1683 +53120 1617 1857 +53120 1645 1756 +53120 1669 1754 +53120 1688 1771 +53120 1698 1769 +53120 1707 1769 +53120 1707 1789 +53120 1756 1505 +53120 1772 1874 +53120 1789 1803 +53120 1501 1522 +53120 1553 1683 +53120 1921 1462 +53120 1449 1519 +53120 1477 1519 +53120 1522 1524 +53120 1577 1655 +53120 1684 1701 +53120 1716 1808 +53120 1698 1707 +53120 1698 1764 +53120 1819 1920 +53120 1677 1684 +53120 1501 1524 +53120 1563 1657 +53120 1449 1477 +53120 1599 1655 +53120 1671 1767 +53120 1707 1764 +53120 1825 1469 +53120 1681 1525 +53120 1683 1525 +53120 1681 1683 +53120 1650 1668 +53140 1538 1593 +53140 1553 1683 +53140 1702 1466 +53140 1761 1853 +53140 1871 1517 +53140 1921 1462 +53140 1449 1519 +53140 1477 1519 +53140 1522 1524 +53140 1577 1655 +53140 1630 1467 +53140 1677 1701 +53140 1684 1701 +53140 1716 1808 +53140 1541 1691 +53140 1698 1707 +53140 1698 1764 +53140 1819 1920 +53140 1677 1684 +53140 1501 1524 +53140 1563 1657 +53140 1449 1477 +53140 1599 1655 +53140 1671 1767 +53140 1563 1769 +53140 1707 1764 +53140 1825 1469 +53140 1681 1525 +53140 1683 1525 +53140 1681 1683 +53140 1650 1668 +53160 1546 1558 +53160 1546 1606 +53160 1577 1655 +53160 1606 1431 +53160 1625 1659 +53160 1626 1630 +53160 1630 1467 +53160 1635 1458 +53160 1657 1769 +53160 1677 1701 +53160 1684 1701 +53160 1688 1694 +53160 1699 1771 +53160 1716 1808 +53160 1771 1789 +53160 1541 1691 +53160 1669 1754 +53160 1698 1707 +53160 1698 1764 +53160 1667 1857 +53160 1716 1457 +53160 1819 1920 +53160 1617 1667 +53160 1677 1684 +53160 1699 1902 +53160 1501 1524 +53160 1563 1657 +53160 1449 1477 +53160 1599 1655 +53160 1501 1522 +53160 1671 1767 +53160 1563 1769 +53160 1707 1764 +53160 1825 1469 +53160 1681 1525 +53160 1683 1525 +53160 1681 1683 +53160 1650 1668 +53180 1541 1691 +53180 1669 1754 +53180 1698 1707 +53180 1698 1764 +53180 1699 1803 +53180 1550 1872 +53180 1604 1649 +53180 1667 1857 +53180 1676 1700 +53180 1716 1457 +53180 1819 1920 +53180 1617 1667 +53180 1754 1789 +53180 1921 1462 +53180 1677 1684 +53180 1699 1902 +53180 1501 1524 +53180 1563 1657 +53180 1449 1477 +53180 1599 1655 +53180 1501 1522 +53180 1840 1453 +53180 1671 1767 +53180 1563 1769 +53180 1707 1764 +53180 1825 1469 +53180 1681 1525 +53180 1683 1525 +53180 1681 1683 +53180 1650 1668 +53200 1550 1872 +53200 1604 1649 +53200 1625 1659 +53200 1667 1857 +53200 1676 1700 +53200 1677 1701 +53200 1716 1457 +53200 1803 1902 +53200 1819 1920 +53200 1439 1526 +53200 1577 1655 +53200 1617 1667 +53200 1716 1808 +53200 1754 1789 +53200 1921 1462 +53200 1496 1505 +53200 1677 1684 +53200 1699 1902 +53200 1501 1524 +53200 1563 1657 +53200 1449 1477 +53200 1599 1655 +53200 1501 1522 +53200 1840 1453 +53200 1671 1767 +53200 1563 1769 +53200 1707 1764 +53200 1825 1469 +53200 1681 1525 +53200 1683 1525 +53200 1681 1683 +53200 1650 1668 +53220 1541 1606 +53220 1545 1604 +53220 1545 1430 +53220 1577 1655 +53220 1617 1667 +53220 1707 1871 +53220 1716 1808 +53220 1754 1789 +53220 1772 1874 +53220 1825 1477 +53220 1921 1462 +53220 1449 1519 +53220 1468 1516 +53220 1477 1519 +53220 1496 1505 +53220 1541 1642 +53220 1630 1467 +53220 1677 1684 +53220 1699 1902 +53220 1501 1524 +53220 1563 1657 +53220 1449 1477 +53220 1599 1655 +53220 1501 1522 +53220 1840 1453 +53220 1671 1767 +53220 1563 1769 +53220 1707 1764 +53220 1825 1469 +53220 1681 1525 +53220 1683 1525 +53220 1681 1683 +53220 1650 1668 +53240 1541 1642 +53240 1630 1467 +53240 1669 1754 +53240 1677 1684 +53240 1677 1701 +53240 1699 1902 +53240 1700 1526 +53240 1716 1440 +53240 1771 1853 +53240 1501 1524 +53240 1545 1616 +53240 1545 1649 +53240 1563 1657 +53240 1626 1630 +53240 1684 1701 +53240 1449 1477 +53240 1522 1524 +53240 1604 1430 +53240 1874 1466 +53240 1599 1655 +53240 1501 1522 +53240 1840 1453 +53240 1671 1767 +53240 1563 1769 +53240 1707 1764 +53240 1825 1469 +53240 1681 1525 +53240 1683 1525 +53240 1681 1683 +53240 1650 1668 +53260 1541 1431 +53260 1545 1616 +53260 1545 1649 +53260 1555 1691 +53260 1558 1606 +53260 1562 1593 +53260 1563 1657 +53260 1606 1468 +53260 1626 1630 +53260 1684 1701 +53260 1871 1517 +53260 1449 1477 +53260 1477 1519 +53260 1522 1524 +53260 1604 1430 +53260 1871 1458 +53260 1874 1466 +53260 1921 1462 +53260 1546 1606 +53260 1599 1655 +53260 1754 1789 +53260 1501 1522 +53260 1840 1453 +53260 1671 1767 +53260 1563 1769 +53260 1707 1764 +53260 1698 1707 +53260 1825 1469 +53260 1681 1525 +53260 1683 1525 +53260 1681 1683 +53260 1650 1668 +53280 1550 1872 +53280 1602 1702 +53280 1604 1430 +53280 1613 1633 +53280 1619 1700 +53280 1691 1765 +53280 1700 1528 +53280 1765 1874 +53280 1771 1853 +53280 1871 1458 +53280 1874 1466 +53280 1921 1462 +53280 1545 1604 +53280 1546 1606 +53280 1577 1655 +53280 1599 1655 +53280 1671 1701 +53280 1699 1803 +53280 1699 1902 +53280 1840 1477 +53280 1754 1789 +53280 1501 1522 +53280 1840 1453 +53280 1671 1767 +53280 1563 1769 +53280 1698 1764 +53280 1716 1808 +53280 1707 1764 +53280 1698 1707 +53280 1825 1469 +53280 1681 1525 +53280 1683 1525 +53280 1681 1683 +53280 1650 1668 +53300 1545 1604 +53300 1546 1606 +53300 1577 1655 +53300 1577 1599 +53300 1592 1458 +53300 1599 1655 +53300 1606 1431 +53300 1671 1701 +53300 1676 1700 +53300 1677 1701 +53300 1699 1803 +53300 1699 1902 +53300 1772 1874 +53300 1840 1477 +53300 1617 1677 +53300 1634 1504 +53300 1754 1789 +53300 1501 1522 +53300 1819 1920 +53300 1840 1453 +53300 1671 1767 +53300 1563 1657 +53300 1563 1769 +53300 1698 1764 +53300 1716 1808 +53300 1707 1764 +53300 1698 1707 +53300 1825 1469 +53300 1681 1525 +53300 1683 1525 +53300 1681 1683 +53300 1650 1668 +53320 1546 1431 +53320 1617 1677 +53320 1617 1510 +53320 1634 1504 +53320 1667 1477 +53320 1671 1441 +53320 1754 1789 +53320 1771 1853 +53320 1501 1522 +53320 1522 1524 +53320 1574 1466 +53320 1819 1920 +53320 1501 1524 +53320 1840 1453 +53320 1671 1767 +53320 1563 1657 +53320 1563 1769 +53320 1698 1764 +53320 1716 1808 +53320 1707 1764 +53320 1698 1707 +53320 1825 1469 +53320 1681 1525 +53320 1683 1525 +53320 1617 1701 +53320 1681 1683 +53320 1650 1668 +53340 1574 1466 +53340 1700 1770 +53340 1819 1920 +53340 1501 1524 +53340 1840 1453 +53340 1600 1683 +53340 1667 1519 +53340 1671 1767 +53340 1560 1699 +53340 1677 1701 +53340 1441 1510 +53340 1541 1555 +53340 1669 1754 +53340 1563 1657 +53340 1563 1769 +53340 1772 1874 +53340 1698 1764 +53340 1716 1808 +53340 1707 1764 +53340 1698 1707 +53340 1699 1803 +53340 1825 1469 +53340 1681 1525 +53340 1683 1525 +53340 1617 1701 +53340 1681 1683 +53340 1650 1668 +53360 1546 1431 +53360 1592 1458 +53360 1599 1655 +53360 1600 1681 +53360 1600 1667 +53360 1634 1866 +53360 1691 1501 +53360 1840 1453 +53360 1851 1521 +53360 1871 1517 +53360 1600 1683 +53360 1667 1449 +53360 1667 1519 +53360 1671 1767 +53360 1560 1699 +53360 1657 1769 +53360 1677 1701 +53360 1699 1902 +53360 1441 1510 +53360 1541 1555 +53360 1669 1754 +53360 1803 1902 +53360 1921 1462 +53360 1563 1657 +53360 1563 1769 +53360 1772 1874 +53360 1698 1764 +53360 1716 1808 +53360 1449 1519 +53360 1707 1764 +53360 1698 1707 +53360 1699 1803 +53360 1825 1469 +53360 1681 1525 +53360 1683 1525 +53360 1617 1701 +53360 1681 1683 +53360 1650 1668 +53380 1546 1558 +53380 1558 1516 +53380 1600 1683 +53380 1634 1438 +53380 1667 1449 +53380 1667 1477 +53380 1667 1519 +53380 1671 1767 +53380 1468 1516 +53380 1477 1519 +53380 1501 1504 +53380 1560 1699 +53380 1657 1769 +53380 1677 1701 +53380 1699 1902 +53380 1819 1920 +53380 1441 1510 +53380 1501 1524 +53380 1541 1555 +53380 1669 1754 +53380 1803 1902 +53380 1921 1462 +53380 1563 1657 +53380 1563 1769 +53380 1772 1874 +53380 1698 1764 +53380 1716 1808 +53380 1449 1519 +53380 1707 1764 +53380 1698 1707 +53380 1699 1803 +53380 1825 1469 +53380 1681 1525 +53380 1683 1525 +53380 1617 1701 +53380 1681 1683 +53380 1650 1668 +53400 1560 1699 +53400 1562 1593 +53400 1657 1769 +53400 1661 1853 +53400 1667 1921 +53400 1671 1684 +53400 1677 1857 +53400 1677 1701 +53400 1688 1531 +53400 1699 1902 +53400 1819 1920 +53400 1441 1510 +53400 1457 1458 +53400 1501 1524 +53400 1541 1555 +53400 1617 1857 +53400 1669 1754 +53400 1699 1458 +53400 1767 1441 +53400 1803 1902 +53400 1921 1462 +53400 1563 1657 +53400 1563 1769 +53400 1772 1874 +53400 1698 1764 +53400 1716 1808 +53400 1449 1519 +53400 1707 1764 +53400 1698 1707 +53400 1699 1803 +53400 1825 1469 +53400 1840 1453 +53400 1681 1525 +53400 1683 1525 +53400 1599 1655 +53400 1477 1480 +53400 1617 1701 +53400 1681 1683 +53400 1650 1668 +53420 1541 1555 +53420 1617 1857 +53420 1669 1754 +53420 1699 1458 +53420 1701 1857 +53420 1767 1441 +53420 1803 1902 +53420 1866 1501 +53420 1921 1462 +53420 1541 1691 +53420 1563 1657 +53420 1563 1769 +53420 1772 1874 +53420 1698 1764 +53420 1716 1808 +53420 1449 1519 +53420 1707 1764 +53420 1698 1707 +53420 1699 1803 +53420 1825 1469 +53420 1840 1453 +53420 1681 1525 +53420 1683 1525 +53420 1599 1655 +53420 1477 1480 +53420 1617 1701 +53420 1681 1683 +53420 1650 1668 +53440 1541 1691 +53440 1546 1516 +53440 1563 1657 +53440 1563 1769 +53440 1577 1655 +53440 1772 1874 +53440 1441 1510 +53440 1538 1501 +53440 1550 1872 +53440 1603 1700 +53440 1603 1613 +53440 1698 1764 +53440 1716 1808 +53440 1767 1857 +53440 1857 1441 +53440 1449 1519 +53440 1546 1606 +53440 1613 1700 +53440 1707 1764 +53440 1894 1480 +53440 1698 1707 +53440 1699 1803 +53440 1825 1469 +53440 1840 1453 +53440 1681 1525 +53440 1683 1525 +53440 1599 1655 +53440 1894 1477 +53440 1477 1480 +53440 1617 1701 +53440 1681 1683 +53440 1650 1668 +53460 1538 1501 +53460 1550 1872 +53460 1563 1592 +53460 1573 1452 +53460 1603 1700 +53460 1603 1613 +53460 1606 1431 +53460 1613 1688 +53460 1617 1677 +53460 1677 1701 +53460 1698 1764 +53460 1716 1808 +53460 1767 1857 +53460 1803 1902 +53460 1857 1441 +53460 1449 1519 +53460 1501 1507 +53460 1501 1524 +53460 1546 1606 +53460 1595 1654 +53460 1613 1700 +53460 1688 1700 +53460 1707 1764 +53460 1767 1441 +53460 1894 1480 +53460 1538 1522 +53460 1541 1555 +53460 1553 1683 +53460 1698 1707 +53460 1546 1431 +53460 1671 1857 +53460 1699 1803 +53460 1825 1469 +53460 1840 1453 +53460 1566 1531 +53460 1681 1525 +53460 1683 1525 +53460 1501 1522 +53460 1599 1655 +53460 1894 1477 +53460 1477 1480 +53460 1617 1701 +53460 1681 1683 +53460 1650 1668 +53480 1543 1452 +53480 1546 1558 +53480 1546 1606 +53480 1595 1654 +53480 1603 1779 +53480 1613 1700 +53480 1623 1458 +53480 1642 1531 +53480 1677 1441 +53480 1688 1700 +53480 1707 1764 +53480 1767 1441 +53480 1894 1480 +53480 1431 1516 +53480 1538 1522 +53480 1538 1524 +53480 1541 1555 +53480 1553 1683 +53480 1603 1452 +53480 1698 1707 +53480 1871 1517 +53480 1522 1524 +53480 1546 1431 +53480 1671 1857 +53480 1699 1803 +53480 1699 1902 +53480 1825 1469 +53480 1840 1453 +53480 1566 1531 +53480 1681 1525 +53480 1683 1525 +53480 1669 1754 +53480 1501 1522 +53480 1507 1524 +53480 1599 1655 +53480 1894 1477 +53480 1477 1480 +53480 1617 1701 +53480 1681 1683 +53480 1650 1668 +53500 1538 1522 +53500 1538 1524 +53500 1541 1555 +53500 1541 1691 +53500 1553 1683 +53500 1563 1922 +53500 1574 1783 +53500 1603 1452 +53500 1698 1707 +53500 1699 1789 +53500 1787 1851 +53500 1840 1477 +53500 1871 1517 +53500 1449 1519 +53500 1501 1507 +53500 1501 1524 +53500 1522 1524 +53500 1543 1526 +53500 1546 1431 +53500 1671 1441 +53500 1671 1857 +53500 1699 1803 +53500 1699 1902 +53500 1803 1902 +53500 1825 1469 +53500 1840 1453 +53500 1857 1441 +53500 1566 1531 +53500 1603 1526 +53500 1681 1525 +53500 1683 1525 +53500 1669 1754 +53500 1501 1522 +53500 1507 1524 +53500 1599 1655 +53500 1894 1477 +53500 1477 1480 +53500 1617 1701 +53500 1543 1603 +53500 1677 1767 +53500 1681 1683 +53500 1650 1668 +53520 1543 1526 +53520 1546 1431 +53520 1577 1655 +53520 1657 1769 +53520 1671 1441 +53520 1671 1857 +53520 1699 1803 +53520 1699 1902 +53520 1803 1902 +53520 1825 1469 +53520 1831 1871 +53520 1840 1453 +53520 1857 1441 +53520 1566 1531 +53520 1603 1526 +53520 1625 1863 +53520 1681 1525 +53520 1683 1525 +53520 1698 1764 +53520 1547 1716 +53520 1669 1754 +53520 1501 1522 +53520 1507 1524 +53520 1599 1655 +53520 1894 1480 +53520 1894 1477 +53520 1477 1480 +53520 1626 1630 +53520 1617 1701 +53520 1543 1603 +53520 1677 1767 +53520 1707 1764 +53520 1681 1683 +53520 1650 1668 +53540 1541 1555 +53540 1566 1531 +53540 1603 1526 +53540 1623 1840 +53540 1625 1863 +53540 1681 1525 +53540 1683 1525 +53540 1698 1764 +53540 1732 1512 +53540 1805 1831 +53540 1921 1462 +53540 1501 1524 +53540 1547 1716 +53540 1669 1754 +53540 1698 1707 +53540 1501 1522 +53540 1565 1684 +53540 1507 1524 +53540 1599 1655 +53540 1894 1480 +53540 1894 1477 +53540 1477 1480 +53540 1538 1522 +53540 1626 1630 +53540 1617 1701 +53540 1543 1603 +53540 1871 1517 +53540 1677 1767 +53540 1707 1764 +53540 1681 1683 +53540 1650 1668 +53560 1538 1501 +53560 1541 1691 +53560 1546 1431 +53560 1547 1716 +53560 1669 1754 +53560 1698 1707 +53560 1699 1902 +53560 1840 1448 +53560 1431 1516 +53560 1448 1477 +53560 1501 1522 +53560 1538 1524 +53560 1565 1684 +53560 1623 1650 +53560 1699 1789 +53560 1825 1469 +53560 1857 1441 +53560 1522 1524 +53560 1552 1453 +53560 1507 1524 +53560 1599 1655 +53560 1699 1803 +53560 1894 1480 +53560 1894 1477 +53560 1477 1480 +53560 1538 1522 +53560 1626 1630 +53560 1617 1701 +53560 1543 1603 +53560 1871 1517 +53560 1677 1767 +53560 1707 1764 +53560 1681 1683 +53560 1650 1668 +53580 1538 1524 +53580 1565 1684 +53580 1623 1650 +53580 1657 1769 +53580 1687 1702 +53580 1698 1764 +53580 1699 1789 +53580 1825 1469 +53580 1857 1441 +53580 1522 1524 +53580 1552 1453 +53580 1573 1452 +53580 1507 1524 +53580 1599 1655 +53580 1630 1467 +53580 1699 1803 +53580 1894 1480 +53580 1894 1477 +53580 1477 1480 +53580 1538 1522 +53580 1590 1517 +53580 1626 1630 +53580 1617 1701 +53580 1921 1462 +53580 1543 1603 +53580 1871 1517 +53580 1677 1767 +53580 1707 1764 +53580 1681 1683 +53580 1650 1668 +53600 1539 1448 +53600 1552 1453 +53600 1563 1448 +53600 1573 1452 +53600 1573 1765 +53600 1630 1427 +53600 1669 1754 +53600 1699 1902 +53600 1765 1452 +53600 1501 1522 +53600 1507 1524 +53600 1541 1691 +53600 1547 1808 +53600 1599 1655 +53600 1625 1863 +53600 1630 1467 +53600 1699 1803 +53600 1894 1480 +53600 1894 1477 +53600 1477 1480 +53600 1538 1522 +53600 1590 1517 +53600 1590 1871 +53600 1626 1630 +53600 1449 1519 +53600 1617 1701 +53600 1836 1512 +53600 1831 1453 +53600 1921 1462 +53600 1543 1603 +53600 1871 1517 +53600 1698 1707 +53600 1677 1767 +53600 1707 1764 +53600 1681 1683 +53600 1650 1668 +53620 1541 1691 +53620 1547 1808 +53620 1547 1770 +53620 1599 1655 +53620 1625 1863 +53620 1630 1467 +53620 1657 1769 +53620 1699 1803 +53620 1699 1789 +53620 1840 1480 +53620 1894 1480 +53620 1894 1477 +53620 1477 1480 +53620 1522 1524 +53620 1538 1522 +53620 1590 1517 +53620 1590 1871 +53620 1626 1630 +53620 1449 1519 +53620 1546 1516 +53620 1546 1431 +53620 1617 1701 +53620 1836 1512 +53620 1831 1453 +53620 1921 1462 +53620 1543 1603 +53620 1698 1764 +53620 1871 1517 +53620 1698 1707 +53620 1677 1767 +53620 1707 1764 +53620 1681 1683 +53620 1650 1668 +53640 1538 1522 +53640 1553 1683 +53640 1585 1752 +53640 1590 1517 +53640 1590 1871 +53640 1603 1528 +53640 1626 1630 +53640 1699 1902 +53640 1765 1533 +53640 1770 1438 +53640 1772 1874 +53640 1449 1519 +53640 1507 1524 +53640 1546 1516 +53640 1546 1431 +53640 1566 1531 +53640 1617 1701 +53640 1752 1766 +53640 1789 1803 +53640 1836 1512 +53640 1501 1524 +53640 1831 1453 +53640 1921 1462 +53640 1543 1603 +53640 1789 1902 +53640 1698 1764 +53640 1871 1517 +53640 1698 1707 +53640 1677 1767 +53640 1707 1764 +53640 1681 1683 +53640 1650 1668 +53660 1538 1524 +53660 1546 1516 +53660 1546 1431 +53660 1552 1453 +53660 1558 1431 +53660 1563 1922 +53660 1566 1531 +53660 1617 1701 +53660 1642 1480 +53660 1657 1769 +53660 1752 1766 +53660 1789 1803 +53660 1836 1512 +53660 1857 1480 +53660 1501 1524 +53660 1626 1427 +53660 1831 1453 +53660 1921 1462 +53660 1431 1516 +53660 1543 1603 +53660 1789 1902 +53660 1477 1517 +53660 1698 1764 +53660 1871 1517 +53660 1698 1707 +53660 1501 1522 +53660 1547 1770 +53660 1677 1767 +53660 1707 1764 +53660 1681 1683 +53660 1650 1668 +53680 1563 1894 +53680 1603 1526 +53680 1626 1427 +53680 1684 1448 +53680 1699 1803 +53680 1831 1453 +53680 1921 1462 +53680 1431 1516 +53680 1543 1528 +53680 1543 1603 +53680 1699 1789 +53680 1789 1902 +53680 1477 1517 +53680 1507 1524 +53680 1595 1654 +53680 1698 1764 +53680 1854 1477 +53680 1871 1517 +53680 1698 1707 +53680 1501 1522 +53680 1547 1770 +53680 1677 1767 +53680 1707 1764 +53680 1681 1683 +53680 1650 1668 +53700 1538 1524 +53700 1543 1528 +53700 1543 1603 +53700 1543 1526 +53700 1558 1516 +53700 1560 1667 +53700 1699 1789 +53700 1699 1902 +53700 1789 1803 +53700 1789 1902 +53700 1803 1902 +53700 1825 1469 +53700 1854 1517 +53700 1477 1517 +53700 1501 1507 +53700 1507 1524 +53700 1595 1654 +53700 1698 1764 +53700 1566 1603 +53700 1854 1477 +53700 1871 1517 +53700 1698 1707 +53700 1501 1522 +53700 1522 1524 +53700 1538 1522 +53700 1599 1655 +53700 1617 1701 +53700 1906 1477 +53700 1547 1770 +53700 1677 1767 +53700 1707 1764 +53700 1681 1683 +53700 1650 1668 +53720 1541 1691 +53720 1563 1679 +53720 1577 1655 +53720 1595 1654 +53720 1623 1519 +53720 1698 1764 +53720 1854 1906 +53720 1921 1462 +53720 1427 1453 +53720 1566 1603 +53720 1854 1477 +53720 1871 1517 +53720 1625 1863 +53720 1698 1707 +53720 1431 1516 +53720 1501 1522 +53720 1522 1524 +53720 1538 1522 +53720 1543 1783 +53720 1599 1655 +53720 1617 1701 +53720 1906 1477 +53720 1547 1770 +53720 1677 1767 +53720 1707 1764 +53720 1681 1683 +53720 1650 1668 +53740 1538 1501 +53740 1548 1516 +53740 1566 1603 +53740 1606 1516 +53740 1630 1467 +53740 1667 1857 +53740 1789 1803 +53740 1854 1477 +53740 1871 1517 +53740 1448 1458 +53740 1501 1507 +53740 1616 1518 +53740 1625 1863 +53740 1698 1707 +53740 1857 1441 +53740 1431 1516 +53740 1501 1522 +53740 1522 1524 +53740 1538 1522 +53740 1543 1783 +53740 1599 1655 +53740 1617 1701 +53740 1676 1770 +53740 1906 1477 +53740 1547 1770 +53740 1563 1592 +53740 1477 1517 +53740 1677 1767 +53740 1707 1764 +53740 1657 1769 +53740 1681 1683 +53740 1650 1668 +53760 1541 1691 +53760 1546 1516 +53760 1552 1453 +53760 1616 1518 +53760 1625 1863 +53760 1698 1707 +53760 1772 1874 +53760 1789 1902 +53760 1857 1441 +53760 1431 1516 +53760 1453 1493 +53760 1501 1522 +53760 1522 1524 +53760 1538 1522 +53760 1543 1783 +53760 1547 1676 +53760 1599 1655 +53760 1617 1701 +53760 1676 1770 +53760 1698 1764 +53760 1770 1808 +53760 1906 1477 +53760 1921 1462 +53760 1543 1504 +53760 1547 1770 +53760 1678 1900 +53760 1563 1592 +53760 1477 1517 +53760 1677 1767 +53760 1538 1524 +53760 1707 1764 +53760 1657 1769 +53760 1547 1560 +53760 1681 1683 +53760 1650 1668 +53780 1538 1522 +53780 1538 1501 +53780 1543 1783 +53780 1547 1676 +53780 1599 1655 +53780 1617 1701 +53780 1667 1441 +53780 1676 1770 +53780 1698 1764 +53780 1770 1808 +53780 1906 1477 +53780 1921 1462 +53780 1504 1531 +53780 1543 1504 +53780 1543 1531 +53780 1547 1770 +53780 1566 1603 +53780 1678 1900 +53780 1871 1517 +53780 1563 1592 +53780 1477 1517 +53780 1677 1767 +53780 1538 1524 +53780 1707 1764 +53780 1657 1769 +53780 1547 1560 +53780 1681 1683 +53780 1650 1668 +53800 1543 1504 +53800 1543 1531 +53800 1547 1770 +53800 1566 1603 +53800 1603 1731 +53800 1626 1630 +53800 1635 1771 +53800 1669 1754 +53800 1676 1458 +53800 1770 1458 +53800 1501 1524 +53800 1630 1467 +53800 1678 1900 +53800 1871 1517 +53800 1563 1592 +53800 1477 1517 +53800 1501 1507 +53800 1677 1767 +53800 1507 1524 +53800 1538 1524 +53800 1707 1764 +53800 1625 1863 +53800 1501 1522 +53800 1657 1769 +53800 1789 1803 +53800 1547 1560 +53800 1783 1531 +53800 1681 1683 +53800 1650 1668 +53820 1562 1593 +53820 1600 1519 +53820 1630 1467 +53820 1678 1900 +53820 1684 1698 +53820 1803 1902 +53820 1842 1528 +53820 1871 1517 +53820 1563 1592 +53820 1477 1517 +53820 1501 1507 +53820 1538 1522 +53820 1599 1655 +53820 1677 1767 +53820 1906 1517 +53820 1507 1524 +53820 1538 1524 +53820 1707 1764 +53820 1725 1906 +53820 1497 1505 +53820 1725 1477 +53820 1906 1477 +53820 1552 1453 +53820 1625 1863 +53820 1501 1522 +53820 1657 1769 +53820 1789 1803 +53820 1547 1560 +53820 1783 1531 +53820 1698 1707 +53820 1681 1683 +53820 1650 1668 +53840 1563 1592 +53840 1700 1480 +53840 1921 1462 +53840 1476 1477 +53840 1477 1517 +53840 1501 1507 +53840 1538 1522 +53840 1599 1655 +53840 1677 1767 +53840 1906 1517 +53840 1507 1524 +53840 1538 1524 +53840 1707 1764 +53840 1725 1906 +53840 1497 1505 +53840 1725 1476 +53840 1725 1477 +53840 1725 1517 +53840 1906 1476 +53840 1906 1477 +53840 1425 1512 +53840 1698 1764 +53840 1552 1453 +53840 1625 1863 +53840 1920 1504 +53840 1501 1522 +53840 1657 1769 +53840 1789 1803 +53840 1547 1560 +53840 1783 1531 +53840 1698 1707 +53840 1681 1683 +53840 1650 1668 +53860 1538 1522 +53860 1552 1676 +53860 1563 1699 +53860 1599 1655 +53860 1677 1767 +53860 1688 1480 +53860 1872 1453 +53860 1906 1517 +53860 1476 1517 +53860 1501 1524 +53860 1507 1524 +53860 1522 1524 +53860 1538 1524 +53860 1707 1764 +53860 1725 1906 +53860 1774 1787 +53860 1497 1505 +53860 1725 1476 +53860 1725 1477 +53860 1725 1517 +53860 1906 1476 +53860 1906 1477 +53860 1425 1512 +53860 1538 1501 +53860 1698 1764 +53860 1552 1453 +53860 1625 1863 +53860 1920 1504 +53860 1501 1522 +53860 1566 1603 +53860 1657 1769 +53860 1789 1803 +53860 1547 1560 +53860 1783 1531 +53860 1698 1707 +53860 1681 1683 +53860 1650 1668 +53880 1538 1524 +53880 1701 1464 +53880 1707 1764 +53880 1725 1906 +53880 1774 1787 +53880 1787 1512 +53880 1789 1902 +53880 1803 1902 +53880 1854 1906 +53880 1497 1505 +53880 1725 1476 +53880 1725 1477 +53880 1725 1517 +53880 1725 1519 +53880 1906 1476 +53880 1906 1477 +53880 1425 1512 +53880 1439 1531 +53880 1538 1501 +53880 1698 1764 +53880 1477 1517 +53880 1501 1507 +53880 1552 1453 +53880 1625 1863 +53880 1920 1504 +53880 1501 1522 +53880 1566 1603 +53880 1657 1769 +53880 1789 1803 +53880 1547 1560 +53880 1476 1477 +53880 1783 1531 +53880 1698 1707 +53880 1681 1683 +53880 1650 1668 +53900 1538 1522 +53900 1539 1699 +53900 1568 1831 +53900 1600 1469 +53900 1656 1682 +53900 1669 1754 +53900 1671 1701 +53900 1676 1770 +53900 1725 1921 +53900 1725 1476 +53900 1725 1477 +53900 1725 1517 +53900 1725 1871 +53900 1725 1519 +53900 1854 1477 +53900 1871 1921 +53900 1906 1476 +53900 1906 1477 +53900 1425 1512 +53900 1439 1531 +53900 1538 1501 +53900 1604 1725 +53900 1616 1725 +53900 1677 1464 +53900 1698 1764 +53900 1825 1469 +53900 1477 1517 +53900 1501 1507 +53900 1501 1524 +53900 1552 1453 +53900 1625 1863 +53900 1671 1464 +53900 1507 1524 +53900 1700 1480 +53900 1920 1504 +53900 1501 1522 +53900 1600 1517 +53900 1566 1603 +53900 1657 1769 +53900 1789 1803 +53900 1547 1560 +53900 1476 1477 +53900 1783 1531 +53900 1698 1707 +53900 1681 1683 +53900 1650 1668 +53920 1538 1501 +53920 1604 1725 +53920 1616 1725 +53920 1671 1677 +53920 1677 1464 +53920 1698 1764 +53920 1825 1469 +53920 1872 1453 +53920 1477 1517 +53920 1497 1505 +53920 1501 1507 +53920 1501 1524 +53920 1552 1453 +53920 1625 1863 +53920 1671 1464 +53920 1507 1524 +53920 1604 1616 +53920 1700 1480 +53920 1920 1504 +53920 1501 1522 +53920 1600 1517 +53920 1566 1603 +53920 1657 1769 +53920 1789 1803 +53920 1547 1560 +53920 1476 1477 +53920 1783 1531 +53920 1698 1707 +53920 1681 1683 +53920 1650 1668 +53940 1538 1522 +53940 1552 1453 +53940 1593 1521 +53940 1604 1767 +53940 1625 1863 +53940 1671 1464 +53940 1701 1754 +53940 1899 1439 +53940 1507 1524 +53940 1522 1524 +53940 1604 1616 +53940 1700 1480 +53940 1767 1900 +53940 1920 1504 +53940 1501 1522 +53940 1600 1517 +53940 1630 1467 +53940 1566 1603 +53940 1669 1754 +53940 1657 1769 +53940 1789 1803 +53940 1547 1560 +53940 1803 1902 +53940 1476 1477 +53940 1783 1531 +53940 1698 1707 +53940 1681 1683 +53940 1650 1668 +53960 1600 1866 +53960 1604 1616 +53960 1626 1467 +53960 1700 1480 +53960 1767 1900 +53960 1854 1477 +53960 1920 1504 +53960 1501 1522 +53960 1501 1507 +53960 1600 1517 +53960 1626 1630 +53960 1630 1467 +53960 1656 1682 +53960 1857 1441 +53960 1698 1764 +53960 1566 1603 +53960 1669 1754 +53960 1657 1769 +53960 1789 1803 +53960 1547 1560 +53960 1803 1902 +53960 1476 1477 +53960 1783 1531 +53960 1698 1707 +53960 1681 1683 +53960 1650 1668 +53980 1564 1441 +53980 1600 1871 +53980 1600 1477 +53980 1600 1517 +53980 1626 1630 +53980 1630 1467 +53980 1656 1682 +53980 1671 1464 +53980 1857 1441 +53980 1866 1871 +53980 1477 1517 +53980 1507 1524 +53980 1538 1522 +53980 1688 1457 +53980 1694 1699 +53980 1698 1764 +53980 1834 1517 +53980 1871 1517 +53980 1522 1524 +53980 1566 1603 +53980 1669 1754 +53980 1657 1769 +53980 1789 1803 +53980 1547 1560 +53980 1707 1764 +53980 1803 1902 +53980 1476 1477 +53980 1783 1531 +53980 1698 1707 +53980 1825 1469 +53980 1681 1683 +53980 1650 1668 +54000 1538 1522 +54000 1538 1524 +54000 1583 1600 +54000 1590 1657 +54000 1600 1476 +54000 1604 1725 +54000 1676 1698 +54000 1688 1457 +54000 1694 1699 +54000 1698 1764 +54000 1834 1517 +54000 1866 1894 +54000 1871 1517 +54000 1476 1517 +54000 1522 1524 +54000 1566 1603 +54000 1669 1754 +54000 1657 1769 +54000 1789 1803 +54000 1547 1560 +54000 1707 1764 +54000 1803 1902 +54000 1476 1477 +54000 1783 1531 +54000 1698 1707 +54000 1825 1469 +54000 1700 1480 +54000 1681 1683 +54000 1650 1668 +54020 1541 1691 +54020 1547 1676 +54020 1566 1603 +54020 1590 1769 +54020 1603 1466 +54020 1604 1616 +54020 1604 1767 +54020 1669 1754 +54020 1671 1725 +54020 1687 1702 +54020 1789 1518 +54020 1840 1854 +54020 1871 1476 +54020 1920 1526 +54020 1921 1462 +54020 1657 1769 +54020 1789 1803 +54020 1547 1560 +54020 1707 1764 +54020 1803 1902 +54020 1476 1477 +54020 1599 1655 +54020 1783 1531 +54020 1698 1707 +54020 1625 1659 +54020 1825 1469 +54020 1700 1480 +54020 1681 1683 +54020 1650 1668 +54040 1617 1427 +54040 1626 1467 +54040 1635 1698 +54040 1635 1707 +54040 1657 1769 +54040 1789 1803 +54040 1538 1522 +54040 1547 1560 +54040 1707 1764 +54040 1803 1902 +54040 1507 1524 +54040 1522 1524 +54040 1476 1477 +54040 1562 1593 +54040 1599 1655 +54040 1783 1531 +54040 1698 1707 +54040 1698 1764 +54040 1625 1659 +54040 1825 1469 +54040 1700 1480 +54040 1681 1683 +54040 1650 1668 +54060 1538 1522 +54060 1547 1560 +54060 1558 1468 +54060 1568 1831 +54060 1590 1657 +54060 1590 1769 +54060 1677 1464 +54060 1688 1457 +54060 1707 1764 +54060 1767 1900 +54060 1803 1902 +54060 1879 1531 +54060 1507 1524 +54060 1522 1524 +54060 1546 1606 +54060 1603 1531 +54060 1604 1616 +54060 1476 1477 +54060 1562 1593 +54060 1599 1655 +54060 1626 1630 +54060 1783 1531 +54060 1630 1467 +54060 1698 1707 +54060 1698 1764 +54060 1600 1517 +54060 1625 1659 +54060 1825 1469 +54060 1700 1480 +54060 1681 1683 +54060 1650 1668 +54080 1546 1606 +54080 1562 1521 +54080 1568 1701 +54080 1603 1531 +54080 1604 1616 +54080 1701 1754 +54080 1707 1462 +54080 1825 1517 +54080 1476 1477 +54080 1562 1593 +54080 1599 1655 +54080 1626 1630 +54080 1783 1531 +54080 1630 1467 +54080 1698 1707 +54080 1698 1764 +54080 1600 1517 +54080 1625 1659 +54080 1825 1469 +54080 1604 1767 +54080 1700 1480 +54080 1681 1683 +54080 1650 1668 +54100 1547 1635 +54100 1562 1593 +54100 1583 1477 +54100 1599 1655 +54100 1626 1630 +54100 1642 1694 +54100 1687 1702 +54100 1688 1457 +54100 1767 1518 +54100 1772 1874 +54100 1783 1531 +54100 1847 1462 +54100 1921 1462 +54100 1477 1519 +54100 1625 1863 +54100 1630 1467 +54100 1564 1441 +54100 1698 1707 +54100 1698 1764 +54100 1600 1517 +54100 1600 1871 +54100 1625 1659 +54100 1825 1469 +54100 1604 1767 +54100 1700 1480 +54100 1871 1517 +54100 1681 1683 +54100 1650 1668 +54120 1546 1524 +54120 1546 1516 +54120 1568 1678 +54120 1577 1655 +54120 1603 1531 +54120 1616 1767 +54120 1625 1863 +54120 1630 1467 +54120 1469 1477 +54120 1564 1441 +54120 1604 1840 +54120 1698 1707 +54120 1698 1764 +54120 1707 1764 +54120 1600 1517 +54120 1600 1871 +54120 1603 1783 +54120 1625 1659 +54120 1825 1469 +54120 1604 1767 +54120 1700 1480 +54120 1871 1517 +54120 1681 1683 +54120 1650 1668 +54140 1789 1902 +54140 1921 1471 +54140 1564 1441 +54140 1604 1840 +54140 1617 1857 +54140 1669 1754 +54140 1698 1707 +54140 1698 1764 +54140 1707 1764 +54140 1803 1902 +54140 1600 1517 +54140 1600 1871 +54140 1603 1783 +54140 1789 1819 +54140 1625 1659 +54140 1825 1469 +54140 1604 1767 +54140 1700 1480 +54140 1871 1517 +54140 1681 1683 +54140 1650 1668 +54160 1546 1524 +54160 1564 1441 +54160 1599 1655 +54160 1604 1840 +54160 1617 1857 +54160 1669 1754 +54160 1671 1684 +54160 1698 1707 +54160 1698 1764 +54160 1707 1764 +54160 1767 1840 +54160 1772 1874 +54160 1803 1902 +54160 1600 1517 +54160 1600 1871 +54160 1603 1783 +54160 1789 1819 +54160 1562 1593 +54160 1604 1616 +54160 1625 1659 +54160 1825 1469 +54160 1626 1630 +54160 1630 1467 +54160 1656 1682 +54160 1604 1767 +54160 1700 1480 +54160 1871 1517 +54160 1681 1683 +54160 1650 1668 +54180 1538 1522 +54180 1577 1599 +54180 1600 1517 +54180 1600 1871 +54180 1603 1501 +54180 1603 1783 +54180 1642 1853 +54180 1669 1675 +54180 1703 1920 +54180 1725 1441 +54180 1789 1819 +54180 1562 1593 +54180 1604 1616 +54180 1625 1659 +54180 1687 1702 +54180 1687 1439 +54180 1825 1469 +54180 1626 1630 +54180 1630 1467 +54180 1656 1682 +54180 1604 1767 +54180 1700 1480 +54180 1871 1517 +54180 1681 1683 +54180 1650 1668 +54200 1547 1635 +54200 1556 1701 +54200 1562 1593 +54200 1604 1616 +54200 1625 1659 +54200 1687 1702 +54200 1687 1439 +54200 1789 1902 +54200 1825 1469 +54200 1871 1489 +54200 1904 1477 +54200 1489 1517 +54200 1616 1767 +54200 1696 1811 +54200 1626 1630 +54200 1627 1461 +54200 1630 1467 +54200 1656 1682 +54200 1599 1655 +54200 1604 1767 +54200 1564 1441 +54200 1700 1480 +54200 1871 1517 +54200 1681 1683 +54200 1650 1668 +54220 1553 1600 +54220 1603 1783 +54220 1609 1921 +54220 1616 1767 +54220 1626 1467 +54220 1669 1675 +54220 1696 1811 +54220 1427 1493 +54220 1626 1630 +54220 1627 1461 +54220 1630 1467 +54220 1635 1517 +54220 1656 1682 +54220 1701 1770 +54220 1562 1521 +54220 1599 1655 +54220 1604 1767 +54220 1564 1441 +54220 1700 1480 +54220 1871 1517 +54220 1840 1489 +54220 1657 1769 +54220 1681 1683 +54220 1650 1668 +54240 1552 1630 +54240 1556 1701 +54240 1604 1489 +54240 1767 1840 +54240 1626 1630 +54240 1627 1461 +54240 1675 1754 +54240 1552 1469 +54240 1577 1655 +54240 1630 1467 +54240 1635 1517 +54240 1656 1682 +54240 1701 1770 +54240 1767 1489 +54240 1562 1521 +54240 1562 1593 +54240 1599 1655 +54240 1604 1767 +54240 1564 1441 +54240 1700 1480 +54240 1871 1517 +54240 1840 1489 +54240 1657 1769 +54240 1681 1683 +54240 1650 1668 +54260 1626 1467 +54260 1626 1630 +54260 1627 1461 +54260 1675 1754 +54260 1772 1874 +54260 1552 1469 +54260 1577 1655 +54260 1593 1521 +54260 1630 1467 +54260 1635 1517 +54260 1656 1682 +54260 1701 1770 +54260 1767 1489 +54260 1562 1521 +54260 1562 1593 +54260 1599 1655 +54260 1604 1767 +54260 1564 1441 +54260 1669 1675 +54260 1700 1480 +54260 1863 1477 +54260 1871 1517 +54260 1840 1489 +54260 1657 1769 +54260 1681 1683 +54260 1650 1668 +54280 1538 1522 +54280 1546 1524 +54280 1552 1469 +54280 1556 1701 +54280 1568 1462 +54280 1577 1655 +54280 1593 1521 +54280 1604 1489 +54280 1630 1467 +54280 1635 1517 +54280 1656 1682 +54280 1701 1770 +54280 1767 1489 +54280 1825 1519 +54280 1904 1477 +54280 1562 1521 +54280 1562 1593 +54280 1599 1655 +54280 1604 1767 +54280 1616 1489 +54280 1564 1441 +54280 1669 1675 +54280 1700 1480 +54280 1863 1904 +54280 1863 1477 +54280 1871 1517 +54280 1840 1489 +54280 1617 1857 +54280 1657 1769 +54280 1681 1683 +54280 1650 1668 +54300 1562 1521 +54300 1562 1593 +54300 1592 1894 +54300 1599 1655 +54300 1604 1767 +54300 1616 1489 +54300 1627 1461 +54300 1847 1920 +54300 1564 1441 +54300 1600 1519 +54300 1669 1675 +54300 1700 1480 +54300 1863 1904 +54300 1863 1477 +54300 1871 1517 +54300 1767 1840 +54300 1840 1489 +54300 1617 1857 +54300 1657 1769 +54300 1681 1683 +54300 1650 1668 +54320 1539 1770 +54320 1552 1469 +54320 1564 1441 +54320 1597 1678 +54320 1600 1519 +54320 1604 1871 +54320 1616 1871 +54320 1669 1675 +54320 1681 1477 +54320 1696 1819 +54320 1700 1480 +54320 1702 1439 +54320 1772 1874 +54320 1863 1904 +54320 1863 1477 +54320 1871 1517 +54320 1767 1840 +54320 1767 1489 +54320 1840 1489 +54320 1656 1682 +54320 1676 1528 +54320 1477 1519 +54320 1547 1808 +54320 1617 1857 +54320 1657 1769 +54320 1681 1683 +54320 1650 1668 +54340 1537 1471 +54340 1600 1477 +54340 1625 1659 +54340 1725 1857 +54340 1767 1840 +54340 1767 1489 +54340 1840 1489 +54340 1656 1682 +54340 1676 1528 +54340 1477 1519 +54340 1547 1808 +54340 1617 1441 +54340 1617 1857 +54340 1657 1769 +54340 1556 1819 +54340 1563 1770 +54340 1681 1683 +54340 1650 1668 +54360 1543 1614 +54360 1577 1655 +54360 1597 1701 +54360 1606 1425 +54360 1626 1467 +54360 1630 1467 +54360 1656 1682 +54360 1669 1675 +54360 1676 1528 +54360 1682 1696 +54360 1477 1519 +54360 1547 1808 +54360 1617 1441 +54360 1617 1857 +54360 1657 1769 +54360 1675 1754 +54360 1556 1819 +54360 1563 1770 +54360 1599 1655 +54360 1681 1683 +54360 1650 1668 +54380 1538 1522 +54380 1538 1524 +54380 1539 1770 +54380 1543 1700 +54380 1547 1808 +54380 1600 1683 +54380 1466 1501 +54380 1537 1471 +54380 1678 1510 +54380 1700 1480 +54380 1617 1441 +54380 1617 1857 +54380 1657 1769 +54380 1675 1754 +54380 1857 1441 +54380 1684 1725 +54380 1669 1754 +54380 1556 1819 +54380 1563 1770 +54380 1599 1655 +54380 1681 1683 +54380 1650 1668 +54400 1537 1471 +54400 1573 1452 +54400 1656 1682 +54400 1671 1489 +54400 1678 1510 +54400 1700 1480 +54400 1617 1441 +54400 1617 1857 +54400 1645 1756 +54400 1657 1769 +54400 1840 1489 +54400 1600 1519 +54400 1675 1754 +54400 1857 1441 +54400 1684 1725 +54400 1669 1754 +54400 1547 1642 +54400 1556 1819 +54400 1563 1770 +54400 1599 1655 +54400 1681 1683 +54400 1650 1668 +54420 1562 1521 +54420 1603 1466 +54420 1617 1441 +54420 1617 1857 +54420 1645 1756 +54420 1657 1769 +54420 1840 1489 +54420 1600 1683 +54420 1600 1519 +54420 1675 1754 +54420 1688 1457 +54420 1857 1441 +54420 1684 1725 +54420 1698 1707 +54420 1669 1754 +54420 1547 1642 +54420 1556 1819 +54420 1563 1770 +54420 1599 1655 +54420 1681 1683 +54420 1650 1668 +54440 1537 1471 +54440 1577 1655 +54440 1600 1683 +54440 1600 1519 +54440 1625 1659 +54440 1667 1754 +54440 1675 1754 +54440 1688 1457 +54440 1707 1764 +54440 1749 1476 +54440 1767 1489 +54440 1857 1441 +54440 1684 1725 +54440 1698 1707 +54440 1669 1754 +54440 1547 1642 +54440 1556 1819 +54440 1563 1770 +54440 1599 1655 +54440 1681 1683 +54440 1650 1668 +54460 1539 1770 +54460 1590 1441 +54460 1671 1489 +54460 1675 1840 +54460 1684 1725 +54460 1698 1707 +54460 1840 1489 +54460 1512 1531 +54460 1669 1754 +54460 1547 1642 +54460 1556 1819 +54460 1563 1770 +54460 1599 1655 +54460 1681 1683 +54460 1650 1668 +54480 1548 1516 +54480 1558 1516 +54480 1698 1764 +54480 1725 1489 +54480 1512 1531 +54480 1600 1519 +54480 1669 1754 +54480 1547 1642 +54480 1556 1819 +54480 1563 1770 +54480 1599 1655 +54480 1681 1683 +54480 1650 1668 +54500 1600 1519 +54500 1617 1441 +54500 1669 1754 +54500 1684 1489 +54500 1694 1791 +54500 1767 1489 +54500 1857 1502 +54500 1452 1531 +54500 1547 1642 +54500 1556 1819 +54500 1563 1770 +54500 1599 1655 +54500 1681 1683 +54500 1650 1668 +54520 1547 1642 +54520 1547 1590 +54520 1556 1819 +54520 1675 1489 +54520 1698 1707 +54520 1707 1764 +54520 1707 1487 +54520 1592 1442 +54520 1603 1466 +54520 1772 1874 +54520 1512 1531 +54520 1675 1767 +54520 1563 1770 +54520 1599 1655 +54520 1840 1489 +54520 1681 1683 +54520 1650 1668 +54540 1552 1626 +54540 1592 1442 +54540 1600 1825 +54540 1603 1466 +54540 1671 1489 +54540 1767 1840 +54540 1772 1874 +54540 1791 1493 +54540 1512 1531 +54540 1552 1467 +54540 1652 1747 +54540 1675 1767 +54540 1563 1770 +54540 1599 1655 +54540 1669 1754 +54540 1840 1489 +54540 1681 1683 +54540 1650 1668 +54560 1546 1558 +54560 1617 1857 +54560 1657 1769 +54560 1675 1489 +54560 1767 1489 +54560 1857 1502 +54560 1512 1531 +54560 1546 1516 +54560 1552 1467 +54560 1652 1747 +54560 1675 1767 +54560 1563 1770 +54560 1599 1655 +54560 1669 1754 +54560 1840 1489 +54560 1681 1683 +54560 1650 1668 +54580 1546 1516 +54580 1552 1467 +54580 1558 1516 +54580 1577 1655 +54580 1600 1825 +54580 1603 1466 +54580 1630 1467 +54580 1652 1747 +54580 1671 1489 +54580 1468 1516 +54580 1617 1441 +54580 1675 1767 +54580 1563 1770 +54580 1599 1655 +54580 1669 1754 +54580 1840 1489 +54580 1681 1683 +54580 1650 1668 +54600 1538 1524 +54600 1564 1716 +54600 1617 1441 +54600 1683 1467 +54600 1767 1489 +54600 1547 1808 +54600 1675 1767 +54600 1857 1502 +54600 1563 1770 +54600 1599 1655 +54600 1669 1754 +54600 1840 1489 +54600 1512 1531 +54600 1681 1683 +54600 1650 1668 +54620 1547 1808 +54620 1671 1489 +54620 1675 1489 +54620 1675 1767 +54620 1825 1467 +54620 1857 1502 +54620 1904 1467 +54620 1467 1477 +54620 1467 1519 +54620 1477 1519 +54620 1563 1770 +54620 1599 1655 +54620 1617 1857 +54620 1669 1754 +54620 1840 1489 +54620 1512 1531 +54620 1681 1683 +54620 1650 1668 +54640 1538 1524 +54640 1563 1770 +54640 1577 1655 +54640 1772 1874 +54640 1599 1655 +54640 1617 1857 +54640 1669 1754 +54640 1617 1441 +54640 1840 1489 +54640 1512 1531 +54640 1681 1683 +54640 1650 1668 +54660 1599 1655 +54660 1600 1477 +54660 1604 1616 +54660 1617 1857 +54660 1657 1769 +54660 1669 1754 +54660 1767 1489 +54660 1547 1438 +54660 1563 1592 +54660 1675 1767 +54660 1857 1502 +54660 1617 1441 +54660 1477 1519 +54660 1840 1489 +54660 1512 1531 +54660 1681 1683 +54660 1650 1668 +54680 1538 1524 +54680 1547 1438 +54680 1549 1825 +54680 1563 1592 +54680 1630 1679 +54680 1458 1471 +54680 1675 1767 +54680 1857 1502 +54680 1573 1819 +54680 1617 1441 +54680 1477 1519 +54680 1840 1489 +54680 1512 1531 +54680 1681 1683 +54680 1650 1668 +54700 1599 1655 +54700 1652 1747 +54700 1675 1767 +54700 1857 1502 +54700 1772 1874 +54700 1573 1819 +54700 1767 1840 +54700 1651 1905 +54700 1675 1489 +54700 1791 1493 +54700 1617 1441 +54700 1767 1489 +54700 1477 1519 +54700 1840 1489 +54700 1512 1531 +54700 1681 1683 +54700 1650 1668 +54720 1563 1592 +54720 1725 1783 +54720 1772 1874 +54720 1884 1519 +54720 1547 1808 +54720 1573 1819 +54720 1767 1840 +54720 1575 1667 +54720 1651 1905 +54720 1675 1489 +54720 1791 1493 +54720 1617 1441 +54720 1767 1489 +54720 1477 1519 +54720 1840 1489 +54720 1512 1531 +54720 1681 1683 +54720 1650 1668 +54740 1537 1471 +54740 1538 1522 +54740 1547 1808 +54740 1573 1819 +54740 1608 1530 +54740 1767 1840 +54740 1575 1667 +54740 1603 1467 +54740 1651 1905 +54740 1652 1747 +54740 1675 1489 +54740 1791 1493 +54740 1617 1441 +54740 1657 1769 +54740 1767 1489 +54740 1675 1767 +54740 1477 1519 +54740 1840 1489 +54740 1512 1531 +54740 1681 1683 +54740 1650 1668 +54760 1575 1667 +54760 1603 1467 +54760 1651 1905 +54760 1652 1747 +54760 1671 1677 +54760 1675 1489 +54760 1772 1874 +54760 1791 1493 +54760 1562 1521 +54760 1669 1754 +54760 1448 1453 +54760 1617 1441 +54760 1657 1769 +54760 1767 1489 +54760 1675 1767 +54760 1477 1519 +54760 1840 1489 +54760 1512 1531 +54760 1681 1683 +54760 1650 1668 +54780 1549 1825 +54780 1562 1521 +54780 1573 1635 +54780 1627 1461 +54780 1669 1754 +54780 1448 1453 +54780 1608 1530 +54780 1617 1441 +54780 1657 1769 +54780 1677 1903 +54780 1767 1489 +54780 1604 1616 +54780 1675 1767 +54780 1477 1519 +54780 1635 1819 +54780 1840 1489 +54780 1512 1531 +54780 1681 1683 +54780 1650 1668 +54800 1573 1819 +54800 1577 1599 +54800 1608 1530 +54800 1617 1441 +54800 1630 1866 +54800 1652 1747 +54800 1657 1769 +54800 1677 1903 +54800 1767 1489 +54800 1791 1493 +54800 1825 1884 +54800 1825 1477 +54800 1836 1471 +54800 1604 1616 +54800 1675 1767 +54800 1477 1519 +54800 1547 1808 +54800 1630 1872 +54800 1635 1819 +54800 1840 1489 +54800 1676 1528 +54800 1512 1531 +54800 1681 1683 +54800 1650 1668 +54820 1538 1522 +54820 1604 1616 +54820 1675 1767 +54820 1678 1727 +54820 1477 1519 +54820 1547 1808 +54820 1630 1872 +54820 1635 1819 +54820 1767 1840 +54820 1840 1489 +54820 1683 1477 +54820 1675 1840 +54820 1676 1528 +54820 1512 1531 +54820 1681 1683 +54820 1650 1668 +54840 1537 1471 +54840 1547 1808 +54840 1573 1819 +54840 1597 1679 +54840 1630 1872 +54840 1635 1819 +54840 1657 1769 +54840 1767 1840 +54840 1825 1477 +54840 1840 1489 +54840 1683 1477 +54840 1608 1530 +54840 1675 1840 +54840 1676 1528 +54840 1512 1531 +54840 1681 1683 +54840 1650 1668 +54860 1543 1635 +54860 1577 1599 +54860 1678 1727 +54860 1683 1477 +54860 1608 1530 +54860 1675 1840 +54860 1652 1747 +54860 1676 1528 +54860 1512 1531 +54860 1617 1441 +54860 1604 1616 +54860 1655 1477 +54860 1681 1683 +54860 1650 1668 +54880 1608 1530 +54880 1616 1635 +54880 1630 1872 +54880 1667 1866 +54880 1669 1848 +54880 1675 1840 +54880 1772 1874 +54880 1652 1747 +54880 1676 1528 +54880 1767 1840 +54880 1512 1531 +54880 1617 1441 +54880 1604 1616 +54880 1655 1477 +54880 1681 1683 +54880 1650 1668 +54900 1652 1747 +54900 1655 1884 +54900 1669 1754 +54900 1676 1528 +54900 1767 1840 +54900 1767 1489 +54900 1791 1493 +54900 1857 1526 +54900 1512 1531 +54900 1603 1874 +54900 1617 1441 +54900 1630 1493 +54900 1604 1616 +54900 1630 1791 +54900 1678 1727 +54900 1655 1477 +54900 1681 1683 +54900 1650 1668 +54920 1608 1530 +54920 1652 1525 +54920 1659 1673 +54920 1667 1866 +54920 1840 1489 +54920 1512 1531 +54920 1603 1874 +54920 1617 1441 +54920 1627 1461 +54920 1630 1493 +54920 1669 1848 +54920 1851 1449 +54920 1604 1616 +54920 1630 1791 +54920 1678 1727 +54920 1655 1477 +54920 1681 1683 +54920 1650 1668 +54940 1603 1874 +54940 1617 1441 +54940 1627 1461 +54940 1630 1493 +54940 1669 1848 +54940 1671 1441 +54940 1767 1840 +54940 1851 1449 +54940 1857 1469 +54940 1604 1616 +54940 1630 1791 +54940 1678 1727 +54940 1655 1477 +54940 1681 1683 +54940 1650 1668 +54960 1538 1524 +54960 1604 1616 +54960 1616 1635 +54960 1630 1791 +54960 1652 1747 +54960 1652 1453 +54960 1667 1866 +54960 1678 1727 +54960 1655 1477 +54960 1681 1683 +54960 1650 1668 +54980 1675 1767 +54980 1678 1727 +54980 1749 1464 +54980 1840 1489 +54980 1884 1477 +54980 1604 1635 +54980 1655 1477 +54980 1679 1464 +54980 1681 1683 +54980 1650 1668 +55000 1537 1471 +55000 1551 1269 +55000 1600 1655 +55000 1604 1635 +55000 1635 1684 +55000 1655 1477 +55000 1679 1464 +55000 1655 1825 +55000 1798 1825 +55000 1441 1526 +55000 1655 1798 +55000 1681 1683 +55000 1650 1668 +55020 1575 1464 +55020 1600 1825 +55020 1600 1798 +55020 1655 1825 +55020 1675 1767 +55020 1767 1840 +55020 1798 1825 +55020 1866 1434 +55020 1441 1526 +55020 1604 1616 +55020 1699 1440 +55020 1905 1467 +55020 1512 1531 +55020 1678 1727 +55020 1655 1798 +55020 1681 1683 +55020 1650 1668 +55040 1664 1821 +55040 1825 1884 +55040 1538 1524 +55040 1604 1616 +55040 1699 1440 +55040 1905 1467 +55040 1600 1477 +55040 1655 1862 +55040 1798 1862 +55040 1512 1531 +55040 1652 1747 +55040 1678 1727 +55040 1655 1798 +55040 1681 1683 +55040 1650 1668 +55060 1538 1522 +55060 1538 1524 +55060 1604 1616 +55060 1604 1448 +55060 1616 1448 +55060 1657 1769 +55060 1684 1448 +55060 1699 1440 +55060 1747 1525 +55060 1905 1467 +55060 1453 1525 +55060 1600 1477 +55060 1675 1767 +55060 1655 1862 +55060 1798 1862 +55060 1512 1531 +55060 1652 1747 +55060 1678 1727 +55060 1655 1798 +55060 1681 1683 +55060 1650 1668 +55080 1549 1477 +55080 1600 1477 +55080 1675 1767 +55080 1655 1862 +55080 1798 1862 +55080 1851 1874 +55080 1512 1531 +55080 1701 1906 +55080 1652 1747 +55080 1684 1441 +55080 1678 1727 +55080 1655 1798 +55080 1681 1683 +55080 1650 1668 +55100 1655 1862 +55100 1657 1769 +55100 1699 1440 +55100 1798 1862 +55100 1851 1874 +55100 1449 1531 +55100 1453 1525 +55100 1512 1531 +55100 1543 1848 +55100 1616 1448 +55100 1655 1825 +55100 1701 1906 +55100 1652 1747 +55100 1684 1441 +55100 1678 1727 +55100 1655 1798 +55100 1681 1683 +55100 1650 1668 +55120 1538 1522 +55120 1543 1848 +55120 1549 1657 +55120 1553 1683 +55120 1603 1635 +55120 1604 1616 +55120 1616 1448 +55120 1617 1441 +55120 1655 1825 +55120 1669 1754 +55120 1675 1767 +55120 1681 1884 +55120 1701 1906 +55120 1825 1884 +55120 1825 1862 +55120 1652 1747 +55120 1767 1489 +55120 1684 1441 +55120 1678 1727 +55120 1767 1840 +55120 1840 1489 +55120 1655 1798 +55120 1453 1466 +55120 1681 1683 +55120 1650 1668 +55140 1547 1532 +55140 1598 1469 +55140 1652 1747 +55140 1716 1532 +55140 1767 1489 +55140 1798 1862 +55140 1879 1471 +55140 1684 1441 +55140 1757 1848 +55140 1905 1467 +55140 1678 1727 +55140 1767 1840 +55140 1543 1679 +55140 1840 1489 +55140 1655 1798 +55140 1655 1862 +55140 1453 1466 +55140 1681 1683 +55140 1650 1668 +55160 1598 1819 +55160 1604 1655 +55160 1616 1655 +55160 1684 1441 +55160 1757 1848 +55160 1905 1467 +55160 1604 1616 +55160 1678 1727 +55160 1767 1840 +55160 1547 1716 +55160 1489 1526 +55160 1543 1679 +55160 1840 1489 +55160 1655 1798 +55160 1655 1862 +55160 1453 1466 +55160 1681 1683 +55160 1650 1668 +55180 1563 1772 +55180 1566 1848 +55180 1577 1599 +55180 1604 1616 +55180 1678 1727 +55180 1681 1884 +55180 1683 1884 +55180 1684 1448 +55180 1767 1840 +55180 1879 1471 +55180 1547 1716 +55180 1616 1477 +55180 1489 1526 +55180 1507 1522 +55180 1543 1679 +55180 1857 1441 +55180 1617 1441 +55180 1840 1489 +55180 1655 1798 +55180 1655 1862 +55180 1453 1466 +55180 1627 1461 +55180 1681 1683 +55180 1650 1668 +55200 1547 1716 +55200 1616 1529 +55200 1616 1477 +55200 1657 1769 +55200 1669 1754 +55200 1684 1783 +55200 1919 1468 +55200 1489 1526 +55200 1507 1522 +55200 1543 1679 +55200 1547 1808 +55200 1857 1441 +55200 1617 1441 +55200 1840 1489 +55200 1477 1529 +55200 1477 1485 +55200 1655 1798 +55200 1655 1862 +55200 1798 1862 +55200 1512 1531 +55200 1453 1466 +55200 1627 1461 +55200 1681 1683 +55200 1650 1668 +55220 1543 1679 +55220 1547 1808 +55220 1683 1825 +55220 1857 1441 +55220 1617 1441 +55220 1840 1489 +55220 1477 1529 +55220 1477 1485 +55220 1485 1529 +55220 1655 1798 +55220 1655 1862 +55220 1798 1862 +55220 1512 1531 +55220 1453 1466 +55220 1627 1461 +55220 1681 1683 +55220 1650 1668 +55240 1563 1461 +55240 1652 1448 +55240 1655 1519 +55240 1673 1428 +55240 1701 1754 +55240 1767 1489 +55240 1798 1477 +55240 1857 1441 +55240 1519 1525 +55240 1608 1530 +55240 1617 1441 +55240 1840 1489 +55240 1477 1529 +55240 1477 1485 +55240 1485 1529 +55240 1652 1747 +55240 1655 1798 +55240 1655 1862 +55240 1684 1783 +55240 1798 1862 +55240 1919 1468 +55240 1681 1884 +55240 1512 1531 +55240 1489 1526 +55240 1453 1466 +55240 1616 1477 +55240 1627 1461 +55240 1681 1683 +55240 1650 1668 +55260 1608 1530 +55260 1617 1441 +55260 1683 1529 +55260 1767 1840 +55260 1840 1489 +55260 1840 1526 +55260 1477 1529 +55260 1477 1485 +55260 1547 1716 +55260 1549 1825 +55260 1485 1529 +55260 1652 1747 +55260 1655 1798 +55260 1655 1862 +55260 1684 1783 +55260 1798 1862 +55260 1919 1468 +55260 1681 1884 +55260 1683 1884 +55260 1512 1531 +55260 1489 1526 +55260 1453 1466 +55260 1604 1477 +55260 1616 1477 +55260 1627 1461 +55260 1604 1616 +55260 1681 1683 +55260 1650 1668 +55280 1547 1442 +55280 1547 1716 +55280 1549 1825 +55280 1566 1477 +55280 1747 1857 +55280 1767 1489 +55280 1485 1529 +55280 1652 1857 +55280 1652 1747 +55280 1655 1798 +55280 1655 1862 +55280 1684 1783 +55280 1798 1862 +55280 1919 1468 +55280 1681 1884 +55280 1683 1884 +55280 1512 1531 +55280 1489 1526 +55280 1453 1466 +55280 1604 1477 +55280 1616 1477 +55280 1627 1461 +55280 1604 1616 +55280 1681 1683 +55280 1650 1668 +55300 1652 1857 +55300 1652 1747 +55300 1655 1798 +55300 1655 1862 +55300 1655 1477 +55300 1684 1783 +55300 1798 1825 +55300 1798 1862 +55300 1840 1489 +55300 1577 1599 +55300 1655 1825 +55300 1919 1468 +55300 1681 1884 +55300 1683 1884 +55300 1512 1531 +55300 1617 1441 +55300 1489 1526 +55300 1616 1655 +55300 1453 1466 +55300 1604 1477 +55300 1616 1477 +55300 1627 1461 +55300 1604 1655 +55300 1604 1616 +55300 1681 1683 +55300 1650 1668 +55320 1577 1599 +55320 1655 1825 +55320 1669 1754 +55320 1754 1798 +55320 1919 1468 +55320 1681 1884 +55320 1683 1884 +55320 1512 1531 +55320 1551 1819 +55320 1617 1441 +55320 1489 1526 +55320 1616 1655 +55320 1453 1466 +55320 1604 1477 +55320 1616 1477 +55320 1627 1461 +55320 1604 1655 +55320 1604 1616 +55320 1681 1683 +55320 1650 1668 +55340 1547 1808 +55340 1671 1862 +55340 1681 1884 +55340 1683 1884 +55340 1269 1819 +55340 1485 1529 +55340 1512 1531 +55340 1551 1819 +55340 1617 1441 +55340 1489 1526 +55340 1684 1783 +55340 1673 1747 +55340 1616 1655 +55340 1453 1466 +55340 1604 1477 +55340 1616 1477 +55340 1627 1461 +55340 1604 1655 +55340 1604 1616 +55340 1681 1683 +55340 1650 1668 +55360 1551 1819 +55360 1617 1441 +55360 1699 1440 +55360 1857 1428 +55360 1489 1526 +55360 1608 1530 +55360 1655 1477 +55360 1684 1783 +55360 1547 1608 +55360 1549 1525 +55360 1862 1489 +55360 1673 1747 +55360 1616 1655 +55360 1453 1466 +55360 1604 1477 +55360 1616 1477 +55360 1627 1461 +55360 1669 1754 +55360 1604 1655 +55360 1604 1616 +55360 1681 1683 +55360 1650 1668 +55380 1566 1603 +55380 1608 1530 +55380 1655 1477 +55380 1671 1489 +55380 1677 1485 +55380 1684 1783 +55380 1754 1487 +55380 1547 1608 +55380 1549 1525 +55380 1862 1489 +55380 1485 1529 +55380 1512 1531 +55380 1673 1747 +55380 1616 1655 +55380 1683 1884 +55380 1453 1466 +55380 1604 1477 +55380 1616 1477 +55380 1627 1461 +55380 1669 1754 +55380 1604 1655 +55380 1604 1616 +55380 1681 1683 +55380 1650 1668 +55400 1547 1608 +55400 1547 1716 +55400 1549 1525 +55400 1563 1592 +55400 1699 1757 +55400 1862 1489 +55400 1485 1529 +55400 1512 1531 +55400 1547 1808 +55400 1673 1747 +55400 1681 1884 +55400 1551 1819 +55400 1616 1655 +55400 1683 1884 +55400 1453 1466 +55400 1604 1477 +55400 1616 1477 +55400 1627 1461 +55400 1669 1754 +55400 1604 1655 +55400 1604 1616 +55400 1681 1683 +55400 1650 1668 +55420 1538 1774 +55420 1547 1808 +55420 1627 1757 +55420 1667 1487 +55420 1671 1489 +55420 1673 1747 +55420 1684 1783 +55420 1757 1461 +55420 1467 1476 +55420 1489 1529 +55420 1566 1634 +55420 1566 1603 +55420 1677 1857 +55420 1681 1884 +55420 1551 1819 +55420 1616 1655 +55420 1683 1884 +55420 1453 1466 +55420 1604 1477 +55420 1616 1477 +55420 1627 1461 +55420 1669 1754 +55420 1604 1655 +55420 1767 1489 +55420 1604 1616 +55420 1681 1683 +55420 1650 1668 +55440 1547 1608 +55440 1566 1634 +55440 1566 1603 +55440 1652 1673 +55440 1657 1769 +55440 1671 1677 +55440 1677 1857 +55440 1677 1489 +55440 1677 1767 +55440 1681 1884 +55440 1512 1531 +55440 1551 1819 +55440 1590 1678 +55440 1616 1655 +55440 1683 1884 +55440 1453 1466 +55440 1604 1477 +55440 1616 1477 +55440 1627 1461 +55440 1655 1477 +55440 1669 1754 +55440 1604 1655 +55440 1767 1489 +55440 1604 1616 +55440 1681 1683 +55440 1650 1668 +55460 1667 1840 +55460 1671 1862 +55460 1840 1428 +55460 1551 1819 +55460 1590 1678 +55460 1616 1655 +55460 1683 1884 +55460 1453 1466 +55460 1604 1477 +55460 1616 1477 +55460 1627 1461 +55460 1655 1477 +55460 1657 1487 +55460 1669 1754 +55460 1769 1487 +55460 1604 1655 +55460 1767 1489 +55460 1604 1616 +55460 1681 1683 +55460 1650 1668 +55480 1538 1706 +55480 1538 1524 +55480 1543 1727 +55480 1551 1819 +55480 1681 1884 +55480 1706 1524 +55480 1269 1819 +55480 1840 1489 +55480 1512 1531 +55480 1590 1678 +55480 1616 1655 +55480 1667 1529 +55480 1683 1884 +55480 1767 1840 +55480 1453 1466 +55480 1604 1477 +55480 1616 1477 +55480 1627 1461 +55480 1655 1477 +55480 1657 1487 +55480 1669 1754 +55480 1769 1487 +55480 1604 1655 +55480 1767 1489 +55480 1604 1616 +55480 1681 1683 +55480 1650 1668 +55500 1590 1678 +55500 1592 1453 +55500 1616 1655 +55500 1667 1529 +55500 1671 1862 +55500 1683 1884 +55500 1767 1840 +55500 1912 1916 +55500 1453 1466 +55500 1604 1477 +55500 1616 1477 +55500 1627 1461 +55500 1655 1477 +55500 1657 1487 +55500 1669 1754 +55500 1769 1487 +55500 1604 1655 +55500 1767 1489 +55500 1652 1673 +55500 1657 1769 +55500 1604 1616 +55500 1681 1683 +55500 1650 1668 +55520 1551 1819 +55520 1563 1434 +55520 1604 1477 +55520 1616 1477 +55520 1627 1461 +55520 1655 1477 +55520 1657 1487 +55520 1706 1524 +55520 1840 1489 +55520 1449 1512 +55520 1485 1529 +55520 1616 1825 +55520 1669 1754 +55520 1769 1487 +55520 1604 1655 +55520 1767 1489 +55520 1684 1783 +55520 1652 1673 +55520 1657 1769 +55520 1604 1616 +55520 1681 1683 +55520 1650 1668 +55540 1546 1857 +55540 1582 1592 +55540 1616 1825 +55540 1655 1825 +55540 1669 1754 +55540 1767 1840 +55540 1769 1487 +55540 1787 1851 +55540 1851 1524 +55540 1919 1485 +55540 1507 1522 +55540 1604 1655 +55540 1616 1655 +55540 1767 1489 +55540 1546 1606 +55540 1671 1862 +55540 1683 1884 +55540 1489 1526 +55540 1603 1453 +55540 1684 1783 +55540 1652 1673 +55540 1657 1769 +55540 1604 1616 +55540 1681 1683 +55540 1650 1668 +55560 1537 1471 +55560 1547 1716 +55560 1566 1634 +55560 1566 1453 +55560 1597 1489 +55560 1599 1512 +55560 1604 1504 +55560 1604 1655 +55560 1616 1655 +55560 1627 1461 +55560 1767 1489 +55560 1769 1489 +55560 1840 1489 +55560 1546 1606 +55560 1671 1862 +55560 1683 1884 +55560 1269 1819 +55560 1485 1529 +55560 1489 1526 +55560 1603 1453 +55560 1684 1783 +55560 1616 1477 +55560 1652 1673 +55560 1617 1441 +55560 1551 1819 +55560 1657 1769 +55560 1604 1616 +55560 1604 1477 +55560 1543 1727 +55560 1597 1767 +55560 1681 1683 +55560 1650 1668 +55580 1546 1606 +55580 1671 1862 +55580 1683 1884 +55580 1683 1487 +55580 1269 1819 +55580 1787 1851 +55580 1485 1529 +55580 1489 1526 +55580 1603 1453 +55580 1684 1783 +55580 1616 1477 +55580 1652 1673 +55580 1617 1441 +55580 1551 1819 +55580 1657 1769 +55580 1604 1616 +55580 1604 1477 +55580 1543 1727 +55580 1657 1840 +55580 1597 1767 +55580 1912 1916 +55580 1769 1840 +55580 1681 1683 +55580 1650 1668 +55600 1546 1840 +55600 1546 1671 +55600 1549 1919 +55600 1590 1673 +55600 1599 1893 +55600 1603 1453 +55600 1616 1919 +55600 1627 1461 +55600 1657 1489 +55600 1684 1783 +55600 1566 1603 +55600 1616 1477 +55600 1652 1673 +55600 1825 1919 +55600 1597 1489 +55600 1617 1441 +55600 1551 1819 +55600 1657 1769 +55600 1767 1489 +55600 1769 1489 +55600 1604 1616 +55600 1604 1477 +55600 1543 1727 +55600 1657 1840 +55600 1597 1767 +55600 1669 1754 +55600 1912 1916 +55600 1769 1840 +55600 1681 1683 +55600 1650 1668 +55620 1538 1524 +55620 1566 1603 +55620 1616 1477 +55620 1652 1673 +55620 1655 1898 +55620 1673 1747 +55620 1825 1919 +55620 1597 1489 +55620 1617 1441 +55620 1683 1487 +55620 1537 1471 +55620 1551 1819 +55620 1657 1769 +55620 1767 1489 +55620 1769 1489 +55620 1840 1489 +55620 1604 1616 +55620 1604 1477 +55620 1543 1727 +55620 1657 1840 +55620 1485 1529 +55620 1597 1767 +55620 1669 1754 +55620 1912 1916 +55620 1634 1504 +55620 1769 1840 +55620 1681 1683 +55620 1650 1668 +55640 1564 1437 +55640 1597 1489 +55640 1603 1453 +55640 1617 1441 +55640 1627 1461 +55640 1683 1466 +55640 1683 1487 +55640 1879 1471 +55640 1537 1471 +55640 1549 1583 +55640 1551 1819 +55640 1562 1521 +55640 1657 1769 +55640 1657 1489 +55640 1706 1524 +55640 1767 1489 +55640 1769 1489 +55640 1269 1819 +55640 1840 1489 +55640 1562 1449 +55640 1604 1616 +55640 1604 1477 +55640 1543 1727 +55640 1657 1840 +55640 1485 1529 +55640 1597 1767 +55640 1669 1754 +55640 1912 1916 +55640 1634 1504 +55640 1769 1840 +55640 1893 1474 +55640 1681 1683 +55640 1650 1668 +55660 1537 1471 +55660 1549 1583 +55660 1551 1819 +55660 1562 1521 +55660 1657 1769 +55660 1657 1489 +55660 1671 1489 +55660 1706 1524 +55660 1767 1489 +55660 1769 1489 +55660 1269 1819 +55660 1840 1489 +55660 1562 1449 +55660 1566 1603 +55660 1604 1616 +55660 1604 1477 +55660 1543 1727 +55660 1657 1840 +55660 1485 1529 +55660 1597 1767 +55660 1669 1754 +55660 1912 1916 +55660 1655 1898 +55660 1634 1504 +55660 1769 1840 +55660 1825 1919 +55660 1893 1474 +55660 1681 1683 +55660 1650 1668 +55680 1543 1701 +55680 1547 1608 +55680 1547 1808 +55680 1562 1449 +55680 1566 1603 +55680 1603 1469 +55680 1604 1616 +55680 1604 1477 +55680 1604 1655 +55680 1808 1530 +55680 1449 1521 +55680 1543 1727 +55680 1546 1701 +55680 1657 1840 +55680 1485 1529 +55680 1603 1453 +55680 1655 1919 +55680 1683 1487 +55680 1597 1767 +55680 1669 1754 +55680 1912 1916 +55680 1655 1898 +55680 1898 1477 +55680 1655 1477 +55680 1634 1504 +55680 1769 1840 +55680 1825 1919 +55680 1893 1474 +55680 1681 1683 +55680 1650 1668 +55700 1539 1546 +55700 1543 1727 +55700 1546 1701 +55700 1562 1521 +55700 1657 1840 +55700 1683 1466 +55700 1485 1529 +55700 1603 1453 +55700 1655 1919 +55700 1683 1487 +55700 1551 1819 +55700 1597 1767 +55700 1669 1754 +55700 1767 1840 +55700 1912 1916 +55700 1547 1716 +55700 1655 1898 +55700 1898 1477 +55700 1655 1477 +55700 1919 1477 +55700 1634 1504 +55700 1769 1840 +55700 1657 1769 +55700 1825 1919 +55700 1893 1474 +55700 1681 1683 +55700 1650 1668 +55720 1562 1593 +55720 1590 1453 +55720 1603 1453 +55720 1655 1919 +55720 1673 1747 +55720 1683 1487 +55720 1684 1526 +55720 1825 1477 +55720 1898 1919 +55720 1549 1583 +55720 1551 1819 +55720 1597 1767 +55720 1608 1530 +55720 1669 1754 +55720 1767 1840 +55720 1912 1916 +55720 1547 1716 +55720 1655 1898 +55720 1898 1477 +55720 1655 1477 +55720 1919 1477 +55720 1604 1616 +55720 1634 1504 +55720 1269 1819 +55720 1769 1840 +55720 1657 1769 +55720 1825 1919 +55720 1893 1474 +55720 1681 1683 +55720 1650 1668 +55740 1549 1583 +55740 1551 1819 +55740 1551 1269 +55740 1597 1767 +55740 1608 1530 +55740 1669 1754 +55740 1767 1840 +55740 1912 1916 +55740 1537 1471 +55740 1547 1716 +55740 1655 1898 +55740 1898 1477 +55740 1655 1477 +55740 1657 1840 +55740 1919 1477 +55740 1604 1616 +55740 1634 1504 +55740 1269 1819 +55740 1769 1840 +55740 1657 1769 +55740 1549 1525 +55740 1825 1919 +55740 1893 1474 +55740 1681 1683 +55740 1650 1668 +55760 1537 1471 +55760 1547 1716 +55760 1655 1898 +55760 1671 1684 +55760 1767 1769 +55760 1783 1489 +55760 1898 1477 +55760 1593 1521 +55760 1655 1477 +55760 1657 1840 +55760 1919 1477 +55760 1604 1616 +55760 1634 1504 +55760 1269 1819 +55760 1769 1840 +55760 1657 1769 +55760 1549 1525 +55760 1825 1919 +55760 1893 1474 +55760 1681 1683 +55760 1650 1668 +55780 1543 1727 +55780 1593 1521 +55780 1593 1449 +55780 1655 1477 +55780 1657 1840 +55780 1767 1489 +55780 1770 1791 +55780 1879 1471 +55780 1919 1477 +55780 1583 1884 +55780 1597 1767 +55780 1604 1616 +55780 1634 1504 +55780 1769 1489 +55780 1269 1819 +55780 1840 1489 +55780 1437 1453 +55780 1769 1840 +55780 1485 1529 +55780 1657 1769 +55780 1684 1526 +55780 1434 1453 +55780 1549 1525 +55780 1825 1919 +55780 1893 1474 +55780 1681 1683 +55780 1650 1668 +55800 1546 1634 +55800 1583 1884 +55800 1597 1767 +55800 1604 1616 +55800 1627 1461 +55800 1655 1530 +55800 1706 1524 +55800 1898 1477 +55800 1634 1504 +55800 1769 1489 +55800 1269 1819 +55800 1783 1489 +55800 1840 1489 +55800 1912 1916 +55800 1437 1453 +55800 1769 1840 +55800 1485 1529 +55800 1617 1857 +55800 1657 1769 +55800 1684 1526 +55800 1434 1453 +55800 1547 1716 +55800 1549 1525 +55800 1825 1919 +55800 1893 1474 +55800 1681 1683 +55800 1650 1668 +55820 1546 1606 +55820 1593 1521 +55820 1617 1441 +55820 1634 1504 +55820 1688 1467 +55820 1712 1467 +55820 1767 1769 +55820 1769 1489 +55820 1269 1819 +55820 1783 1489 +55820 1840 1489 +55820 1912 1916 +55820 1919 1477 +55820 1437 1453 +55820 1825 1477 +55820 1769 1840 +55820 1485 1529 +55820 1551 1819 +55820 1617 1857 +55820 1857 1441 +55820 1597 1489 +55820 1657 1769 +55820 1684 1526 +55820 1434 1453 +55820 1547 1716 +55820 1767 1489 +55820 1549 1525 +55820 1825 1919 +55820 1893 1474 +55820 1681 1683 +55820 1650 1668 +55840 1550 1443 +55840 1551 1269 +55840 1597 1767 +55840 1627 1461 +55840 1825 1477 +55840 1443 1527 +55840 1769 1840 +55840 1485 1529 +55840 1551 1819 +55840 1562 1603 +55840 1617 1857 +55840 1857 1441 +55840 1434 1437 +55840 1597 1489 +55840 1657 1769 +55840 1684 1526 +55840 1434 1453 +55840 1547 1716 +55840 1767 1489 +55840 1549 1525 +55840 1825 1919 +55840 1893 1474 +55840 1681 1683 +55840 1650 1668 +55860 1603 1449 +55860 1604 1616 +55860 1617 1441 +55860 1769 1840 +55860 1769 1489 +55860 1912 1916 +55860 1485 1529 +55860 1551 1819 +55860 1562 1603 +55860 1617 1857 +55860 1857 1441 +55860 1434 1437 +55860 1597 1489 +55860 1657 1769 +55860 1684 1526 +55860 1269 1819 +55860 1434 1453 +55860 1437 1453 +55860 1547 1716 +55860 1657 1840 +55860 1767 1489 +55860 1549 1525 +55860 1825 1919 +55860 1893 1474 +55860 1681 1683 +55860 1650 1668 +55880 1551 1819 +55880 1562 1603 +55880 1590 1634 +55880 1592 1772 +55880 1617 1857 +55880 1783 1489 +55880 1857 1441 +55880 1434 1437 +55880 1551 1269 +55880 1597 1489 +55880 1657 1769 +55880 1684 1526 +55880 1269 1819 +55880 1434 1453 +55880 1437 1453 +55880 1543 1727 +55880 1791 1489 +55880 1547 1716 +55880 1657 1840 +55880 1767 1489 +55880 1549 1525 +55880 1825 1919 +55880 1893 1474 +55880 1681 1683 +55880 1650 1668 +55900 1551 1269 +55900 1597 1489 +55900 1604 1616 +55900 1657 1769 +55900 1684 1526 +55900 1269 1819 +55900 1434 1453 +55900 1437 1453 +55900 1543 1727 +55900 1546 1606 +55900 1857 1526 +55900 1791 1489 +55900 1840 1489 +55900 1547 1716 +55900 1617 1441 +55900 1657 1840 +55900 1769 1840 +55900 1767 1489 +55900 1919 1477 +55900 1549 1525 +55900 1825 1919 +55900 1893 1474 +55900 1681 1683 +55900 1650 1668 +55920 1543 1727 +55920 1546 1606 +55920 1627 1461 +55920 1671 1857 +55920 1671 1684 +55920 1683 1518 +55920 1898 1477 +55920 1550 1443 +55920 1563 1524 +55920 1684 1857 +55920 1857 1526 +55920 1791 1489 +55920 1840 1489 +55920 1547 1716 +55920 1617 1441 +55920 1657 1840 +55920 1769 1840 +55920 1767 1489 +55920 1919 1477 +55920 1549 1525 +55920 1825 1919 +55920 1893 1474 +55920 1681 1683 +55920 1650 1668 +55940 1550 1443 +55940 1563 1524 +55940 1590 1530 +55940 1597 1767 +55940 1655 1740 +55940 1655 1772 +55940 1448 1466 +55940 1604 1616 +55940 1669 1754 +55940 1684 1857 +55940 1684 1526 +55940 1857 1526 +55940 1791 1489 +55940 1840 1489 +55940 1547 1716 +55940 1617 1441 +55940 1657 1840 +55940 1769 1840 +55940 1767 1489 +55940 1919 1477 +55940 1549 1525 +55940 1825 1919 +55940 1893 1474 +55940 1681 1683 +55940 1650 1668 +55960 1549 1884 +55960 1575 1434 +55960 1604 1616 +55960 1783 1489 +55960 1884 1519 +55960 1563 1592 +55960 1652 1747 +55960 1655 1892 +55960 1655 1477 +55960 1669 1754 +55960 1684 1857 +55960 1684 1526 +55960 1767 1769 +55960 1857 1526 +55960 1791 1489 +55960 1543 1727 +55960 1627 1461 +55960 1840 1489 +55960 1912 1916 +55960 1547 1716 +55960 1617 1441 +55960 1657 1840 +55960 1769 1840 +55960 1767 1489 +55960 1919 1477 +55960 1549 1525 +55960 1825 1919 +55960 1893 1474 +55960 1681 1683 +55960 1650 1668 +55980 1546 1606 +55980 1563 1592 +55980 1652 1673 +55980 1652 1747 +55980 1655 1892 +55980 1655 1477 +55980 1657 1767 +55980 1669 1754 +55980 1671 1857 +55980 1684 1857 +55980 1684 1526 +55980 1698 1725 +55980 1767 1840 +55980 1767 1769 +55980 1857 1526 +55980 1547 1808 +55980 1678 1525 +55980 1716 1808 +55980 1769 1489 +55980 1791 1489 +55980 1892 1898 +55980 1898 1477 +55980 1543 1727 +55980 1627 1461 +55980 1840 1489 +55980 1912 1916 +55980 1547 1716 +55980 1617 1441 +55980 1657 1840 +55980 1769 1840 +55980 1767 1489 +55980 1919 1477 +55980 1549 1525 +55980 1825 1919 +55980 1655 1890 +55980 1893 1474 +55980 1892 1477 +55980 1681 1683 +55980 1650 1668 +56000 1547 1808 +56000 1647 1762 +56000 1657 1769 +56000 1678 1525 +56000 1678 1519 +56000 1683 1519 +56000 1698 1765 +56000 1716 1808 +56000 1769 1489 +56000 1783 1840 +56000 1791 1489 +56000 1857 1489 +56000 1892 1898 +56000 1898 1919 +56000 1898 1477 +56000 1898 1519 +56000 1543 1434 +56000 1543 1727 +56000 1627 1461 +56000 1783 1489 +56000 1485 1529 +56000 1840 1489 +56000 1912 1916 +56000 1547 1716 +56000 1617 1441 +56000 1617 1857 +56000 1657 1840 +56000 1769 1840 +56000 1767 1489 +56000 1919 1477 +56000 1549 1525 +56000 1825 1919 +56000 1655 1890 +56000 1893 1474 +56000 1892 1477 +56000 1681 1683 +56000 1650 1668 +56020 1543 1434 +56020 1543 1727 +56020 1547 1504 +56020 1550 1443 +56020 1590 1530 +56020 1627 1461 +56020 1703 1920 +56020 1783 1489 +56020 1808 1504 +56020 1485 1529 +56020 1840 1489 +56020 1857 1441 +56020 1912 1916 +56020 1547 1716 +56020 1669 1754 +56020 1684 1783 +56020 1617 1441 +56020 1617 1857 +56020 1657 1840 +56020 1769 1840 +56020 1767 1489 +56020 1919 1477 +56020 1549 1525 +56020 1825 1919 +56020 1655 1890 +56020 1893 1474 +56020 1892 1477 +56020 1681 1683 +56020 1650 1668 +56040 1657 1489 +56040 1684 1840 +56040 1698 1707 +56040 1716 1808 +56040 1791 1840 +56040 1791 1489 +56040 1840 1489 +56040 1857 1441 +56040 1912 1916 +56040 1919 1519 +56040 1547 1716 +56040 1669 1754 +56040 1684 1783 +56040 1684 1791 +56040 1767 1840 +56040 1767 1769 +56040 1617 1441 +56040 1617 1857 +56040 1657 1840 +56040 1769 1840 +56040 1767 1489 +56040 1919 1477 +56040 1549 1525 +56040 1657 1769 +56040 1825 1919 +56040 1655 1890 +56040 1893 1474 +56040 1892 1477 +56040 1547 1808 +56040 1681 1683 +56040 1650 1668 +56060 1547 1716 +56060 1580 1527 +56060 1590 1530 +56060 1669 1754 +56060 1684 1489 +56060 1684 1783 +56060 1684 1791 +56060 1767 1840 +56060 1767 1769 +56060 1783 1791 +56060 1787 1521 +56060 1905 1467 +56060 1617 1441 +56060 1617 1857 +56060 1657 1840 +56060 1769 1840 +56060 1890 1466 +56060 1767 1489 +56060 1919 1477 +56060 1549 1525 +56060 1657 1769 +56060 1825 1919 +56060 1593 1453 +56060 1655 1890 +56060 1893 1474 +56060 1892 1477 +56060 1547 1808 +56060 1681 1683 +56060 1650 1668 +56080 1543 1434 +56080 1617 1441 +56080 1617 1857 +56080 1627 1461 +56080 1645 1756 +56080 1655 1466 +56080 1657 1840 +56080 1691 1811 +56080 1769 1840 +56080 1840 1489 +56080 1847 1894 +56080 1857 1441 +56080 1890 1466 +56080 1657 1489 +56080 1703 1900 +56080 1767 1489 +56080 1769 1489 +56080 1892 1919 +56080 1919 1477 +56080 1549 1525 +56080 1657 1769 +56080 1825 1919 +56080 1593 1453 +56080 1655 1890 +56080 1893 1474 +56080 1892 1477 +56080 1547 1808 +56080 1681 1683 +56080 1650 1668 +56100 1657 1489 +56100 1702 1811 +56100 1703 1900 +56100 1762 1783 +56100 1767 1489 +56100 1769 1489 +56100 1892 1919 +56100 1919 1477 +56100 1547 1716 +56100 1791 1489 +56100 1669 1754 +56100 1549 1525 +56100 1657 1769 +56100 1825 1919 +56100 1593 1453 +56100 1655 1890 +56100 1893 1474 +56100 1892 1477 +56100 1547 1808 +56100 1681 1683 +56100 1650 1668 +56120 1547 1716 +56120 1617 1529 +56120 1617 1441 +56120 1684 1489 +56120 1684 1791 +56120 1767 1769 +56120 1769 1840 +56120 1791 1489 +56120 1862 1466 +56120 1441 1529 +56120 1441 1489 +56120 1669 1754 +56120 1549 1525 +56120 1657 1769 +56120 1825 1919 +56120 1593 1453 +56120 1655 1890 +56120 1893 1474 +56120 1892 1477 +56120 1547 1808 +56120 1681 1683 +56120 1650 1668 +56140 1657 1840 +56140 1834 1439 +56140 1441 1489 +56140 1669 1754 +56140 1840 1489 +56140 1912 1916 +56140 1549 1525 +56140 1657 1769 +56140 1825 1919 +56140 1593 1453 +56140 1655 1890 +56140 1893 1474 +56140 1892 1477 +56140 1547 1808 +56140 1681 1683 +56140 1650 1668 +56160 1617 1857 +56160 1669 1754 +56160 1767 1791 +56160 1840 1489 +56160 1912 1916 +56160 1919 1477 +56160 1449 1531 +56160 1549 1525 +56160 1657 1769 +56160 1825 1919 +56160 1593 1453 +56160 1627 1461 +56160 1617 1441 +56160 1485 1529 +56160 1655 1890 +56160 1893 1474 +56160 1892 1898 +56160 1892 1477 +56160 1547 1716 +56160 1547 1808 +56160 1681 1683 +56160 1650 1668 +56180 1549 1525 +56180 1657 1769 +56180 1825 1919 +56180 1593 1453 +56180 1617 1671 +56180 1627 1461 +56180 1671 1441 +56180 1617 1441 +56180 1684 1526 +56180 1485 1529 +56180 1655 1890 +56180 1657 1840 +56180 1898 1477 +56180 1893 1474 +56180 1767 1489 +56180 1791 1489 +56180 1543 1434 +56180 1892 1898 +56180 1892 1477 +56180 1547 1716 +56180 1547 1808 +56180 1681 1683 +56180 1650 1668 +56200 1593 1453 +56200 1617 1671 +56200 1627 1461 +56200 1671 1441 +56200 1767 1769 +56200 1769 1489 +56200 1840 1489 +56200 1458 1467 +56200 1617 1441 +56200 1684 1526 +56200 1688 1457 +56200 1485 1529 +56200 1655 1890 +56200 1657 1840 +56200 1767 1840 +56200 1898 1477 +56200 1657 1767 +56200 1892 1919 +56200 1893 1474 +56200 1919 1477 +56200 1767 1489 +56200 1898 1919 +56200 1791 1489 +56200 1543 1434 +56200 1892 1898 +56200 1892 1477 +56200 1547 1716 +56200 1547 1808 +56200 1681 1683 +56200 1650 1668 +56220 1617 1441 +56220 1669 1754 +56220 1684 1526 +56220 1688 1457 +56220 1787 1531 +56220 1857 1441 +56220 1920 1462 +56220 1485 1529 +56220 1539 1699 +56220 1617 1857 +56220 1635 1688 +56220 1655 1890 +56220 1657 1840 +56220 1767 1840 +56220 1898 1477 +56220 1657 1767 +56220 1892 1919 +56220 1449 1531 +56220 1893 1474 +56220 1919 1477 +56220 1767 1489 +56220 1898 1919 +56220 1791 1489 +56220 1441 1461 +56220 1543 1434 +56220 1892 1898 +56220 1892 1477 +56220 1547 1716 +56220 1547 1808 +56220 1681 1683 +56220 1650 1668 +56240 1537 1725 +56240 1539 1699 +56240 1549 1890 +56240 1549 1759 +56240 1608 1530 +56240 1617 1857 +56240 1617 1627 +56240 1635 1688 +56240 1635 1462 +56240 1635 1902 +56240 1655 1890 +56240 1655 1759 +56240 1657 1840 +56240 1701 1770 +56240 1767 1840 +56240 1767 1769 +56240 1898 1477 +56240 1458 1467 +56240 1657 1489 +56240 1657 1767 +56240 1759 1890 +56240 1769 1489 +56240 1840 1489 +56240 1884 1890 +56240 1892 1919 +56240 1449 1531 +56240 1593 1453 +56240 1893 1474 +56240 1919 1477 +56240 1767 1489 +56240 1898 1919 +56240 1791 1489 +56240 1441 1461 +56240 1543 1434 +56240 1892 1898 +56240 1892 1477 +56240 1547 1716 +56240 1547 1808 +56240 1681 1683 +56240 1650 1668 +56260 1580 1527 +56260 1617 1529 +56260 1657 1489 +56260 1657 1769 +56260 1657 1767 +56260 1701 1912 +56260 1701 1916 +56260 1759 1890 +56260 1769 1489 +56260 1840 1489 +56260 1884 1890 +56260 1669 1754 +56260 1892 1919 +56260 1449 1531 +56260 1485 1529 +56260 1593 1453 +56260 1893 1474 +56260 1919 1477 +56260 1767 1489 +56260 1898 1919 +56260 1791 1489 +56260 1441 1461 +56260 1543 1434 +56260 1892 1898 +56260 1892 1477 +56260 1547 1716 +56260 1547 1808 +56260 1681 1683 +56260 1650 1668 +56280 1554 1847 +56280 1669 1754 +56280 1735 1465 +56280 1892 1919 +56280 1449 1531 +56280 1485 1529 +56280 1549 1890 +56280 1593 1453 +56280 1767 1840 +56280 1893 1474 +56280 1919 1477 +56280 1767 1489 +56280 1898 1919 +56280 1791 1489 +56280 1441 1461 +56280 1543 1434 +56280 1892 1898 +56280 1892 1477 +56280 1547 1716 +56280 1547 1808 +56280 1898 1477 +56280 1681 1683 +56280 1650 1668 +56300 1549 1890 +56300 1593 1453 +56300 1599 1474 +56300 1599 1893 +56300 1727 1819 +56300 1767 1840 +56300 1893 1474 +56300 1919 1477 +56300 1657 1769 +56300 1688 1457 +56300 1767 1489 +56300 1898 1919 +56300 1791 1489 +56300 1441 1461 +56300 1543 1434 +56300 1892 1898 +56300 1892 1477 +56300 1627 1441 +56300 1547 1716 +56300 1547 1808 +56300 1898 1477 +56300 1681 1683 +56300 1650 1668 +56320 1544 1600 +56320 1657 1769 +56320 1657 1684 +56320 1688 1457 +56320 1767 1489 +56320 1898 1919 +56320 1458 1467 +56320 1583 1884 +56320 1600 1659 +56320 1684 1769 +56320 1791 1489 +56320 1441 1461 +56320 1449 1531 +56320 1543 1434 +56320 1892 1898 +56320 1892 1477 +56320 1627 1441 +56320 1547 1716 +56320 1547 1808 +56320 1898 1477 +56320 1681 1683 +56320 1650 1668 +56340 1583 1884 +56340 1600 1659 +56340 1627 1857 +56340 1684 1769 +56340 1791 1489 +56340 1892 1919 +56340 1441 1461 +56340 1449 1531 +56340 1543 1434 +56340 1727 1819 +56340 1892 1898 +56340 1892 1477 +56340 1617 1627 +56340 1627 1441 +56340 1840 1489 +56340 1547 1716 +56340 1770 1916 +56340 1547 1808 +56340 1898 1477 +56340 1681 1683 +56340 1650 1668 +56360 1543 1434 +56360 1593 1521 +56360 1727 1819 +56360 1892 1898 +56360 1892 1477 +56360 1458 1467 +56360 1617 1627 +56360 1627 1441 +56360 1840 1489 +56360 1919 1477 +56360 1547 1716 +56360 1770 1916 +56360 1898 1919 +56360 1617 1857 +56360 1547 1808 +56360 1678 1900 +56360 1898 1477 +56360 1544 1890 +56360 1544 1683 +56360 1683 1890 +56360 1681 1683 +56360 1650 1668 +56380 1617 1627 +56380 1627 1441 +56380 1840 1489 +56380 1919 1477 +56380 1547 1716 +56380 1770 1916 +56380 1898 1919 +56380 1617 1857 +56380 1684 1769 +56380 1485 1529 +56380 1547 1808 +56380 1657 1684 +56380 1678 1900 +56380 1544 1681 +56380 1898 1477 +56380 1544 1890 +56380 1544 1683 +56380 1441 1461 +56380 1683 1890 +56380 1681 1683 +56380 1650 1668 +56400 1547 1716 +56400 1627 1461 +56400 1770 1916 +56400 1892 1477 +56400 1898 1919 +56400 1503 1524 +56400 1543 1434 +56400 1617 1857 +56400 1627 1857 +56400 1684 1769 +56400 1485 1529 +56400 1547 1808 +56400 1657 1684 +56400 1678 1900 +56400 1544 1681 +56400 1767 1840 +56400 1898 1477 +56400 1544 1890 +56400 1544 1683 +56400 1441 1461 +56400 1683 1890 +56400 1767 1489 +56400 1681 1683 +56400 1650 1668 +56420 1543 1434 +56420 1617 1857 +56420 1627 1857 +56420 1684 1769 +56420 1872 1503 +56420 1485 1529 +56420 1547 1808 +56420 1657 1684 +56420 1593 1787 +56420 1678 1900 +56420 1840 1489 +56420 1544 1681 +56420 1767 1840 +56420 1898 1477 +56420 1544 1890 +56420 1544 1683 +56420 1441 1461 +56420 1683 1890 +56420 1767 1489 +56420 1681 1683 +56420 1650 1668 +56440 1553 1890 +56440 1684 1769 +56440 1716 1808 +56440 1872 1503 +56440 1485 1529 +56440 1547 1808 +56440 1657 1684 +56440 1593 1787 +56440 1678 1900 +56440 1840 1489 +56440 1544 1681 +56440 1767 1840 +56440 1898 1477 +56440 1544 1890 +56440 1544 1683 +56440 1655 1885 +56440 1703 1863 +56440 1441 1461 +56440 1683 1890 +56440 1767 1489 +56440 1547 1716 +56440 1681 1683 +56440 1650 1668 +56460 1617 1857 +56460 1627 1857 +56460 1485 1529 +56460 1485 1489 +56460 1489 1529 +56460 1449 1531 +56460 1547 1808 +56460 1657 1684 +56460 1681 1890 +56460 1593 1787 +56460 1678 1900 +56460 1840 1489 +56460 1544 1681 +56460 1767 1840 +56460 1898 1477 +56460 1544 1890 +56460 1544 1683 +56460 1655 1885 +56460 1703 1863 +56460 1441 1461 +56460 1683 1890 +56460 1767 1489 +56460 1547 1716 +56460 1681 1683 +56460 1650 1668 +56480 1545 1649 +56480 1545 1430 +56480 1627 1441 +56480 1657 1769 +56480 1449 1531 +56480 1547 1808 +56480 1657 1684 +56480 1919 1477 +56480 1681 1890 +56480 1684 1769 +56480 1593 1787 +56480 1655 1872 +56480 1678 1900 +56480 1840 1489 +56480 1544 1681 +56480 1767 1840 +56480 1898 1477 +56480 1898 1919 +56480 1544 1890 +56480 1544 1683 +56480 1655 1885 +56480 1703 1863 +56480 1441 1461 +56480 1683 1890 +56480 1767 1489 +56480 1547 1716 +56480 1681 1683 +56480 1650 1668 +56500 1544 1553 +56500 1547 1808 +56500 1553 1890 +56500 1627 1461 +56500 1657 1684 +56500 1919 1477 +56500 1681 1890 +56500 1684 1769 +56500 1593 1787 +56500 1655 1872 +56500 1678 1900 +56500 1840 1489 +56500 1872 1885 +56500 1544 1681 +56500 1617 1857 +56500 1767 1840 +56500 1898 1477 +56500 1898 1919 +56500 1539 1772 +56500 1544 1890 +56500 1544 1683 +56500 1655 1792 +56500 1655 1885 +56500 1703 1863 +56500 1441 1461 +56500 1485 1529 +56500 1683 1890 +56500 1767 1489 +56500 1547 1716 +56500 1681 1683 +56500 1650 1668 +56520 1657 1769 +56520 1681 1890 +56520 1684 1769 +56520 1912 1916 +56520 1527 1532 +56520 1593 1787 +56520 1655 1872 +56520 1678 1900 +56520 1716 1808 +56520 1840 1489 +56520 1872 1885 +56520 1544 1681 +56520 1617 1857 +56520 1767 1840 +56520 1898 1477 +56520 1898 1919 +56520 1539 1772 +56520 1544 1890 +56520 1544 1683 +56520 1655 1792 +56520 1655 1885 +56520 1825 1919 +56520 1627 1441 +56520 1703 1863 +56520 1441 1461 +56520 1485 1529 +56520 1683 1890 +56520 1767 1489 +56520 1547 1716 +56520 1681 1683 +56520 1650 1668 +56540 1547 1808 +56540 1593 1787 +56540 1655 1872 +56540 1678 1900 +56540 1716 1808 +56540 1825 1898 +56540 1840 1489 +56540 1872 1885 +56540 1544 1681 +56540 1617 1857 +56540 1767 1840 +56540 1792 1885 +56540 1898 1477 +56540 1898 1919 +56540 1539 1772 +56540 1544 1890 +56540 1544 1683 +56540 1655 1792 +56540 1655 1885 +56540 1825 1919 +56540 1627 1441 +56540 1703 1863 +56540 1441 1461 +56540 1485 1529 +56540 1683 1890 +56540 1767 1489 +56540 1627 1461 +56540 1547 1716 +56540 1681 1683 +56540 1650 1668 +56560 1544 1681 +56560 1617 1857 +56560 1684 1489 +56560 1767 1840 +56560 1792 1885 +56560 1898 1477 +56560 1898 1919 +56560 1539 1772 +56560 1544 1890 +56560 1544 1683 +56560 1655 1792 +56560 1655 1885 +56560 1825 1919 +56560 1627 1441 +56560 1703 1863 +56560 1441 1461 +56560 1819 1920 +56560 1485 1529 +56560 1683 1890 +56560 1767 1489 +56560 1681 1890 +56560 1627 1461 +56560 1547 1716 +56560 1912 1916 +56560 1681 1683 +56560 1650 1668 +56580 1539 1772 +56580 1544 1890 +56580 1544 1683 +56580 1655 1792 +56580 1655 1885 +56580 1684 1526 +56580 1825 1919 +56580 1884 1527 +56580 1593 1787 +56580 1627 1441 +56580 1703 1863 +56580 1441 1461 +56580 1819 1920 +56580 1840 1489 +56580 1485 1529 +56580 1683 1890 +56580 1767 1489 +56580 1681 1890 +56580 1627 1461 +56580 1547 1716 +56580 1912 1916 +56580 1681 1683 +56580 1650 1668 +56600 1593 1521 +56600 1593 1787 +56600 1627 1441 +56600 1655 1924 +56600 1703 1863 +56600 1787 1521 +56600 1441 1461 +56600 1553 1890 +56600 1819 1920 +56600 1840 1489 +56600 1485 1529 +56600 1683 1890 +56600 1767 1489 +56600 1681 1890 +56600 1617 1857 +56600 1627 1461 +56600 1547 1716 +56600 1912 1916 +56600 1681 1683 +56600 1650 1668 +56620 1538 1524 +56620 1539 1772 +56620 1553 1890 +56620 1819 1920 +56620 1825 1884 +56620 1840 1489 +56620 1892 1477 +56620 1485 1529 +56620 1683 1890 +56620 1767 1489 +56620 1681 1890 +56620 1617 1857 +56620 1683 1825 +56620 1627 1461 +56620 1892 1898 +56620 1547 1808 +56620 1547 1716 +56620 1898 1477 +56620 1912 1916 +56620 1681 1683 +56620 1650 1668 +56640 1545 1430 +56640 1683 1890 +56640 1767 1489 +56640 1825 1890 +56640 1527 1532 +56640 1681 1825 +56640 1681 1890 +56640 1703 1863 +56640 1617 1857 +56640 1683 1825 +56640 1593 1521 +56640 1627 1441 +56640 1627 1461 +56640 1441 1461 +56640 1892 1898 +56640 1547 1808 +56640 1547 1716 +56640 1898 1477 +56640 1912 1916 +56640 1681 1683 +56640 1650 1668 +56660 1538 1524 +56660 1599 1463 +56660 1655 1463 +56660 1681 1825 +56660 1681 1890 +56660 1703 1863 +56660 1716 1808 +56660 1617 1857 +56660 1683 1825 +56660 1593 1521 +56660 1599 1655 +56660 1627 1441 +56660 1627 1461 +56660 1441 1461 +56660 1460 1499 +56660 1892 1898 +56660 1547 1808 +56660 1547 1716 +56660 1898 1477 +56660 1912 1916 +56660 1599 1890 +56660 1681 1683 +56660 1650 1668 +56680 1617 1857 +56680 1683 1825 +56680 1593 1521 +56680 1599 1655 +56680 1627 1441 +56680 1627 1461 +56680 1441 1461 +56680 1460 1499 +56680 1469 1498 +56680 1892 1898 +56680 1485 1529 +56680 1819 1920 +56680 1547 1808 +56680 1547 1716 +56680 1890 1655 +56680 1898 1477 +56680 1912 1916 +56680 1599 1890 +56680 1681 1683 +56680 1650 1668 +56700 1593 1521 +56700 1599 1655 +56700 1627 1441 +56700 1627 1461 +56700 1441 1461 +56700 1460 1499 +56700 1469 1498 +56700 1539 1772 +56700 1892 1898 +56700 1892 1477 +56700 1485 1529 +56700 1684 1526 +56700 1819 1920 +56700 1547 1808 +56700 1547 1716 +56700 1890 1655 +56700 1898 1477 +56700 1912 1916 +56700 1599 1890 +56700 1681 1683 +56700 1650 1668 +56720 1539 1772 +56720 1857 1874 +56720 1892 1898 +56720 1892 1477 +56720 1485 1529 +56720 1678 1461 +56720 1681 1825 +56720 1683 1825 +56720 1684 1526 +56720 1819 1920 +56720 1857 1441 +56720 1547 1808 +56720 1547 1716 +56720 1890 1655 +56720 1617 1857 +56720 1898 1477 +56720 1912 1916 +56720 1703 1863 +56720 1599 1890 +56720 1681 1683 +56720 1650 1668 +56740 1617 1441 +56740 1678 1461 +56740 1681 1825 +56740 1683 1825 +56740 1684 1526 +56740 1716 1808 +56740 1819 1920 +56740 1840 1489 +56740 1857 1441 +56740 1898 1919 +56740 1538 1524 +56740 1627 1461 +56740 1547 1808 +56740 1547 1716 +56740 1890 1655 +56740 1617 1857 +56740 1898 1477 +56740 1912 1916 +56740 1703 1863 +56740 1599 1890 +56740 1681 1683 +56740 1464 1489 +56740 1650 1668 +56760 1538 1524 +56760 1627 1461 +56760 1669 1754 +56760 1683 1519 +56760 1825 1519 +56760 1547 1808 +56760 1547 1716 +56760 1890 1655 +56760 1617 1857 +56760 1898 1892 +56760 1898 1477 +56760 1599 1655 +56760 1912 1916 +56760 1703 1863 +56760 1599 1890 +56760 1681 1683 +56760 1464 1489 +56760 1650 1668 +56780 1920 1819 +56780 1599 1898 +56780 1499 1460 +56780 1547 1808 +56780 1547 1716 +56780 1549 1519 +56780 1890 1655 +56780 1617 1857 +56780 1898 1892 +56780 1898 1477 +56780 1599 1655 +56780 1912 1916 +56780 1703 1863 +56780 1599 1890 +56780 1681 1683 +56780 1464 1489 +56780 1650 1668 +56800 1547 1808 +56800 1547 1716 +56800 1549 1519 +56800 1681 1519 +56800 1485 1529 +56800 1549 1919 +56800 1890 1655 +56800 1617 1857 +56800 1898 1892 +56800 1898 1477 +56800 1599 1655 +56800 1825 1919 +56800 1912 1916 +56800 1477 1892 +56800 1703 1863 +56800 1599 1890 +56800 1681 1683 +56800 1464 1489 +56800 1650 1668 +56820 1549 1919 +56820 1890 1655 +56820 1683 1519 +56820 1683 1919 +56820 1617 1857 +56820 1898 1892 +56820 1898 1477 +56820 1519 1919 +56820 1599 1655 +56820 1825 1919 +56820 1912 1916 +56820 1538 1524 +56820 1460 1499 +56820 1477 1892 +56820 1703 1863 +56820 1599 1890 +56820 1681 1683 +56820 1464 1489 +56820 1650 1668 +56840 1681 1919 +56840 1683 1519 +56840 1683 1919 +56840 1840 1464 +56840 1617 1857 +56840 1598 1659 +56840 1599 1756 +56840 1898 1892 +56840 1898 1477 +56840 1519 1919 +56840 1599 1655 +56840 1825 1919 +56840 1912 1916 +56840 1538 1524 +56840 1547 1808 +56840 1460 1499 +56840 1593 1521 +56840 1477 1892 +56840 1703 1863 +56840 1599 1890 +56840 1547 1716 +56840 1840 1489 +56840 1681 1683 +56840 1464 1489 +56840 1650 1668 +56860 1920 1819 +56860 1669 1754 +56860 1598 1600 +56860 1825 1519 +56860 1898 1892 +56860 1898 1477 +56860 1617 1441 +56860 1519 1919 +56860 1599 1655 +56860 1825 1919 +56860 1912 1916 +56860 1538 1524 +56860 1547 1808 +56860 1460 1499 +56860 1593 1521 +56860 1477 1892 +56860 1703 1863 +56860 1599 1890 +56860 1547 1716 +56860 1840 1489 +56860 1681 1683 +56860 1464 1489 +56860 1650 1668 +56880 1684 1857 +56880 1825 1519 +56880 1898 1892 +56880 1898 1477 +56880 1469 1498 +56880 1617 1441 +56880 1519 1919 +56880 1599 1655 +56880 1825 1919 +56880 1912 1916 +56880 1538 1524 +56880 1547 1808 +56880 1460 1499 +56880 1593 1521 +56880 1477 1892 +56880 1703 1863 +56880 1544 1598 +56880 1599 1890 +56880 1547 1716 +56880 1840 1489 +56880 1681 1683 +56880 1464 1489 +56880 1650 1668 +56900 1683 1825 +56900 1583 1825 +56900 1599 1655 +56900 1890 1655 +56900 1825 1919 +56900 1912 1916 +56900 1538 1524 +56900 1547 1808 +56900 1890 1519 +56900 1460 1499 +56900 1593 1521 +56900 1477 1892 +56900 1703 1863 +56900 1544 1598 +56900 1599 1890 +56900 1547 1716 +56900 1840 1489 +56900 1681 1683 +56900 1464 1489 +56900 1650 1668 +56920 1808 1716 +56920 1583 1919 +56920 1469 1498 +56920 1599 1772 +56920 1683 1919 +56920 1684 1617 +56920 1825 1919 +56920 1912 1916 +56920 1538 1524 +56920 1547 1808 +56920 1890 1519 +56920 1441 1857 +56920 1460 1499 +56920 1669 1754 +56920 1593 1521 +56920 1477 1892 +56920 1703 1863 +56920 1544 1598 +56920 1599 1890 +56920 1547 1716 +56920 1840 1489 +56920 1681 1683 +56920 1464 1489 +56920 1650 1668 +56940 1683 1919 +56940 1684 1617 +56940 1825 1919 +56940 1599 1519 +56940 1912 1916 +56940 1538 1524 +56940 1547 1808 +56940 1890 1519 +56940 1777 1655 +56940 1441 1857 +56940 1460 1499 +56940 1669 1754 +56940 1840 1464 +56940 1593 1521 +56940 1477 1892 +56940 1703 1863 +56940 1544 1598 +56940 1599 1890 +56940 1547 1716 +56940 1840 1489 +56940 1681 1683 +56940 1464 1489 +56940 1650 1668 +56960 1538 1524 +56960 1547 1808 +56960 1890 1519 +56960 1777 1655 +56960 1437 1582 +56960 1840 1919 +56960 1681 1599 +56960 1441 1857 +56960 1460 1499 +56960 1669 1754 +56960 1840 1464 +56960 1593 1521 +56960 1477 1892 +56960 1681 1890 +56960 1703 1863 +56960 1544 1598 +56960 1599 1890 +56960 1547 1716 +56960 1857 1617 +56960 1683 1599 +56960 1840 1489 +56960 1681 1683 +56960 1683 1890 +56960 1464 1489 +56960 1650 1668 +56980 1808 1716 +56980 1437 1582 +56980 1825 1519 +56980 1840 1919 +56980 1599 1519 +56980 1681 1599 +56980 1441 1857 +56980 1460 1499 +56980 1669 1754 +56980 1840 1464 +56980 1593 1521 +56980 1477 1892 +56980 1681 1890 +56980 1703 1863 +56980 1544 1598 +56980 1599 1890 +56980 1916 1912 +56980 1547 1716 +56980 1441 1919 +56980 1857 1617 +56980 1683 1599 +56980 1840 1489 +56980 1681 1683 +56980 1683 1890 +56980 1464 1489 +56980 1650 1668 +57000 1920 1819 +57000 1681 1599 +57000 1441 1857 +57000 1460 1499 +57000 1857 1919 +57000 1519 1525 +57000 1669 1754 +57000 1840 1464 +57000 1593 1521 +57000 1477 1892 +57000 1617 1919 +57000 1681 1890 +57000 1703 1863 +57000 1544 1598 +57000 1599 1890 +57000 1916 1912 +57000 1547 1716 +57000 1441 1919 +57000 1857 1617 +57000 1683 1599 +57000 1840 1489 +57000 1681 1683 +57000 1683 1890 +57000 1464 1489 +57000 1650 1668 +57020 1669 1754 +57020 1819 1598 +57020 1437 1582 +57020 1825 1525 +57020 1840 1464 +57020 1593 1521 +57020 1477 1892 +57020 1617 1919 +57020 1681 1890 +57020 1703 1863 +57020 1544 1598 +57020 1599 1890 +57020 1916 1912 +57020 1547 1808 +57020 1547 1716 +57020 1441 1919 +57020 1857 1617 +57020 1683 1599 +57020 1840 1489 +57020 1681 1683 +57020 1683 1890 +57020 1464 1489 +57020 1650 1668 +57040 1681 1599 +57040 1600 1659 +57040 1681 1890 +57040 1825 1890 +57040 1703 1863 +57040 1544 1598 +57040 1599 1890 +57040 1681 1825 +57040 1683 1825 +57040 1599 1825 +57040 1916 1912 +57040 1547 1808 +57040 1547 1716 +57040 1441 1919 +57040 1892 1898 +57040 1857 1617 +57040 1683 1599 +57040 1840 1489 +57040 1681 1683 +57040 1683 1890 +57040 1464 1489 +57040 1650 1668 +57060 1920 1544 +57060 1920 1600 +57060 1681 1890 +57060 1825 1890 +57060 1703 1863 +57060 1840 1464 +57060 1920 1598 +57060 1544 1598 +57060 1441 1783 +57060 1599 1890 +57060 1681 1825 +57060 1683 1825 +57060 1599 1825 +57060 1916 1912 +57060 1547 1808 +57060 1547 1716 +57060 1477 1898 +57060 1441 1919 +57060 1892 1898 +57060 1857 1617 +57060 1683 1599 +57060 1840 1489 +57060 1920 1819 +57060 1924 1655 +57060 1681 1683 +57060 1683 1890 +57060 1464 1489 +57060 1650 1668 +57080 1920 1598 +57080 1544 1598 +57080 1808 1716 +57080 1441 1783 +57080 1599 1890 +57080 1600 1519 +57080 1681 1825 +57080 1683 1825 +57080 1599 1825 +57080 1916 1912 +57080 1547 1808 +57080 1547 1716 +57080 1681 1599 +57080 1477 1898 +57080 1441 1919 +57080 1892 1898 +57080 1857 1617 +57080 1683 1599 +57080 1840 1489 +57080 1920 1819 +57080 1924 1655 +57080 1681 1683 +57080 1683 1890 +57080 1464 1489 +57080 1650 1668 +57100 1681 1825 +57100 1683 1825 +57100 1692 1660 +57100 1599 1825 +57100 1916 1912 +57100 1547 1808 +57100 1547 1716 +57100 1681 1599 +57100 1477 1898 +57100 1441 1919 +57100 1892 1898 +57100 1857 1617 +57100 1478 1655 +57100 1683 1599 +57100 1840 1489 +57100 1920 1819 +57100 1924 1655 +57100 1703 1863 +57100 1477 1892 +57100 1681 1683 +57100 1683 1890 +57100 1464 1489 +57100 1650 1668 +57120 1924 1599 +57120 1547 1808 +57120 1808 1716 +57120 1681 1890 +57120 1825 1890 +57120 1825 1655 +57120 1825 1583 +57120 1460 1499 +57120 1547 1716 +57120 1681 1599 +57120 1477 1898 +57120 1441 1919 +57120 1892 1898 +57120 1857 1617 +57120 1478 1655 +57120 1683 1599 +57120 1840 1489 +57120 1920 1819 +57120 1924 1655 +57120 1703 1863 +57120 1477 1892 +57120 1681 1683 +57120 1683 1890 +57120 1544 1600 +57120 1599 1890 +57120 1464 1489 +57120 1650 1668 +57140 1544 1525 +57140 1547 1716 +57140 1681 1599 +57140 1683 1924 +57140 1924 1460 +57140 1460 1655 +57140 1477 1898 +57140 1441 1919 +57140 1892 1898 +57140 1441 1617 +57140 1857 1617 +57140 1478 1655 +57140 1669 1754 +57140 1683 1599 +57140 1840 1489 +57140 1920 1819 +57140 1924 1478 +57140 1924 1655 +57140 1703 1863 +57140 1477 1892 +57140 1681 1683 +57140 1683 1890 +57140 1544 1600 +57140 1599 1890 +57140 1464 1489 +57140 1650 1668 +57160 1808 1716 +57160 1694 1724 +57160 1441 1617 +57160 1441 1857 +57160 1857 1617 +57160 1478 1655 +57160 1669 1754 +57160 1681 1890 +57160 1683 1599 +57160 1840 1489 +57160 1920 1819 +57160 1924 1478 +57160 1924 1655 +57160 1703 1863 +57160 1477 1892 +57160 1681 1683 +57160 1683 1890 +57160 1544 1600 +57160 1825 1525 +57160 1599 1890 +57160 1464 1489 +57160 1650 1668 +57180 1669 1754 +57180 1546 1548 +57180 1549 1825 +57180 1681 1890 +57180 1683 1599 +57180 1840 1489 +57180 1920 1819 +57180 1924 1478 +57180 1924 1655 +57180 1703 1863 +57180 1477 1892 +57180 1681 1683 +57180 1683 1890 +57180 1681 1599 +57180 1544 1600 +57180 1825 1525 +57180 1599 1890 +57180 1464 1489 +57180 1650 1668 +57200 1668 1463 +57200 1478 1655 +57200 1617 1441 +57200 1683 1599 +57200 1840 1489 +57200 1920 1819 +57200 1924 1478 +57200 1924 1655 +57200 1703 1863 +57200 1857 1441 +57200 1477 1892 +57200 1681 1683 +57200 1683 1890 +57200 1547 1716 +57200 1681 1599 +57200 1544 1600 +57200 1825 1525 +57200 1599 1890 +57200 1464 1489 +57200 1650 1668 +57220 1683 1599 +57220 1840 1464 +57220 1840 1489 +57220 1599 1655 +57220 1920 1819 +57220 1549 1525 +57220 1924 1478 +57220 1924 1655 +57220 1703 1863 +57220 1857 1441 +57220 1477 1892 +57220 1681 1890 +57220 1681 1683 +57220 1683 1890 +57220 1547 1716 +57220 1681 1599 +57220 1900 1754 +57220 1544 1600 +57220 1825 1525 +57220 1599 1890 +57220 1464 1489 +57220 1650 1668 +57240 1920 1819 +57240 1920 1598 +57240 1549 1825 +57240 1549 1525 +57240 1924 1478 +57240 1924 1655 +57240 1669 1754 +57240 1703 1863 +57240 1857 1441 +57240 1477 1892 +57240 1681 1890 +57240 1681 1683 +57240 1683 1890 +57240 1547 1716 +57240 1681 1599 +57240 1900 1754 +57240 1544 1600 +57240 1825 1525 +57240 1599 1890 +57240 1464 1489 +57240 1547 1808 +57240 1650 1668 +57260 1924 1655 +57260 1669 1754 +57260 1692 1660 +57260 1703 1863 +57260 1600 1655 +57260 1857 1441 +57260 1477 1892 +57260 1783 1526 +57260 1538 1524 +57260 1544 1519 +57260 1681 1890 +57260 1681 1683 +57260 1683 1600 +57260 1683 1890 +57260 1683 1599 +57260 1683 1655 +57260 1547 1716 +57260 1681 1599 +57260 1599 1655 +57260 1890 1655 +57260 1920 1671 +57260 1900 1754 +57260 1544 1600 +57260 1825 1525 +57260 1599 1890 +57260 1464 1489 +57260 1547 1808 +57260 1650 1668 +57280 1538 1524 +57280 1544 1519 +57280 1681 1600 +57280 1681 1890 +57280 1681 1683 +57280 1683 1600 +57280 1683 1890 +57280 1683 1599 +57280 1683 1655 +57280 1840 1489 +57280 1599 1600 +57280 1547 1716 +57280 1808 1716 +57280 1681 1655 +57280 1681 1599 +57280 1599 1655 +57280 1890 1655 +57280 1920 1671 +57280 1900 1754 +57280 1544 1600 +57280 1825 1525 +57280 1599 1890 +57280 1464 1489 +57280 1547 1808 +57280 1650 1668 +57300 1671 1819 +57300 1772 1703 +57300 1547 1716 +57300 1808 1716 +57300 1553 1655 +57300 1681 1655 +57300 1681 1599 +57300 1583 1655 +57300 1599 1655 +57300 1600 1519 +57300 1890 1655 +57300 1920 1671 +57300 1900 1754 +57300 1437 1857 +57300 1477 1892 +57300 1544 1600 +57300 1825 1525 +57300 1599 1890 +57300 1464 1489 +57300 1703 1863 +57300 1547 1808 +57300 1650 1668 +57320 1920 1671 +57320 1538 1524 +57320 1900 1754 +57320 1684 1526 +57320 1813 1598 +57320 1437 1857 +57320 1437 1617 +57320 1599 1600 +57320 1477 1892 +57320 1469 1498 +57320 1669 1754 +57320 1544 1600 +57320 1857 1617 +57320 1825 1525 +57320 1599 1890 +57320 1464 1489 +57320 1840 1489 +57320 1703 1863 +57320 1547 1808 +57320 1650 1668 +57340 1920 1598 +57340 1669 1754 +57340 1544 1600 +57340 1549 1525 +57340 1808 1716 +57340 1441 1857 +57340 1600 1519 +57340 1825 1884 +57340 1857 1617 +57340 1825 1525 +57340 1599 1890 +57340 1464 1489 +57340 1840 1489 +57340 1441 1617 +57340 1547 1716 +57340 1703 1863 +57340 1547 1808 +57340 1650 1668 +57360 1920 1819 +57360 1825 1884 +57360 1463 1628 +57360 1857 1617 +57360 1469 1498 +57360 1884 1525 +57360 1825 1525 +57360 1544 1890 +57360 1599 1890 +57360 1464 1489 +57360 1840 1489 +57360 1441 1617 +57360 1547 1716 +57360 1703 1863 +57360 1547 1808 +57360 1650 1668 +57380 1538 1524 +57380 1671 1819 +57380 1825 1525 +57380 1598 1772 +57380 1600 1890 +57380 1544 1890 +57380 1544 1599 +57380 1808 1716 +57380 1583 1890 +57380 1599 1890 +57380 1600 1519 +57380 1477 1898 +57380 1920 1671 +57380 1464 1489 +57380 1840 1489 +57380 1441 1617 +57380 1547 1716 +57380 1703 1863 +57380 1669 1754 +57380 1547 1808 +57380 1890 1519 +57380 1650 1668 +57400 1544 1890 +57400 1544 1549 +57400 1544 1599 +57400 1808 1716 +57400 1452 1598 +57400 1583 1890 +57400 1599 1890 +57400 1600 1519 +57400 1477 1898 +57400 1920 1671 +57400 1464 1489 +57400 1840 1489 +57400 1441 1617 +57400 1469 1498 +57400 1857 1617 +57400 1547 1716 +57400 1920 1819 +57400 1703 1863 +57400 1669 1754 +57400 1547 1808 +57400 1890 1519 +57400 1650 1668 +57420 1920 1671 +57420 1538 1524 +57420 1668 1628 +57420 1692 1660 +57420 1449 1787 +57420 1464 1489 +57420 1600 1890 +57420 1655 1512 +57420 1840 1489 +57420 1477 1892 +57420 1617 1526 +57420 1441 1857 +57420 1441 1526 +57420 1441 1617 +57420 1469 1498 +57420 1857 1526 +57420 1857 1617 +57420 1547 1716 +57420 1920 1819 +57420 1703 1863 +57420 1669 1754 +57420 1547 1808 +57420 1890 1519 +57420 1650 1668 +57440 1549 1890 +57440 1825 1890 +57440 1840 1489 +57440 1600 1884 +57440 1477 1892 +57440 1617 1526 +57440 1549 1519 +57440 1441 1857 +57440 1441 1526 +57440 1441 1617 +57440 1583 1890 +57440 1469 1498 +57440 1857 1526 +57440 1857 1617 +57440 1547 1716 +57440 1477 1898 +57440 1920 1819 +57440 1544 1599 +57440 1703 1863 +57440 1669 1754 +57440 1547 1808 +57440 1890 1519 +57440 1650 1668 +57460 1549 1519 +57460 1441 1857 +57460 1441 1526 +57460 1441 1617 +57460 1583 1890 +57460 1469 1498 +57460 1600 1890 +57460 1857 1526 +57460 1857 1617 +57460 1890 1783 +57460 1890 1884 +57460 1547 1716 +57460 1477 1898 +57460 1920 1819 +57460 1544 1599 +57460 1703 1863 +57460 1669 1754 +57460 1547 1808 +57460 1890 1519 +57460 1650 1668 +57480 1547 1716 +57480 1825 1890 +57480 1628 1463 +57480 1477 1898 +57480 1920 1819 +57480 1544 1599 +57480 1703 1863 +57480 1669 1754 +57480 1547 1808 +57480 1890 1519 +57480 1840 1489 +57480 1650 1668 +57500 1920 1819 +57500 1544 1599 +57500 1668 1628 +57500 1599 1890 +57500 1857 1617 +57500 1857 1489 +57500 1692 1660 +57500 1703 1863 +57500 1549 1890 +57500 1669 1754 +57500 1547 1808 +57500 1890 1519 +57500 1840 1489 +57500 1650 1668 +57520 1538 1524 +57520 1692 1660 +57520 1825 1469 +57520 1583 1599 +57520 1600 1890 +57520 1617 1526 +57520 1441 1617 +57520 1703 1863 +57520 1549 1890 +57520 1547 1716 +57520 1669 1754 +57520 1547 1808 +57520 1890 1519 +57520 1840 1489 +57520 1650 1668 +57540 1808 1716 +57540 1441 1617 +57540 1703 1863 +57540 1593 1787 +57540 1549 1890 +57540 1547 1716 +57540 1669 1754 +57540 1547 1808 +57540 1890 1519 +57540 1840 1489 +57540 1650 1668 +57560 1549 1890 +57560 1628 1463 +57560 1600 1519 +57560 1547 1716 +57560 1600 1890 +57560 1669 1754 +57560 1547 1808 +57560 1628 1598 +57560 1890 1519 +57560 1840 1489 +57560 1650 1668 +57580 1668 1598 +57580 1668 1463 +57580 1547 1716 +57580 1684 1660 +57580 1692 1489 +57580 1463 1650 +57580 1599 1825 +57580 1600 1825 +57580 1600 1890 +57580 1825 1890 +57580 1703 1863 +57580 1669 1754 +57580 1547 1808 +57580 1544 1599 +57580 1808 1716 +57580 1628 1598 +57580 1890 1519 +57580 1840 1489 +57580 1650 1668 +57600 1668 1628 +57600 1549 1890 +57600 1600 1825 +57600 1600 1890 +57600 1825 1890 +57600 1884 1890 +57600 1774 1655 +57600 1660 1628 +57600 1703 1863 +57600 1692 1598 +57600 1463 1660 +57600 1598 1660 +57600 1600 1519 +57600 1669 1754 +57600 1547 1808 +57600 1692 1660 +57600 1544 1599 +57600 1808 1716 +57600 1599 1525 +57600 1628 1598 +57600 1890 1519 +57600 1840 1489 +57600 1650 1668 +57620 1703 1863 +57620 1692 1628 +57620 1692 1754 +57620 1692 1598 +57620 1692 1463 +57620 1463 1660 +57620 1598 1660 +57620 1600 1519 +57620 1669 1754 +57620 1538 1524 +57620 1547 1808 +57620 1692 1660 +57620 1544 1599 +57620 1547 1716 +57620 1808 1716 +57620 1599 1525 +57620 1628 1598 +57620 1890 1519 +57620 1840 1489 +57620 1650 1668 +57640 1669 1754 +57640 1825 1600 +57640 1825 1890 +57640 1825 1884 +57640 1884 1890 +57640 1538 1524 +57640 1547 1808 +57640 1692 1660 +57640 1544 1599 +57640 1547 1716 +57640 1808 1716 +57640 1884 1600 +57640 1599 1525 +57640 1628 1598 +57640 1857 1617 +57640 1890 1519 +57640 1840 1489 +57640 1600 1890 +57640 1650 1668 +57660 1538 1524 +57660 1547 1808 +57660 1684 1464 +57660 1692 1660 +57660 1544 1599 +57660 1547 1716 +57660 1808 1716 +57660 1884 1600 +57660 1599 1525 +57660 1628 1598 +57660 1857 1617 +57660 1549 1890 +57660 1890 1519 +57660 1840 1489 +57660 1600 1890 +57660 1650 1668 +57680 1544 1599 +57680 1547 1716 +57680 1808 1716 +57680 1825 1600 +57680 1884 1600 +57680 1599 1525 +57680 1600 1519 +57680 1628 1598 +57680 1857 1617 +57680 1703 1863 +57680 1549 1890 +57680 1890 1519 +57680 1840 1489 +57680 1669 1754 +57680 1600 1890 +57680 1650 1668 +57700 1538 1857 +57700 1547 1808 +57700 1692 1660 +57700 1628 1598 +57700 1617 1524 +57700 1538 1524 +57700 1857 1617 +57700 1857 1524 +57700 1703 1863 +57700 1549 1890 +57700 1890 1519 +57700 1840 1489 +57700 1669 1754 +57700 1600 1890 +57700 1650 1668 +57720 1538 1617 +57720 1538 1524 +57720 1808 1716 +57720 1825 1600 +57720 1857 1617 +57720 1857 1524 +57720 1703 1863 +57720 1549 1890 +57720 1890 1519 +57720 1840 1489 +57720 1669 1754 +57720 1600 1890 +57720 1650 1668 +57740 1544 1549 +57740 1547 1808 +57740 1703 1863 +57740 1549 1553 +57740 1549 1890 +57740 1825 1884 +57740 1890 1519 +57740 1840 1489 +57740 1669 1754 +57740 1600 1890 +57740 1650 1668 +57760 1703 1863 +57760 1549 1553 +57760 1549 1890 +57760 1825 1890 +57760 1825 1884 +57760 1520 1660 +57760 1538 1524 +57760 1890 1519 +57760 1884 1890 +57760 1617 1524 +57760 1840 1489 +57760 1600 1884 +57760 1692 1660 +57760 1669 1754 +57760 1600 1890 +57760 1650 1668 +57780 1538 1524 +57780 1890 1519 +57780 1825 1600 +57780 1884 1890 +57780 1547 1808 +57780 1617 1524 +57780 1840 1489 +57780 1600 1884 +57780 1692 1660 +57780 1669 1754 +57780 1600 1890 +57780 1650 1668 +57800 1553 1890 +57800 1553 1599 +57800 1825 1600 +57800 1884 1890 +57800 1547 1808 +57800 1617 1524 +57800 1598 1783 +57800 1840 1489 +57800 1600 1884 +57800 1692 1660 +57800 1599 1918 +57800 1669 1754 +57800 1600 1890 +57800 1650 1668 +57820 1538 1524 +57820 1547 1808 +57820 1825 1884 +57820 1593 1787 +57820 1617 1524 +57820 1598 1783 +57820 1840 1489 +57820 1600 1884 +57820 1692 1660 +57820 1599 1918 +57820 1669 1754 +57820 1600 1890 +57820 1441 1634 +57820 1650 1668 +57840 1598 1918 +57840 1598 1783 +57840 1549 1825 +57840 1825 1600 +57840 1840 1489 +57840 1600 1884 +57840 1692 1660 +57840 1599 1918 +57840 1669 1754 +57840 1600 1890 +57840 1441 1634 +57840 1650 1668 +57860 1549 1825 +57860 1724 1857 +57860 1599 1525 +57860 1825 1600 +57860 1825 1884 +57860 1840 1489 +57860 1600 1884 +57860 1617 1524 +57860 1692 1660 +57860 1538 1524 +57860 1599 1918 +57860 1669 1754 +57860 1600 1890 +57860 1441 1634 +57860 1650 1668 +57880 1544 1599 +57880 1825 1600 +57880 1825 1884 +57880 1840 1489 +57880 1851 1521 +57880 1772 1787 +57880 1600 1884 +57880 1617 1524 +57880 1692 1660 +57880 1538 1524 +57880 1599 1918 +57880 1669 1754 +57880 1600 1890 +57880 1441 1634 +57880 1650 1668 +57900 1772 1787 +57900 1808 1582 +57900 1840 1724 +57900 1600 1884 +57900 1617 1524 +57900 1547 1808 +57900 1593 1521 +57900 1549 1825 +57900 1692 1660 +57900 1851 1772 +57900 1538 1524 +57900 1599 1918 +57900 1669 1754 +57900 1600 1890 +57900 1441 1634 +57900 1890 1519 +57900 1547 1582 +57900 1650 1668 +57920 1544 1918 +57920 1544 1599 +57920 1547 1808 +57920 1840 1489 +57920 1593 1521 +57920 1593 1851 +57920 1549 1825 +57920 1692 1660 +57920 1851 1772 +57920 1600 1825 +57920 1475 1655 +57920 1538 1524 +57920 1671 1598 +57920 1825 1890 +57920 1599 1918 +57920 1669 1754 +57920 1600 1890 +57920 1441 1634 +57920 1890 1519 +57920 1547 1582 +57920 1650 1668 +57940 1924 1478 +57940 1549 1825 +57940 1692 1660 +57940 1851 1772 +57940 1600 1825 +57940 1600 1519 +57940 1475 1655 +57940 1538 1524 +57940 1671 1598 +57940 1544 1525 +57940 1825 1890 +57940 1599 1918 +57940 1669 1754 +57940 1600 1890 +57940 1441 1634 +57940 1890 1519 +57940 1547 1582 +57940 1650 1668 +57960 1538 1524 +57960 1671 1598 +57960 1544 1525 +57960 1825 1890 +57960 1825 1519 +57960 1617 1524 +57960 1599 1918 +57960 1669 1754 +57960 1600 1890 +57960 1441 1634 +57960 1890 1519 +57960 1547 1582 +57960 1650 1668 +57980 1825 1600 +57980 1699 1598 +57980 1617 1524 +57980 1599 1918 +57980 1669 1754 +57980 1692 1660 +57980 1547 1808 +57980 1600 1890 +57980 1441 1634 +57980 1890 1519 +57980 1547 1582 +57980 1650 1668 +58000 1671 1598 +58000 1655 1660 +58000 1617 1524 +58000 1599 1918 +58000 1669 1754 +58000 1600 1884 +58000 1692 1660 +58000 1698 1707 +58000 1547 1808 +58000 1600 1890 +58000 1441 1634 +58000 1890 1519 +58000 1547 1582 +58000 1650 1668 +58020 1825 1884 +58020 1684 1489 +58020 1707 1764 +58020 1544 1600 +58020 1544 1890 +58020 1599 1918 +58020 1669 1754 +58020 1600 1884 +58020 1544 1825 +58020 1549 1825 +58020 1692 1660 +58020 1698 1707 +58020 1547 1808 +58020 1600 1890 +58020 1441 1634 +58020 1890 1519 +58020 1547 1582 +58020 1650 1668 +58040 1544 1600 +58040 1544 1890 +58040 1684 1857 +58040 1825 1600 +58040 1599 1918 +58040 1538 1524 +58040 1669 1754 +58040 1600 1884 +58040 1544 1825 +58040 1549 1825 +58040 1692 1660 +58040 1698 1707 +58040 1547 1808 +58040 1600 1890 +58040 1441 1634 +58040 1599 1655 +58040 1890 1519 +58040 1547 1582 +58040 1650 1668 +58060 1538 1524 +58060 1669 1754 +58060 1549 1463 +58060 1600 1884 +58060 1884 1519 +58060 1671 1699 +58060 1544 1825 +58060 1549 1825 +58060 1692 1660 +58060 1698 1707 +58060 1825 1884 +58060 1547 1808 +58060 1600 1890 +58060 1441 1634 +58060 1599 1655 +58060 1890 1519 +58060 1547 1582 +58060 1650 1668 +58080 1671 1699 +58080 1544 1825 +58080 1549 1825 +58080 1684 1857 +58080 1692 1660 +58080 1698 1707 +58080 1825 1884 +58080 1890 1884 +58080 1547 1808 +58080 1600 1890 +58080 1441 1634 +58080 1825 1600 +58080 1601 1911 +58080 1851 1787 +58080 1599 1655 +58080 1890 1519 +58080 1547 1582 +58080 1650 1668 +58100 1920 1601 +58100 1547 1808 +58100 1600 1890 +58100 1441 1634 +58100 1544 1600 +58100 1825 1600 +58100 1601 1911 +58100 1851 1787 +58100 1599 1655 +58100 1890 1519 +58100 1547 1582 +58100 1650 1668 +58120 1544 1600 +58120 1825 1600 +58120 1600 1519 +58120 1920 1911 +58120 1684 1617 +58120 1707 1764 +58120 1601 1911 +58120 1851 1787 +58120 1599 1655 +58120 1890 1519 +58120 1671 1699 +58120 1617 1857 +58120 1547 1582 +58120 1650 1668 +58140 1920 1911 +58140 1544 1890 +58140 1553 1599 +58140 1684 1617 +58140 1692 1660 +58140 1692 1582 +58140 1707 1764 +58140 1601 1911 +58140 1684 1857 +58140 1851 1787 +58140 1599 1655 +58140 1890 1519 +58140 1671 1699 +58140 1547 1808 +58140 1441 1634 +58140 1617 1857 +58140 1547 1582 +58140 1840 1489 +58140 1698 1707 +58140 1650 1668 +58160 1684 1857 +58160 1924 1599 +58160 1851 1787 +58160 1599 1655 +58160 1890 1519 +58160 1671 1699 +58160 1547 1808 +58160 1441 1634 +58160 1617 1857 +58160 1547 1582 +58160 1840 1489 +58160 1698 1707 +58160 1650 1668 +58180 1544 1890 +58180 1698 1764 +58180 1890 1519 +58180 1671 1699 +58180 1684 1660 +58180 1707 1764 +58180 1547 1808 +58180 1544 1463 +58180 1441 1634 +58180 1911 1601 +58180 1617 1857 +58180 1684 1692 +58180 1692 1660 +58180 1547 1582 +58180 1840 1489 +58180 1698 1707 +58180 1650 1668 +58200 1671 1699 +58200 1684 1660 +58200 1692 1582 +58200 1825 1890 +58200 1707 1764 +58200 1600 1890 +58200 1544 1884 +58200 1547 1808 +58200 1544 1463 +58200 1441 1634 +58200 1911 1601 +58200 1617 1857 +58200 1684 1692 +58200 1692 1660 +58200 1547 1582 +58200 1840 1489 +58200 1698 1707 +58200 1650 1668 +58220 1920 1911 +58220 1544 1884 +58220 1547 1808 +58220 1544 1463 +58220 1441 1634 +58220 1911 1601 +58220 1617 1857 +58220 1684 1692 +58220 1692 1660 +58220 1547 1582 +58220 1698 1764 +58220 1840 1489 +58220 1698 1707 +58220 1650 1668 +58240 1544 1884 +58240 1547 1808 +58240 1544 1463 +58240 1441 1634 +58240 1911 1601 +58240 1600 1526 +58240 1617 1857 +58240 1684 1692 +58240 1692 1660 +58240 1547 1582 +58240 1698 1764 +58240 1840 1489 +58240 1698 1707 +58240 1650 1668 +58260 1920 1911 +58260 1671 1699 +58260 1544 1890 +58260 1544 1463 +58260 1441 1634 +58260 1911 1601 +58260 1851 1787 +58260 1600 1526 +58260 1890 1519 +58260 1617 1857 +58260 1617 1634 +58260 1684 1692 +58260 1692 1660 +58260 1547 1582 +58260 1698 1764 +58260 1441 1617 +58260 1840 1489 +58260 1698 1707 +58260 1650 1668 +58280 1684 1660 +58280 1463 1650 +58280 1599 1655 +58280 1544 1884 +58280 1707 1764 +58280 1684 1692 +58280 1692 1660 +58280 1547 1582 +58280 1698 1764 +58280 1441 1617 +58280 1840 1489 +58280 1698 1707 +58280 1650 1668 +58300 1668 1463 +58300 1544 1884 +58300 1547 1808 +58300 1599 1521 +58300 1890 1519 +58300 1707 1764 +58300 1544 1890 +58300 1463 1526 +58300 1650 1526 +58300 1538 1524 +58300 1684 1692 +58300 1692 1660 +58300 1600 1890 +58300 1547 1582 +58300 1698 1764 +58300 1441 1617 +58300 1441 1634 +58300 1840 1489 +58300 1698 1707 +58300 1650 1668 +58320 1707 1764 +58320 1668 1628 +58320 1544 1890 +58320 1696 1851 +58320 1463 1526 +58320 1601 1911 +58320 1628 1650 +58320 1650 1526 +58320 1538 1524 +58320 1684 1692 +58320 1884 1600 +58320 1851 1521 +58320 1692 1660 +58320 1600 1890 +58320 1671 1699 +58320 1547 1582 +58320 1698 1764 +58320 1628 1526 +58320 1441 1617 +58320 1441 1634 +58320 1840 1489 +58320 1698 1707 +58320 1650 1668 +58340 1538 1524 +58340 1544 1519 +58340 1684 1692 +58340 1884 1600 +58340 1884 1890 +58340 1851 1521 +58340 1599 1521 +58340 1600 1519 +58340 1692 1660 +58340 1851 1593 +58340 1617 1634 +58340 1463 1628 +58340 1600 1890 +58340 1671 1699 +58340 1547 1808 +58340 1547 1582 +58340 1698 1764 +58340 1890 1519 +58340 1628 1526 +58340 1441 1617 +58340 1441 1634 +58340 1840 1489 +58340 1698 1707 +58340 1650 1668 +58360 1692 1660 +58360 1694 1900 +58360 1463 1526 +58360 1851 1593 +58360 1617 1634 +58360 1628 1650 +58360 1668 1628 +58360 1463 1628 +58360 1600 1890 +58360 1671 1699 +58360 1547 1808 +58360 1547 1582 +58360 1698 1764 +58360 1890 1519 +58360 1628 1526 +58360 1441 1617 +58360 1441 1634 +58360 1599 1655 +58360 1840 1489 +58360 1698 1707 +58360 1650 1668 +58380 1707 1764 +58380 1668 1628 +58380 1825 1890 +58380 1884 1600 +58380 1463 1628 +58380 1600 1890 +58380 1671 1699 +58380 1544 1890 +58380 1547 1808 +58380 1547 1582 +58380 1698 1764 +58380 1650 1526 +58380 1890 1519 +58380 1628 1526 +58380 1441 1617 +58380 1441 1634 +58380 1599 1655 +58380 1840 1489 +58380 1698 1707 +58380 1650 1668 +58400 1671 1699 +58400 1544 1890 +58400 1544 1519 +58400 1547 1808 +58400 1547 1582 +58400 1684 1692 +58400 1684 1660 +58400 1698 1764 +58400 1884 1519 +58400 1650 1526 +58400 1538 1524 +58400 1599 1593 +58400 1890 1519 +58400 1628 1526 +58400 1441 1617 +58400 1634 1617 +58400 1441 1634 +58400 1599 1655 +58400 1840 1489 +58400 1698 1707 +58400 1650 1668 +58420 1538 1524 +58420 1924 1593 +58420 1668 1628 +58420 1599 1593 +58420 1600 1825 +58420 1600 1890 +58420 1890 1519 +58420 1808 1582 +58420 1628 1650 +58420 1628 1526 +58420 1441 1617 +58420 1634 1617 +58420 1547 1684 +58420 1441 1634 +58420 1599 1655 +58420 1840 1489 +58420 1698 1707 +58420 1660 1692 +58420 1650 1668 +58440 1668 1526 +58440 1808 1582 +58440 1825 1519 +58440 1650 1526 +58440 1698 1764 +58440 1628 1650 +58440 1628 1526 +58440 1463 1526 +58440 1599 1521 +58440 1441 1617 +58440 1634 1617 +58440 1547 1684 +58440 1441 1634 +58440 1599 1655 +58440 1840 1489 +58440 1707 1764 +58440 1698 1707 +58440 1660 1692 +58440 1650 1668 +58460 1671 1703 +58460 1698 1764 +58460 1628 1650 +58460 1628 1526 +58460 1463 1526 +58460 1851 1787 +58460 1679 1520 +58460 1463 1628 +58460 1599 1521 +58460 1441 1617 +58460 1634 1617 +58460 1547 1684 +58460 1890 1519 +58460 1441 1634 +58460 1599 1655 +58460 1840 1489 +58460 1707 1764 +58460 1698 1707 +58460 1660 1692 +58460 1650 1668 +58480 1538 1524 +58480 1544 1890 +58480 1679 1520 +58480 1707 1659 +58480 1463 1628 +58480 1825 1519 +58480 1544 1519 +58480 1599 1521 +58480 1441 1617 +58480 1634 1617 +58480 1668 1628 +58480 1547 1684 +58480 1890 1519 +58480 1441 1634 +58480 1599 1655 +58480 1840 1489 +58480 1707 1764 +58480 1599 1484 +58480 1698 1707 +58480 1660 1692 +58480 1650 1668 +58500 1544 1519 +58500 1825 1890 +58500 1851 1787 +58500 1599 1521 +58500 1441 1617 +58500 1628 1650 +58500 1634 1617 +58500 1668 1628 +58500 1547 1684 +58500 1808 1582 +58500 1544 1884 +58500 1698 1764 +58500 1890 1519 +58500 1441 1634 +58500 1599 1655 +58500 1840 1489 +58500 1707 1764 +58500 1599 1484 +58500 1655 1484 +58500 1698 1707 +58500 1660 1692 +58500 1650 1668 +58520 1668 1628 +58520 1547 1684 +58520 1679 1520 +58520 1808 1582 +58520 1825 1519 +58520 1593 1521 +58520 1884 1519 +58520 1544 1884 +58520 1679 1575 +58520 1698 1764 +58520 1484 1521 +58520 1890 1519 +58520 1628 1526 +58520 1441 1634 +58520 1599 1655 +58520 1840 1489 +58520 1707 1764 +58520 1599 1484 +58520 1655 1484 +58520 1698 1707 +58520 1660 1692 +58520 1650 1668 +58540 1544 1884 +58540 1679 1575 +58540 1698 1764 +58540 1857 1617 +58540 1484 1521 +58540 1890 1519 +58540 1924 1593 +58540 1628 1526 +58540 1441 1634 +58540 1599 1655 +58540 1840 1489 +58540 1707 1764 +58540 1599 1484 +58540 1655 1484 +58540 1698 1707 +58540 1660 1692 +58540 1650 1668 +58560 1924 1593 +58560 1668 1628 +58560 1655 1774 +58560 1628 1650 +58560 1628 1526 +58560 1547 1808 +58560 1441 1634 +58560 1599 1655 +58560 1840 1489 +58560 1707 1764 +58560 1599 1484 +58560 1655 1484 +58560 1698 1707 +58560 1660 1692 +58560 1650 1668 +58580 1920 1669 +58580 1547 1808 +58580 1441 1634 +58580 1599 1655 +58580 1484 1521 +58580 1840 1489 +58580 1707 1764 +58580 1599 1484 +58580 1655 1484 +58580 1698 1707 +58580 1660 1692 +58580 1650 1668 +58600 1544 1525 +58600 1684 1437 +58600 1840 1489 +58600 1911 1629 +58600 1629 1601 +58600 1707 1764 +58600 1599 1484 +58600 1655 1484 +58600 1698 1707 +58600 1698 1764 +58600 1660 1692 +58600 1650 1668 +58620 1547 1808 +58620 1684 1437 +58620 1463 1628 +58620 1851 1787 +58620 1707 1660 +58620 1669 1754 +58620 1840 1489 +58620 1911 1629 +58620 1629 1601 +58620 1526 1628 +58620 1463 1526 +58620 1707 1764 +58620 1599 1484 +58620 1655 1484 +58620 1698 1707 +58620 1599 1655 +58620 1698 1764 +58620 1660 1692 +58620 1650 1668 +58640 1669 1754 +58640 1441 1857 +58640 1840 1489 +58640 1628 1650 +58640 1911 1629 +58640 1629 1601 +58640 1526 1628 +58640 1463 1526 +58640 1707 1764 +58640 1724 1441 +58640 1599 1484 +58640 1655 1484 +58640 1698 1707 +58640 1599 1655 +58640 1698 1764 +58640 1660 1692 +58640 1650 1668 +58660 1668 1628 +58660 1629 1601 +58660 1884 1525 +58660 1526 1628 +58660 1463 1526 +58660 1707 1764 +58660 1724 1441 +58660 1599 1484 +58660 1655 1484 +58660 1698 1707 +58660 1599 1655 +58660 1698 1764 +58660 1660 1692 +58660 1650 1668 +58680 1544 1525 +58680 1840 1857 +58680 1707 1660 +58680 1884 1525 +58680 1526 1628 +58680 1463 1526 +58680 1707 1764 +58680 1724 1441 +58680 1599 1484 +58680 1655 1484 +58680 1698 1707 +58680 1599 1655 +58680 1698 1764 +58680 1660 1692 +58680 1650 1668 +58700 1544 1890 +58700 1601 1629 +58700 1684 1840 +58700 1463 1526 +58700 1707 1764 +58700 1724 1441 +58700 1599 1484 +58700 1655 1484 +58700 1698 1707 +58700 1599 1655 +58700 1890 1519 +58700 1698 1764 +58700 1660 1692 +58700 1650 1668 +58720 1684 1840 +58720 1437 1840 +58720 1463 1526 +58720 1707 1764 +58720 1724 1441 +58720 1599 1484 +58720 1655 1484 +58720 1593 1521 +58720 1698 1707 +58720 1599 1655 +58720 1890 1519 +58720 1698 1764 +58720 1660 1692 +58720 1650 1668 +58740 1544 1600 +58740 1544 1525 +58740 1707 1764 +58740 1724 1441 +58740 1884 1525 +58740 1629 1911 +58740 1547 1808 +58740 1599 1484 +58740 1655 1484 +58740 1593 1521 +58740 1669 1754 +58740 1698 1707 +58740 1599 1655 +58740 1890 1519 +58740 1698 1764 +58740 1660 1692 +58740 1650 1668 +58760 1544 1825 +58760 1547 1808 +58760 1437 1840 +58760 1599 1484 +58760 1655 1484 +58760 1484 1786 +58760 1593 1521 +58760 1774 1786 +58760 1669 1754 +58760 1698 1707 +58760 1599 1655 +58760 1601 1629 +58760 1463 1526 +58760 1600 1890 +58760 1890 1519 +58760 1698 1764 +58760 1660 1692 +58760 1650 1668 +58780 1669 1754 +58780 1698 1707 +58780 1707 1764 +58780 1599 1655 +58780 1911 1629 +58780 1601 1629 +58780 1463 1526 +58780 1600 1890 +58780 1890 1519 +58780 1441 1724 +58780 1698 1764 +58780 1660 1692 +58780 1650 1668 +58800 1484 1786 +58800 1599 1655 +58800 1911 1629 +58800 1601 1629 +58800 1463 1526 +58800 1600 1890 +58800 1890 1519 +58800 1441 1724 +58800 1698 1764 +58800 1660 1692 +58800 1650 1668 +58820 1851 1521 +58820 1599 1655 +58820 1600 1884 +58820 1475 1628 +58820 1911 1629 +58820 1679 1634 +58820 1601 1629 +58820 1884 1519 +58820 1694 1857 +58820 1586 1851 +58820 1463 1526 +58820 1600 1890 +58820 1890 1519 +58820 1441 1724 +58820 1698 1764 +58820 1660 1692 +58820 1650 1668 +58840 1679 1634 +58840 1601 1629 +58840 1593 1521 +58840 1884 1519 +58840 1650 1526 +58840 1694 1857 +58840 1586 1851 +58840 1463 1526 +58840 1600 1890 +58840 1601 1911 +58840 1890 1519 +58840 1441 1724 +58840 1698 1764 +58840 1660 1692 +58840 1650 1668 +58860 1698 1707 +58860 1694 1857 +58860 1586 1851 +58860 1600 1525 +58860 1600 1519 +58860 1463 1526 +58860 1600 1890 +58860 1601 1911 +58860 1890 1519 +58860 1441 1724 +58860 1698 1764 +58860 1660 1692 +58860 1650 1668 +58880 1519 1525 +58880 1694 1857 +58880 1586 1851 +58880 1600 1525 +58880 1600 1519 +58880 1825 1884 +58880 1463 1526 +58880 1600 1890 +58880 1884 1519 +58880 1669 1754 +58880 1601 1911 +58880 1890 1519 +58880 1629 1601 +58880 1441 1724 +58880 1698 1764 +58880 1629 1911 +58880 1660 1692 +58880 1650 1668 +58900 1851 1758 +58900 1599 1655 +58900 1600 1825 +58900 1600 1884 +58900 1600 1525 +58900 1600 1519 +58900 1857 1617 +58900 1825 1884 +58900 1825 1525 +58900 1593 1521 +58900 1767 1489 +58900 1924 1478 +58900 1463 1526 +58900 1600 1890 +58900 1884 1519 +58900 1669 1754 +58900 1694 1617 +58900 1601 1911 +58900 1890 1519 +58900 1629 1601 +58900 1441 1724 +58900 1698 1764 +58900 1629 1911 +58900 1660 1692 +58900 1650 1668 +58920 1924 1478 +58920 1463 1526 +58920 1600 1890 +58920 1884 1519 +58920 1519 1525 +58920 1669 1754 +58920 1694 1617 +58920 1601 1911 +58920 1890 1519 +58920 1629 1601 +58920 1441 1724 +58920 1698 1764 +58920 1629 1911 +58920 1660 1692 +58920 1650 1668 +58940 1669 1754 +58940 1698 1707 +58940 1707 1764 +58940 1924 1469 +58940 1890 1884 +58940 1519 1600 +58940 1694 1617 +58940 1601 1911 +58940 1890 1519 +58940 1629 1601 +58940 1441 1724 +58940 1698 1764 +58940 1629 1911 +58940 1660 1692 +58940 1650 1668 +58960 1519 1600 +58960 1694 1617 +58960 1851 1758 +58960 1601 1911 +58960 1890 1519 +58960 1840 1489 +58960 1629 1601 +58960 1441 1724 +58960 1698 1764 +58960 1884 1519 +58960 1629 1911 +58960 1660 1692 +58960 1650 1668 +58980 1538 1524 +58980 1669 1754 +58980 1441 1641 +58980 1617 1489 +58980 1890 1519 +58980 1573 1452 +58980 1840 1489 +58980 1629 1601 +58980 1825 1525 +58980 1698 1707 +58980 1441 1724 +58980 1698 1764 +58980 1884 1519 +58980 1629 1911 +58980 1660 1692 +58980 1650 1668 +59000 1573 1452 +59000 1547 1808 +59000 1840 1489 +59000 1547 1609 +59000 1694 1617 +59000 1629 1601 +59000 1911 1601 +59000 1825 1525 +59000 1698 1707 +59000 1441 1724 +59000 1698 1764 +59000 1884 1519 +59000 1629 1911 +59000 1825 1884 +59000 1660 1692 +59000 1650 1668 +59020 1547 1808 +59020 1840 1489 +59020 1547 1609 +59020 1694 1617 +59020 1629 1601 +59020 1911 1601 +59020 1678 1520 +59020 1825 1525 +59020 1698 1707 +59020 1441 1724 +59020 1698 1764 +59020 1884 1519 +59020 1890 1519 +59020 1629 1911 +59020 1825 1884 +59020 1660 1692 +59020 1650 1668 +59040 1451 1478 +59040 1547 1609 +59040 1519 1825 +59040 1694 1617 +59040 1825 1890 +59040 1655 1599 +59040 1669 1754 +59040 1629 1601 +59040 1911 1601 +59040 1617 1767 +59040 1463 1526 +59040 1678 1520 +59040 1825 1525 +59040 1698 1707 +59040 1441 1724 +59040 1698 1764 +59040 1884 1519 +59040 1890 1519 +59040 1629 1911 +59040 1825 1884 +59040 1660 1692 +59040 1650 1668 +59060 1451 1924 +59060 1669 1754 +59060 1629 1601 +59060 1911 1601 +59060 1851 1787 +59060 1617 1767 +59060 1463 1526 +59060 1678 1520 +59060 1840 1489 +59060 1825 1525 +59060 1698 1707 +59060 1441 1724 +59060 1698 1764 +59060 1884 1519 +59060 1890 1519 +59060 1629 1911 +59060 1825 1884 +59060 1660 1692 +59060 1650 1668 +59080 1694 1617 +59080 1707 1764 +59080 1463 1526 +59080 1678 1520 +59080 1840 1489 +59080 1840 1767 +59080 1655 1599 +59080 1767 1489 +59080 1825 1525 +59080 1698 1707 +59080 1441 1724 +59080 1698 1764 +59080 1884 1519 +59080 1890 1519 +59080 1629 1911 +59080 1825 1884 +59080 1660 1692 +59080 1650 1668 +59100 1678 1520 +59100 1840 1489 +59100 1840 1767 +59100 1655 1599 +59100 1890 1884 +59100 1890 1525 +59100 1767 1489 +59100 1519 1525 +59100 1825 1525 +59100 1698 1707 +59100 1441 1724 +59100 1698 1764 +59100 1857 1489 +59100 1884 1519 +59100 1890 1519 +59100 1629 1911 +59100 1825 1884 +59100 1660 1692 +59100 1650 1668 +59120 1451 1478 +59120 1825 1890 +59120 1825 1525 +59120 1698 1707 +59120 1628 1475 +59120 1924 1478 +59120 1441 1724 +59120 1698 1764 +59120 1857 1617 +59120 1857 1489 +59120 1884 1519 +59120 1617 1489 +59120 1890 1519 +59120 1629 1911 +59120 1825 1884 +59120 1660 1692 +59120 1650 1668 +59140 1441 1641 +59140 1441 1724 +59140 1840 1767 +59140 1471 1503 +59140 1787 1512 +59140 1679 1575 +59140 1884 1890 +59140 1890 1525 +59140 1698 1764 +59140 1669 1754 +59140 1857 1617 +59140 1857 1489 +59140 1884 1519 +59140 1617 1489 +59140 1890 1519 +59140 1538 1524 +59140 1629 1911 +59140 1825 1884 +59140 1601 1629 +59140 1601 1911 +59140 1547 1808 +59140 1660 1692 +59140 1650 1668 +59160 1679 1575 +59160 1519 1825 +59160 1463 1648 +59160 1628 1475 +59160 1924 1609 +59160 1884 1890 +59160 1890 1525 +59160 1698 1764 +59160 1669 1754 +59160 1857 1617 +59160 1857 1489 +59160 1884 1519 +59160 1707 1764 +59160 1617 1489 +59160 1890 1519 +59160 1538 1524 +59160 1629 1911 +59160 1825 1884 +59160 1601 1629 +59160 1601 1911 +59160 1547 1808 +59160 1698 1707 +59160 1660 1692 +59160 1650 1668 +59180 1698 1660 +59180 1698 1764 +59180 1851 1787 +59180 1469 1609 +59180 1669 1754 +59180 1857 1617 +59180 1857 1489 +59180 1884 1519 +59180 1707 1764 +59180 1617 1489 +59180 1890 1519 +59180 1538 1524 +59180 1629 1911 +59180 1825 1884 +59180 1601 1629 +59180 1601 1911 +59180 1547 1808 +59180 1698 1707 +59180 1660 1692 +59180 1650 1668 +59200 1669 1754 +59200 1857 1617 +59200 1857 1489 +59200 1884 1519 +59200 1707 1764 +59200 1452 1503 +59200 1463 1648 +59200 1475 1628 +59200 1825 1519 +59200 1617 1489 +59200 1890 1519 +59200 1538 1524 +59200 1629 1911 +59200 1825 1884 +59200 1601 1629 +59200 1601 1911 +59200 1825 1890 +59200 1547 1808 +59200 1698 1707 +59200 1660 1692 +59200 1890 1525 +59200 1650 1668 +59220 1538 1524 +59220 1451 1924 +59220 1471 1489 +59220 1600 1890 +59220 1441 1641 +59220 1629 1911 +59220 1840 1767 +59220 1884 1890 +59220 1767 1489 +59220 1655 1599 +59220 1825 1884 +59220 1601 1629 +59220 1601 1911 +59220 1825 1890 +59220 1840 1489 +59220 1441 1617 +59220 1547 1808 +59220 1698 1707 +59220 1660 1692 +59220 1890 1525 +59220 1650 1668 +59240 1544 1890 +59240 1840 1767 +59240 1884 1890 +59240 1475 1628 +59240 1463 1648 +59240 1767 1489 +59240 1655 1599 +59240 1698 1764 +59240 1707 1764 +59240 1825 1884 +59240 1601 1629 +59240 1601 1911 +59240 1825 1890 +59240 1825 1519 +59240 1840 1489 +59240 1441 1617 +59240 1684 1698 +59240 1547 1808 +59240 1698 1707 +59240 1684 1707 +59240 1857 1526 +59240 1660 1692 +59240 1890 1525 +59240 1650 1668 +59260 1924 1478 +59260 1884 1890 +59260 1475 1628 +59260 1463 1648 +59260 1767 1489 +59260 1890 1519 +59260 1655 1599 +59260 1684 1764 +59260 1698 1764 +59260 1707 1764 +59260 1825 1884 +59260 1884 1519 +59260 1601 1629 +59260 1601 1911 +59260 1825 1890 +59260 1825 1519 +59260 1840 1489 +59260 1441 1617 +59260 1684 1698 +59260 1452 1503 +59260 1547 1808 +59260 1698 1707 +59260 1684 1707 +59260 1857 1526 +59260 1660 1692 +59260 1890 1525 +59260 1650 1668 +59280 1684 1764 +59280 1698 1764 +59280 1707 1764 +59280 1825 1884 +59280 1884 1519 +59280 1601 1629 +59280 1601 1911 +59280 1825 1890 +59280 1825 1519 +59280 1629 1911 +59280 1840 1489 +59280 1441 1617 +59280 1684 1698 +59280 1452 1503 +59280 1547 1808 +59280 1698 1707 +59280 1684 1707 +59280 1857 1526 +59280 1660 1692 +59280 1890 1525 +59280 1650 1668 +59300 1538 1524 +59300 1573 1503 +59300 1601 1629 +59300 1601 1911 +59300 1669 1754 +59300 1698 1489 +59300 1707 1840 +59300 1707 1489 +59300 1825 1890 +59300 1825 1519 +59300 1544 1890 +59300 1544 1525 +59300 1629 1911 +59300 1840 1489 +59300 1441 1617 +59300 1767 1489 +59300 1684 1698 +59300 1452 1503 +59300 1655 1599 +59300 1547 1808 +59300 1698 1707 +59300 1484 1655 +59300 1684 1707 +59300 1857 1526 +59300 1660 1692 +59300 1890 1525 +59300 1650 1668 +59320 1544 1890 +59320 1544 1525 +59320 1599 1484 +59320 1629 1911 +59320 1707 1764 +59320 1840 1489 +59320 1441 1617 +59320 1767 1489 +59320 1684 1698 +59320 1452 1503 +59320 1655 1599 +59320 1547 1808 +59320 1698 1707 +59320 1475 1628 +59320 1484 1655 +59320 1684 1707 +59320 1573 1452 +59320 1857 1526 +59320 1660 1692 +59320 1890 1525 +59320 1650 1668 +59340 1538 1524 +59340 1684 1764 +59340 1698 1764 +59340 1840 1489 +59340 1586 1851 +59340 1441 1617 +59340 1767 1489 +59340 1519 1525 +59340 1684 1698 +59340 1573 1503 +59340 1452 1503 +59340 1601 1911 +59340 1655 1599 +59340 1547 1808 +59340 1698 1707 +59340 1475 1628 +59340 1484 1655 +59340 1684 1707 +59340 1573 1452 +59340 1857 1526 +59340 1660 1692 +59340 1669 1754 +59340 1890 1525 +59340 1650 1668 +59360 1684 1698 +59360 1573 1503 +59360 1452 1503 +59360 1601 1911 +59360 1655 1599 +59360 1547 1808 +59360 1698 1707 +59360 1707 1767 +59360 1437 1471 +59360 1475 1628 +59360 1484 1655 +59360 1684 1707 +59360 1573 1452 +59360 1857 1526 +59360 1660 1692 +59360 1669 1754 +59360 1890 1525 +59360 1650 1668 +59380 1668 1463 +59380 1547 1808 +59380 1698 1707 +59380 1707 1767 +59380 1437 1471 +59380 1840 1767 +59380 1617 1441 +59380 1463 1650 +59380 1601 1629 +59380 1475 1628 +59380 1684 1764 +59380 1698 1764 +59380 1707 1764 +59380 1484 1655 +59380 1684 1707 +59380 1573 1452 +59380 1857 1526 +59380 1660 1692 +59380 1669 1754 +59380 1890 1525 +59380 1650 1668 +59400 1684 1764 +59400 1698 1764 +59400 1924 1451 +59400 1924 1478 +59400 1707 1764 +59400 1911 1629 +59400 1484 1655 +59400 1684 1707 +59400 1840 1489 +59400 1463 1648 +59400 1884 1519 +59400 1573 1452 +59400 1857 1526 +59400 1452 1503 +59400 1684 1698 +59400 1573 1503 +59400 1660 1692 +59400 1669 1754 +59400 1890 1525 +59400 1650 1668 +59420 1684 1707 +59420 1840 1489 +59420 1463 1648 +59420 1628 1475 +59420 1601 1629 +59420 1601 1911 +59420 1609 1524 +59420 1884 1519 +59420 1767 1489 +59420 1573 1452 +59420 1857 1526 +59420 1452 1503 +59420 1684 1698 +59420 1573 1503 +59420 1617 1857 +59420 1660 1692 +59420 1617 1441 +59420 1669 1754 +59420 1698 1707 +59420 1890 1525 +59420 1650 1668 +59440 1573 1452 +59440 1598 1920 +59440 1601 1689 +59440 1629 1689 +59440 1857 1526 +59440 1437 1471 +59440 1452 1503 +59440 1684 1698 +59440 1573 1503 +59440 1617 1857 +59440 1660 1692 +59440 1857 1441 +59440 1617 1441 +59440 1669 1754 +59440 1698 1707 +59440 1547 1808 +59440 1890 1525 +59440 1707 1764 +59440 1650 1668 +59460 1601 1609 +59460 1601 1694 +59460 1684 1698 +59460 1698 1489 +59460 1573 1503 +59460 1840 1489 +59460 1463 1668 +59460 1767 1489 +59460 1629 1911 +59460 1617 1857 +59460 1660 1692 +59460 1857 1441 +59460 1617 1441 +59460 1669 1754 +59460 1698 1707 +59460 1547 1808 +59460 1890 1525 +59460 1707 1764 +59460 1650 1668 +59480 1565 1699 +59480 1617 1857 +59480 1628 1475 +59480 1660 1692 +59480 1857 1441 +59480 1884 1519 +59480 1890 1519 +59480 1452 1503 +59480 1617 1441 +59480 1669 1754 +59480 1684 1764 +59480 1698 1707 +59480 1547 1808 +59480 1890 1525 +59480 1707 1764 +59480 1601 1629 +59480 1601 1911 +59480 1650 1668 +59500 1617 1441 +59500 1669 1754 +59500 1684 1764 +59500 1698 1764 +59500 1789 1902 +59500 1684 1698 +59500 1698 1707 +59500 1547 1808 +59500 1684 1707 +59500 1890 1525 +59500 1707 1764 +59500 1629 1911 +59500 1601 1629 +59500 1601 1911 +59500 1650 1668 +59520 1601 1609 +59520 1684 1698 +59520 1767 1489 +59520 1452 1503 +59520 1698 1707 +59520 1547 1808 +59520 1684 1489 +59520 1684 1707 +59520 1890 1525 +59520 1707 1764 +59520 1629 1911 +59520 1601 1629 +59520 1601 1911 +59520 1660 1692 +59520 1650 1668 +59540 1600 1890 +59540 1617 1441 +59540 1669 1754 +59540 1674 1489 +59540 1680 1728 +59540 1698 1764 +59540 1628 1475 +59540 1660 1767 +59540 1698 1489 +59540 1698 1707 +59540 1547 1808 +59540 1684 1489 +59540 1684 1707 +59540 1692 1767 +59540 1890 1525 +59540 1707 1764 +59540 1629 1911 +59540 1601 1629 +59540 1601 1911 +59540 1660 1692 +59540 1650 1668 +59560 1628 1475 +59560 1660 1767 +59560 1698 1489 +59560 1698 1707 +59560 1547 1808 +59560 1684 1489 +59560 1641 1857 +59560 1684 1707 +59560 1692 1767 +59560 1890 1525 +59560 1707 1764 +59560 1629 1911 +59560 1601 1629 +59560 1601 1911 +59560 1660 1692 +59560 1650 1668 +59580 1547 1808 +59580 1575 1679 +59580 1583 1600 +59580 1586 1851 +59580 1622 1660 +59580 1625 1920 +59580 1684 1489 +59580 1641 1857 +59580 1617 1441 +59580 1684 1707 +59580 1890 1519 +59580 1519 1525 +59580 1669 1754 +59580 1692 1767 +59580 1890 1525 +59580 1707 1764 +59580 1629 1911 +59580 1601 1629 +59580 1601 1911 +59580 1660 1692 +59580 1650 1668 +59600 1609 1625 +59600 1641 1857 +59600 1787 1851 +59600 1617 1441 +59600 1684 1698 +59600 1684 1707 +59600 1684 1764 +59600 1890 1519 +59600 1452 1503 +59600 1519 1525 +59600 1669 1754 +59600 1698 1707 +59600 1692 1767 +59600 1890 1525 +59600 1707 1764 +59600 1629 1911 +59600 1601 1629 +59600 1601 1911 +59600 1660 1692 +59600 1650 1668 +59620 1617 1441 +59620 1644 1894 +59620 1684 1698 +59620 1684 1707 +59620 1684 1764 +59620 1857 1441 +59620 1884 1890 +59620 1890 1519 +59620 1452 1503 +59620 1519 1525 +59620 1669 1754 +59620 1698 1707 +59620 1692 1767 +59620 1648 1696 +59620 1890 1525 +59620 1707 1764 +59620 1629 1911 +59620 1601 1629 +59620 1660 1767 +59620 1601 1911 +59620 1660 1692 +59620 1650 1668 +59640 1669 1754 +59640 1674 1707 +59640 1698 1489 +59640 1698 1707 +59640 1707 1489 +59640 1764 1489 +59640 1787 1851 +59640 1871 1894 +59640 1884 1519 +59640 1924 1478 +59640 1684 1489 +59640 1692 1767 +59640 1707 1441 +59640 1648 1696 +59640 1890 1525 +59640 1707 1764 +59640 1599 1671 +59640 1622 1526 +59640 1617 1857 +59640 1629 1911 +59640 1601 1629 +59640 1660 1767 +59640 1601 1911 +59640 1660 1692 +59640 1650 1668 +59660 1549 1625 +59660 1684 1489 +59660 1692 1767 +59660 1707 1441 +59660 1728 1531 +59660 1764 1441 +59660 1851 1458 +59660 1452 1503 +59660 1648 1696 +59660 1789 1902 +59660 1890 1525 +59660 1670 1754 +59660 1707 1764 +59660 1787 1458 +59660 1599 1671 +59660 1674 1489 +59660 1622 1526 +59660 1617 1857 +59660 1629 1911 +59660 1601 1629 +59660 1660 1767 +59660 1601 1911 +59660 1660 1692 +59660 1650 1668 +59680 1648 1696 +59680 1787 1851 +59680 1789 1902 +59680 1890 1525 +59680 1670 1754 +59680 1680 1458 +59680 1698 1707 +59680 1698 1764 +59680 1707 1764 +59680 1787 1458 +59680 1890 1519 +59680 1924 1478 +59680 1599 1671 +59680 1674 1489 +59680 1622 1526 +59680 1617 1857 +59680 1629 1911 +59680 1601 1629 +59680 1660 1767 +59680 1871 1517 +59680 1601 1911 +59680 1660 1692 +59680 1650 1668 +59700 1553 1519 +59700 1600 1890 +59700 1669 1754 +59700 1670 1754 +59700 1680 1458 +59700 1680 1851 +59700 1698 1707 +59700 1698 1764 +59700 1707 1764 +59700 1787 1458 +59700 1851 1458 +59700 1890 1519 +59700 1924 1478 +59700 1599 1671 +59700 1655 1484 +59700 1674 1489 +59700 1770 1773 +59700 1622 1526 +59700 1684 1441 +59700 1617 1857 +59700 1629 1911 +59700 1549 1525 +59700 1601 1629 +59700 1660 1767 +59700 1871 1517 +59700 1601 1911 +59700 1660 1692 +59700 1650 1668 +59720 1599 1774 +59720 1599 1671 +59720 1617 1707 +59720 1641 1770 +59720 1648 1890 +59720 1655 1484 +59720 1674 1489 +59720 1770 1773 +59720 1789 1902 +59720 1622 1526 +59720 1684 1441 +59720 1441 1489 +59720 1617 1857 +59720 1629 1911 +59720 1549 1525 +59720 1601 1629 +59720 1660 1767 +59720 1871 1517 +59720 1601 1911 +59720 1660 1692 +59720 1650 1668 +59740 1547 1808 +59740 1583 1600 +59740 1583 1525 +59740 1600 1525 +59740 1622 1526 +59740 1684 1441 +59740 1707 1437 +59740 1441 1489 +59740 1617 1857 +59740 1629 1911 +59740 1598 1890 +59740 1549 1525 +59740 1684 1489 +59740 1601 1629 +59740 1660 1767 +59740 1871 1517 +59740 1601 1911 +59740 1660 1692 +59740 1650 1668 +59760 1601 1789 +59760 1617 1857 +59760 1617 1707 +59760 1629 1911 +59760 1655 1484 +59760 1692 1767 +59760 1698 1707 +59760 1789 1902 +59760 1598 1890 +59760 1707 1764 +59760 1549 1525 +59760 1684 1489 +59760 1601 1629 +59760 1660 1767 +59760 1871 1517 +59760 1601 1911 +59760 1660 1692 +59760 1650 1668 +59780 1598 1890 +59780 1601 1728 +59780 1648 1696 +59780 1679 1884 +59780 1707 1764 +59780 1549 1525 +59780 1599 1774 +59780 1641 1698 +59780 1684 1489 +59780 1641 1707 +59780 1601 1629 +59780 1660 1767 +59780 1871 1517 +59780 1601 1911 +59780 1660 1692 +59780 1650 1668 +59800 1549 1525 +59800 1583 1600 +59800 1599 1774 +59800 1641 1698 +59800 1655 1484 +59800 1674 1698 +59800 1684 1489 +59800 1698 1764 +59800 1918 1475 +59800 1629 1911 +59800 1641 1707 +59800 1789 1902 +59800 1698 1707 +59800 1900 1471 +59800 1692 1767 +59800 1601 1629 +59800 1660 1767 +59800 1871 1517 +59800 1601 1911 +59800 1660 1692 +59800 1650 1668 +59820 1573 1452 +59820 1583 1890 +59820 1629 1911 +59820 1641 1707 +59820 1707 1773 +59820 1789 1902 +59820 1698 1707 +59820 1900 1471 +59820 1924 1478 +59820 1692 1767 +59820 1601 1629 +59820 1660 1767 +59820 1441 1489 +59820 1871 1517 +59820 1601 1911 +59820 1707 1764 +59820 1660 1692 +59820 1650 1668 +59840 1641 1444 +59840 1698 1707 +59840 1900 1471 +59840 1924 1478 +59840 1547 1808 +59840 1599 1681 +59840 1894 1531 +59840 1692 1767 +59840 1601 1629 +59840 1660 1767 +59840 1441 1489 +59840 1641 1458 +59840 1871 1517 +59840 1601 1911 +59840 1707 1764 +59840 1660 1692 +59840 1650 1668 +59860 1547 1808 +59860 1573 1698 +59860 1573 1707 +59860 1599 1681 +59860 1641 1707 +59860 1641 1764 +59860 1681 1484 +59860 1765 1442 +59860 1786 1819 +59860 1894 1531 +59860 1598 1648 +59860 1617 1857 +59860 1692 1767 +59860 1601 1629 +59860 1629 1911 +59860 1660 1767 +59860 1773 1444 +59860 1441 1489 +59860 1641 1458 +59860 1871 1517 +59860 1601 1911 +59860 1707 1764 +59860 1660 1692 +59860 1650 1668 +59880 1546 1548 +59880 1549 1553 +59880 1573 1444 +59880 1582 1598 +59880 1598 1648 +59880 1598 1526 +59880 1599 1774 +59880 1617 1857 +59880 1648 1696 +59880 1692 1767 +59880 1789 1902 +59880 1601 1629 +59880 1629 1911 +59880 1660 1767 +59880 1773 1444 +59880 1441 1489 +59880 1641 1458 +59880 1871 1517 +59880 1601 1911 +59880 1707 1764 +59880 1660 1692 +59880 1650 1668 +59900 1554 1613 +59900 1598 1920 +59900 1598 1825 +59900 1600 1808 +59900 1601 1471 +59900 1601 1629 +59900 1614 1526 +59900 1629 1911 +59900 1660 1767 +59900 1667 1866 +59900 1669 1754 +59900 1773 1444 +59900 1900 1471 +59900 1918 1475 +59900 1441 1489 +59900 1641 1458 +59900 1541 1691 +59900 1871 1517 +59900 1601 1911 +59900 1698 1764 +59900 1707 1764 +59900 1660 1692 +59900 1698 1707 +59900 1650 1668 +59920 1601 1622 +59920 1617 1857 +59920 1622 1629 +59920 1622 1911 +59920 1641 1458 +59920 1652 1747 +59920 1660 1811 +59920 1698 1458 +59920 1786 1789 +59920 1825 1525 +59920 1850 1484 +59920 1857 1441 +59920 1871 1531 +59920 1541 1691 +59920 1549 1525 +59920 1598 1526 +59920 1871 1517 +59920 1601 1911 +59920 1698 1764 +59920 1707 1764 +59920 1547 1808 +59920 1617 1441 +59920 1660 1692 +59920 1698 1707 +59920 1650 1668 +59940 1541 1691 +59940 1574 1627 +59940 1583 1884 +59940 1601 1629 +59940 1674 1458 +59940 1774 1484 +59940 1811 1441 +59940 1441 1458 +59940 1549 1525 +59940 1598 1526 +59940 1648 1696 +59940 1659 1689 +59940 1825 1884 +59940 1871 1517 +59940 1914 1484 +59940 1601 1911 +59940 1698 1764 +59940 1707 1764 +59940 1547 1808 +59940 1921 1462 +59940 1617 1441 +59940 1629 1911 +59940 1692 1767 +59940 1660 1692 +59940 1512 1531 +59940 1698 1707 +59940 1650 1668 +59960 1549 1525 +59960 1598 1526 +59960 1613 1756 +59960 1617 1857 +59960 1623 1688 +59960 1641 1894 +59960 1648 1696 +59960 1659 1689 +59960 1660 1767 +59960 1669 1754 +59960 1688 1457 +59960 1692 1839 +59960 1703 1519 +59960 1707 1921 +59960 1725 1752 +59960 1752 1766 +59960 1774 1901 +59960 1787 1851 +59960 1789 1902 +59960 1825 1884 +59960 1857 1441 +59960 1871 1517 +59960 1894 1921 +59960 1901 1484 +59960 1914 1484 +59960 1918 1475 +59960 1546 1548 +59960 1601 1911 +59960 1641 1921 +59960 1652 1673 +59960 1698 1764 +59960 1707 1764 +59960 1547 1808 +59960 1599 1901 +59960 1599 1774 +59960 1641 1462 +59960 1880 1484 +59960 1921 1462 +59960 1617 1441 +59960 1629 1911 +59960 1703 1517 +59960 1692 1767 +59960 1660 1692 +59960 1512 1531 +59960 1698 1707 +59960 1651 1703 +59960 1650 1668 +59980 1546 1548 +59980 1583 1600 +59980 1598 1614 +59980 1599 1880 +59980 1600 1825 +59980 1601 1911 +59980 1629 1458 +59980 1641 1921 +59980 1644 1503 +59980 1652 1673 +59980 1652 1747 +59980 1674 1437 +59980 1676 1761 +59980 1698 1764 +59980 1707 1764 +59980 1547 1808 +59980 1599 1841 +59980 1599 1901 +59980 1599 1774 +59980 1641 1462 +59980 1841 1901 +59980 1872 1531 +59980 1880 1484 +59980 1921 1462 +59980 1601 1629 +59980 1617 1441 +59980 1629 1911 +59980 1703 1517 +59980 1825 1519 +59980 1692 1767 +59980 1660 1692 +59980 1512 1531 +59980 1698 1707 +59980 1651 1703 +59980 1650 1668 +60000 1541 1531 +60000 1547 1808 +60000 1554 1579 +60000 1554 1531 +60000 1562 1695 +60000 1579 1448 +60000 1579 1466 +60000 1579 1731 +60000 1579 1879 +60000 1599 1841 +60000 1599 1901 +60000 1599 1774 +60000 1619 1641 +60000 1622 1471 +60000 1641 1462 +60000 1660 1767 +60000 1683 1484 +60000 1691 1778 +60000 1691 1531 +60000 1765 1778 +60000 1841 1484 +60000 1841 1901 +60000 1872 1531 +60000 1880 1484 +60000 1921 1462 +60000 1466 1531 +60000 1541 1765 +60000 1601 1629 +60000 1617 1441 +60000 1629 1911 +60000 1703 1517 +60000 1825 1519 +60000 1543 1545 +60000 1692 1767 +60000 1918 1475 +60000 1545 1528 +60000 1541 1691 +60000 1660 1692 +60000 1512 1531 +60000 1698 1707 +60000 1871 1517 +60000 1651 1703 +60000 1650 1668 +60020 1541 1578 +60020 1541 1765 +60020 1547 1466 +60020 1563 1786 +60020 1563 1579 +60020 1569 1520 +60020 1590 1530 +60020 1599 1484 +60020 1601 1458 +60020 1601 1629 +60020 1617 1441 +60020 1629 1911 +60020 1684 1798 +60020 1691 1765 +60020 1699 1469 +60020 1703 1517 +60020 1725 1765 +60020 1731 1765 +60020 1765 1487 +60020 1765 1779 +60020 1794 1484 +60020 1825 1519 +60020 1831 1467 +60020 1448 1531 +60020 1543 1545 +60020 1549 1525 +60020 1599 1897 +60020 1692 1767 +60020 1706 1467 +60020 1884 1519 +60020 1437 1462 +60020 1648 1696 +60020 1678 1906 +60020 1918 1475 +60020 1547 1665 +60020 1545 1528 +60020 1541 1691 +60020 1698 1764 +60020 1707 1764 +60020 1660 1692 +60020 1546 1548 +60020 1512 1531 +60020 1698 1707 +60020 1871 1517 +60020 1651 1703 +60020 1650 1668 +60040 1537 1517 +60040 1543 1545 +60040 1549 1525 +60040 1550 1531 +60040 1550 1765 +60040 1568 1699 +60040 1579 1496 +60040 1585 1766 +60040 1590 1761 +60040 1592 1688 +60040 1599 1897 +60040 1599 1774 +60040 1652 1673 +60040 1655 1774 +60040 1659 1786 +60040 1670 1917 +60040 1688 1871 +60040 1692 1767 +60040 1698 1905 +60040 1706 1467 +60040 1724 1531 +60040 1725 1752 +60040 1779 1531 +60040 1851 1434 +60040 1884 1519 +60040 1890 1476 +60040 1437 1462 +60040 1648 1696 +60040 1664 1821 +60040 1678 1906 +60040 1851 1529 +60040 1918 1475 +60040 1547 1665 +60040 1787 1529 +60040 1545 1528 +60040 1660 1767 +60040 1541 1691 +60040 1698 1764 +60040 1707 1764 +60040 1660 1692 +60040 1546 1548 +60040 1512 1531 +60040 1698 1707 +60040 1871 1517 +60040 1651 1703 +60040 1650 1668 +60060 1547 1725 +60060 1550 1752 +60060 1554 1476 +60060 1563 1622 +60060 1568 1582 +60060 1579 1613 +60060 1599 1855 +60060 1601 1458 +60060 1613 1673 +60060 1613 1756 +60060 1629 1458 +60060 1648 1696 +60060 1655 1484 +60060 1664 1731 +60060 1664 1821 +60060 1678 1906 +60060 1678 1919 +60060 1711 1825 +60060 1711 1890 +60060 1742 1520 +60060 1752 1916 +60060 1752 1428 +60060 1787 1851 +60060 1811 1462 +60060 1825 1890 +60060 1851 1529 +60060 1855 1484 +60060 1918 1475 +60060 1427 1531 +60060 1547 1665 +60060 1617 1857 +60060 1787 1529 +60060 1545 1528 +60060 1598 1648 +60060 1660 1767 +60060 1749 1757 +60060 1541 1691 +60060 1698 1764 +60060 1707 1764 +60060 1890 1519 +60060 1660 1692 +60060 1825 1519 +60060 1546 1548 +60060 1512 1531 +60060 1698 1707 +60060 1871 1517 +60060 1651 1703 +60060 1650 1668 +60080 1537 1517 +60080 1538 1694 +60080 1539 1613 +60080 1547 1665 +60080 1547 1747 +60080 1563 1592 +60080 1585 1613 +60080 1585 1766 +60080 1599 1774 +60080 1600 1890 +60080 1608 1470 +60080 1613 1752 +60080 1617 1857 +60080 1617 1725 +60080 1641 1487 +60080 1655 1491 +60080 1655 1774 +60080 1659 1428 +60080 1669 1754 +60080 1698 1725 +60080 1698 1487 +60080 1725 1866 +60080 1725 1773 +60080 1752 1531 +60080 1756 1531 +60080 1779 1428 +60080 1786 1915 +60080 1787 1529 +60080 1841 1901 +60080 1877 1890 +60080 1484 1491 +60080 1537 1703 +60080 1541 1901 +60080 1545 1528 +60080 1598 1648 +60080 1642 1854 +60080 1660 1767 +60080 1684 1798 +60080 1688 1694 +60080 1749 1757 +60080 1923 1484 +60080 1433 1503 +60080 1503 1535 +60080 1541 1691 +60080 1652 1747 +60080 1655 1893 +60080 1698 1764 +60080 1707 1764 +60080 1752 1766 +60080 1854 1437 +60080 1890 1519 +60080 1660 1692 +60080 1825 1519 +60080 1546 1548 +60080 1778 1920 +60080 1664 1808 +60080 1538 1524 +60080 1512 1531 +60080 1692 1767 +60080 1698 1707 +60080 1871 1517 +60080 1651 1703 +60080 1650 1668 +60100 1537 1703 +60100 1541 1901 +60100 1545 1528 +60100 1547 1756 +60100 1572 1914 +60100 1585 1752 +60100 1592 1471 +60100 1598 1648 +60100 1599 1474 +60100 1599 1923 +60100 1599 1893 +60100 1601 1458 +60100 1602 1731 +60100 1602 1613 +60100 1613 1535 +60100 1619 1441 +60100 1622 1917 +60100 1622 1703 +60100 1625 1471 +60100 1628 1688 +60100 1642 1854 +60100 1655 1482 +60100 1660 1767 +60100 1670 1877 +60100 1673 1460 +60100 1676 1731 +60100 1678 1919 +60100 1684 1798 +60100 1688 1694 +60100 1691 1901 +60100 1711 1877 +60100 1747 1460 +60100 1749 1752 +60100 1749 1531 +60100 1749 1757 +60100 1749 1766 +60100 1890 1490 +60100 1905 1526 +60100 1923 1484 +60100 1433 1503 +60100 1438 1517 +60100 1476 1496 +60100 1503 1535 +60100 1531 1533 +60100 1541 1691 +60100 1547 1664 +60100 1599 1775 +60100 1641 1673 +60100 1645 1756 +60100 1652 1747 +60100 1655 1835 +60100 1655 1893 +60100 1698 1764 +60100 1707 1764 +60100 1752 1766 +60100 1825 1890 +60100 1825 1490 +60100 1854 1437 +60100 1890 1519 +60100 1490 1519 +60100 1660 1692 +60100 1825 1519 +60100 1485 1529 +60100 1546 1548 +60100 1778 1920 +60100 1664 1808 +60100 1538 1524 +60100 1574 1439 +60100 1512 1531 +60100 1692 1767 +60100 1598 1696 +60100 1698 1707 +60100 1871 1517 +60100 1725 1462 +60100 1651 1703 +60100 1650 1668 +60120 1541 1691 +60120 1541 1678 +60120 1544 1510 +60120 1545 1498 +60120 1547 1664 +60120 1547 1808 +60120 1547 1602 +60120 1547 1850 +60120 1549 1525 +60120 1550 1641 +60120 1550 1773 +60120 1555 1531 +60120 1562 1585 +60120 1562 1766 +60120 1563 1592 +60120 1570 1655 +60120 1579 1706 +60120 1579 1898 +60120 1582 1872 +60120 1585 1749 +60120 1585 1766 +60120 1599 1774 +60120 1599 1775 +60120 1641 1673 +60120 1641 1747 +60120 1641 1460 +60120 1645 1756 +60120 1652 1747 +60120 1655 1835 +60120 1655 1893 +60120 1659 1853 +60120 1661 1747 +60120 1670 1912 +60120 1673 1747 +60120 1676 1831 +60120 1681 1731 +60120 1698 1764 +60120 1707 1764 +60120 1707 1794 +60120 1725 1811 +60120 1749 1853 +60120 1752 1757 +60120 1752 1766 +60120 1779 1903 +60120 1789 1902 +60120 1825 1890 +60120 1825 1490 +60120 1841 1901 +60120 1853 1531 +60120 1854 1437 +60120 1884 1890 +60120 1890 1519 +60120 1893 1474 +60120 1490 1519 +60120 1545 1626 +60120 1579 1828 +60120 1599 1887 +60120 1600 1825 +60120 1648 1696 +60120 1655 1785 +60120 1660 1692 +60120 1825 1519 +60120 1485 1529 +60120 1546 1548 +60120 1778 1920 +60120 1664 1808 +60120 1538 1524 +60120 1574 1439 +60120 1890 1479 +60120 1512 1531 +60120 1692 1767 +60120 1598 1696 +60120 1698 1707 +60120 1871 1517 +60120 1550 1572 +60120 1725 1462 +60120 1642 1437 +60120 1651 1703 +60120 1650 1668 +60140 1545 1626 +60140 1546 1554 +60140 1547 1613 +60140 1562 1452 +60140 1579 1828 +60140 1579 1527 +60140 1582 1623 +60140 1585 1428 +60140 1598 1648 +60140 1599 1887 +60140 1600 1825 +60140 1600 1519 +60140 1602 1698 +60140 1613 1649 +60140 1617 1652 +60140 1617 1821 +60140 1641 1707 +60140 1648 1696 +60140 1649 1681 +60140 1655 1785 +60140 1660 1692 +60140 1670 1877 +60140 1673 1698 +60140 1673 1707 +60140 1674 1825 +60140 1678 1906 +60140 1695 1831 +60140 1698 1794 +60140 1707 1821 +60140 1731 1470 +60140 1742 1520 +60140 1749 1757 +60140 1752 1428 +60140 1766 1428 +60140 1770 1811 +60140 1785 1484 +60140 1825 1519 +60140 1857 1441 +60140 1871 1890 +60140 1906 1533 +60140 1916 1917 +60140 1485 1529 +60140 1546 1548 +60140 1550 1645 +60140 1601 1458 +60140 1602 1641 +60140 1629 1458 +60140 1645 1914 +60140 1655 1886 +60140 1711 1479 +60140 1778 1920 +60140 1804 1884 +60140 1585 1752 +60140 1664 1808 +60140 1711 1890 +60140 1538 1524 +60140 1821 1441 +60140 1574 1439 +60140 1678 1919 +60140 1890 1479 +60140 1512 1531 +60140 1562 1622 +60140 1692 1767 +60140 1598 1696 +60140 1698 1707 +60140 1871 1517 +60140 1550 1572 +60140 1725 1462 +60140 1642 1437 +60140 1651 1703 +60140 1650 1668 +60160 1546 1548 +60160 1550 1773 +60160 1550 1645 +60160 1551 1269 +60160 1590 1831 +60160 1600 1674 +60160 1601 1458 +60160 1601 1629 +60160 1602 1641 +60160 1613 1698 +60160 1629 1458 +60160 1641 1850 +60160 1645 1914 +60160 1649 1664 +60160 1655 1875 +60160 1655 1717 +60160 1655 1886 +60160 1664 1707 +60160 1673 1747 +60160 1681 1707 +60160 1684 1489 +60160 1698 1850 +60160 1706 1501 +60160 1707 1850 +60160 1711 1479 +60160 1731 1455 +60160 1747 1914 +60160 1747 1773 +60160 1774 1786 +60160 1775 1434 +60160 1778 1920 +60160 1786 1887 +60160 1789 1902 +60160 1789 1471 +60160 1804 1884 +60160 1828 1527 +60160 1912 1916 +60160 1442 1455 +60160 1547 1649 +60160 1579 1706 +60160 1579 1501 +60160 1585 1752 +60160 1585 1766 +60160 1613 1707 +60160 1664 1808 +60160 1711 1890 +60160 1731 1761 +60160 1752 1766 +60160 1889 1484 +60160 1470 1533 +60160 1538 1524 +60160 1547 1664 +60160 1660 1767 +60160 1821 1441 +60160 1898 1477 +60160 1574 1439 +60160 1678 1919 +60160 1890 1479 +60160 1512 1531 +60160 1562 1622 +60160 1692 1767 +60160 1598 1696 +60160 1655 1868 +60160 1698 1707 +60160 1840 1489 +60160 1871 1517 +60160 1918 1475 +60160 1550 1572 +60160 1725 1462 +60160 1642 1437 +60160 1651 1703 +60160 1841 1901 +60160 1650 1668 +60180 1547 1649 +60180 1547 1828 +60180 1562 1505 +60180 1573 1452 +60180 1579 1706 +60180 1579 1501 +60180 1585 1752 +60180 1585 1766 +60180 1590 1698 +60180 1590 1707 +60180 1608 1470 +60180 1613 1707 +60180 1619 1681 +60180 1619 1756 +60180 1641 1914 +60180 1648 1696 +60180 1652 1747 +60180 1664 1808 +60180 1665 1894 +60180 1670 1711 +60180 1674 1825 +60180 1674 1519 +60180 1678 1901 +60180 1683 1880 +60180 1711 1890 +60180 1711 1908 +60180 1713 1762 +60180 1731 1761 +60180 1752 1766 +60180 1786 1873 +60180 1871 1505 +60180 1889 1484 +60180 1898 1522 +60180 1426 1501 +60180 1470 1533 +60180 1538 1524 +60180 1547 1664 +60180 1547 1707 +60180 1590 1649 +60180 1660 1767 +60180 1695 1831 +60180 1749 1892 +60180 1773 1914 +60180 1821 1441 +60180 1877 1908 +60180 1890 1908 +60180 1898 1477 +60180 1908 1479 +60180 1438 1517 +60180 1568 1623 +60180 1574 1439 +60180 1655 1873 +60180 1660 1692 +60180 1678 1919 +60180 1890 1479 +60180 1512 1531 +60180 1547 1698 +60180 1562 1622 +60180 1877 1890 +60180 1692 1767 +60180 1598 1696 +60180 1599 1889 +60180 1655 1868 +60180 1629 1911 +60180 1698 1707 +60180 1711 1877 +60180 1840 1489 +60180 1871 1517 +60180 1918 1475 +60180 1550 1572 +60180 1725 1462 +60180 1541 1678 +60180 1642 1437 +60180 1651 1703 +60180 1841 1901 +60180 1650 1668 +60200 1538 1524 +60200 1542 1619 +60200 1543 1528 +60200 1544 1438 +60200 1547 1664 +60200 1547 1707 +60200 1560 1835 +60200 1562 1619 +60200 1563 1476 +60200 1590 1649 +60200 1602 1617 +60200 1602 1483 +60200 1606 1622 +60200 1619 1872 +60200 1619 1622 +60200 1649 1664 +60200 1660 1767 +60200 1664 1698 +60200 1673 1747 +60200 1676 1831 +60200 1695 1831 +60200 1725 1490 +60200 1749 1892 +60200 1749 1477 +60200 1752 1527 +60200 1761 1831 +60200 1764 1441 +60200 1773 1914 +60200 1773 1828 +60200 1789 1504 +60200 1789 1917 +60200 1821 1441 +60200 1825 1519 +60200 1831 1530 +60200 1835 1915 +60200 1853 1471 +60200 1871 1908 +60200 1875 1887 +60200 1877 1908 +60200 1890 1908 +60200 1892 1920 +60200 1892 1505 +60200 1898 1477 +60200 1898 1527 +60200 1908 1479 +60200 1912 1496 +60200 1438 1517 +60200 1546 1548 +60200 1568 1623 +60200 1574 1439 +60200 1655 1873 +60200 1660 1692 +60200 1664 1831 +60200 1676 1761 +60200 1678 1919 +60200 1707 1808 +60200 1752 1522 +60200 1766 1892 +60200 1789 1908 +60200 1868 1873 +60200 1890 1479 +60200 1512 1531 +60200 1541 1906 +60200 1547 1698 +60200 1562 1622 +60200 1695 1761 +60200 1877 1890 +60200 1577 1531 +60200 1692 1767 +60200 1892 1477 +60200 1598 1696 +60200 1599 1889 +60200 1655 1868 +60200 1834 1863 +60200 1629 1911 +60200 1698 1707 +60200 1711 1877 +60200 1840 1489 +60200 1871 1517 +60200 1912 1916 +60200 1918 1475 +60200 1550 1572 +60200 1725 1462 +60200 1698 1808 +60200 1541 1678 +60200 1642 1437 +60200 1651 1703 +60200 1841 1901 +60200 1650 1668 +60220 1546 1548 +60220 1568 1623 +60220 1574 1439 +60220 1576 1752 +60220 1585 1522 +60220 1585 1766 +60220 1587 1634 +60220 1592 1471 +60220 1619 1871 +60220 1655 1873 +60220 1655 1786 +60220 1655 1886 +60220 1660 1692 +60220 1664 1692 +60220 1664 1831 +60220 1665 1894 +60220 1676 1761 +60220 1678 1919 +60220 1683 1880 +60220 1707 1808 +60220 1725 1747 +60220 1747 1845 +60220 1752 1522 +60220 1752 1455 +60220 1756 1466 +60220 1766 1507 +60220 1766 1892 +60220 1789 1908 +60220 1789 1517 +60220 1831 1448 +60220 1831 1917 +60220 1868 1873 +60220 1890 1479 +60220 1908 1517 +60220 1431 1516 +60220 1441 1487 +60220 1512 1531 +60220 1541 1906 +60220 1547 1698 +60220 1562 1622 +60220 1617 1857 +60220 1676 1731 +60220 1695 1761 +60220 1718 1889 +60220 1877 1890 +60220 1892 1522 +60220 1577 1531 +60220 1601 1458 +60220 1655 1865 +60220 1692 1767 +60220 1752 1766 +60220 1892 1477 +60220 1507 1522 +60220 1598 1696 +60220 1599 1889 +60220 1599 1492 +60220 1599 1718 +60220 1655 1868 +60220 1749 1757 +60220 1573 1452 +60220 1834 1863 +60220 1850 1441 +60220 1617 1764 +60220 1629 1911 +60220 1698 1707 +60220 1711 1877 +60220 1585 1752 +60220 1676 1775 +60220 1840 1489 +60220 1871 1517 +60220 1912 1916 +60220 1918 1475 +60220 1550 1572 +60220 1725 1462 +60220 1698 1808 +60220 1541 1678 +60220 1642 1437 +60220 1651 1703 +60220 1841 1901 +60220 1650 1668 +60240 1541 1906 +60240 1547 1698 +60240 1547 1707 +60240 1562 1622 +60240 1565 1688 +60240 1585 1831 +60240 1606 1884 +60240 1617 1857 +60240 1641 1470 +60240 1651 1766 +60240 1655 1829 +60240 1655 1774 +60240 1670 1711 +60240 1676 1887 +60240 1676 1731 +60240 1695 1761 +60240 1703 1766 +60240 1718 1889 +60240 1725 1487 +60240 1731 1887 +60240 1752 1505 +60240 1752 1831 +60240 1774 1492 +60240 1785 1470 +60240 1831 1477 +60240 1866 1871 +60240 1877 1890 +60240 1877 1479 +60240 1890 1908 +60240 1890 1517 +60240 1892 1522 +60240 1908 1479 +60240 1919 1473 +60240 1538 1524 +60240 1566 1467 +60240 1577 1531 +60240 1601 1458 +60240 1655 1865 +60240 1659 1727 +60240 1673 1747 +60240 1692 1767 +60240 1752 1766 +60240 1804 1510 +60240 1889 1492 +60240 1892 1898 +60240 1892 1477 +60240 1484 1492 +60240 1507 1522 +60240 1598 1696 +60240 1599 1889 +60240 1599 1492 +60240 1599 1718 +60240 1655 1868 +60240 1749 1757 +60240 1877 1908 +60240 1573 1452 +60240 1711 1908 +60240 1752 1501 +60240 1773 1835 +60240 1834 1863 +60240 1850 1441 +60240 1617 1764 +60240 1629 1911 +60240 1698 1707 +60240 1711 1877 +60240 1585 1752 +60240 1676 1775 +60240 1840 1489 +60240 1871 1517 +60240 1912 1916 +60240 1918 1475 +60240 1550 1572 +60240 1725 1462 +60240 1698 1808 +60240 1541 1678 +60240 1642 1437 +60240 1651 1703 +60240 1841 1901 +60240 1598 1635 +60240 1650 1668 +60260 1537 1912 +60260 1538 1524 +60260 1560 1664 +60260 1566 1467 +60260 1574 1439 +60260 1577 1531 +60260 1590 1473 +60260 1590 1649 +60260 1600 1674 +60260 1601 1458 +60260 1622 1879 +60260 1648 1696 +60260 1655 1865 +60260 1659 1727 +60260 1660 1767 +60260 1664 1835 +60260 1669 1754 +60260 1673 1747 +60260 1674 1519 +60260 1678 1717 +60260 1683 1464 +60260 1691 1906 +60260 1692 1767 +60260 1713 1762 +60260 1717 1775 +60260 1718 1492 +60260 1718 1774 +60260 1752 1766 +60260 1752 1527 +60260 1766 1527 +60260 1804 1510 +60260 1831 1522 +60260 1857 1470 +60260 1866 1908 +60260 1871 1527 +60260 1889 1492 +60260 1892 1898 +60260 1892 1477 +60260 1449 1512 +60260 1470 1483 +60260 1484 1492 +60260 1501 1505 +60260 1501 1522 +60260 1507 1522 +60260 1517 1527 +60260 1537 1689 +60260 1543 1528 +60260 1546 1548 +60260 1598 1696 +60260 1599 1889 +60260 1599 1492 +60260 1599 1718 +60260 1655 1868 +60260 1747 1465 +60260 1749 1757 +60260 1766 1871 +60260 1802 1865 +60260 1831 1505 +60260 1835 1894 +60260 1877 1908 +60260 1889 1484 +60260 1573 1452 +60260 1711 1908 +60260 1752 1501 +60260 1773 1835 +60260 1834 1863 +60260 1850 1441 +60260 1512 1531 +60260 1617 1764 +60260 1629 1911 +60260 1676 1498 +60260 1678 1906 +60260 1698 1707 +60260 1711 1877 +60260 1485 1529 +60260 1585 1752 +60260 1599 1484 +60260 1676 1775 +60260 1840 1489 +60260 1871 1517 +60260 1912 1916 +60260 1918 1475 +60260 1550 1572 +60260 1449 1531 +60260 1725 1462 +60260 1775 1498 +60260 1547 1590 +60260 1641 1664 +60260 1698 1808 +60260 1541 1678 +60260 1660 1692 +60260 1642 1437 +60260 1651 1703 +60260 1841 1901 +60260 1598 1635 +60260 1650 1668 +60280 1537 1689 +60280 1543 1528 +60280 1546 1548 +60280 1562 1875 +60280 1570 1731 +60280 1572 1470 +60280 1583 1890 +60280 1585 1517 +60280 1585 1879 +60280 1598 1696 +60280 1599 1889 +60280 1599 1734 +60280 1599 1774 +60280 1599 1492 +60280 1599 1718 +60280 1600 1890 +60280 1600 1519 +60280 1622 1875 +60280 1629 1458 +60280 1641 1919 +60280 1644 1473 +60280 1652 1725 +60280 1655 1868 +60280 1655 1734 +60280 1676 1480 +60280 1699 1496 +60280 1703 1434 +60280 1703 1501 +60280 1711 1479 +60280 1747 1465 +60280 1749 1757 +60280 1761 1775 +60280 1766 1871 +60280 1767 1855 +60280 1774 1889 +60280 1802 1865 +60280 1829 1886 +60280 1831 1505 +60280 1835 1894 +60280 1845 1437 +60280 1875 1448 +60280 1877 1908 +60280 1889 1484 +60280 1568 1582 +60280 1573 1452 +60280 1695 1761 +60280 1711 1908 +60280 1717 1906 +60280 1752 1501 +60280 1773 1835 +60280 1829 1873 +60280 1834 1863 +60280 1850 1441 +60280 1854 1527 +60280 1898 1477 +60280 1512 1531 +60280 1599 1907 +60280 1617 1764 +60280 1629 1911 +60280 1655 1907 +60280 1676 1498 +60280 1678 1906 +60280 1698 1707 +60280 1711 1877 +60280 1485 1529 +60280 1562 1622 +60280 1585 1752 +60280 1599 1484 +60280 1676 1775 +60280 1766 1879 +60280 1840 1489 +60280 1871 1517 +60280 1912 1916 +60280 1918 1475 +60280 1550 1572 +60280 1449 1531 +60280 1725 1462 +60280 1775 1498 +60280 1547 1590 +60280 1641 1664 +60280 1698 1808 +60280 1707 1808 +60280 1541 1678 +60280 1660 1692 +60280 1642 1437 +60280 1651 1703 +60280 1547 1649 +60280 1841 1901 +60280 1608 1894 +60280 1598 1635 +60280 1650 1668 +60300 1547 1644 +60300 1550 1887 +60300 1563 1592 +60300 1564 1470 +60300 1568 1582 +60300 1573 1452 +60300 1574 1439 +60300 1579 1761 +60300 1583 1519 +60300 1585 1501 +60300 1587 1634 +60300 1601 1831 +60300 1623 1706 +60300 1670 1908 +60300 1676 1531 +60300 1692 1887 +60300 1695 1761 +60300 1711 1866 +60300 1711 1908 +60300 1711 1890 +60300 1717 1906 +60300 1747 1831 +60300 1752 1501 +60300 1752 1879 +60300 1757 1501 +60300 1761 1480 +60300 1766 1501 +60300 1773 1835 +60300 1804 1510 +60300 1829 1873 +60300 1834 1863 +60300 1850 1441 +60300 1854 1527 +60300 1857 1887 +60300 1866 1890 +60300 1877 1890 +60300 1879 1501 +60300 1890 1908 +60300 1898 1477 +60300 1501 1517 +60300 1512 1531 +60300 1566 1467 +60300 1572 1887 +60300 1599 1907 +60300 1617 1764 +60300 1629 1911 +60300 1645 1756 +60300 1655 1907 +60300 1670 1711 +60300 1676 1498 +60300 1678 1906 +60300 1692 1731 +60300 1698 1707 +60300 1711 1877 +60300 1866 1908 +60300 1485 1529 +60300 1507 1522 +60300 1562 1622 +60300 1585 1752 +60300 1599 1484 +60300 1600 1674 +60300 1676 1775 +60300 1766 1879 +60300 1840 1489 +60300 1871 1517 +60300 1912 1916 +60300 1918 1475 +60300 1550 1572 +60300 1655 1774 +60300 1898 1920 +60300 1449 1531 +60300 1655 1484 +60300 1725 1462 +60300 1775 1498 +60300 1547 1590 +60300 1641 1664 +60300 1698 1808 +60300 1707 1808 +60300 1752 1766 +60300 1541 1678 +60300 1660 1692 +60300 1642 1437 +60300 1857 1441 +60300 1651 1703 +60300 1547 1649 +60300 1652 1747 +60300 1841 1901 +60300 1608 1894 +60300 1598 1635 +60300 1650 1668 +60320 1566 1467 +60320 1572 1887 +60320 1574 1734 +60320 1579 1717 +60320 1599 1907 +60320 1617 1835 +60320 1617 1764 +60320 1626 1742 +60320 1628 1871 +60320 1629 1911 +60320 1645 1756 +60320 1648 1696 +60320 1655 1907 +60320 1660 1731 +60320 1664 1845 +60320 1664 1773 +60320 1670 1711 +60320 1673 1747 +60320 1676 1498 +60320 1678 1906 +60320 1678 1901 +60320 1692 1731 +60320 1692 1863 +60320 1698 1707 +60320 1711 1877 +60320 1711 1479 +60320 1713 1762 +60320 1731 1835 +60320 1764 1857 +60320 1764 1835 +60320 1773 1845 +60320 1785 1811 +60320 1789 1902 +60320 1804 1438 +60320 1835 1441 +60320 1835 1857 +60320 1866 1908 +60320 1866 1527 +60320 1877 1908 +60320 1887 1437 +60320 1890 1519 +60320 1894 1914 +60320 1904 1501 +60320 1908 1519 +60320 1485 1529 +60320 1485 1531 +60320 1507 1522 +60320 1562 1622 +60320 1585 1752 +60320 1599 1484 +60320 1600 1674 +60320 1659 1727 +60320 1676 1775 +60320 1718 1851 +60320 1764 1850 +60320 1766 1879 +60320 1835 1887 +60320 1840 1489 +60320 1855 1480 +60320 1871 1517 +60320 1912 1916 +60320 1918 1475 +60320 1473 1533 +60320 1550 1572 +60320 1599 1655 +60320 1617 1857 +60320 1617 1850 +60320 1648 1749 +60320 1655 1774 +60320 1850 1857 +60320 1898 1920 +60320 1449 1531 +60320 1655 1484 +60320 1725 1462 +60320 1775 1498 +60320 1547 1590 +60320 1641 1664 +60320 1698 1808 +60320 1707 1808 +60320 1752 1766 +60320 1541 1678 +60320 1660 1692 +60320 1642 1437 +60320 1857 1441 +60320 1651 1703 +60320 1674 1890 +60320 1547 1649 +60320 1613 1644 +60320 1652 1747 +60320 1841 1901 +60320 1608 1894 +60320 1598 1635 +60320 1650 1668 +60340 1546 1548 +60340 1562 1622 +60340 1582 1656 +60340 1585 1752 +60340 1591 1858 +60340 1599 1484 +60340 1600 1890 +60340 1600 1674 +60340 1601 1458 +60340 1602 1811 +60340 1602 1725 +60340 1617 1664 +60340 1650 1825 +60340 1651 1897 +60340 1659 1727 +60340 1664 1764 +60340 1668 1825 +60340 1676 1775 +60340 1711 1819 +60340 1711 1908 +60340 1718 1851 +60340 1761 1775 +60340 1764 1850 +60340 1766 1879 +60340 1767 1787 +60340 1774 1484 +60340 1828 1465 +60340 1835 1887 +60340 1840 1489 +60340 1855 1480 +60340 1866 1877 +60340 1871 1517 +60340 1877 1527 +60340 1898 1477 +60340 1908 1527 +60340 1912 1916 +60340 1918 1475 +60340 1433 1448 +60340 1473 1533 +60340 1483 1485 +60340 1501 1517 +60340 1550 1572 +60340 1590 1649 +60340 1599 1655 +60340 1617 1857 +60340 1617 1850 +60340 1628 1875 +60340 1648 1749 +60340 1655 1774 +60340 1706 1501 +60340 1850 1857 +60340 1898 1920 +60340 1449 1531 +60340 1569 1742 +60340 1587 1634 +60340 1617 1441 +60340 1655 1786 +60340 1655 1484 +60340 1695 1761 +60340 1725 1462 +60340 1775 1498 +60340 1775 1439 +60340 1547 1590 +60340 1623 1501 +60340 1641 1664 +60340 1698 1808 +60340 1707 1808 +60340 1752 1766 +60340 1541 1678 +60340 1660 1692 +60340 1676 1439 +60340 1642 1437 +60340 1857 1441 +60340 1651 1703 +60340 1674 1890 +60340 1547 1649 +60340 1613 1644 +60340 1652 1747 +60340 1841 1901 +60340 1608 1894 +60340 1598 1635 +60340 1650 1668 +60360 1547 1713 +60360 1550 1572 +60360 1550 1622 +60360 1562 1692 +60360 1566 1467 +60360 1572 1731 +60360 1573 1725 +60360 1590 1649 +60360 1599 1655 +60360 1602 1452 +60360 1617 1857 +60360 1617 1850 +60360 1617 1731 +60360 1628 1875 +60360 1641 1485 +60360 1645 1756 +60360 1648 1897 +60360 1648 1749 +60360 1655 1774 +60360 1664 1731 +60360 1698 1713 +60360 1706 1501 +60360 1713 1533 +60360 1731 1441 +60360 1731 1857 +60360 1749 1897 +60360 1775 1513 +60360 1804 1510 +60360 1850 1857 +60360 1887 1437 +60360 1894 1529 +60360 1898 1920 +60360 1906 1513 +60360 1914 1533 +60360 1437 1496 +60360 1439 1513 +60360 1449 1531 +60360 1496 1505 +60360 1507 1524 +60360 1541 1906 +60360 1569 1742 +60360 1587 1634 +60360 1600 1825 +60360 1617 1441 +60360 1655 1786 +60360 1655 1484 +60360 1664 1773 +60360 1676 1498 +60360 1678 1906 +60360 1683 1897 +60360 1695 1761 +60360 1725 1462 +60360 1752 1879 +60360 1775 1498 +60360 1775 1439 +60360 1789 1902 +60360 1877 1908 +60360 1547 1590 +60360 1623 1501 +60360 1641 1664 +60360 1698 1808 +60360 1698 1717 +60360 1707 1808 +60360 1727 1779 +60360 1752 1766 +60360 1439 1498 +60360 1541 1678 +60360 1660 1692 +60360 1835 1437 +60360 1438 1519 +60360 1676 1439 +60360 1804 1438 +60360 1585 1766 +60360 1642 1437 +60360 1857 1441 +60360 1651 1703 +60360 1674 1890 +60360 1547 1649 +60360 1613 1644 +60360 1622 1731 +60360 1829 1886 +60360 1652 1747 +60360 1841 1901 +60360 1608 1894 +60360 1754 1821 +60360 1598 1635 +60360 1650 1668 +60380 1541 1906 +60380 1564 1619 +60380 1569 1742 +60380 1587 1634 +60380 1600 1825 +60380 1600 1890 +60380 1602 1725 +60380 1617 1441 +60380 1622 1845 +60380 1623 1706 +60380 1626 1742 +60380 1655 1786 +60380 1655 1484 +60380 1659 1727 +60380 1664 1773 +60380 1676 1498 +60380 1678 1906 +60380 1683 1880 +60380 1683 1897 +60380 1695 1761 +60380 1696 1897 +60380 1707 1717 +60380 1711 1908 +60380 1711 1877 +60380 1717 1808 +60380 1725 1465 +60380 1725 1462 +60380 1731 1773 +60380 1752 1879 +60380 1775 1498 +60380 1775 1439 +60380 1789 1902 +60380 1798 1840 +60380 1798 1485 +60380 1819 1897 +60380 1829 1873 +60380 1875 1470 +60380 1877 1908 +60380 1912 1916 +60380 1916 1491 +60380 1918 1475 +60380 1428 1431 +60380 1547 1590 +60380 1623 1501 +60380 1641 1664 +60380 1676 1775 +60380 1698 1808 +60380 1698 1717 +60380 1698 1535 +60380 1707 1808 +60380 1727 1779 +60380 1752 1766 +60380 1835 1887 +60380 1439 1498 +60380 1485 1529 +60380 1522 1524 +60380 1541 1678 +60380 1554 1853 +60380 1660 1692 +60380 1835 1437 +60380 1438 1519 +60380 1676 1439 +60380 1804 1438 +60380 1585 1766 +60380 1642 1437 +60380 1546 1548 +60380 1857 1441 +60380 1601 1458 +60380 1651 1703 +60380 1674 1890 +60380 1698 1707 +60380 1547 1649 +60380 1613 1644 +60380 1622 1731 +60380 1829 1886 +60380 1652 1747 +60380 1841 1901 +60380 1871 1517 +60380 1608 1894 +60380 1754 1821 +60380 1598 1635 +60380 1650 1668 +60400 1538 1522 +60400 1547 1590 +60400 1560 1526 +60400 1585 1438 +60400 1599 1774 +60400 1602 1798 +60400 1604 1858 +60400 1609 1908 +60400 1609 1877 +60400 1613 1513 +60400 1613 1845 +60400 1623 1501 +60400 1641 1664 +60400 1651 1749 +60400 1655 1721 +60400 1655 1774 +60400 1656 1501 +60400 1664 1771 +60400 1669 1754 +60400 1676 1775 +60400 1683 1464 +60400 1698 1808 +60400 1698 1717 +60400 1698 1535 +60400 1703 1749 +60400 1703 1455 +60400 1707 1808 +60400 1717 1830 +60400 1717 1535 +60400 1727 1779 +60400 1749 1819 +60400 1752 1766 +60400 1761 1439 +60400 1773 1473 +60400 1835 1887 +60400 1840 1489 +60400 1439 1498 +60400 1449 1531 +60400 1485 1529 +60400 1517 1525 +60400 1522 1524 +60400 1541 1678 +60400 1554 1853 +60400 1660 1692 +60400 1835 1437 +60400 1853 1470 +60400 1898 1517 +60400 1438 1519 +60400 1496 1505 +60400 1507 1522 +60400 1550 1513 +60400 1641 1771 +60400 1676 1439 +60400 1804 1438 +60400 1585 1752 +60400 1585 1766 +60400 1642 1437 +60400 1546 1548 +60400 1857 1441 +60400 1601 1458 +60400 1651 1703 +60400 1674 1890 +60400 1438 1510 +60400 1698 1707 +60400 1547 1649 +60400 1920 1517 +60400 1613 1644 +60400 1622 1731 +60400 1829 1886 +60400 1652 1747 +60400 1841 1901 +60400 1554 1470 +60400 1871 1517 +60400 1608 1894 +60400 1754 1821 +60400 1598 1635 +60400 1650 1668 +60420 1541 1698 +60420 1541 1678 +60420 1547 1808 +60420 1547 1717 +60420 1550 1473 +60420 1554 1853 +60420 1601 1911 +60420 1619 1673 +60420 1622 1771 +60420 1625 1875 +60420 1642 1835 +60420 1655 1786 +60420 1659 1779 +60420 1660 1692 +60420 1673 1866 +60420 1698 1480 +60420 1698 1855 +60420 1707 1480 +60420 1711 1908 +60420 1711 1877 +60420 1717 1808 +60420 1717 1775 +60420 1721 1786 +60420 1787 1851 +60420 1804 1510 +60420 1835 1496 +60420 1835 1437 +60420 1853 1470 +60420 1884 1438 +60420 1898 1920 +60420 1898 1517 +60420 1898 1477 +60420 1908 1916 +60420 1438 1519 +60420 1473 1513 +60420 1496 1505 +60420 1501 1525 +60420 1507 1522 +60420 1547 1775 +60420 1550 1513 +60420 1550 1572 +60420 1590 1513 +60420 1599 1721 +60420 1626 1742 +60420 1641 1771 +60420 1676 1841 +60420 1676 1439 +60420 1721 1774 +60420 1804 1438 +60420 1449 1512 +60420 1512 1531 +60420 1541 1906 +60420 1585 1752 +60420 1585 1766 +60420 1642 1437 +60420 1678 1906 +60420 1829 1873 +60420 1873 1886 +60420 1546 1548 +60420 1619 1866 +60420 1676 1498 +60420 1857 1441 +60420 1601 1458 +60420 1651 1703 +60420 1674 1890 +60420 1691 1906 +60420 1438 1510 +60420 1698 1707 +60420 1547 1649 +60420 1871 1920 +60420 1920 1517 +60420 1613 1644 +60420 1622 1731 +60420 1829 1886 +60420 1775 1808 +60420 1652 1747 +60420 1841 1901 +60420 1554 1470 +60420 1871 1517 +60420 1608 1894 +60420 1754 1821 +60420 1598 1635 +60420 1650 1668 +60440 1537 1522 +60440 1537 1524 +60440 1540 1625 +60440 1547 1775 +60440 1550 1513 +60440 1550 1572 +60440 1562 1764 +60440 1590 1513 +60440 1599 1721 +60440 1601 1495 +60440 1602 1828 +60440 1617 1835 +60440 1622 1462 +60440 1626 1742 +60440 1641 1771 +60440 1642 1887 +60440 1649 1775 +60440 1674 1825 +60440 1676 1841 +60440 1676 1718 +60440 1676 1439 +60440 1695 1761 +60440 1718 1749 +60440 1721 1774 +60440 1727 1779 +60440 1804 1438 +60440 1845 1480 +60440 1850 1441 +60440 1907 1513 +60440 1449 1512 +60440 1471 1487 +60440 1482 1498 +60440 1485 1529 +60440 1512 1531 +60440 1522 1524 +60440 1541 1906 +60440 1549 1525 +60440 1585 1752 +60440 1585 1766 +60440 1642 1437 +60440 1655 1816 +60440 1678 1906 +60440 1829 1873 +60440 1873 1886 +60440 1431 1516 +60440 1546 1548 +60440 1569 1742 +60440 1619 1866 +60440 1676 1498 +60440 1676 1482 +60440 1857 1441 +60440 1601 1458 +60440 1616 1462 +60440 1651 1703 +60440 1674 1890 +60440 1691 1906 +60440 1438 1510 +60440 1678 1710 +60440 1698 1707 +60440 1845 1434 +60440 1547 1649 +60440 1871 1920 +60440 1920 1517 +60440 1613 1644 +60440 1622 1731 +60440 1829 1886 +60440 1775 1808 +60440 1652 1747 +60440 1789 1902 +60440 1841 1901 +60440 1554 1470 +60440 1871 1517 +60440 1608 1894 +60440 1501 1527 +60440 1754 1821 +60440 1598 1635 +60440 1650 1668 +60460 1541 1906 +60460 1549 1525 +60460 1572 1473 +60460 1572 1773 +60460 1576 1689 +60460 1585 1752 +60460 1585 1766 +60460 1601 1911 +60460 1617 1441 +60460 1641 1462 +60460 1642 1437 +60460 1655 1816 +60460 1655 1786 +60460 1678 1906 +60460 1683 1897 +60460 1683 1858 +60460 1711 1487 +60460 1718 1855 +60460 1721 1882 +60460 1752 1766 +60460 1773 1473 +60460 1825 1510 +60460 1829 1873 +60460 1847 1517 +60460 1847 1871 +60460 1866 1496 +60460 1873 1886 +60460 1431 1516 +60460 1546 1548 +60460 1569 1742 +60460 1600 1825 +60460 1619 1866 +60460 1628 1485 +60460 1676 1498 +60460 1676 1482 +60460 1717 1808 +60460 1786 1882 +60460 1857 1441 +60460 1877 1908 +60460 1898 1477 +60460 1462 1533 +60460 1540 1875 +60460 1585 1884 +60460 1591 1858 +60460 1601 1458 +60460 1616 1462 +60460 1641 1533 +60460 1651 1703 +60460 1674 1890 +60460 1691 1906 +60460 1718 1889 +60460 1438 1510 +60460 1622 1513 +60460 1655 1721 +60460 1678 1710 +60460 1698 1707 +60460 1845 1434 +60460 1547 1649 +60460 1655 1774 +60460 1871 1920 +60460 1920 1517 +60460 1541 1678 +60460 1613 1644 +60460 1622 1731 +60460 1829 1886 +60460 1775 1808 +60460 1433 1519 +60460 1652 1747 +60460 1789 1902 +60460 1841 1901 +60460 1554 1470 +60460 1600 1438 +60460 1871 1517 +60460 1608 1894 +60460 1660 1692 +60460 1501 1527 +60460 1507 1522 +60460 1754 1821 +60460 1598 1635 +60460 1650 1668 +60480 1546 1548 +60480 1563 1487 +60480 1569 1742 +60480 1600 1825 +60480 1600 1890 +60480 1606 1477 +60480 1617 1857 +60480 1619 1866 +60480 1626 1742 +60480 1628 1485 +60480 1642 1866 +60480 1652 1811 +60480 1659 1779 +60480 1670 1877 +60480 1676 1498 +60480 1676 1482 +60480 1676 1439 +60480 1695 1761 +60480 1711 1908 +60480 1711 1877 +60480 1717 1808 +60480 1717 1855 +60480 1717 1775 +60480 1718 1492 +60480 1735 1428 +60480 1752 1914 +60480 1752 1527 +60480 1786 1882 +60480 1857 1441 +60480 1877 1908 +60480 1879 1522 +60480 1898 1477 +60480 1912 1916 +60480 1918 1475 +60480 1462 1533 +60480 1476 1487 +60480 1485 1529 +60480 1540 1875 +60480 1547 1775 +60480 1585 1884 +60480 1591 1858 +60480 1601 1458 +60480 1616 1462 +60480 1641 1533 +60480 1649 1775 +60480 1651 1703 +60480 1674 1890 +60480 1691 1906 +60480 1718 1889 +60480 1847 1897 +60480 1438 1510 +60480 1439 1482 +60480 1439 1498 +60480 1482 1498 +60480 1622 1513 +60480 1655 1721 +60480 1678 1710 +60480 1698 1707 +60480 1731 1513 +60480 1845 1434 +60480 1522 1524 +60480 1547 1649 +60480 1619 1496 +60480 1655 1774 +60480 1825 1438 +60480 1871 1920 +60480 1920 1517 +60480 1541 1678 +60480 1613 1644 +60480 1622 1731 +60480 1829 1886 +60480 1775 1808 +60480 1433 1519 +60480 1449 1531 +60480 1652 1747 +60480 1789 1902 +60480 1841 1901 +60480 1554 1470 +60480 1600 1438 +60480 1871 1517 +60480 1608 1894 +60480 1550 1572 +60480 1660 1692 +60480 1501 1527 +60480 1507 1522 +60480 1754 1821 +60480 1598 1635 +60480 1650 1668 +60500 1537 1847 +60500 1540 1875 +60500 1547 1855 +60500 1547 1775 +60500 1549 1914 +60500 1562 1839 +60500 1585 1884 +60500 1591 1858 +60500 1591 1847 +60500 1599 1816 +60500 1599 1721 +60500 1600 1650 +60500 1601 1458 +60500 1616 1462 +60500 1625 1629 +60500 1641 1533 +60500 1644 1717 +60500 1649 1775 +60500 1651 1703 +60500 1655 1882 +60500 1674 1890 +60500 1691 1906 +60500 1692 1535 +60500 1698 1886 +60500 1718 1889 +60500 1761 1841 +60500 1771 1480 +60500 1847 1897 +60500 1847 1858 +60500 1847 1879 +60500 1858 1897 +60500 1858 1477 +60500 1887 1437 +60500 1897 1477 +60500 1431 1516 +60500 1438 1510 +60500 1439 1482 +60500 1439 1498 +60500 1482 1498 +60500 1582 1527 +60500 1622 1513 +60500 1655 1816 +60500 1655 1721 +60500 1678 1710 +60500 1698 1707 +60500 1727 1779 +60500 1731 1513 +60500 1766 1884 +60500 1845 1434 +60500 1522 1524 +60500 1544 1890 +60500 1546 1431 +60500 1547 1649 +60500 1619 1496 +60500 1655 1774 +60500 1825 1438 +60500 1825 1510 +60500 1871 1920 +60500 1920 1517 +60500 1541 1678 +60500 1613 1644 +60500 1622 1731 +60500 1829 1886 +60500 1840 1489 +60500 1585 1766 +60500 1775 1808 +60500 1829 1873 +60500 1433 1519 +60500 1449 1531 +60500 1652 1747 +60500 1789 1902 +60500 1841 1901 +60500 1554 1470 +60500 1600 1438 +60500 1871 1517 +60500 1608 1894 +60500 1550 1572 +60500 1660 1692 +60500 1501 1527 +60500 1507 1522 +60500 1754 1821 +60500 1598 1635 +60500 1650 1668 +60520 1537 1728 +60520 1551 1894 +60520 1576 1752 +60520 1582 1501 +60520 1582 1527 +60520 1583 1525 +60520 1591 1897 +60520 1602 1617 +60520 1622 1480 +60520 1622 1513 +60520 1655 1796 +60520 1655 1881 +60520 1655 1816 +60520 1655 1721 +60520 1659 1779 +60520 1659 1903 +60520 1676 1498 +60520 1678 1901 +60520 1678 1710 +60520 1688 1728 +60520 1698 1707 +60520 1717 1480 +60520 1727 1779 +60520 1731 1513 +60520 1742 1517 +60520 1742 1871 +60520 1752 1858 +60520 1752 1501 +60520 1752 1902 +60520 1766 1884 +60520 1766 1527 +60520 1786 1881 +60520 1789 1858 +60520 1804 1825 +60520 1835 1919 +60520 1845 1434 +60520 1881 1882 +60520 1522 1524 +60520 1544 1890 +60520 1546 1431 +60520 1547 1649 +60520 1550 1773 +60520 1566 1467 +60520 1599 1774 +60520 1619 1496 +60520 1619 1866 +60520 1628 1485 +60520 1655 1774 +60520 1655 1807 +60520 1676 1482 +60520 1718 1503 +60520 1819 1920 +60520 1825 1438 +60520 1825 1510 +60520 1871 1920 +60520 1877 1908 +60520 1884 1525 +60520 1920 1517 +60520 1541 1678 +60520 1613 1644 +60520 1622 1731 +60520 1805 1888 +60520 1828 1452 +60520 1829 1886 +60520 1840 1489 +60520 1544 1674 +60520 1585 1766 +60520 1775 1808 +60520 1829 1873 +60520 1480 1513 +60520 1433 1519 +60520 1449 1531 +60520 1652 1747 +60520 1789 1902 +60520 1841 1901 +60520 1554 1470 +60520 1599 1796 +60520 1600 1438 +60520 1871 1517 +60520 1608 1894 +60520 1550 1572 +60520 1660 1692 +60520 1501 1527 +60520 1507 1522 +60520 1754 1821 +60520 1598 1635 +60520 1650 1668 +60540 1541 1710 +60540 1543 1528 +60540 1544 1890 +60540 1546 1431 +60540 1547 1649 +60540 1550 1773 +60540 1566 1467 +60540 1582 1728 +60540 1582 1847 +60540 1585 1752 +60540 1585 1689 +60540 1585 1434 +60540 1585 1525 +60540 1591 1890 +60540 1591 1858 +60540 1599 1774 +60540 1616 1462 +60540 1619 1496 +60540 1619 1866 +60540 1628 1485 +60540 1655 1774 +60540 1655 1807 +60540 1676 1482 +60540 1711 1908 +60540 1718 1503 +60540 1728 1847 +60540 1735 1428 +60540 1752 1766 +60540 1752 1487 +60540 1752 1527 +60540 1752 1784 +60540 1761 1841 +60540 1766 1525 +60540 1766 1845 +60540 1786 1882 +60540 1808 1855 +60540 1819 1920 +60540 1825 1438 +60540 1825 1510 +60540 1866 1496 +60540 1871 1920 +60540 1871 1425 +60540 1873 1886 +60540 1877 1908 +60540 1884 1525 +60540 1897 1487 +60540 1920 1517 +60540 1541 1678 +60540 1613 1644 +60540 1622 1731 +60540 1699 1904 +60540 1805 1888 +60540 1828 1452 +60540 1829 1886 +60540 1840 1489 +60540 1858 1890 +60540 1920 1425 +60540 1463 1485 +60540 1544 1674 +60540 1585 1766 +60540 1645 1756 +60540 1689 1752 +60540 1775 1808 +60540 1829 1873 +60540 1480 1513 +60540 1651 1703 +60540 1775 1855 +60540 1857 1441 +60540 1433 1519 +60540 1449 1531 +60540 1652 1747 +60540 1789 1902 +60540 1898 1477 +60540 1674 1890 +60540 1841 1901 +60540 1554 1470 +60540 1599 1796 +60540 1600 1438 +60540 1655 1512 +60540 1871 1517 +60540 1608 1894 +60540 1648 1696 +60540 1550 1572 +60540 1660 1692 +60540 1501 1527 +60540 1507 1522 +60540 1754 1821 +60540 1598 1635 +60540 1650 1668 +60560 1541 1678 +60560 1562 1660 +60560 1573 1828 +60560 1582 1425 +60560 1587 1634 +60560 1591 1845 +60560 1591 1519 +60560 1613 1644 +60560 1622 1731 +60560 1649 1676 +60560 1683 1734 +60560 1689 1884 +60560 1689 1525 +60560 1699 1904 +60560 1742 1487 +60560 1779 1903 +60560 1805 1888 +60560 1828 1452 +60560 1829 1886 +60560 1835 1858 +60560 1840 1489 +60560 1858 1890 +60560 1887 1437 +60560 1920 1425 +60560 1463 1485 +60560 1544 1674 +60560 1585 1766 +60560 1591 1434 +60560 1600 1897 +60560 1613 1641 +60560 1613 1894 +60560 1645 1756 +60560 1669 1754 +60560 1678 1710 +60560 1689 1752 +60560 1711 1877 +60560 1775 1808 +60560 1829 1873 +60560 1480 1513 +60560 1651 1703 +60560 1752 1884 +60560 1775 1855 +60560 1857 1441 +60560 1433 1519 +60560 1449 1531 +60560 1652 1747 +60560 1789 1902 +60560 1898 1477 +60560 1522 1524 +60560 1546 1548 +60560 1674 1890 +60560 1841 1901 +60560 1554 1470 +60560 1599 1796 +60560 1655 1882 +60560 1600 1438 +60560 1655 1512 +60560 1871 1517 +60560 1608 1894 +60560 1648 1696 +60560 1550 1572 +60560 1660 1692 +60560 1501 1527 +60560 1507 1522 +60560 1754 1821 +60560 1598 1635 +60560 1650 1668 +60580 1541 1649 +60580 1541 1906 +60580 1543 1531 +60580 1544 1674 +60580 1547 1649 +60580 1550 1622 +60580 1552 1676 +60580 1583 1897 +60580 1585 1766 +60580 1591 1434 +60580 1600 1897 +60580 1601 1458 +60580 1613 1641 +60580 1613 1676 +60580 1613 1894 +60580 1613 1535 +60580 1614 1897 +60580 1619 1773 +60580 1628 1437 +60580 1641 1676 +60580 1645 1756 +60580 1659 1779 +60580 1659 1727 +60580 1669 1754 +60580 1678 1710 +60580 1688 1477 +60580 1689 1752 +60580 1711 1908 +60580 1711 1877 +60580 1764 1448 +60580 1766 1858 +60580 1775 1808 +60580 1786 1882 +60580 1808 1855 +60580 1819 1920 +60580 1825 1897 +60580 1825 1890 +60580 1825 1438 +60580 1829 1873 +60580 1842 1471 +60580 1845 1858 +60580 1847 1501 +60580 1847 1487 +60580 1854 1487 +60580 1857 1868 +60580 1858 1897 +60580 1858 1519 +60580 1862 1437 +60580 1897 1438 +60580 1480 1513 +60580 1485 1489 +60580 1485 1529 +60580 1487 1501 +60580 1617 1665 +60580 1626 1742 +60580 1641 1535 +60580 1651 1703 +60580 1688 1898 +60580 1752 1884 +60580 1775 1855 +60580 1787 1851 +60580 1845 1434 +60580 1850 1441 +60580 1850 1857 +60580 1857 1441 +60580 1433 1519 +60580 1449 1531 +60580 1642 1756 +60580 1652 1747 +60580 1789 1902 +60580 1868 1441 +60580 1898 1477 +60580 1522 1524 +60580 1546 1548 +60580 1674 1890 +60580 1573 1452 +60580 1841 1901 +60580 1554 1470 +60580 1599 1796 +60580 1616 1462 +60580 1655 1882 +60580 1600 1438 +60580 1655 1512 +60580 1591 1525 +60580 1871 1517 +60580 1608 1894 +60580 1648 1696 +60580 1591 1858 +60580 1550 1572 +60580 1660 1692 +60580 1501 1527 +60580 1507 1522 +60580 1754 1821 +60580 1598 1635 +60580 1650 1668 +60600 1541 1602 +60600 1544 1897 +60600 1547 1855 +60600 1550 1480 +60600 1576 1766 +60600 1591 1752 +60600 1591 1884 +60600 1602 1480 +60600 1602 1619 +60600 1608 1613 +60600 1617 1665 +60600 1619 1480 +60600 1619 1857 +60600 1623 1706 +60600 1626 1742 +60600 1641 1535 +60600 1651 1703 +60600 1670 1711 +60600 1684 1489 +60600 1688 1898 +60600 1688 1789 +60600 1688 1902 +60600 1688 1847 +60600 1734 1779 +60600 1752 1858 +60600 1752 1884 +60600 1752 1525 +60600 1775 1855 +60600 1787 1851 +60600 1805 1888 +60600 1829 1886 +60600 1835 1517 +60600 1845 1434 +60600 1850 1441 +60600 1850 1857 +60600 1857 1441 +60600 1914 1478 +60600 1433 1519 +60600 1449 1531 +60600 1613 1773 +60600 1642 1756 +60600 1652 1747 +60600 1688 1501 +60600 1734 1819 +60600 1752 1766 +60600 1789 1902 +60600 1807 1467 +60600 1825 1510 +60600 1868 1441 +60600 1877 1908 +60600 1898 1477 +60600 1522 1524 +60600 1546 1548 +60600 1613 1439 +60600 1674 1897 +60600 1674 1890 +60600 1573 1452 +60600 1841 1901 +60600 1889 1492 +60600 1554 1470 +60600 1599 1796 +60600 1616 1462 +60600 1655 1882 +60600 1887 1437 +60600 1890 1897 +60600 1600 1438 +60600 1655 1512 +60600 1734 1920 +60600 1775 1528 +60600 1858 1525 +60600 1543 1528 +60600 1591 1525 +60600 1871 1517 +60600 1608 1894 +60600 1648 1696 +60600 1591 1858 +60600 1543 1775 +60600 1840 1489 +60600 1550 1572 +60600 1541 1547 +60600 1660 1692 +60600 1501 1527 +60600 1507 1522 +60600 1754 1821 +60600 1598 1635 +60600 1650 1668 +60620 1537 1853 +60620 1549 1919 +60620 1585 1766 +60620 1585 1703 +60620 1591 1527 +60620 1592 1789 +60620 1613 1773 +60620 1622 1469 +60620 1641 1676 +60620 1642 1756 +60620 1652 1747 +60620 1677 1683 +60620 1677 1701 +60620 1688 1897 +60620 1688 1519 +60620 1688 1501 +60620 1688 1527 +60620 1711 1877 +60620 1725 1490 +60620 1728 1425 +60620 1734 1473 +60620 1734 1819 +60620 1752 1766 +60620 1766 1433 +60620 1789 1902 +60620 1807 1467 +60620 1825 1510 +60620 1868 1441 +60620 1877 1908 +60620 1898 1477 +60620 1912 1480 +60620 1425 1431 +60620 1431 1516 +60620 1460 1499 +60620 1485 1529 +60620 1522 1524 +60620 1525 1527 +60620 1546 1548 +60620 1547 1691 +60620 1578 1480 +60620 1582 1622 +60620 1613 1439 +60620 1674 1897 +60620 1674 1890 +60620 1835 1871 +60620 1862 1916 +60620 1573 1452 +60620 1602 1513 +60620 1613 1498 +60620 1841 1901 +60620 1889 1492 +60620 1554 1470 +60620 1599 1796 +60620 1616 1462 +60620 1655 1882 +60620 1887 1437 +60620 1890 1897 +60620 1566 1467 +60620 1600 1438 +60620 1655 1512 +60620 1734 1920 +60620 1775 1528 +60620 1786 1512 +60620 1858 1525 +60620 1543 1528 +60620 1591 1525 +60620 1622 1761 +60620 1871 1517 +60620 1608 1894 +60620 1648 1696 +60620 1591 1858 +60620 1543 1775 +60620 1840 1489 +60620 1550 1572 +60620 1541 1547 +60620 1660 1692 +60620 1501 1527 +60620 1507 1522 +60620 1544 1674 +60620 1754 1821 +60620 1598 1635 +60620 1650 1668 +60640 1544 1897 +60640 1546 1898 +60640 1546 1548 +60640 1547 1691 +60640 1548 1425 +60640 1563 1592 +60640 1569 1626 +60640 1578 1480 +60640 1582 1622 +60640 1590 1688 +60640 1590 1764 +60640 1600 1919 +60640 1604 1740 +60640 1613 1439 +60640 1619 1516 +60640 1622 1924 +60640 1626 1742 +60640 1649 1857 +60640 1660 1816 +60640 1670 1908 +60640 1674 1897 +60640 1674 1890 +60640 1689 1858 +60640 1692 1816 +60640 1701 1703 +60640 1718 1482 +60640 1728 1752 +60640 1783 1453 +60640 1825 1919 +60640 1835 1871 +60640 1862 1916 +60640 1879 1898 +60640 1902 1522 +60640 1920 1473 +60640 1485 1516 +60640 1573 1452 +60640 1602 1513 +60640 1613 1498 +60640 1617 1665 +60640 1628 1676 +60640 1696 1522 +60640 1703 1835 +60640 1721 1816 +60640 1728 1897 +60640 1728 1890 +60640 1841 1901 +60640 1889 1492 +60640 1449 1531 +60640 1554 1470 +60640 1599 1796 +60640 1616 1462 +60640 1655 1882 +60640 1887 1437 +60640 1890 1897 +60640 1566 1467 +60640 1591 1884 +60640 1600 1438 +60640 1655 1512 +60640 1734 1920 +60640 1775 1528 +60640 1786 1512 +60640 1858 1525 +60640 1919 1510 +60640 1919 1438 +60640 1543 1528 +60640 1591 1525 +60640 1622 1761 +60640 1858 1884 +60640 1871 1517 +60640 1608 1894 +60640 1648 1696 +60640 1591 1858 +60640 1543 1775 +60640 1808 1855 +60640 1840 1489 +60640 1550 1572 +60640 1541 1547 +60640 1546 1425 +60640 1660 1692 +60640 1501 1527 +60640 1507 1522 +60640 1544 1674 +60640 1754 1821 +60640 1598 1635 +60640 1650 1668 +60660 1562 1816 +60660 1573 1452 +60660 1582 1761 +60660 1590 1489 +60660 1592 1626 +60660 1592 1470 +60660 1602 1513 +60660 1613 1498 +60660 1617 1665 +60660 1619 1701 +60660 1628 1676 +60660 1655 1786 +60660 1696 1522 +60660 1703 1835 +60660 1721 1816 +60660 1728 1448 +60660 1728 1897 +60660 1728 1890 +60660 1740 1487 +60660 1761 1453 +60660 1779 1819 +60660 1787 1851 +60660 1789 1902 +60660 1841 1901 +60660 1884 1525 +60660 1887 1480 +60660 1889 1492 +60660 1898 1425 +60660 1898 1477 +60660 1912 1916 +60660 1437 1480 +60660 1449 1531 +60660 1489 1516 +60660 1554 1470 +60660 1599 1796 +60660 1616 1462 +60660 1655 1882 +60660 1711 1908 +60660 1734 1819 +60660 1779 1903 +60660 1866 1496 +60660 1887 1437 +60660 1890 1897 +60660 1566 1467 +60660 1582 1453 +60660 1591 1884 +60660 1600 1438 +60660 1622 1453 +60660 1655 1512 +60660 1734 1920 +60660 1775 1528 +60660 1786 1512 +60660 1835 1874 +60660 1858 1525 +60660 1919 1510 +60660 1919 1438 +60660 1543 1528 +60660 1591 1525 +60660 1622 1761 +60660 1858 1884 +60660 1868 1441 +60660 1871 1517 +60660 1608 1894 +60660 1648 1696 +60660 1877 1908 +60660 1433 1519 +60660 1591 1858 +60660 1613 1695 +60660 1522 1524 +60660 1543 1775 +60660 1601 1458 +60660 1660 1688 +60660 1688 1692 +60660 1808 1855 +60660 1840 1489 +60660 1857 1441 +60660 1541 1683 +60660 1550 1572 +60660 1676 1439 +60660 1541 1547 +60660 1546 1425 +60660 1585 1752 +60660 1660 1692 +60660 1547 1683 +60660 1501 1527 +60660 1507 1522 +60660 1544 1674 +60660 1754 1821 +60660 1598 1635 +60660 1650 1668 +60680 1537 1480 +60680 1537 1578 +60680 1537 1731 +60680 1537 1613 +60680 1547 1855 +60680 1554 1470 +60680 1572 1731 +60680 1583 1825 +60680 1585 1766 +60680 1592 1798 +60680 1599 1796 +60680 1608 1480 +60680 1609 1879 +60680 1613 1773 +60680 1616 1462 +60680 1628 1463 +60680 1655 1882 +60680 1674 1890 +60680 1679 1505 +60680 1683 1691 +60680 1703 1475 +60680 1711 1908 +60680 1725 1490 +60680 1731 1480 +60680 1734 1819 +60680 1779 1903 +60680 1785 1448 +60680 1816 1866 +60680 1816 1823 +60680 1821 1489 +60680 1829 1873 +60680 1829 1487 +60680 1850 1868 +60680 1862 1912 +60680 1866 1496 +60680 1882 1512 +60680 1887 1437 +60680 1890 1897 +60680 1894 1480 +60680 1914 1478 +60680 1455 1463 +60680 1485 1529 +60680 1566 1467 +60680 1582 1453 +60680 1591 1884 +60680 1600 1438 +60680 1622 1453 +60680 1655 1512 +60680 1701 1835 +60680 1734 1920 +60680 1775 1528 +60680 1786 1512 +60680 1825 1510 +60680 1835 1874 +60680 1850 1857 +60680 1858 1525 +60680 1919 1510 +60680 1919 1438 +60680 1543 1528 +60680 1591 1525 +60680 1622 1761 +60680 1718 1482 +60680 1850 1441 +60680 1858 1884 +60680 1868 1441 +60680 1871 1517 +60680 1608 1894 +60680 1648 1696 +60680 1877 1908 +60680 1433 1519 +60680 1591 1858 +60680 1613 1695 +60680 1522 1524 +60680 1543 1775 +60680 1601 1458 +60680 1660 1688 +60680 1677 1701 +60680 1688 1692 +60680 1752 1766 +60680 1783 1518 +60680 1808 1855 +60680 1840 1489 +60680 1857 1441 +60680 1541 1683 +60680 1550 1572 +60680 1676 1439 +60680 1541 1547 +60680 1546 1425 +60680 1585 1752 +60680 1660 1692 +60680 1547 1683 +60680 1501 1527 +60680 1507 1522 +60680 1544 1674 +60680 1754 1821 +60680 1598 1635 +60680 1650 1668 +60700 1550 1731 +60700 1566 1467 +60700 1566 1453 +60700 1582 1761 +60700 1582 1453 +60700 1591 1592 +60700 1591 1884 +60700 1592 1858 +60700 1600 1438 +60700 1606 1489 +60700 1622 1453 +60700 1641 1480 +60700 1655 1512 +60700 1673 1725 +60700 1678 1475 +60700 1692 1496 +60700 1692 1866 +60700 1692 1491 +60700 1701 1835 +60700 1703 1473 +60700 1725 1811 +60700 1728 1448 +60700 1734 1920 +60700 1734 1779 +60700 1740 1503 +60700 1761 1453 +60700 1775 1528 +60700 1779 1835 +60700 1786 1512 +60700 1825 1510 +60700 1835 1874 +60700 1850 1857 +60700 1858 1525 +60700 1898 1471 +60700 1912 1916 +60700 1919 1510 +60700 1919 1438 +60700 1543 1528 +60700 1591 1525 +60700 1622 1761 +60700 1628 1455 +60700 1655 1818 +60700 1689 1924 +60700 1718 1482 +60700 1734 1752 +60700 1775 1866 +60700 1828 1458 +60700 1850 1441 +60700 1858 1884 +60700 1868 1441 +60700 1871 1517 +60700 1608 1894 +60700 1648 1696 +60700 1651 1905 +60700 1697 1906 +60700 1877 1908 +60700 1433 1519 +60700 1453 1467 +60700 1548 1425 +60700 1591 1858 +60700 1613 1695 +60700 1522 1524 +60700 1543 1775 +60700 1601 1458 +60700 1660 1688 +60700 1677 1701 +60700 1688 1692 +60700 1752 1766 +60700 1783 1518 +60700 1808 1855 +60700 1840 1489 +60700 1857 1441 +60700 1541 1683 +60700 1550 1572 +60700 1676 1439 +60700 1752 1835 +60700 1541 1547 +60700 1546 1425 +60700 1585 1752 +60700 1766 1835 +60700 1660 1692 +60700 1547 1683 +60700 1501 1527 +60700 1507 1522 +60700 1544 1674 +60700 1804 1510 +60700 1717 1513 +60700 1754 1821 +60700 1598 1635 +60700 1650 1668 +60720 1537 1452 +60720 1543 1528 +60720 1543 1496 +60720 1566 1582 +60720 1576 1585 +60720 1576 1874 +60720 1578 1857 +60720 1578 1441 +60720 1579 1740 +60720 1585 1766 +60720 1591 1525 +60720 1599 1774 +60720 1616 1462 +60720 1622 1761 +60720 1628 1455 +60720 1655 1882 +60720 1655 1755 +60720 1655 1818 +60720 1665 1785 +60720 1674 1890 +60720 1689 1924 +60720 1692 1816 +60720 1692 1721 +60720 1711 1877 +60720 1718 1482 +60720 1734 1752 +60720 1761 1449 +60720 1775 1496 +60720 1775 1866 +60720 1777 1923 +60720 1779 1903 +60720 1785 1816 +60720 1804 1825 +60720 1819 1920 +60720 1828 1458 +60720 1828 1495 +60720 1850 1441 +60720 1858 1884 +60720 1866 1496 +60720 1868 1441 +60720 1871 1517 +60720 1887 1480 +60720 1457 1527 +60720 1550 1578 +60720 1551 1269 +60720 1553 1919 +60720 1590 1914 +60720 1608 1894 +60720 1648 1696 +60720 1651 1905 +60720 1688 1816 +60720 1697 1906 +60720 1734 1835 +60720 1877 1908 +60720 1433 1519 +60720 1453 1467 +60720 1548 1425 +60720 1591 1858 +60720 1613 1695 +60720 1522 1524 +60720 1543 1775 +60720 1601 1458 +60720 1660 1688 +60720 1677 1701 +60720 1688 1692 +60720 1752 1766 +60720 1783 1518 +60720 1808 1855 +60720 1840 1489 +60720 1857 1441 +60720 1889 1492 +60720 1541 1683 +60720 1550 1572 +60720 1613 1773 +60720 1676 1439 +60720 1752 1835 +60720 1541 1547 +60720 1546 1425 +60720 1585 1752 +60720 1585 1835 +60720 1766 1835 +60720 1660 1692 +60720 1898 1477 +60720 1547 1683 +60720 1501 1527 +60720 1507 1522 +60720 1544 1674 +60720 1804 1510 +60720 1717 1513 +60720 1754 1821 +60720 1598 1635 +60720 1650 1668 +60740 1547 1691 +60740 1550 1578 +60740 1551 1269 +60740 1553 1919 +60740 1562 1816 +60740 1562 1692 +60740 1566 1467 +60740 1578 1649 +60740 1590 1914 +60740 1591 1426 +60740 1608 1894 +60740 1628 1442 +60740 1648 1696 +60740 1651 1905 +60740 1668 1463 +60740 1688 1816 +60740 1697 1906 +60740 1718 1503 +60740 1724 1734 +60740 1734 1835 +60740 1755 1882 +60740 1755 1774 +60740 1798 1897 +60740 1816 1881 +60740 1816 1893 +60740 1841 1901 +60740 1858 1457 +60740 1877 1908 +60740 1893 1496 +60740 1911 1458 +60740 1433 1519 +60740 1453 1467 +60740 1546 1548 +60740 1548 1425 +60740 1585 1734 +60740 1591 1858 +60740 1592 1525 +60740 1613 1695 +60740 1660 1816 +60740 1706 1457 +60740 1721 1881 +60740 1798 1448 +60740 1522 1524 +60740 1543 1775 +60740 1601 1458 +60740 1655 1774 +60740 1660 1688 +60740 1677 1701 +60740 1688 1692 +60740 1718 1492 +60740 1752 1766 +60740 1783 1518 +60740 1808 1855 +60740 1840 1489 +60740 1857 1441 +60740 1889 1492 +60740 1541 1683 +60740 1550 1572 +60740 1598 1667 +60740 1626 1742 +60740 1635 1667 +60740 1582 1467 +60740 1613 1773 +60740 1676 1439 +60740 1752 1835 +60740 1431 1516 +60740 1541 1547 +60740 1546 1425 +60740 1585 1752 +60740 1585 1835 +60740 1766 1835 +60740 1455 1463 +60740 1660 1692 +60740 1898 1477 +60740 1547 1683 +60740 1501 1527 +60740 1507 1522 +60740 1544 1674 +60740 1804 1510 +60740 1717 1513 +60740 1652 1747 +60740 1754 1821 +60740 1598 1635 +60740 1650 1668 +60760 1546 1548 +60760 1548 1425 +60760 1562 1449 +60760 1562 1453 +60760 1573 1470 +60760 1582 1453 +60760 1585 1734 +60760 1591 1858 +60760 1592 1525 +60760 1606 1516 +60760 1613 1695 +60760 1617 1857 +60760 1628 1455 +60760 1652 1831 +60760 1655 1755 +60760 1660 1816 +60760 1695 1773 +60760 1706 1457 +60760 1706 1426 +60760 1711 1479 +60760 1721 1881 +60760 1728 1433 +60760 1728 1470 +60760 1761 1866 +60760 1761 1453 +60760 1798 1448 +60760 1798 1858 +60760 1829 1886 +60760 1847 1471 +60760 1877 1923 +60760 1507 1524 +60760 1522 1524 +60760 1543 1775 +60760 1547 1855 +60760 1550 1649 +60760 1566 1731 +60760 1601 1458 +60760 1649 1731 +60760 1655 1774 +60760 1660 1688 +60760 1677 1701 +60760 1688 1692 +60760 1689 1924 +60760 1692 1816 +60760 1718 1492 +60760 1725 1490 +60760 1734 1752 +60760 1752 1766 +60760 1775 1528 +60760 1783 1518 +60760 1808 1855 +60760 1840 1489 +60760 1857 1441 +60760 1889 1492 +60760 1912 1437 +60760 1541 1683 +60760 1550 1572 +60760 1554 1853 +60760 1598 1667 +60760 1626 1742 +60760 1635 1667 +60760 1721 1816 +60760 1819 1920 +60760 1582 1467 +60760 1613 1773 +60760 1676 1439 +60760 1718 1889 +60760 1752 1835 +60760 1768 1818 +60760 1431 1516 +60760 1541 1547 +60760 1655 1786 +60760 1546 1425 +60760 1585 1752 +60760 1585 1835 +60760 1585 1766 +60760 1766 1835 +60760 1455 1463 +60760 1619 1920 +60760 1660 1692 +60760 1674 1890 +60760 1898 1477 +60760 1543 1528 +60760 1547 1683 +60760 1501 1527 +60760 1507 1522 +60760 1544 1674 +60760 1804 1510 +60760 1717 1513 +60760 1652 1747 +60760 1754 1821 +60760 1598 1635 +60760 1871 1517 +60760 1650 1668 +60780 1543 1775 +60780 1547 1855 +60780 1550 1649 +60780 1550 1566 +60780 1562 1531 +60780 1566 1731 +60780 1569 1626 +60780 1576 1874 +60780 1591 1821 +60780 1601 1458 +60780 1602 1489 +60780 1648 1696 +60780 1649 1731 +60780 1655 1774 +60780 1656 1712 +60780 1656 1517 +60780 1660 1688 +60780 1670 1908 +60780 1677 1701 +60780 1688 1816 +60780 1688 1692 +60780 1689 1924 +60780 1692 1816 +60780 1711 1471 +60780 1718 1492 +60780 1718 1503 +60780 1725 1490 +60780 1728 1519 +60780 1734 1752 +60780 1752 1766 +60780 1755 1786 +60780 1761 1467 +60780 1775 1528 +60780 1783 1518 +60780 1796 1816 +60780 1808 1855 +60780 1840 1489 +60780 1857 1441 +60780 1889 1492 +60780 1898 1471 +60780 1912 1437 +60780 1924 1478 +60780 1538 1522 +60780 1541 1683 +60780 1549 1525 +60780 1550 1572 +60780 1554 1853 +60780 1598 1667 +60780 1608 1894 +60780 1626 1742 +60780 1635 1667 +60780 1655 1715 +60780 1655 1882 +60780 1681 1526 +60780 1715 1768 +60780 1715 1882 +60780 1721 1816 +60780 1819 1920 +60780 1449 1531 +60780 1582 1467 +60780 1613 1773 +60780 1628 1442 +60780 1651 1905 +60780 1655 1768 +60780 1676 1439 +60780 1718 1889 +60780 1752 1835 +60780 1768 1818 +60780 1431 1516 +60780 1541 1547 +60780 1547 1691 +60780 1655 1786 +60780 1546 1425 +60780 1585 1752 +60780 1585 1835 +60780 1585 1766 +60780 1766 1835 +60780 1789 1902 +60780 1455 1463 +60780 1619 1920 +60780 1655 1818 +60780 1660 1692 +60780 1674 1890 +60780 1898 1477 +60780 1543 1528 +60780 1547 1683 +60780 1501 1527 +60780 1507 1522 +60780 1877 1908 +60780 1544 1674 +60780 1804 1510 +60780 1717 1513 +60780 1652 1747 +60780 1754 1821 +60780 1598 1635 +60780 1871 1517 +60780 1650 1668 +60800 1537 1735 +60800 1538 1522 +60800 1541 1688 +60800 1541 1683 +60800 1549 1525 +60800 1550 1572 +60800 1551 1269 +60800 1554 1853 +60800 1591 1731 +60800 1598 1667 +60800 1608 1613 +60800 1608 1894 +60800 1613 1894 +60800 1617 1916 +60800 1626 1742 +60800 1635 1667 +60800 1652 1811 +60800 1655 1715 +60800 1655 1882 +60800 1656 1761 +60800 1681 1526 +60800 1688 1845 +60800 1688 1717 +60800 1692 1740 +60800 1692 1761 +60800 1703 1845 +60800 1715 1768 +60800 1715 1786 +60800 1715 1882 +60800 1721 1816 +60800 1761 1492 +60800 1768 1786 +60800 1786 1882 +60800 1816 1845 +60800 1819 1920 +60800 1829 1467 +60800 1880 1464 +60800 1919 1476 +60800 1449 1531 +60800 1544 1890 +60800 1577 1471 +60800 1582 1467 +60800 1613 1773 +60800 1617 1894 +60800 1628 1442 +60800 1651 1905 +60800 1655 1768 +60800 1676 1439 +60800 1718 1889 +60800 1752 1835 +60800 1768 1818 +60800 1798 1448 +60800 1825 1510 +60800 1431 1516 +60800 1433 1519 +60800 1438 1519 +60800 1541 1547 +60800 1547 1691 +60800 1563 1592 +60800 1655 1786 +60800 1850 1868 +60800 1546 1425 +60800 1585 1752 +60800 1585 1835 +60800 1585 1766 +60800 1766 1835 +60800 1789 1902 +60800 1829 1886 +60800 1455 1463 +60800 1619 1920 +60800 1655 1818 +60800 1660 1692 +60800 1665 1441 +60800 1674 1890 +60800 1706 1426 +60800 1841 1901 +60800 1898 1477 +60800 1522 1524 +60800 1543 1528 +60800 1547 1683 +60800 1501 1527 +60800 1507 1522 +60800 1649 1887 +60800 1877 1908 +60800 1544 1674 +60800 1613 1498 +60800 1804 1510 +60800 1717 1513 +60800 1652 1747 +60800 1754 1821 +60800 1598 1635 +60800 1871 1517 +60800 1470 1517 +60800 1650 1668 +60820 1537 1458 +60820 1544 1890 +60820 1566 1922 +60820 1577 1471 +60820 1582 1467 +60820 1583 1919 +60820 1591 1613 +60820 1608 1845 +60820 1613 1688 +60820 1613 1773 +60820 1613 1887 +60820 1616 1462 +60820 1617 1441 +60820 1617 1894 +60820 1628 1442 +60820 1641 1533 +60820 1651 1905 +60820 1655 1768 +60820 1676 1688 +60820 1676 1439 +60820 1688 1887 +60820 1688 1773 +60820 1703 1796 +60820 1706 1457 +60820 1718 1889 +60820 1718 1492 +60820 1725 1770 +60820 1725 1735 +60820 1728 1476 +60820 1731 1452 +60820 1734 1752 +60820 1747 1811 +60820 1752 1835 +60820 1755 1865 +60820 1761 1872 +60820 1768 1818 +60820 1775 1528 +60820 1786 1818 +60820 1798 1448 +60820 1825 1510 +60820 1431 1516 +60820 1433 1519 +60820 1438 1519 +60820 1541 1547 +60820 1547 1691 +60820 1550 1566 +60820 1563 1592 +60820 1581 1667 +60820 1591 1858 +60820 1655 1786 +60820 1667 1752 +60820 1684 1798 +60820 1783 1518 +60820 1850 1868 +60820 1912 1441 +60820 1916 1441 +60820 1546 1425 +60820 1585 1752 +60820 1585 1835 +60820 1585 1766 +60820 1655 1774 +60820 1752 1766 +60820 1766 1835 +60820 1789 1902 +60820 1829 1886 +60820 1455 1463 +60820 1619 1920 +60820 1655 1818 +60820 1660 1692 +60820 1665 1857 +60820 1665 1441 +60820 1674 1890 +60820 1706 1426 +60820 1841 1901 +60820 1898 1477 +60820 1439 1480 +60820 1522 1524 +60820 1543 1528 +60820 1547 1683 +60820 1601 1458 +60820 1501 1527 +60820 1725 1490 +60820 1755 1802 +60820 1802 1865 +60820 1507 1522 +60820 1649 1887 +60820 1857 1441 +60820 1877 1908 +60820 1544 1674 +60820 1613 1498 +60820 1804 1510 +60820 1717 1513 +60820 1652 1747 +60820 1754 1821 +60820 1543 1775 +60820 1598 1635 +60820 1871 1517 +60820 1470 1517 +60820 1650 1668 +60840 1541 1547 +60840 1541 1683 +60840 1547 1691 +60840 1549 1761 +60840 1550 1721 +60840 1550 1572 +60840 1550 1566 +60840 1551 1842 +60840 1563 1592 +60840 1566 1916 +60840 1578 1725 +60840 1581 1667 +60840 1591 1858 +60840 1652 1811 +60840 1655 1786 +60840 1663 1786 +60840 1667 1752 +60840 1670 1908 +60840 1684 1798 +60840 1688 1754 +60840 1697 1906 +60840 1735 1811 +60840 1735 1747 +60840 1783 1518 +60840 1850 1868 +60840 1912 1441 +60840 1912 1916 +60840 1916 1441 +60840 1441 1482 +60840 1451 1485 +60840 1546 1425 +60840 1546 1471 +60840 1585 1752 +60840 1585 1835 +60840 1585 1766 +60840 1600 1438 +60840 1602 1489 +60840 1655 1774 +60840 1703 1808 +60840 1715 1755 +60840 1752 1766 +60840 1766 1835 +60840 1789 1902 +60840 1805 1888 +60840 1829 1886 +60840 1871 1470 +60840 1455 1463 +60840 1582 1504 +60840 1619 1920 +60840 1655 1818 +60840 1655 1663 +60840 1655 1882 +60840 1660 1692 +60840 1665 1857 +60840 1665 1441 +60840 1674 1890 +60840 1706 1426 +60840 1841 1901 +60840 1889 1492 +60840 1898 1477 +60840 1439 1480 +60840 1522 1524 +60840 1543 1528 +60840 1547 1683 +60840 1601 1458 +60840 1711 1908 +60840 1721 1816 +60840 1501 1527 +60840 1677 1701 +60840 1725 1490 +60840 1755 1802 +60840 1802 1865 +60840 1507 1522 +60840 1649 1887 +60840 1857 1441 +60840 1877 1908 +60840 1544 1674 +60840 1613 1498 +60840 1804 1510 +60840 1888 1467 +60840 1717 1513 +60840 1652 1747 +60840 1754 1821 +60840 1543 1775 +60840 1598 1635 +60840 1871 1517 +60840 1470 1517 +60840 1650 1668 +60860 1539 1724 +60860 1543 1829 +60860 1543 1893 +60860 1546 1425 +60860 1546 1548 +60860 1546 1471 +60860 1547 1855 +60860 1548 1471 +60860 1554 1613 +60860 1554 1591 +60860 1585 1752 +60860 1585 1835 +60860 1585 1701 +60860 1585 1766 +60860 1591 1613 +60860 1599 1786 +60860 1600 1438 +60860 1602 1489 +60860 1613 1887 +60860 1616 1462 +60860 1655 1774 +60860 1667 1471 +60860 1673 1761 +60860 1684 1489 +60860 1688 1761 +60860 1688 1427 +60860 1689 1924 +60860 1701 1752 +60860 1701 1835 +60860 1701 1766 +60860 1703 1808 +60860 1715 1865 +60860 1715 1802 +60860 1715 1755 +60860 1752 1835 +60860 1752 1766 +60860 1766 1874 +60860 1766 1835 +60860 1773 1498 +60860 1789 1902 +60860 1804 1825 +60860 1805 1888 +60860 1829 1886 +60860 1871 1470 +60860 1884 1919 +60860 1916 1482 +60860 1455 1463 +60860 1537 1828 +60860 1547 1595 +60860 1548 1425 +60860 1549 1884 +60860 1581 1712 +60860 1582 1504 +60860 1591 1617 +60860 1619 1920 +60860 1626 1742 +60860 1641 1480 +60860 1652 1735 +60860 1655 1818 +60860 1655 1663 +60860 1655 1882 +60860 1660 1692 +60860 1663 1882 +60860 1665 1857 +60860 1665 1441 +60860 1674 1890 +60860 1676 1887 +60860 1706 1426 +60860 1841 1901 +60860 1889 1492 +60860 1898 1477 +60860 1439 1480 +60860 1522 1524 +60860 1543 1528 +60860 1547 1683 +60860 1601 1458 +60860 1663 1818 +60860 1711 1908 +60860 1711 1877 +60860 1721 1816 +60860 1755 1865 +60860 1884 1427 +60860 1501 1527 +60860 1547 1775 +60860 1550 1816 +60860 1677 1701 +60860 1725 1490 +60860 1755 1802 +60860 1802 1865 +60860 1507 1522 +60860 1649 1887 +60860 1775 1845 +60860 1857 1441 +60860 1877 1908 +60860 1544 1674 +60860 1613 1498 +60860 1804 1510 +60860 1888 1467 +60860 1599 1655 +60860 1717 1513 +60860 1652 1747 +60860 1835 1874 +60860 1754 1821 +60860 1543 1775 +60860 1598 1635 +60860 1871 1517 +60860 1470 1517 +60860 1650 1668 +60880 1537 1828 +60880 1538 1522 +60880 1539 1829 +60880 1547 1595 +60880 1547 1703 +60880 1548 1425 +60880 1549 1427 +60880 1549 1884 +60880 1550 1572 +60880 1569 1626 +60880 1573 1491 +60880 1576 1835 +60880 1581 1712 +60880 1582 1504 +60880 1591 1617 +60880 1597 1622 +60880 1599 1774 +60880 1617 1862 +60880 1619 1920 +60880 1626 1742 +60880 1626 1425 +60880 1628 1442 +60880 1641 1480 +60880 1647 1460 +60880 1648 1696 +60880 1652 1735 +60880 1655 1818 +60880 1655 1663 +60880 1655 1882 +60880 1660 1692 +60880 1663 1882 +60880 1665 1857 +60880 1665 1441 +60880 1674 1890 +60880 1676 1887 +60880 1683 1808 +60880 1683 1703 +60880 1706 1426 +60880 1718 1889 +60880 1724 1513 +60880 1734 1789 +60880 1752 1919 +60880 1796 1816 +60880 1816 1441 +60880 1841 1901 +60880 1855 1480 +60880 1889 1492 +60880 1898 1477 +60880 1912 1916 +60880 1439 1480 +60880 1451 1485 +60880 1507 1524 +60880 1522 1524 +60880 1541 1691 +60880 1543 1528 +60880 1547 1683 +60880 1599 1818 +60880 1599 1663 +60880 1601 1458 +60880 1663 1818 +60880 1688 1527 +60880 1706 1457 +60880 1711 1908 +60880 1711 1877 +60880 1721 1816 +60880 1721 1823 +60880 1755 1865 +60880 1773 1441 +60880 1884 1427 +60880 1433 1519 +60880 1449 1531 +60880 1501 1527 +60880 1547 1775 +60880 1550 1816 +60880 1677 1701 +60880 1725 1490 +60880 1755 1802 +60880 1802 1865 +60880 1507 1522 +60880 1543 1845 +60880 1550 1566 +60880 1645 1756 +60880 1649 1887 +60880 1775 1845 +60880 1857 1441 +60880 1877 1908 +60880 1544 1674 +60880 1613 1498 +60880 1804 1510 +60880 1888 1467 +60880 1599 1655 +60880 1651 1905 +60880 1717 1513 +60880 1652 1747 +60880 1798 1448 +60880 1835 1874 +60880 1754 1821 +60880 1543 1775 +60880 1598 1635 +60880 1840 1489 +60880 1871 1517 +60880 1613 1439 +60880 1470 1517 +60880 1650 1668 +60900 1538 1524 +60900 1541 1691 +60900 1543 1528 +60900 1544 1890 +60900 1547 1683 +60900 1550 1721 +60900 1581 1701 +60900 1591 1441 +60900 1591 1796 +60900 1591 1857 +60900 1599 1818 +60900 1599 1882 +60900 1599 1663 +60900 1601 1458 +60900 1606 1516 +60900 1608 1434 +60900 1619 1675 +60900 1619 1829 +60900 1628 1455 +60900 1660 1901 +60900 1663 1818 +60900 1663 1774 +60900 1673 1761 +60900 1676 1761 +60900 1688 1789 +60900 1688 1527 +60900 1692 1841 +60900 1692 1901 +60900 1694 1908 +60900 1706 1457 +60900 1711 1908 +60900 1711 1877 +60900 1715 1802 +60900 1721 1816 +60900 1721 1773 +60900 1721 1823 +60900 1752 1821 +60900 1755 1865 +60900 1761 1850 +60900 1761 1831 +60900 1773 1816 +60900 1773 1441 +60900 1775 1901 +60900 1786 1818 +60900 1796 1857 +60900 1816 1823 +60900 1825 1510 +60900 1847 1425 +60900 1853 1879 +60900 1884 1427 +60900 1905 1526 +60900 1433 1519 +60900 1449 1531 +60900 1501 1527 +60900 1547 1775 +60900 1550 1816 +60900 1617 1480 +60900 1629 1923 +60900 1655 1786 +60900 1677 1701 +60900 1725 1490 +60900 1755 1802 +60900 1802 1865 +60900 1835 1886 +60900 1868 1495 +60900 1879 1505 +60900 1439 1498 +60900 1507 1522 +60900 1543 1845 +60900 1550 1566 +60900 1645 1756 +60900 1649 1887 +60900 1752 1766 +60900 1775 1845 +60900 1857 1441 +60900 1877 1908 +60900 1544 1674 +60900 1613 1498 +60900 1652 1811 +60900 1661 1840 +60900 1747 1811 +60900 1804 1510 +60900 1842 1853 +60900 1888 1467 +60900 1599 1786 +60900 1599 1655 +60900 1651 1905 +60900 1717 1513 +60900 1652 1747 +60900 1798 1448 +60900 1835 1874 +60900 1754 1821 +60900 1853 1505 +60900 1871 1470 +60900 1543 1775 +60900 1598 1635 +60900 1840 1489 +60900 1871 1517 +60900 1613 1439 +60900 1829 1886 +60900 1470 1517 +60900 1650 1668 +60920 1547 1775 +60920 1550 1816 +60920 1551 1898 +60920 1552 1761 +60920 1553 1525 +60920 1568 1629 +60920 1581 1602 +60920 1585 1455 +60920 1591 1863 +60920 1600 1438 +60920 1600 1519 +60920 1608 1463 +60920 1617 1480 +60920 1628 1442 +60920 1629 1923 +60920 1655 1786 +60920 1655 1774 +60920 1667 1898 +60920 1676 1831 +60920 1677 1701 +60920 1688 1471 +60920 1692 1740 +60920 1694 1877 +60920 1717 1816 +60920 1718 1889 +60920 1721 1513 +60920 1725 1490 +60920 1734 1829 +60920 1755 1802 +60920 1761 1887 +60920 1802 1865 +60920 1835 1886 +60920 1868 1495 +60920 1879 1505 +60920 1880 1464 +60920 1912 1513 +60920 1425 1427 +60920 1439 1498 +60920 1471 1501 +60920 1507 1522 +60920 1507 1524 +60920 1522 1524 +60920 1543 1845 +60920 1550 1566 +60920 1568 1923 +60920 1645 1756 +60920 1649 1887 +60920 1701 1886 +60920 1703 1808 +60920 1735 1465 +60920 1735 1831 +60920 1752 1766 +60920 1775 1845 +60920 1857 1441 +60920 1877 1908 +60920 1544 1674 +60920 1549 1884 +60920 1613 1498 +60920 1652 1811 +60920 1661 1840 +60920 1673 1676 +60920 1747 1811 +60920 1804 1510 +60920 1842 1853 +60920 1888 1467 +60920 1485 1529 +60920 1599 1786 +60920 1599 1655 +60920 1613 1528 +60920 1651 1905 +60920 1660 1692 +60920 1717 1513 +60920 1652 1747 +60920 1798 1448 +60920 1835 1874 +60920 1754 1821 +60920 1853 1505 +60920 1871 1470 +60920 1543 1775 +60920 1598 1635 +60920 1840 1489 +60920 1871 1517 +60920 1688 1501 +60920 1613 1439 +60920 1684 1901 +60920 1438 1519 +60920 1601 1911 +60920 1829 1886 +60920 1470 1517 +60920 1650 1668 +60940 1538 1886 +60940 1543 1845 +60940 1548 1425 +60940 1550 1566 +60940 1551 1269 +60940 1568 1923 +60940 1581 1887 +60940 1583 1525 +60940 1585 1766 +60940 1595 1863 +60940 1626 1742 +60940 1641 1533 +60940 1645 1756 +60940 1649 1887 +60940 1650 1463 +60940 1665 1914 +60940 1688 1734 +60940 1688 1701 +60940 1701 1886 +60940 1703 1808 +60940 1706 1426 +60940 1711 1898 +60940 1718 1503 +60940 1735 1465 +60940 1735 1831 +60940 1752 1480 +60940 1752 1766 +60940 1775 1845 +60940 1828 1480 +60940 1853 1879 +60940 1857 1441 +60940 1877 1908 +60940 1887 1455 +60940 1889 1492 +60940 1911 1458 +60940 1425 1501 +60940 1425 1525 +60940 1425 1471 +60940 1544 1674 +60940 1549 1884 +60940 1563 1592 +60940 1613 1498 +60940 1652 1811 +60940 1661 1840 +60940 1673 1676 +60940 1706 1457 +60940 1747 1811 +60940 1796 1441 +60940 1804 1510 +60940 1825 1510 +60940 1842 1853 +60940 1888 1467 +60940 1439 1528 +60940 1485 1529 +60940 1546 1425 +60940 1599 1786 +60940 1599 1655 +60940 1613 1528 +60940 1651 1905 +60940 1660 1692 +60940 1717 1513 +60940 1721 1816 +60940 1541 1691 +60940 1652 1747 +60940 1798 1448 +60940 1835 1874 +60940 1924 1478 +60940 1590 1609 +60940 1601 1458 +60940 1754 1821 +60940 1853 1505 +60940 1871 1470 +60940 1543 1775 +60940 1598 1635 +60940 1840 1489 +60940 1871 1517 +60940 1688 1501 +60940 1613 1439 +60940 1684 1901 +60940 1438 1519 +60940 1601 1911 +60940 1829 1886 +60940 1591 1872 +60940 1470 1517 +60940 1650 1668 +60960 1544 1674 +60960 1549 1884 +60960 1563 1592 +60960 1566 1828 +60960 1576 1835 +60960 1577 1886 +60960 1613 1441 +60960 1613 1498 +60960 1649 1527 +60960 1652 1811 +60960 1661 1840 +60960 1673 1676 +60960 1706 1457 +60960 1710 1906 +60960 1747 1811 +60960 1752 1754 +60960 1754 1766 +60960 1796 1441 +60960 1804 1510 +60960 1825 1510 +60960 1842 1853 +60960 1888 1467 +60960 1439 1528 +60960 1439 1498 +60960 1448 1480 +60960 1449 1531 +60960 1485 1529 +60960 1546 1425 +60960 1599 1786 +60960 1599 1780 +60960 1599 1655 +60960 1613 1528 +60960 1651 1905 +60960 1660 1692 +60960 1674 1890 +60960 1678 1768 +60960 1717 1513 +60960 1721 1816 +60960 1879 1505 +60960 1901 1489 +60960 1541 1691 +60960 1652 1747 +60960 1798 1448 +60960 1835 1874 +60960 1898 1477 +60960 1924 1478 +60960 1590 1609 +60960 1601 1458 +60960 1655 1786 +60960 1754 1821 +60960 1796 1857 +60960 1853 1505 +60960 1871 1470 +60960 1887 1437 +60960 1543 1775 +60960 1598 1635 +60960 1808 1816 +60960 1840 1489 +60960 1871 1517 +60960 1688 1501 +60960 1544 1890 +60960 1613 1439 +60960 1684 1901 +60960 1438 1519 +60960 1601 1911 +60960 1829 1886 +60960 1591 1872 +60960 1470 1517 +60960 1650 1668 +60980 1546 1425 +60980 1547 1492 +60980 1550 1773 +60980 1550 1566 +60980 1551 1269 +60980 1566 1857 +60980 1599 1786 +60980 1599 1780 +60980 1599 1655 +60980 1608 1789 +60980 1613 1528 +60980 1651 1905 +60980 1660 1692 +60980 1667 1908 +60980 1674 1890 +60980 1676 1526 +60980 1678 1768 +60980 1681 1770 +60980 1688 1471 +60980 1701 1842 +60980 1703 1513 +60980 1717 1513 +60980 1721 1816 +60980 1724 1784 +60980 1725 1834 +60980 1735 1766 +60980 1784 1845 +60980 1804 1501 +60980 1853 1879 +60980 1879 1505 +60980 1889 1492 +60980 1901 1489 +60980 1911 1458 +60980 1501 1510 +60980 1541 1691 +60980 1645 1756 +60980 1652 1747 +60980 1695 1725 +60980 1798 1448 +60980 1805 1467 +60980 1835 1874 +60980 1898 1477 +60980 1924 1478 +60980 1471 1501 +60980 1543 1845 +60980 1590 1609 +60980 1601 1458 +60980 1626 1742 +60980 1655 1786 +60980 1754 1821 +60980 1796 1857 +60980 1853 1505 +60980 1871 1470 +60980 1887 1437 +60980 1543 1775 +60980 1598 1635 +60980 1808 1816 +60980 1840 1489 +60980 1871 1517 +60980 1688 1501 +60980 1877 1908 +60980 1544 1890 +60980 1888 1524 +60980 1585 1766 +60980 1613 1439 +60980 1684 1901 +60980 1775 1845 +60980 1734 1444 +60980 1438 1519 +60980 1437 1455 +60980 1601 1911 +60980 1829 1886 +60980 1591 1872 +60980 1470 1517 +60980 1650 1668 +61000 1538 1777 +61000 1541 1691 +61000 1546 1489 +61000 1547 1808 +61000 1547 1816 +61000 1547 1775 +61000 1548 1425 +61000 1593 1449 +61000 1598 1470 +61000 1628 1463 +61000 1645 1756 +61000 1649 1735 +61000 1652 1747 +61000 1667 1877 +61000 1695 1725 +61000 1718 1503 +61000 1731 1770 +61000 1752 1789 +61000 1779 1903 +61000 1798 1448 +61000 1802 1865 +61000 1805 1467 +61000 1835 1874 +61000 1857 1441 +61000 1858 1441 +61000 1888 1522 +61000 1890 1525 +61000 1898 1477 +61000 1924 1478 +61000 1437 1527 +61000 1448 1480 +61000 1471 1501 +61000 1543 1916 +61000 1543 1845 +61000 1547 1721 +61000 1590 1609 +61000 1593 1531 +61000 1601 1458 +61000 1604 1791 +61000 1626 1742 +61000 1655 1786 +61000 1670 1877 +61000 1688 1835 +61000 1754 1821 +61000 1796 1857 +61000 1845 1916 +61000 1853 1505 +61000 1871 1470 +61000 1887 1437 +61000 1439 1498 +61000 1449 1531 +61000 1543 1775 +61000 1598 1635 +61000 1808 1816 +61000 1840 1489 +61000 1840 1901 +61000 1871 1517 +61000 1887 1527 +61000 1425 1489 +61000 1688 1501 +61000 1877 1908 +61000 1544 1890 +61000 1825 1426 +61000 1888 1524 +61000 1585 1766 +61000 1613 1439 +61000 1684 1901 +61000 1775 1845 +61000 1734 1444 +61000 1438 1519 +61000 1437 1455 +61000 1601 1911 +61000 1825 1525 +61000 1426 1525 +61000 1829 1886 +61000 1591 1872 +61000 1470 1517 +61000 1650 1668 +61020 1543 1916 +61020 1543 1845 +61020 1546 1840 +61020 1547 1721 +61020 1551 1269 +61020 1566 1857 +61020 1590 1609 +61020 1591 1473 +61020 1593 1531 +61020 1601 1458 +61020 1604 1791 +61020 1626 1742 +61020 1628 1821 +61020 1652 1530 +61020 1655 1786 +61020 1655 1882 +61020 1661 1840 +61020 1667 1711 +61020 1670 1877 +61020 1688 1835 +61020 1703 1916 +61020 1724 1901 +61020 1725 1770 +61020 1725 1731 +61020 1754 1821 +61020 1768 1828 +61020 1775 1916 +61020 1796 1857 +61020 1816 1823 +61020 1835 1501 +61020 1845 1916 +61020 1853 1505 +61020 1871 1470 +61020 1872 1473 +61020 1887 1437 +61020 1889 1492 +61020 1912 1916 +61020 1439 1528 +61020 1439 1498 +61020 1449 1531 +61020 1543 1775 +61020 1569 1742 +61020 1598 1635 +61020 1676 1526 +61020 1684 1724 +61020 1721 1816 +61020 1808 1816 +61020 1821 1463 +61020 1840 1489 +61020 1840 1901 +61020 1871 1517 +61020 1887 1527 +61020 1425 1489 +61020 1485 1529 +61020 1498 1528 +61020 1546 1425 +61020 1648 1696 +61020 1688 1501 +61020 1877 1908 +61020 1544 1890 +61020 1825 1426 +61020 1888 1524 +61020 1585 1766 +61020 1613 1528 +61020 1613 1439 +61020 1684 1901 +61020 1689 1752 +61020 1775 1845 +61020 1547 1768 +61020 1734 1444 +61020 1438 1519 +61020 1689 1766 +61020 1752 1766 +61020 1437 1455 +61020 1601 1911 +61020 1655 1774 +61020 1825 1525 +61020 1613 1498 +61020 1426 1525 +61020 1829 1886 +61020 1660 1692 +61020 1591 1872 +61020 1470 1517 +61020 1650 1668 +61040 1543 1775 +61040 1550 1773 +61040 1569 1742 +61040 1585 1752 +61040 1592 1847 +61040 1598 1635 +61040 1602 1688 +61040 1649 1752 +61040 1652 1458 +61040 1655 1760 +61040 1661 1489 +61040 1667 1877 +61040 1676 1526 +61040 1684 1724 +61040 1706 1448 +61040 1710 1906 +61040 1721 1816 +61040 1728 1448 +61040 1747 1465 +61040 1747 1811 +61040 1752 1858 +61040 1767 1775 +61040 1779 1903 +61040 1783 1521 +61040 1805 1467 +61040 1808 1816 +61040 1821 1448 +61040 1821 1463 +61040 1828 1916 +61040 1840 1489 +61040 1840 1901 +61040 1841 1901 +61040 1853 1879 +61040 1871 1517 +61040 1887 1527 +61040 1901 1425 +61040 1911 1458 +61040 1425 1489 +61040 1431 1516 +61040 1437 1527 +61040 1485 1529 +61040 1498 1528 +61040 1541 1691 +61040 1546 1425 +61040 1549 1688 +61040 1593 1521 +61040 1648 1696 +61040 1667 1908 +61040 1688 1501 +61040 1715 1755 +61040 1786 1882 +61040 1877 1908 +61040 1544 1890 +61040 1675 1798 +61040 1825 1426 +61040 1835 1874 +61040 1888 1524 +61040 1585 1766 +61040 1613 1528 +61040 1613 1439 +61040 1684 1901 +61040 1689 1752 +61040 1775 1845 +61040 1547 1768 +61040 1734 1444 +61040 1898 1477 +61040 1438 1519 +61040 1689 1766 +61040 1740 1863 +61040 1752 1766 +61040 1796 1441 +61040 1437 1455 +61040 1601 1911 +61040 1655 1774 +61040 1825 1525 +61040 1613 1498 +61040 1426 1525 +61040 1829 1886 +61040 1660 1692 +61040 1591 1872 +61040 1470 1517 +61040 1650 1668 +61060 1537 1850 +61060 1541 1691 +61060 1543 1513 +61060 1546 1425 +61060 1549 1688 +61060 1553 1924 +61060 1566 1857 +61060 1593 1521 +61060 1626 1742 +61060 1646 1655 +61060 1648 1696 +61060 1667 1908 +61060 1688 1448 +61060 1688 1884 +61060 1688 1501 +61060 1708 1774 +61060 1711 1908 +61060 1711 1877 +61060 1715 1755 +61060 1725 1465 +61060 1725 1731 +61060 1747 1831 +61060 1767 1901 +61060 1779 1835 +61060 1786 1882 +61060 1789 1858 +61060 1796 1473 +61060 1858 1875 +61060 1871 1480 +61060 1877 1908 +61060 1886 1908 +61060 1908 1914 +61060 1439 1528 +61060 1448 1501 +61060 1492 1501 +61060 1544 1890 +61060 1551 1269 +61060 1652 1725 +61060 1655 1882 +61060 1675 1798 +61060 1688 1475 +61060 1708 1882 +61060 1825 1426 +61060 1828 1522 +61060 1835 1874 +61060 1888 1524 +61060 1889 1492 +61060 1439 1498 +61060 1585 1766 +61060 1613 1528 +61060 1613 1439 +61060 1661 1840 +61060 1669 1754 +61060 1679 1742 +61060 1684 1901 +61060 1689 1752 +61060 1728 1890 +61060 1775 1845 +61060 1880 1464 +61060 1547 1768 +61060 1599 1512 +61060 1601 1458 +61060 1734 1444 +61060 1898 1477 +61060 1438 1519 +61060 1689 1766 +61060 1740 1863 +61060 1752 1766 +61060 1796 1441 +61060 1804 1510 +61060 1437 1455 +61060 1601 1911 +61060 1655 1774 +61060 1825 1525 +61060 1613 1498 +61060 1426 1525 +61060 1829 1886 +61060 1660 1692 +61060 1591 1872 +61060 1652 1747 +61060 1470 1517 +61060 1650 1668 +61080 1538 1777 +61080 1544 1890 +61080 1551 1269 +61080 1554 1633 +61080 1563 1842 +61080 1572 1441 +61080 1592 1916 +61080 1592 1470 +61080 1592 1887 +61080 1606 1431 +61080 1616 1887 +61080 1652 1725 +61080 1655 1882 +61080 1660 1501 +61080 1675 1798 +61080 1676 1747 +61080 1678 1501 +61080 1688 1889 +61080 1688 1475 +61080 1688 1492 +61080 1688 1434 +61080 1694 1898 +61080 1706 1434 +61080 1708 1882 +61080 1725 1789 +61080 1725 1831 +61080 1731 1831 +61080 1767 1840 +61080 1779 1522 +61080 1805 1467 +61080 1825 1426 +61080 1828 1522 +61080 1828 1507 +61080 1829 1448 +61080 1835 1874 +61080 1840 1901 +61080 1862 1887 +61080 1888 1524 +61080 1889 1492 +61080 1889 1485 +61080 1431 1516 +61080 1439 1498 +61080 1480 1518 +61080 1550 1566 +61080 1585 1766 +61080 1613 1528 +61080 1613 1439 +61080 1645 1756 +61080 1661 1840 +61080 1669 1754 +61080 1679 1742 +61080 1684 1901 +61080 1689 1752 +61080 1728 1890 +61080 1775 1845 +61080 1831 1526 +61080 1880 1464 +61080 1911 1458 +61080 1507 1522 +61080 1547 1768 +61080 1599 1512 +61080 1688 1457 +61080 1688 1706 +61080 1808 1816 +61080 1601 1458 +61080 1734 1444 +61080 1898 1477 +61080 1438 1519 +61080 1689 1766 +61080 1740 1863 +61080 1752 1766 +61080 1796 1441 +61080 1804 1510 +61080 1437 1455 +61080 1546 1548 +61080 1601 1911 +61080 1655 1760 +61080 1655 1774 +61080 1665 1853 +61080 1825 1525 +61080 1613 1498 +61080 1426 1525 +61080 1829 1886 +61080 1802 1865 +61080 1660 1692 +61080 1591 1872 +61080 1598 1635 +61080 1652 1747 +61080 1470 1517 +61080 1871 1517 +61080 1650 1668 +61100 1541 1691 +61100 1546 1425 +61100 1550 1592 +61100 1550 1572 +61100 1550 1566 +61100 1560 1526 +61100 1585 1752 +61100 1585 1689 +61100 1585 1766 +61100 1592 1641 +61100 1593 1521 +61100 1613 1528 +61100 1613 1439 +61100 1629 1701 +61100 1645 1756 +61100 1661 1840 +61100 1664 1821 +61100 1664 1519 +61100 1667 1523 +61100 1669 1754 +61100 1670 1908 +61100 1679 1742 +61100 1681 1731 +61100 1683 1718 +61100 1684 1841 +61100 1684 1901 +61100 1689 1752 +61100 1691 1718 +61100 1692 1785 +61100 1706 1457 +61100 1715 1755 +61100 1728 1890 +61100 1764 1798 +61100 1773 1498 +61100 1775 1467 +61100 1775 1845 +61100 1831 1526 +61100 1835 1877 +61100 1853 1879 +61100 1880 1464 +61100 1886 1448 +61100 1911 1458 +61100 1914 1523 +61100 1439 1528 +61100 1485 1529 +61100 1507 1522 +61100 1547 1768 +61100 1599 1512 +61100 1617 1441 +61100 1688 1457 +61100 1688 1706 +61100 1798 1835 +61100 1808 1816 +61100 1877 1920 +61100 1877 1908 +61100 1924 1478 +61100 1601 1458 +61100 1721 1816 +61100 1734 1444 +61100 1898 1477 +61100 1908 1920 +61100 1912 1916 +61100 1438 1519 +61100 1646 1760 +61100 1689 1766 +61100 1740 1863 +61100 1752 1766 +61100 1796 1441 +61100 1804 1510 +61100 1871 1470 +61100 1437 1455 +61100 1546 1548 +61100 1601 1911 +61100 1646 1655 +61100 1655 1760 +61100 1655 1774 +61100 1665 1853 +61100 1825 1525 +61100 1613 1498 +61100 1816 1823 +61100 1426 1525 +61100 1600 1664 +61100 1829 1886 +61100 1802 1865 +61100 1660 1692 +61100 1591 1872 +61100 1598 1635 +61100 1652 1747 +61100 1470 1517 +61100 1871 1517 +61100 1650 1668 +61120 1546 1901 +61120 1547 1768 +61120 1547 1808 +61120 1547 1823 +61120 1547 1816 +61120 1547 1721 +61120 1551 1433 +61120 1554 1845 +61120 1566 1617 +61120 1569 1679 +61120 1592 1613 +61120 1599 1512 +61120 1617 1441 +61120 1623 1835 +61120 1623 1518 +61120 1655 1882 +61120 1688 1728 +61120 1688 1457 +61120 1688 1706 +61120 1688 1887 +61120 1708 1882 +61120 1711 1845 +61120 1721 1768 +61120 1725 1731 +61120 1760 1882 +61120 1767 1840 +61120 1768 1881 +61120 1789 1478 +61120 1798 1835 +61120 1808 1816 +61120 1835 1874 +61120 1877 1920 +61120 1877 1908 +61120 1887 1474 +61120 1889 1480 +61120 1902 1924 +61120 1920 1467 +61120 1924 1478 +61120 1463 1473 +61120 1601 1458 +61120 1673 1676 +61120 1688 1434 +61120 1721 1816 +61120 1734 1444 +61120 1747 1831 +61120 1760 1774 +61120 1768 1816 +61120 1789 1924 +61120 1898 1477 +61120 1908 1920 +61120 1912 1916 +61120 1438 1519 +61120 1543 1513 +61120 1646 1760 +61120 1689 1766 +61120 1740 1863 +61120 1752 1766 +61120 1796 1441 +61120 1804 1510 +61120 1871 1470 +61120 1437 1455 +61120 1546 1548 +61120 1601 1911 +61120 1646 1655 +61120 1655 1760 +61120 1655 1774 +61120 1665 1853 +61120 1825 1525 +61120 1613 1498 +61120 1816 1823 +61120 1889 1492 +61120 1426 1525 +61120 1600 1664 +61120 1829 1886 +61120 1802 1865 +61120 1660 1692 +61120 1591 1872 +61120 1598 1635 +61120 1652 1747 +61120 1470 1517 +61120 1871 1517 +61120 1650 1668 +61140 1544 1893 +61140 1552 1761 +61140 1560 1526 +61140 1569 1626 +61140 1569 1742 +61140 1590 1448 +61140 1591 1688 +61140 1592 1840 +61140 1595 1684 +61140 1595 1654 +61140 1601 1458 +61140 1623 1889 +61140 1623 1492 +61140 1646 1708 +61140 1647 1831 +61140 1673 1676 +61140 1679 1742 +61140 1683 1535 +61140 1688 1434 +61140 1688 1871 +61140 1692 1798 +61140 1721 1816 +61140 1728 1835 +61140 1734 1444 +61140 1747 1831 +61140 1760 1786 +61140 1760 1774 +61140 1768 1816 +61140 1786 1882 +61140 1789 1924 +61140 1858 1433 +61140 1858 1475 +61140 1886 1480 +61140 1897 1473 +61140 1898 1477 +61140 1908 1920 +61140 1912 1916 +61140 1431 1516 +61140 1438 1519 +61140 1485 1529 +61140 1522 1524 +61140 1543 1513 +61140 1585 1766 +61140 1646 1760 +61140 1655 1708 +61140 1689 1766 +61140 1740 1863 +61140 1752 1766 +61140 1796 1441 +61140 1804 1510 +61140 1825 1426 +61140 1871 1470 +61140 1890 1519 +61140 1437 1455 +61140 1546 1548 +61140 1601 1911 +61140 1646 1655 +61140 1655 1760 +61140 1655 1774 +61140 1665 1853 +61140 1825 1525 +61140 1613 1498 +61140 1706 1457 +61140 1816 1823 +61140 1889 1492 +61140 1426 1525 +61140 1541 1691 +61140 1600 1664 +61140 1829 1886 +61140 1841 1901 +61140 1802 1865 +61140 1544 1884 +61140 1660 1692 +61140 1550 1566 +61140 1591 1872 +61140 1598 1635 +61140 1652 1747 +61140 1470 1517 +61140 1871 1517 +61140 1664 1821 +61140 1650 1668 +61160 1537 1886 +61160 1541 1718 +61160 1543 1513 +61160 1566 1796 +61160 1585 1766 +61160 1592 1606 +61160 1592 1431 +61160 1609 1842 +61160 1617 1441 +61160 1646 1760 +61160 1649 1752 +61160 1655 1708 +61160 1664 1519 +61160 1688 1517 +61160 1689 1752 +61160 1689 1766 +61160 1701 1923 +61160 1708 1760 +61160 1713 1887 +61160 1731 1465 +61160 1734 1894 +61160 1740 1863 +61160 1752 1766 +61160 1796 1441 +61160 1804 1510 +61160 1805 1904 +61160 1816 1505 +61160 1823 1505 +61160 1825 1426 +61160 1835 1874 +61160 1835 1467 +61160 1840 1901 +61160 1847 1448 +61160 1871 1470 +61160 1877 1908 +61160 1884 1893 +61160 1890 1519 +61160 1437 1455 +61160 1448 1475 +61160 1507 1522 +61160 1544 1518 +61160 1546 1548 +61160 1599 1512 +61160 1601 1911 +61160 1602 1845 +61160 1616 1462 +61160 1646 1655 +61160 1655 1760 +61160 1655 1774 +61160 1665 1853 +61160 1825 1525 +61160 1572 1592 +61160 1613 1498 +61160 1706 1457 +61160 1816 1823 +61160 1889 1492 +61160 1426 1525 +61160 1541 1691 +61160 1547 1577 +61160 1600 1664 +61160 1829 1886 +61160 1884 1518 +61160 1841 1901 +61160 1802 1865 +61160 1544 1884 +61160 1660 1692 +61160 1550 1566 +61160 1591 1872 +61160 1598 1635 +61160 1652 1747 +61160 1715 1755 +61160 1470 1517 +61160 1871 1517 +61160 1664 1821 +61160 1650 1668 +61180 1544 1518 +61180 1546 1548 +61180 1569 1626 +61180 1581 1752 +61180 1590 1602 +61180 1599 1512 +61180 1601 1911 +61180 1602 1845 +61180 1613 1888 +61180 1616 1617 +61180 1616 1462 +61180 1617 1462 +61180 1625 1923 +61180 1628 1463 +61180 1646 1655 +61180 1647 1831 +61180 1655 1760 +61180 1655 1774 +61180 1665 1853 +61180 1667 1771 +61180 1679 1742 +61180 1721 1816 +61180 1728 1754 +61180 1735 1762 +61180 1786 1882 +61180 1789 1471 +61180 1798 1529 +61180 1798 1845 +61180 1825 1525 +61180 1914 1473 +61180 1914 1489 +61180 1439 1498 +61180 1546 1606 +61180 1554 1920 +61180 1572 1592 +61180 1595 1654 +61180 1613 1498 +61180 1706 1457 +61180 1816 1823 +61180 1889 1492 +61180 1426 1525 +61180 1541 1691 +61180 1547 1577 +61180 1600 1664 +61180 1649 1689 +61180 1829 1886 +61180 1884 1518 +61180 1601 1458 +61180 1606 1431 +61180 1630 1531 +61180 1841 1901 +61180 1850 1868 +61180 1924 1471 +61180 1802 1865 +61180 1544 1884 +61180 1660 1692 +61180 1734 1444 +61180 1550 1566 +61180 1613 1439 +61180 1789 1924 +61180 1840 1489 +61180 1591 1872 +61180 1598 1635 +61180 1652 1747 +61180 1438 1519 +61180 1715 1755 +61180 1470 1517 +61180 1871 1517 +61180 1664 1821 +61180 1650 1668 +61200 1539 1796 +61200 1546 1516 +61200 1546 1606 +61200 1546 1431 +61200 1554 1920 +61200 1568 1898 +61200 1572 1592 +61200 1590 1448 +61200 1595 1654 +61200 1600 1525 +61200 1602 1480 +61200 1602 1679 +61200 1613 1498 +61200 1625 1887 +61200 1641 1888 +61200 1641 1715 +61200 1641 1755 +61200 1664 1519 +61200 1684 1425 +61200 1706 1457 +61200 1731 1465 +61200 1731 1747 +61200 1735 1752 +61200 1735 1527 +61200 1764 1840 +61200 1798 1858 +61200 1805 1841 +61200 1816 1823 +61200 1840 1914 +61200 1853 1879 +61200 1857 1441 +61200 1858 1889 +61200 1858 1492 +61200 1889 1492 +61200 1894 1480 +61200 1920 1473 +61200 1426 1525 +61200 1437 1455 +61200 1541 1691 +61200 1547 1577 +61200 1583 1825 +61200 1587 1817 +61200 1600 1664 +61200 1649 1689 +61200 1661 1840 +61200 1688 1706 +61200 1754 1914 +61200 1755 1498 +61200 1829 1886 +61200 1884 1518 +61200 1548 1516 +61200 1601 1458 +61200 1606 1431 +61200 1630 1531 +61200 1841 1901 +61200 1850 1868 +61200 1541 1718 +61200 1688 1457 +61200 1912 1916 +61200 1924 1471 +61200 1802 1865 +61200 1544 1884 +61200 1660 1692 +61200 1664 1438 +61200 1734 1444 +61200 1550 1566 +61200 1613 1439 +61200 1789 1924 +61200 1840 1489 +61200 1591 1916 +61200 1591 1872 +61200 1598 1635 +61200 1835 1874 +61200 1652 1747 +61200 1438 1519 +61200 1715 1755 +61200 1470 1517 +61200 1871 1517 +61200 1664 1821 +61200 1650 1668 +61220 1541 1691 +61220 1547 1577 +61220 1550 1888 +61220 1566 1857 +61220 1583 1825 +61220 1583 1525 +61220 1585 1617 +61220 1587 1817 +61220 1595 1517 +61220 1600 1664 +61220 1600 1821 +61220 1601 1911 +61220 1609 1448 +61220 1617 1766 +61220 1649 1689 +61220 1649 1731 +61220 1655 1819 +61220 1655 1774 +61220 1661 1840 +61220 1674 1491 +61220 1676 1731 +61220 1688 1706 +61220 1701 1477 +61220 1754 1914 +61220 1755 1498 +61220 1805 1425 +61220 1829 1886 +61220 1842 1480 +61220 1877 1908 +61220 1884 1518 +61220 1908 1505 +61220 1448 1480 +61220 1485 1529 +61220 1548 1516 +61220 1569 1742 +61220 1583 1426 +61220 1601 1458 +61220 1606 1431 +61220 1625 1898 +61220 1626 1742 +61220 1630 1531 +61220 1731 1831 +61220 1841 1901 +61220 1850 1868 +61220 1541 1718 +61220 1576 1835 +61220 1628 1463 +61220 1688 1457 +61220 1825 1426 +61220 1845 1434 +61220 1912 1916 +61220 1924 1471 +61220 1437 1527 +61220 1600 1438 +61220 1645 1756 +61220 1802 1865 +61220 1544 1884 +61220 1660 1692 +61220 1664 1438 +61220 1734 1444 +61220 1550 1566 +61220 1613 1439 +61220 1764 1489 +61220 1789 1924 +61220 1840 1489 +61220 1591 1916 +61220 1591 1872 +61220 1598 1635 +61220 1835 1874 +61220 1652 1747 +61220 1438 1519 +61220 1715 1755 +61220 1871 1470 +61220 1470 1517 +61220 1871 1517 +61220 1664 1821 +61220 1650 1668 +61240 1538 1777 +61240 1541 1683 +61240 1546 1516 +61240 1546 1606 +61240 1548 1516 +61240 1554 1835 +61240 1566 1617 +61240 1569 1742 +61240 1583 1426 +61240 1601 1458 +61240 1602 1676 +61240 1602 1652 +61240 1606 1431 +61240 1625 1898 +61240 1626 1742 +61240 1630 1531 +61240 1634 1452 +61240 1652 1526 +61240 1688 1448 +61240 1688 1890 +61240 1706 1448 +61240 1731 1831 +61240 1764 1840 +61240 1766 1535 +61240 1841 1901 +61240 1850 1868 +61240 1889 1492 +61240 1890 1457 +61240 1901 1441 +61240 1437 1455 +61240 1438 1448 +61240 1467 1529 +61240 1541 1718 +61240 1546 1548 +61240 1546 1431 +61240 1576 1835 +61240 1613 1888 +61240 1625 1490 +61240 1628 1463 +61240 1655 1512 +61240 1688 1457 +61240 1691 1718 +61240 1825 1426 +61240 1831 1526 +61240 1845 1434 +61240 1912 1916 +61240 1924 1471 +61240 1437 1527 +61240 1448 1467 +61240 1600 1438 +61240 1645 1756 +61240 1802 1865 +61240 1544 1884 +61240 1585 1752 +61240 1660 1692 +61240 1664 1438 +61240 1673 1747 +61240 1734 1444 +61240 1544 1518 +61240 1550 1566 +61240 1572 1592 +61240 1613 1439 +61240 1764 1489 +61240 1676 1747 +61240 1789 1924 +61240 1840 1489 +61240 1872 1916 +61240 1591 1916 +61240 1591 1872 +61240 1598 1635 +61240 1835 1874 +61240 1652 1747 +61240 1438 1519 +61240 1715 1755 +61240 1871 1470 +61240 1470 1517 +61240 1871 1517 +61240 1664 1821 +61240 1650 1668 +61260 1541 1691 +61260 1541 1718 +61260 1546 1548 +61260 1546 1431 +61260 1547 1816 +61260 1554 1688 +61260 1554 1473 +61260 1575 1679 +61260 1576 1835 +61260 1599 1512 +61260 1602 1489 +61260 1602 1754 +61260 1609 1448 +61260 1613 1888 +61260 1625 1490 +61260 1628 1463 +61260 1635 1517 +61260 1655 1512 +61260 1688 1457 +61260 1688 1766 +61260 1688 1535 +61260 1691 1718 +61260 1706 1467 +61260 1755 1498 +61260 1766 1890 +61260 1766 1467 +61260 1798 1462 +61260 1825 1426 +61260 1831 1526 +61260 1845 1434 +61260 1857 1441 +61260 1886 1485 +61260 1912 1916 +61260 1924 1471 +61260 1428 1467 +61260 1431 1516 +61260 1433 1480 +61260 1437 1527 +61260 1448 1467 +61260 1448 1462 +61260 1462 1529 +61260 1581 1770 +61260 1600 1438 +61260 1645 1756 +61260 1652 1673 +61260 1688 1467 +61260 1802 1865 +61260 1877 1908 +61260 1544 1884 +61260 1569 1665 +61260 1573 1452 +61260 1585 1752 +61260 1648 1696 +61260 1660 1692 +61260 1664 1438 +61260 1673 1747 +61260 1734 1444 +61260 1544 1518 +61260 1550 1566 +61260 1600 1664 +61260 1600 1821 +61260 1649 1689 +61260 1829 1462 +61260 1884 1518 +61260 1886 1462 +61260 1890 1467 +61260 1572 1592 +61260 1613 1439 +61260 1754 1914 +61260 1764 1489 +61260 1617 1901 +61260 1857 1901 +61260 1652 1676 +61260 1676 1747 +61260 1789 1924 +61260 1840 1489 +61260 1872 1916 +61260 1665 1742 +61260 1591 1916 +61260 1591 1872 +61260 1598 1635 +61260 1835 1874 +61260 1652 1747 +61260 1438 1519 +61260 1715 1755 +61260 1871 1470 +61260 1470 1517 +61260 1871 1517 +61260 1541 1533 +61260 1664 1821 +61260 1650 1668 +61280 1546 1717 +61280 1546 1606 +61280 1548 1516 +61280 1554 1862 +61280 1581 1770 +61280 1591 1912 +61280 1600 1438 +61280 1606 1431 +61280 1609 1688 +61280 1609 1890 +61280 1609 1706 +61280 1619 1873 +61280 1635 1470 +61280 1645 1756 +61280 1649 1904 +61280 1652 1673 +61280 1688 1706 +61280 1688 1467 +61280 1688 1890 +61280 1717 1901 +61280 1764 1840 +61280 1798 1831 +61280 1802 1865 +61280 1805 1425 +61280 1821 1525 +61280 1877 1908 +61280 1889 1492 +61280 1898 1923 +61280 1434 1462 +61280 1438 1467 +61280 1467 1519 +61280 1544 1884 +61280 1547 1808 +61280 1569 1665 +61280 1573 1452 +61280 1585 1752 +61280 1617 1841 +61280 1648 1696 +61280 1660 1692 +61280 1664 1438 +61280 1673 1747 +61280 1673 1676 +61280 1734 1444 +61280 1893 1518 +61280 1897 1428 +61280 1434 1529 +61280 1544 1518 +61280 1550 1566 +61280 1600 1664 +61280 1600 1821 +61280 1617 1717 +61280 1635 1667 +61280 1649 1689 +61280 1829 1462 +61280 1841 1901 +61280 1850 1868 +61280 1884 1518 +61280 1886 1462 +61280 1890 1467 +61280 1572 1592 +61280 1613 1439 +61280 1688 1426 +61280 1754 1914 +61280 1764 1489 +61280 1617 1857 +61280 1617 1901 +61280 1734 1491 +61280 1829 1886 +61280 1841 1857 +61280 1857 1901 +61280 1652 1676 +61280 1676 1747 +61280 1789 1924 +61280 1840 1489 +61280 1872 1916 +61280 1665 1742 +61280 1683 1718 +61280 1591 1916 +61280 1691 1533 +61280 1591 1872 +61280 1598 1635 +61280 1835 1874 +61280 1652 1747 +61280 1438 1519 +61280 1715 1755 +61280 1871 1470 +61280 1470 1517 +61280 1871 1517 +61280 1541 1533 +61280 1664 1821 +61280 1650 1668 +61300 1544 1884 +61300 1546 1547 +61300 1547 1808 +61300 1547 1613 +61300 1569 1665 +61300 1573 1452 +61300 1583 1825 +61300 1585 1752 +61300 1587 1817 +61300 1599 1655 +61300 1600 1902 +61300 1617 1841 +61300 1625 1923 +61300 1630 1531 +61300 1648 1696 +61300 1649 1847 +61300 1660 1692 +61300 1664 1438 +61300 1673 1747 +61300 1673 1676 +61300 1677 1918 +61300 1689 1847 +61300 1701 1448 +61300 1734 1444 +61300 1735 1527 +61300 1755 1498 +61300 1767 1489 +61300 1831 1847 +61300 1845 1434 +61300 1893 1518 +61300 1897 1428 +61300 1902 1924 +61300 1924 1471 +61300 1427 1473 +61300 1434 1529 +61300 1434 1485 +61300 1485 1529 +61300 1544 1518 +61300 1550 1566 +61300 1566 1901 +61300 1579 1476 +61300 1600 1664 +61300 1600 1821 +61300 1617 1717 +61300 1635 1667 +61300 1649 1689 +61300 1829 1462 +61300 1841 1901 +61300 1850 1868 +61300 1884 1518 +61300 1886 1462 +61300 1890 1467 +61300 1911 1458 +61300 1572 1592 +61300 1613 1439 +61300 1688 1426 +61300 1754 1914 +61300 1764 1489 +61300 1617 1857 +61300 1617 1901 +61300 1734 1491 +61300 1829 1886 +61300 1841 1857 +61300 1857 1901 +61300 1652 1676 +61300 1676 1747 +61300 1789 1924 +61300 1840 1489 +61300 1872 1916 +61300 1437 1527 +61300 1665 1742 +61300 1683 1718 +61300 1541 1691 +61300 1591 1916 +61300 1691 1533 +61300 1591 1872 +61300 1598 1635 +61300 1835 1874 +61300 1628 1862 +61300 1652 1747 +61300 1438 1519 +61300 1715 1755 +61300 1871 1470 +61300 1470 1517 +61300 1871 1517 +61300 1541 1533 +61300 1664 1821 +61300 1650 1668 +61320 1544 1438 +61320 1544 1518 +61320 1544 1821 +61320 1550 1566 +61320 1566 1857 +61320 1566 1901 +61320 1579 1476 +61320 1585 1766 +61320 1590 1473 +61320 1600 1664 +61320 1600 1821 +61320 1601 1911 +61320 1604 1616 +61320 1617 1717 +61320 1628 1768 +61320 1635 1667 +61320 1649 1689 +61320 1652 1847 +61320 1676 1847 +61320 1681 1731 +61320 1688 1835 +61320 1692 1752 +61320 1692 1467 +61320 1697 1906 +61320 1701 1473 +61320 1727 1845 +61320 1829 1462 +61320 1841 1901 +61320 1850 1868 +61320 1866 1497 +61320 1884 1518 +61320 1886 1462 +61320 1889 1480 +61320 1889 1492 +61320 1890 1467 +61320 1897 1467 +61320 1911 1458 +61320 1549 1525 +61320 1572 1592 +61320 1595 1473 +61320 1601 1458 +61320 1613 1439 +61320 1626 1665 +61320 1688 1426 +61320 1754 1914 +61320 1764 1489 +61320 1617 1857 +61320 1617 1901 +61320 1734 1491 +61320 1829 1886 +61320 1841 1857 +61320 1857 1901 +61320 1600 1428 +61320 1652 1676 +61320 1676 1747 +61320 1789 1924 +61320 1840 1489 +61320 1872 1916 +61320 1437 1527 +61320 1665 1742 +61320 1683 1718 +61320 1541 1691 +61320 1591 1916 +61320 1691 1533 +61320 1591 1872 +61320 1598 1635 +61320 1835 1874 +61320 1628 1862 +61320 1652 1747 +61320 1805 1425 +61320 1438 1519 +61320 1715 1755 +61320 1871 1470 +61320 1470 1517 +61320 1871 1517 +61320 1541 1533 +61320 1664 1821 +61320 1650 1668 +61340 1549 1525 +61340 1549 1518 +61340 1550 1857 +61340 1550 1717 +61340 1551 1269 +61340 1566 1717 +61340 1569 1665 +61340 1572 1592 +61340 1581 1752 +61340 1595 1473 +61340 1599 1774 +61340 1601 1458 +61340 1606 1516 +61340 1609 1441 +61340 1613 1439 +61340 1626 1665 +61340 1630 1531 +61340 1660 1692 +61340 1664 1890 +61340 1688 1426 +61340 1701 1771 +61340 1731 1770 +61340 1731 1831 +61340 1754 1914 +61340 1764 1489 +61340 1802 1487 +61340 1821 1890 +61340 1847 1875 +61340 1877 1908 +61340 1617 1857 +61340 1617 1901 +61340 1625 1923 +61340 1640 1802 +61340 1734 1491 +61340 1829 1886 +61340 1841 1857 +61340 1857 1901 +61340 1573 1452 +61340 1600 1428 +61340 1652 1676 +61340 1676 1747 +61340 1789 1924 +61340 1840 1489 +61340 1872 1916 +61340 1437 1527 +61340 1583 1825 +61340 1665 1742 +61340 1683 1718 +61340 1752 1766 +61340 1541 1691 +61340 1591 1916 +61340 1673 1747 +61340 1691 1533 +61340 1740 1863 +61340 1890 1518 +61340 1591 1872 +61340 1598 1635 +61340 1835 1874 +61340 1628 1862 +61340 1652 1747 +61340 1805 1425 +61340 1438 1519 +61340 1715 1755 +61340 1871 1470 +61340 1470 1517 +61340 1871 1517 +61340 1541 1533 +61340 1664 1821 +61340 1650 1668 +61360 1537 1835 +61360 1543 1630 +61360 1548 1516 +61360 1549 1884 +61360 1592 1609 +61360 1609 1756 +61360 1617 1857 +61360 1617 1901 +61360 1625 1923 +61360 1640 1802 +61360 1664 1897 +61360 1677 1918 +61360 1688 1701 +61360 1734 1491 +61360 1735 1855 +61360 1825 1462 +61360 1829 1886 +61360 1841 1857 +61360 1841 1901 +61360 1850 1868 +61360 1853 1894 +61360 1857 1901 +61360 1912 1916 +61360 1924 1471 +61360 1473 1529 +61360 1473 1485 +61360 1480 1529 +61360 1480 1485 +61360 1573 1452 +61360 1600 1664 +61360 1600 1428 +61360 1652 1676 +61360 1676 1747 +61360 1789 1924 +61360 1840 1489 +61360 1872 1916 +61360 1437 1527 +61360 1583 1825 +61360 1599 1655 +61360 1665 1742 +61360 1683 1718 +61360 1752 1766 +61360 1767 1489 +61360 1485 1529 +61360 1541 1691 +61360 1591 1916 +61360 1635 1517 +61360 1673 1747 +61360 1691 1533 +61360 1740 1863 +61360 1890 1428 +61360 1890 1518 +61360 1591 1872 +61360 1598 1635 +61360 1600 1890 +61360 1835 1874 +61360 1628 1862 +61360 1652 1747 +61360 1805 1425 +61360 1438 1519 +61360 1550 1566 +61360 1715 1755 +61360 1871 1470 +61360 1470 1517 +61360 1871 1517 +61360 1544 1518 +61360 1541 1533 +61360 1664 1821 +61360 1599 1658 +61360 1650 1668 +61380 1537 1688 +61380 1544 1890 +61380 1573 1452 +61380 1585 1766 +61380 1595 1654 +61380 1600 1664 +61380 1600 1428 +61380 1600 1821 +61380 1626 1649 +61380 1649 1889 +61380 1649 1665 +61380 1652 1676 +61380 1664 1890 +61380 1676 1747 +61380 1694 1529 +61380 1701 1853 +61380 1701 1886 +61380 1756 1489 +61380 1764 1840 +61380 1789 1924 +61380 1821 1890 +61380 1821 1879 +61380 1825 1886 +61380 1840 1489 +61380 1865 1882 +61380 1872 1916 +61380 1879 1884 +61380 1889 1893 +61380 1437 1527 +61380 1583 1825 +61380 1599 1655 +61380 1600 1518 +61380 1665 1742 +61380 1669 1914 +61380 1683 1718 +61380 1731 1847 +61380 1752 1766 +61380 1767 1489 +61380 1789 1902 +61380 1847 1458 +61380 1853 1884 +61380 1886 1462 +61380 1485 1529 +61380 1541 1691 +61380 1591 1916 +61380 1635 1517 +61380 1648 1696 +61380 1673 1747 +61380 1691 1533 +61380 1740 1863 +61380 1754 1914 +61380 1755 1498 +61380 1764 1489 +61380 1890 1428 +61380 1890 1518 +61380 1591 1872 +61380 1598 1635 +61380 1600 1890 +61380 1652 1673 +61380 1713 1924 +61380 1835 1874 +61380 1628 1862 +61380 1660 1692 +61380 1652 1747 +61380 1805 1425 +61380 1438 1519 +61380 1550 1566 +61380 1715 1755 +61380 1871 1470 +61380 1470 1517 +61380 1871 1517 +61380 1544 1518 +61380 1541 1533 +61380 1664 1821 +61380 1599 1658 +61380 1650 1668 +61400 1549 1884 +61400 1551 1269 +61400 1583 1825 +61400 1599 1655 +61400 1600 1518 +61400 1601 1458 +61400 1602 1467 +61400 1664 1853 +61400 1665 1742 +61400 1669 1914 +61400 1669 1754 +61400 1681 1731 +61400 1683 1718 +61400 1701 1706 +61400 1701 1756 +61400 1715 1498 +61400 1731 1847 +61400 1735 1921 +61400 1752 1766 +61400 1767 1489 +61400 1789 1902 +61400 1791 1467 +61400 1825 1462 +61400 1829 1491 +61400 1847 1458 +61400 1850 1868 +61400 1853 1884 +61400 1886 1462 +61400 1444 1491 +61400 1485 1529 +61400 1541 1691 +61400 1547 1660 +61400 1591 1916 +61400 1604 1616 +61400 1635 1517 +61400 1648 1696 +61400 1673 1747 +61400 1691 1533 +61400 1740 1863 +61400 1754 1914 +61400 1755 1498 +61400 1764 1489 +61400 1821 1518 +61400 1890 1428 +61400 1890 1518 +61400 1924 1471 +61400 1591 1872 +61400 1598 1635 +61400 1600 1890 +61400 1652 1673 +61400 1713 1924 +61400 1835 1874 +61400 1628 1862 +61400 1660 1692 +61400 1841 1901 +61400 1652 1747 +61400 1805 1425 +61400 1438 1519 +61400 1550 1566 +61400 1715 1755 +61400 1871 1470 +61400 1470 1517 +61400 1871 1517 +61400 1544 1518 +61400 1541 1533 +61400 1664 1821 +61400 1599 1658 +61400 1650 1668 +61420 1541 1691 +61420 1547 1660 +61420 1548 1606 +61420 1550 1921 +61420 1591 1916 +61420 1600 1428 +61420 1600 1650 +61420 1604 1616 +61420 1617 1441 +61420 1617 1921 +61420 1619 1505 +61420 1628 1701 +61420 1635 1517 +61420 1648 1696 +61420 1664 1448 +61420 1664 1438 +61420 1673 1747 +61420 1691 1533 +61420 1734 1475 +61420 1740 1863 +61420 1754 1889 +61420 1754 1914 +61420 1755 1498 +61420 1756 1475 +61420 1764 1489 +61420 1821 1448 +61420 1821 1518 +61420 1821 1438 +61420 1879 1890 +61420 1890 1428 +61420 1890 1518 +61420 1921 1527 +61420 1924 1471 +61420 1427 1482 +61420 1544 1890 +61420 1564 1847 +61420 1591 1872 +61420 1592 1606 +61420 1598 1635 +61420 1600 1890 +61420 1652 1673 +61420 1655 1774 +61420 1713 1924 +61420 1835 1448 +61420 1835 1874 +61420 1496 1497 +61420 1628 1862 +61420 1660 1692 +61420 1841 1901 +61420 1904 1920 +61420 1652 1747 +61420 1805 1425 +61420 1438 1519 +61420 1550 1566 +61420 1715 1755 +61420 1871 1470 +61420 1470 1517 +61420 1871 1517 +61420 1840 1489 +61420 1544 1518 +61420 1541 1533 +61420 1645 1756 +61420 1664 1821 +61420 1599 1658 +61420 1650 1668 +61440 1544 1890 +61440 1552 1761 +61440 1564 1847 +61440 1566 1921 +61440 1568 1625 +61440 1576 1835 +61440 1590 1609 +61440 1591 1872 +61440 1592 1734 +61440 1592 1606 +61440 1598 1635 +61440 1600 1890 +61440 1601 1458 +61440 1652 1673 +61440 1655 1774 +61440 1664 1879 +61440 1679 1523 +61440 1701 1463 +61440 1713 1924 +61440 1725 1434 +61440 1734 1480 +61440 1764 1840 +61440 1821 1890 +61440 1821 1879 +61440 1835 1448 +61440 1835 1874 +61440 1857 1921 +61440 1857 1527 +61440 1894 1919 +61440 1911 1458 +61440 1496 1497 +61440 1551 1269 +61440 1599 1655 +61440 1628 1862 +61440 1660 1692 +61440 1664 1890 +61440 1841 1901 +61440 1857 1441 +61440 1914 1921 +61440 1462 1518 +61440 1687 1841 +61440 1904 1920 +61440 1652 1747 +61440 1805 1425 +61440 1438 1519 +61440 1550 1566 +61440 1544 1462 +61440 1715 1755 +61440 1767 1489 +61440 1601 1911 +61440 1655 1861 +61440 1669 1754 +61440 1850 1868 +61440 1549 1525 +61440 1871 1470 +61440 1470 1517 +61440 1871 1517 +61440 1840 1489 +61440 1544 1518 +61440 1541 1533 +61440 1645 1756 +61440 1664 1821 +61440 1599 1658 +61440 1650 1668 +61460 1551 1269 +61460 1565 1628 +61460 1591 1734 +61460 1599 1655 +61460 1613 1526 +61460 1628 1862 +61460 1648 1696 +61460 1652 1830 +61460 1660 1692 +61460 1664 1890 +61460 1676 1439 +61460 1688 1888 +61460 1764 1489 +61460 1767 1840 +61460 1831 1847 +61460 1841 1901 +61460 1857 1441 +61460 1890 1428 +61460 1914 1921 +61460 1914 1476 +61460 1462 1518 +61460 1566 1857 +61460 1687 1841 +61460 1879 1890 +61460 1904 1920 +61460 1572 1592 +61460 1652 1747 +61460 1755 1498 +61460 1805 1425 +61460 1438 1519 +61460 1550 1566 +61460 1735 1466 +61460 1544 1462 +61460 1715 1755 +61460 1767 1489 +61460 1601 1911 +61460 1655 1861 +61460 1669 1754 +61460 1731 1911 +61460 1850 1868 +61460 1549 1525 +61460 1871 1470 +61460 1470 1517 +61460 1871 1517 +61460 1840 1489 +61460 1544 1518 +61460 1541 1533 +61460 1645 1756 +61460 1601 1731 +61460 1664 1821 +61460 1829 1886 +61460 1599 1658 +61460 1650 1668 +61480 1548 1606 +61480 1549 1884 +61480 1550 1857 +61480 1566 1857 +61480 1566 1617 +61480 1628 1701 +61480 1673 1747 +61480 1678 1480 +61480 1687 1841 +61480 1721 1906 +61480 1764 1840 +61480 1821 1890 +61480 1862 1471 +61480 1871 1912 +61480 1879 1890 +61480 1889 1906 +61480 1904 1920 +61480 1496 1497 +61480 1572 1592 +61480 1652 1747 +61480 1683 1718 +61480 1696 1894 +61480 1755 1498 +61480 1431 1516 +61480 1805 1425 +61480 1438 1519 +61480 1550 1566 +61480 1598 1635 +61480 1735 1466 +61480 1485 1529 +61480 1544 1462 +61480 1715 1755 +61480 1767 1489 +61480 1601 1911 +61480 1655 1861 +61480 1669 1754 +61480 1731 1911 +61480 1850 1868 +61480 1549 1525 +61480 1595 1654 +61480 1871 1470 +61480 1470 1517 +61480 1871 1517 +61480 1840 1489 +61480 1544 1518 +61480 1541 1533 +61480 1645 1756 +61480 1601 1731 +61480 1664 1821 +61480 1829 1886 +61480 1599 1658 +61480 1650 1668 +61500 1547 1889 +61500 1560 1474 +61500 1565 1628 +61500 1572 1592 +61500 1592 1702 +61500 1599 1861 +61500 1600 1890 +61500 1630 1467 +61500 1652 1747 +61500 1664 1438 +61500 1679 1523 +61500 1681 1831 +61500 1683 1718 +61500 1691 1533 +61500 1696 1894 +61500 1713 1924 +61500 1734 1871 +61500 1752 1766 +61500 1754 1471 +61500 1755 1498 +61500 1831 1875 +61500 1854 1448 +61500 1431 1516 +61500 1664 1890 +61500 1805 1425 +61500 1857 1907 +61500 1890 1462 +61500 1438 1519 +61500 1462 1518 +61500 1550 1566 +61500 1598 1635 +61500 1735 1466 +61500 1835 1874 +61500 1485 1529 +61500 1544 1462 +61500 1549 1689 +61500 1715 1755 +61500 1767 1489 +61500 1601 1911 +61500 1655 1861 +61500 1669 1754 +61500 1731 1911 +61500 1850 1868 +61500 1549 1525 +61500 1840 1901 +61500 1595 1654 +61500 1871 1470 +61500 1470 1517 +61500 1871 1517 +61500 1840 1489 +61500 1544 1518 +61500 1541 1533 +61500 1645 1756 +61500 1601 1731 +61500 1664 1821 +61500 1829 1886 +61500 1599 1658 +61500 1650 1668 +61520 1539 1678 +61520 1547 1747 +61520 1583 1884 +61520 1591 1626 +61520 1600 1438 +61520 1604 1616 +61520 1651 1473 +61520 1652 1427 +61520 1664 1890 +61520 1676 1678 +61520 1684 1841 +61520 1749 1757 +61520 1805 1425 +61520 1821 1890 +61520 1821 1462 +61520 1857 1907 +61520 1890 1462 +61520 1438 1519 +61520 1462 1518 +61520 1538 1549 +61520 1550 1566 +61520 1598 1635 +61520 1735 1466 +61520 1764 1840 +61520 1835 1874 +61520 1847 1458 +61520 1485 1529 +61520 1544 1462 +61520 1549 1689 +61520 1609 1920 +61520 1701 1463 +61520 1715 1755 +61520 1767 1489 +61520 1601 1911 +61520 1655 1861 +61520 1669 1754 +61520 1731 1911 +61520 1841 1901 +61520 1850 1868 +61520 1549 1525 +61520 1840 1841 +61520 1840 1901 +61520 1879 1890 +61520 1595 1654 +61520 1871 1470 +61520 1470 1517 +61520 1871 1517 +61520 1840 1489 +61520 1544 1518 +61520 1541 1533 +61520 1645 1756 +61520 1601 1731 +61520 1664 1821 +61520 1829 1886 +61520 1599 1658 +61520 1650 1668 +61540 1538 1549 +61540 1550 1566 +61540 1592 1887 +61540 1592 1438 +61540 1592 1519 +61540 1598 1635 +61540 1599 1774 +61540 1651 1894 +61540 1652 1747 +61540 1688 1530 +61540 1689 1525 +61540 1692 1830 +61540 1735 1466 +61540 1764 1840 +61540 1764 1489 +61540 1767 1841 +61540 1835 1874 +61540 1835 1887 +61540 1847 1458 +61540 1847 1911 +61540 1854 1887 +61540 1871 1474 +61540 1888 1529 +61540 1904 1920 +61540 1476 1480 +61540 1485 1529 +61540 1544 1462 +61540 1549 1689 +61540 1583 1825 +61540 1609 1920 +61540 1655 1658 +61540 1701 1463 +61540 1715 1755 +61540 1767 1489 +61540 1601 1911 +61540 1655 1861 +61540 1669 1754 +61540 1569 1742 +61540 1600 1519 +61540 1731 1911 +61540 1841 1901 +61540 1850 1868 +61540 1918 1448 +61540 1549 1525 +61540 1598 1667 +61540 1840 1841 +61540 1840 1901 +61540 1879 1890 +61540 1595 1654 +61540 1679 1523 +61540 1871 1470 +61540 1470 1517 +61540 1871 1517 +61540 1840 1489 +61540 1544 1518 +61540 1541 1533 +61540 1645 1756 +61540 1601 1731 +61540 1664 1821 +61540 1829 1886 +61540 1599 1658 +61540 1538 1825 +61540 1650 1668 +61560 1539 1617 +61560 1539 1562 +61560 1539 1527 +61560 1539 1441 +61560 1543 1786 +61560 1544 1462 +61560 1549 1689 +61560 1549 1890 +61560 1550 1562 +61560 1562 1617 +61560 1583 1825 +61560 1583 1884 +61560 1599 1861 +61560 1609 1920 +61560 1630 1467 +61560 1655 1658 +61560 1664 1890 +61560 1688 1900 +61560 1688 1887 +61560 1701 1463 +61560 1713 1924 +61560 1715 1755 +61560 1767 1840 +61560 1767 1489 +61560 1841 1489 +61560 1875 1437 +61560 1438 1471 +61560 1444 1491 +61560 1467 1531 +61560 1544 1821 +61560 1601 1911 +61560 1617 1441 +61560 1655 1861 +61560 1669 1754 +61560 1691 1533 +61560 1731 1458 +61560 1740 1863 +61560 1857 1907 +61560 1888 1485 +61560 1911 1458 +61560 1569 1742 +61560 1600 1519 +61560 1683 1718 +61560 1731 1911 +61560 1841 1901 +61560 1850 1868 +61560 1918 1448 +61560 1547 1889 +61560 1549 1525 +61560 1598 1667 +61560 1840 1841 +61560 1840 1901 +61560 1879 1890 +61560 1595 1654 +61560 1679 1523 +61560 1767 1901 +61560 1871 1470 +61560 1470 1517 +61560 1755 1498 +61560 1871 1517 +61560 1840 1489 +61560 1544 1518 +61560 1541 1533 +61560 1645 1756 +61560 1601 1731 +61560 1664 1821 +61560 1829 1886 +61560 1599 1658 +61560 1538 1825 +61560 1650 1668 +61580 1541 1691 +61580 1544 1821 +61580 1550 1441 +61580 1591 1835 +61580 1599 1774 +61580 1601 1911 +61580 1617 1441 +61580 1640 1802 +61580 1641 1441 +61580 1642 1466 +61580 1655 1861 +61580 1655 1431 +61580 1658 1861 +61580 1669 1754 +61580 1688 1756 +61580 1688 1517 +61580 1689 1713 +61580 1691 1533 +61580 1731 1458 +61580 1740 1863 +61580 1761 1501 +61580 1767 1841 +61580 1798 1906 +61580 1804 1510 +61580 1831 1847 +61580 1857 1907 +61580 1866 1528 +61580 1888 1485 +61580 1911 1458 +61580 1438 1489 +61580 1550 1566 +61580 1569 1742 +61580 1600 1519 +61580 1652 1747 +61580 1683 1718 +61580 1731 1911 +61580 1829 1451 +61580 1841 1901 +61580 1850 1868 +61580 1918 1448 +61580 1543 1467 +61580 1547 1889 +61580 1549 1525 +61580 1598 1667 +61580 1644 1855 +61580 1840 1841 +61580 1840 1901 +61580 1879 1890 +61580 1595 1654 +61580 1679 1523 +61580 1767 1901 +61580 1871 1470 +61580 1470 1517 +61580 1755 1498 +61580 1871 1517 +61580 1840 1489 +61580 1544 1518 +61580 1541 1533 +61580 1645 1756 +61580 1601 1731 +61580 1664 1821 +61580 1829 1886 +61580 1599 1658 +61580 1538 1825 +61580 1650 1668 +61600 1546 1655 +61600 1549 1689 +61600 1550 1566 +61600 1562 1689 +61600 1562 1900 +61600 1563 1835 +61600 1566 1441 +61600 1569 1742 +61600 1600 1519 +61600 1626 1874 +61600 1648 1696 +61600 1648 1651 +61600 1652 1747 +61600 1683 1718 +61600 1688 1871 +61600 1689 1890 +61600 1731 1911 +61600 1767 1840 +61600 1829 1451 +61600 1841 1901 +61600 1850 1868 +61600 1918 1448 +61600 1543 1467 +61600 1546 1516 +61600 1547 1889 +61600 1549 1525 +61600 1598 1667 +61600 1644 1855 +61600 1796 1816 +61600 1798 1889 +61600 1840 1841 +61600 1840 1901 +61600 1879 1890 +61600 1920 1482 +61600 1546 1431 +61600 1547 1798 +61600 1595 1654 +61600 1601 1434 +61600 1679 1523 +61600 1731 1434 +61600 1767 1901 +61600 1871 1470 +61600 1470 1517 +61600 1544 1462 +61600 1715 1755 +61600 1755 1498 +61600 1871 1517 +61600 1840 1489 +61600 1544 1518 +61600 1541 1533 +61600 1645 1756 +61600 1601 1731 +61600 1664 1821 +61600 1660 1692 +61600 1829 1886 +61600 1599 1658 +61600 1538 1825 +61600 1650 1668 +61620 1543 1467 +61620 1546 1599 +61620 1546 1516 +61620 1547 1889 +61620 1549 1525 +61620 1549 1821 +61620 1550 1441 +61620 1587 1817 +61620 1591 1835 +61620 1598 1667 +61620 1608 1831 +61620 1617 1641 +61620 1644 1855 +61620 1679 1835 +61620 1796 1816 +61620 1798 1889 +61620 1840 1841 +61620 1840 1901 +61620 1879 1890 +61620 1920 1482 +61620 1546 1431 +61620 1547 1798 +61620 1595 1654 +61620 1601 1434 +61620 1651 1694 +61620 1679 1523 +61620 1731 1434 +61620 1767 1901 +61620 1871 1470 +61620 1924 1478 +61620 1470 1517 +61620 1544 1462 +61620 1715 1755 +61620 1740 1863 +61620 1755 1498 +61620 1871 1517 +61620 1617 1441 +61620 1675 1857 +61620 1840 1489 +61620 1544 1518 +61620 1541 1533 +61620 1645 1756 +61620 1601 1731 +61620 1664 1821 +61620 1660 1692 +61620 1829 1886 +61620 1599 1658 +61620 1538 1825 +61620 1598 1635 +61620 1650 1668 +61640 1546 1431 +61640 1547 1808 +61640 1547 1798 +61640 1548 1476 +61640 1562 1448 +61640 1563 1592 +61640 1595 1654 +61640 1601 1434 +61640 1648 1696 +61640 1651 1694 +61640 1664 1835 +61640 1679 1523 +61640 1683 1718 +61640 1731 1434 +61640 1767 1901 +61640 1770 1458 +61640 1836 1897 +61640 1871 1470 +61640 1880 1914 +61640 1888 1448 +61640 1897 1467 +61640 1924 1478 +61640 1470 1517 +61640 1475 1523 +61640 1507 1522 +61640 1541 1691 +61640 1544 1462 +61640 1569 1742 +61640 1600 1519 +61640 1626 1874 +61640 1669 1754 +61640 1701 1463 +61640 1841 1901 +61640 1850 1868 +61640 1875 1437 +61640 1689 1825 +61640 1715 1755 +61640 1740 1863 +61640 1755 1498 +61640 1871 1517 +61640 1617 1441 +61640 1675 1857 +61640 1840 1489 +61640 1544 1518 +61640 1541 1533 +61640 1645 1756 +61640 1721 1816 +61640 1601 1731 +61640 1664 1821 +61640 1660 1692 +61640 1829 1886 +61640 1599 1658 +61640 1538 1825 +61640 1598 1635 +61640 1650 1668 +61660 1538 1689 +61660 1539 1448 +61660 1539 1665 +61660 1539 1529 +61660 1541 1691 +61660 1544 1462 +61660 1549 1884 +61660 1569 1742 +61660 1583 1689 +61660 1600 1664 +61660 1600 1518 +61660 1600 1519 +61660 1626 1874 +61660 1669 1754 +61660 1678 1683 +61660 1688 1517 +61660 1691 1533 +61660 1701 1463 +61660 1735 1477 +61660 1811 1875 +61660 1821 1890 +61660 1831 1850 +61660 1831 1868 +61660 1835 1887 +61660 1841 1901 +61660 1850 1868 +61660 1875 1437 +61660 1448 1529 +61660 1471 1517 +61660 1501 1528 +61660 1539 1771 +61660 1689 1825 +61660 1715 1755 +61660 1735 1911 +61660 1740 1863 +61660 1755 1498 +61660 1771 1529 +61660 1796 1816 +61660 1840 1901 +61660 1871 1517 +61660 1617 1857 +61660 1617 1441 +61660 1675 1857 +61660 1840 1489 +61660 1841 1489 +61660 1901 1489 +61660 1544 1518 +61660 1538 1890 +61660 1541 1533 +61660 1645 1756 +61660 1721 1816 +61660 1825 1890 +61660 1601 1731 +61660 1664 1821 +61660 1660 1692 +61660 1829 1886 +61660 1599 1658 +61660 1538 1825 +61660 1598 1635 +61660 1650 1668 +61680 1539 1771 +61680 1546 1851 +61680 1555 1918 +61680 1563 1438 +61680 1689 1825 +61680 1692 1835 +61680 1715 1755 +61680 1735 1847 +61680 1735 1911 +61680 1740 1863 +61680 1755 1498 +61680 1771 1529 +61680 1796 1816 +61680 1840 1901 +61680 1871 1517 +61680 1522 1524 +61680 1617 1857 +61680 1617 1441 +61680 1675 1857 +61680 1731 1434 +61680 1840 1489 +61680 1841 1489 +61680 1901 1489 +61680 1462 1518 +61680 1544 1518 +61680 1675 1441 +61680 1924 1478 +61680 1538 1890 +61680 1541 1533 +61680 1645 1756 +61680 1721 1816 +61680 1825 1890 +61680 1601 1434 +61680 1601 1731 +61680 1857 1441 +61680 1664 1821 +61680 1660 1692 +61680 1829 1886 +61680 1599 1658 +61680 1538 1825 +61680 1547 1798 +61680 1598 1635 +61680 1650 1668 +61700 1549 1600 +61700 1562 1903 +61700 1563 1529 +61700 1578 1592 +61700 1608 1688 +61700 1608 1659 +61700 1617 1857 +61700 1617 1441 +61700 1626 1874 +61700 1675 1857 +61700 1689 1890 +61700 1701 1835 +61700 1731 1434 +61700 1754 1770 +61700 1767 1840 +61700 1835 1441 +61700 1835 1477 +61700 1840 1841 +61700 1840 1489 +61700 1841 1489 +61700 1875 1437 +61700 1890 1518 +61700 1901 1489 +61700 1462 1518 +61700 1544 1518 +61700 1549 1884 +61700 1562 1887 +61700 1609 1920 +61700 1675 1441 +61700 1771 1485 +61700 1924 1478 +61700 1538 1890 +61700 1541 1533 +61700 1645 1756 +61700 1669 1754 +61700 1721 1816 +61700 1825 1890 +61700 1601 1434 +61700 1601 1731 +61700 1857 1441 +61700 1501 1528 +61700 1664 1821 +61700 1660 1692 +61700 1715 1794 +61700 1755 1794 +61700 1841 1901 +61700 1829 1886 +61700 1599 1658 +61700 1595 1654 +61700 1767 1901 +61700 1538 1825 +61700 1547 1798 +61700 1598 1635 +61700 1650 1668 +61720 1544 1462 +61720 1544 1518 +61720 1549 1884 +61720 1562 1887 +61720 1563 1893 +61720 1575 1458 +61720 1595 1845 +61720 1600 1884 +61720 1600 1668 +61720 1609 1920 +61720 1628 1463 +61720 1641 1811 +61720 1642 1911 +61720 1664 1518 +61720 1675 1441 +61720 1688 1887 +61720 1701 1489 +61720 1771 1485 +61720 1802 1528 +61720 1825 1518 +61720 1871 1517 +61720 1924 1478 +61720 1538 1890 +61720 1541 1533 +61720 1569 1742 +61720 1579 1471 +61720 1600 1664 +61720 1645 1756 +61720 1669 1754 +61720 1721 1816 +61720 1740 1863 +61720 1796 1816 +61720 1825 1890 +61720 1601 1434 +61720 1601 1731 +61720 1648 1696 +61720 1715 1755 +61720 1857 1441 +61720 1501 1528 +61720 1664 1821 +61720 1660 1692 +61720 1715 1794 +61720 1755 1794 +61720 1767 1841 +61720 1841 1901 +61720 1829 1886 +61720 1599 1658 +61720 1595 1654 +61720 1767 1901 +61720 1538 1825 +61720 1547 1798 +61720 1598 1635 +61720 1650 1668 +61740 1538 1890 +61740 1541 1533 +61740 1563 1771 +61740 1565 1628 +61740 1569 1742 +61740 1579 1471 +61740 1583 1462 +61740 1600 1664 +61740 1644 1527 +61740 1645 1756 +61740 1645 1438 +61740 1664 1884 +61740 1669 1754 +61740 1673 1688 +61740 1684 1702 +61740 1684 1687 +61740 1688 1920 +61740 1689 1771 +61740 1718 1770 +61740 1721 1816 +61740 1740 1863 +61740 1796 1816 +61740 1804 1510 +61740 1821 1458 +61740 1825 1890 +61740 1840 1901 +61740 1840 1841 +61740 1431 1516 +61740 1601 1434 +61740 1601 1731 +61740 1648 1696 +61740 1664 1458 +61740 1715 1755 +61740 1840 1489 +61740 1857 1441 +61740 1875 1437 +61740 1501 1528 +61740 1664 1821 +61740 1787 1851 +61740 1660 1692 +61740 1715 1794 +61740 1755 1794 +61740 1767 1841 +61740 1841 1901 +61740 1829 1886 +61740 1599 1658 +61740 1595 1654 +61740 1767 1901 +61740 1617 1857 +61740 1617 1441 +61740 1538 1825 +61740 1547 1798 +61740 1626 1835 +61740 1598 1635 +61740 1650 1668 +61760 1547 1533 +61760 1549 1525 +61760 1600 1825 +61760 1600 1884 +61760 1600 1525 +61760 1601 1434 +61760 1601 1731 +61760 1626 1874 +61760 1628 1433 +61760 1641 1701 +61760 1644 1718 +61760 1648 1696 +61760 1664 1458 +61760 1664 1835 +61760 1679 1886 +61760 1687 1702 +61760 1688 1854 +61760 1706 1905 +61760 1706 1835 +61760 1715 1811 +61760 1715 1755 +61760 1724 1835 +61760 1840 1489 +61760 1857 1441 +61760 1875 1437 +61760 1924 1478 +61760 1501 1528 +61760 1549 1600 +61760 1601 1847 +61760 1664 1821 +61760 1688 1829 +61760 1731 1847 +61760 1734 1802 +61760 1787 1851 +61760 1660 1692 +61760 1715 1794 +61760 1755 1794 +61760 1767 1841 +61760 1841 1901 +61760 1829 1886 +61760 1841 1489 +61760 1433 1463 +61760 1599 1658 +61760 1595 1654 +61760 1767 1901 +61760 1617 1857 +61760 1617 1441 +61760 1767 1489 +61760 1538 1825 +61760 1547 1798 +61760 1835 1874 +61760 1576 1835 +61760 1626 1835 +61760 1598 1635 +61760 1650 1668 +61780 1549 1600 +61780 1587 1817 +61780 1592 1918 +61780 1601 1829 +61780 1601 1886 +61780 1601 1847 +61780 1664 1821 +61780 1669 1754 +61780 1674 1688 +61780 1684 1687 +61780 1688 1829 +61780 1688 1886 +61780 1718 1850 +61780 1718 1875 +61780 1731 1886 +61780 1731 1847 +61780 1734 1802 +61780 1755 1811 +61780 1756 1438 +61780 1787 1851 +61780 1794 1811 +61780 1821 1471 +61780 1898 1911 +61780 1911 1527 +61780 1425 1533 +61780 1544 1462 +61780 1628 1458 +61780 1660 1692 +61780 1715 1794 +61780 1755 1794 +61780 1767 1841 +61780 1804 1510 +61780 1829 1847 +61780 1841 1901 +61780 1855 1463 +61780 1431 1516 +61780 1721 1816 +61780 1829 1886 +61780 1841 1489 +61780 1433 1463 +61780 1599 1658 +61780 1600 1519 +61780 1595 1654 +61780 1767 1901 +61780 1617 1857 +61780 1617 1441 +61780 1901 1489 +61780 1767 1489 +61780 1549 1890 +61780 1538 1825 +61780 1547 1798 +61780 1835 1874 +61780 1576 1835 +61780 1626 1835 +61780 1644 1527 +61780 1598 1635 +61780 1650 1668 +61800 1544 1462 +61800 1562 1673 +61800 1579 1592 +61800 1609 1920 +61800 1625 1269 +61800 1626 1874 +61800 1628 1458 +61800 1640 1802 +61800 1651 1694 +61800 1660 1692 +61800 1715 1794 +61800 1718 1754 +61800 1755 1794 +61800 1767 1840 +61800 1767 1841 +61800 1804 1510 +61800 1829 1847 +61800 1831 1847 +61800 1841 1901 +61800 1847 1886 +61800 1847 1911 +61800 1855 1463 +61800 1431 1516 +61800 1721 1816 +61800 1829 1886 +61800 1841 1489 +61800 1857 1441 +61800 1858 1918 +61800 1924 1478 +61800 1433 1463 +61800 1599 1658 +61800 1600 1519 +61800 1715 1755 +61800 1835 1470 +61800 1595 1654 +61800 1767 1901 +61800 1617 1857 +61800 1617 1441 +61800 1645 1756 +61800 1901 1489 +61800 1767 1489 +61800 1549 1890 +61800 1538 1825 +61800 1547 1798 +61800 1835 1874 +61800 1576 1835 +61800 1626 1835 +61800 1644 1527 +61800 1598 1635 +61800 1650 1668 +61820 1568 1911 +61820 1592 1920 +61820 1628 1433 +61820 1629 1894 +61820 1648 1696 +61820 1688 1847 +61820 1702 1489 +61820 1715 1811 +61820 1721 1816 +61820 1755 1498 +61820 1829 1886 +61820 1841 1489 +61820 1857 1441 +61820 1858 1918 +61820 1924 1478 +61820 1433 1463 +61820 1599 1658 +61820 1600 1519 +61820 1669 1754 +61820 1684 1687 +61820 1715 1755 +61820 1835 1470 +61820 1840 1489 +61820 1840 1841 +61820 1595 1654 +61820 1767 1901 +61820 1590 1455 +61820 1617 1857 +61820 1617 1441 +61820 1645 1756 +61820 1664 1821 +61820 1740 1863 +61820 1629 1911 +61820 1901 1489 +61820 1675 1441 +61820 1767 1489 +61820 1549 1890 +61820 1538 1825 +61820 1547 1798 +61820 1835 1874 +61820 1576 1835 +61820 1626 1835 +61820 1644 1527 +61820 1598 1635 +61820 1650 1668 +61840 1544 1890 +61840 1544 1884 +61840 1568 1831 +61840 1599 1658 +61840 1600 1519 +61840 1623 1901 +61840 1623 1462 +61840 1641 1642 +61840 1669 1754 +61840 1684 1687 +61840 1715 1755 +61840 1835 1470 +61840 1840 1489 +61840 1840 1841 +61840 1850 1868 +61840 1872 1470 +61840 1595 1654 +61840 1601 1434 +61840 1734 1802 +61840 1767 1901 +61840 1771 1529 +61840 1590 1455 +61840 1617 1857 +61840 1617 1441 +61840 1645 1756 +61840 1664 1821 +61840 1740 1863 +61840 1431 1516 +61840 1629 1911 +61840 1901 1489 +61840 1675 1441 +61840 1767 1489 +61840 1549 1890 +61840 1855 1463 +61840 1538 1825 +61840 1547 1798 +61840 1835 1874 +61840 1576 1835 +61840 1626 1835 +61840 1644 1527 +61840 1598 1635 +61840 1650 1668 +61860 1544 1549 +61860 1595 1654 +61860 1601 1434 +61860 1665 1678 +61860 1674 1684 +61860 1687 1702 +61860 1717 1441 +61860 1717 1527 +61860 1724 1835 +61860 1734 1802 +61860 1767 1901 +61860 1771 1529 +61860 1840 1901 +61860 1875 1437 +61860 1884 1890 +61860 1590 1455 +61860 1617 1857 +61860 1617 1441 +61860 1645 1756 +61860 1664 1821 +61860 1687 1841 +61860 1735 1465 +61860 1740 1863 +61860 1431 1516 +61860 1601 1629 +61860 1601 1911 +61860 1629 1911 +61860 1901 1489 +61860 1675 1441 +61860 1767 1489 +61860 1549 1890 +61860 1829 1886 +61860 1855 1463 +61860 1660 1692 +61860 1538 1825 +61860 1634 1831 +61860 1547 1798 +61860 1835 1874 +61860 1576 1835 +61860 1626 1835 +61860 1644 1527 +61860 1598 1635 +61860 1650 1668 +61880 1544 1884 +61880 1590 1455 +61880 1598 1920 +61880 1609 1920 +61880 1617 1857 +61880 1617 1441 +61880 1645 1756 +61880 1664 1821 +61880 1674 1702 +61880 1677 1894 +61880 1687 1840 +61880 1687 1841 +61880 1687 1489 +61880 1688 1731 +61880 1721 1816 +61880 1731 1829 +61880 1731 1886 +61880 1735 1465 +61880 1740 1863 +61880 1431 1516 +61880 1496 1497 +61880 1599 1787 +61880 1601 1629 +61880 1601 1911 +61880 1628 1463 +61880 1629 1911 +61880 1644 1717 +61880 1715 1811 +61880 1755 1811 +61880 1840 1841 +61880 1841 1901 +61880 1857 1441 +61880 1901 1489 +61880 1628 1855 +61880 1675 1441 +61880 1767 1489 +61880 1544 1890 +61880 1549 1890 +61880 1829 1886 +61880 1855 1463 +61880 1660 1692 +61880 1538 1825 +61880 1634 1831 +61880 1547 1798 +61880 1835 1874 +61880 1576 1835 +61880 1626 1835 +61880 1644 1527 +61880 1598 1635 +61880 1650 1668 +61900 1563 1629 +61900 1599 1787 +61900 1601 1629 +61900 1601 1911 +61900 1623 1527 +61900 1628 1463 +61900 1629 1642 +61900 1629 1911 +61900 1644 1717 +61900 1702 1841 +61900 1702 1901 +61900 1715 1811 +61900 1724 1835 +61900 1755 1811 +61900 1811 1498 +61900 1840 1841 +61900 1841 1901 +61900 1857 1441 +61900 1875 1437 +61900 1901 1489 +61900 1619 1505 +61900 1628 1855 +61900 1674 1901 +61900 1675 1441 +61900 1767 1489 +61900 1544 1890 +61900 1549 1890 +61900 1595 1654 +61900 1829 1886 +61900 1840 1489 +61900 1855 1463 +61900 1660 1692 +61900 1663 1818 +61900 1538 1825 +61900 1634 1831 +61900 1547 1798 +61900 1835 1874 +61900 1576 1835 +61900 1626 1835 +61900 1644 1527 +61900 1598 1635 +61900 1650 1668 +61920 1568 1717 +61920 1576 1626 +61920 1600 1519 +61920 1619 1505 +61920 1628 1855 +61920 1629 1920 +61920 1642 1485 +61920 1674 1901 +61920 1675 1441 +61920 1767 1489 +61920 1858 1872 +61920 1875 1441 +61920 1889 1920 +61920 1458 1485 +61920 1485 1529 +61920 1544 1890 +61920 1549 1890 +61920 1595 1654 +61920 1684 1901 +61920 1687 1489 +61920 1715 1755 +61920 1924 1478 +61920 1664 1821 +61920 1829 1886 +61920 1840 1489 +61920 1855 1463 +61920 1660 1692 +61920 1663 1818 +61920 1755 1498 +61920 1538 1825 +61920 1634 1831 +61920 1547 1798 +61920 1835 1874 +61920 1576 1835 +61920 1617 1857 +61920 1626 1835 +61920 1644 1527 +61920 1598 1635 +61920 1650 1668 +61940 1544 1890 +61940 1549 1890 +61940 1585 1766 +61940 1595 1654 +61940 1617 1441 +61940 1628 1650 +61940 1669 1754 +61940 1679 1872 +61940 1684 1901 +61940 1687 1841 +61940 1687 1489 +61940 1702 1901 +61940 1715 1755 +61940 1850 1868 +61940 1924 1478 +61940 1544 1600 +61940 1664 1821 +61940 1829 1886 +61940 1840 1489 +61940 1855 1463 +61940 1544 1884 +61940 1660 1692 +61940 1663 1818 +61940 1755 1498 +61940 1884 1890 +61940 1898 1477 +61940 1538 1825 +61940 1634 1831 +61940 1547 1798 +61940 1804 1510 +61940 1835 1874 +61940 1576 1835 +61940 1617 1857 +61940 1626 1835 +61940 1740 1863 +61940 1644 1527 +61940 1598 1635 +61940 1650 1668 +61960 1537 1918 +61960 1544 1600 +61960 1593 1599 +61960 1664 1821 +61960 1701 1906 +61960 1717 1754 +61960 1731 1894 +61960 1829 1886 +61960 1835 1470 +61960 1840 1489 +61960 1855 1463 +61960 1875 1889 +61960 1544 1884 +61960 1660 1692 +61960 1663 1818 +61960 1755 1498 +61960 1884 1890 +61960 1898 1477 +61960 1538 1825 +61960 1628 1855 +61960 1634 1831 +61960 1547 1798 +61960 1661 1684 +61960 1841 1901 +61960 1804 1510 +61960 1835 1874 +61960 1576 1835 +61960 1617 1857 +61960 1626 1835 +61960 1740 1863 +61960 1644 1527 +61960 1598 1635 +61960 1650 1668 +61980 1537 1724 +61980 1541 1887 +61980 1544 1884 +61980 1642 1731 +61980 1651 1694 +61980 1660 1689 +61980 1660 1692 +61980 1663 1818 +61980 1689 1692 +61980 1752 1774 +61980 1755 1498 +61980 1755 1811 +61980 1835 1875 +61980 1875 1491 +61980 1875 1879 +61980 1884 1890 +61980 1898 1477 +61980 1538 1825 +61980 1599 1774 +61980 1628 1855 +61980 1634 1831 +61980 1675 1441 +61980 1701 1845 +61980 1798 1868 +61980 1496 1497 +61980 1547 1798 +61980 1585 1766 +61980 1599 1766 +61980 1617 1441 +61980 1661 1684 +61980 1841 1901 +61980 1585 1599 +61980 1599 1752 +61980 1669 1754 +61980 1804 1510 +61980 1835 1874 +61980 1576 1835 +61980 1617 1857 +61980 1626 1835 +61980 1740 1863 +61980 1644 1527 +61980 1547 1868 +61980 1598 1635 +61980 1650 1668 +62000 1538 1825 +62000 1538 1549 +62000 1568 1889 +62000 1599 1774 +62000 1626 1874 +62000 1628 1855 +62000 1634 1831 +62000 1675 1441 +62000 1687 1841 +62000 1701 1845 +62000 1701 1839 +62000 1715 1724 +62000 1798 1850 +62000 1798 1868 +62000 1821 1898 +62000 1821 1830 +62000 1496 1497 +62000 1547 1798 +62000 1549 1890 +62000 1585 1766 +62000 1599 1766 +62000 1617 1441 +62000 1661 1684 +62000 1752 1766 +62000 1825 1890 +62000 1840 1489 +62000 1841 1901 +62000 1585 1599 +62000 1599 1752 +62000 1669 1754 +62000 1804 1510 +62000 1835 1874 +62000 1576 1835 +62000 1679 1872 +62000 1617 1857 +62000 1767 1489 +62000 1626 1835 +62000 1740 1863 +62000 1547 1850 +62000 1644 1527 +62000 1547 1868 +62000 1829 1886 +62000 1598 1635 +62000 1650 1668 +62020 1538 1525 +62020 1547 1798 +62020 1549 1890 +62020 1585 1766 +62020 1599 1766 +62020 1617 1441 +62020 1661 1684 +62020 1674 1840 +62020 1674 1489 +62020 1679 1862 +62020 1721 1816 +62020 1752 1766 +62020 1825 1890 +62020 1839 1845 +62020 1840 1489 +62020 1841 1901 +62020 1854 1875 +62020 1549 1825 +62020 1585 1599 +62020 1599 1752 +62020 1669 1754 +62020 1804 1510 +62020 1835 1874 +62020 1576 1835 +62020 1471 1503 +62020 1850 1868 +62020 1679 1872 +62020 1544 1884 +62020 1617 1857 +62020 1767 1489 +62020 1626 1835 +62020 1740 1863 +62020 1547 1850 +62020 1644 1527 +62020 1547 1868 +62020 1829 1886 +62020 1598 1635 +62020 1650 1668 +62040 1538 1825 +62040 1549 1825 +62040 1585 1599 +62040 1591 1875 +62040 1599 1752 +62040 1613 1526 +62040 1648 1696 +62040 1669 1754 +62040 1675 1441 +62040 1684 1811 +62040 1688 1473 +62040 1740 1798 +62040 1798 1875 +62040 1804 1510 +62040 1835 1874 +62040 1845 1906 +62040 1854 1470 +62040 1884 1890 +62040 1496 1497 +62040 1576 1835 +62040 1599 1794 +62040 1687 1901 +62040 1924 1478 +62040 1471 1503 +62040 1755 1498 +62040 1850 1868 +62040 1679 1872 +62040 1544 1884 +62040 1617 1857 +62040 1634 1831 +62040 1767 1489 +62040 1626 1835 +62040 1740 1863 +62040 1547 1850 +62040 1644 1527 +62040 1547 1868 +62040 1829 1886 +62040 1598 1635 +62040 1650 1668 +62060 1563 1715 +62060 1576 1835 +62060 1587 1817 +62060 1593 1599 +62060 1599 1794 +62060 1599 1774 +62060 1663 1818 +62060 1687 1901 +62060 1875 1471 +62060 1924 1478 +62060 1471 1503 +62060 1600 1519 +62060 1755 1498 +62060 1804 1482 +62060 1840 1489 +62060 1850 1868 +62060 1857 1441 +62060 1679 1872 +62060 1825 1890 +62060 1544 1884 +62060 1617 1857 +62060 1634 1831 +62060 1767 1840 +62060 1767 1489 +62060 1626 1835 +62060 1740 1863 +62060 1547 1850 +62060 1644 1527 +62060 1547 1868 +62060 1829 1886 +62060 1598 1635 +62060 1650 1668 +62080 1538 1825 +62080 1551 1818 +62080 1600 1519 +62080 1609 1920 +62080 1624 1835 +62080 1721 1816 +62080 1755 1498 +62080 1804 1482 +62080 1840 1489 +62080 1841 1901 +62080 1850 1868 +62080 1857 1441 +62080 1538 1890 +62080 1550 1906 +62080 1679 1872 +62080 1804 1510 +62080 1825 1890 +62080 1835 1874 +62080 1544 1884 +62080 1617 1857 +62080 1634 1831 +62080 1767 1840 +62080 1767 1489 +62080 1617 1441 +62080 1626 1835 +62080 1740 1863 +62080 1547 1850 +62080 1644 1527 +62080 1547 1868 +62080 1829 1886 +62080 1598 1635 +62080 1650 1668 +62100 1538 1890 +62100 1550 1906 +62100 1580 1772 +62100 1599 1512 +62100 1626 1874 +62100 1641 1835 +62100 1641 1470 +62100 1678 1433 +62100 1679 1872 +62100 1684 1489 +62100 1687 1901 +62100 1688 1731 +62100 1804 1510 +62100 1825 1890 +62100 1835 1874 +62100 1854 1491 +62100 1875 1517 +62100 1920 1470 +62100 1924 1478 +62100 1544 1884 +62100 1617 1857 +62100 1634 1831 +62100 1767 1840 +62100 1767 1489 +62100 1617 1441 +62100 1626 1835 +62100 1740 1863 +62100 1547 1850 +62100 1547 1523 +62100 1644 1527 +62100 1547 1868 +62100 1829 1886 +62100 1598 1635 +62100 1650 1668 +62120 1544 1811 +62120 1544 1884 +62120 1549 1525 +62120 1617 1857 +62120 1634 1831 +62120 1731 1857 +62120 1767 1840 +62120 1767 1489 +62120 1796 1823 +62120 1890 1901 +62120 1576 1835 +62120 1609 1920 +62120 1617 1441 +62120 1626 1835 +62120 1701 1839 +62120 1752 1766 +62120 1857 1441 +62120 1600 1519 +62120 1755 1498 +62120 1740 1863 +62120 1547 1850 +62120 1547 1523 +62120 1644 1527 +62120 1871 1517 +62120 1547 1868 +62120 1811 1890 +62120 1538 1825 +62120 1829 1886 +62120 1598 1635 +62120 1650 1668 +62140 1549 1890 +62140 1576 1835 +62140 1578 1718 +62140 1598 1920 +62140 1609 1920 +62140 1617 1441 +62140 1626 1835 +62140 1701 1839 +62140 1752 1766 +62140 1840 1489 +62140 1857 1441 +62140 1884 1890 +62140 1600 1519 +62140 1755 1498 +62140 1804 1510 +62140 1740 1863 +62140 1547 1850 +62140 1547 1523 +62140 1644 1527 +62140 1871 1517 +62140 1547 1868 +62140 1811 1890 +62140 1538 1825 +62140 1829 1886 +62140 1678 1845 +62140 1598 1635 +62140 1650 1668 +62160 1600 1519 +62160 1688 1771 +62160 1721 1816 +62160 1755 1498 +62160 1804 1510 +62160 1835 1911 +62160 1841 1901 +62160 1868 1523 +62160 1924 1478 +62160 1544 1890 +62160 1740 1863 +62160 1547 1850 +62160 1547 1523 +62160 1644 1527 +62160 1871 1517 +62160 1547 1868 +62160 1811 1890 +62160 1538 1825 +62160 1549 1525 +62160 1829 1886 +62160 1678 1845 +62160 1598 1635 +62160 1650 1668 +62180 1544 1890 +62180 1609 1920 +62180 1648 1696 +62180 1684 1441 +62180 1740 1863 +62180 1547 1850 +62180 1547 1523 +62180 1576 1835 +62180 1617 1857 +62180 1626 1835 +62180 1644 1527 +62180 1871 1517 +62180 1835 1874 +62180 1547 1868 +62180 1811 1890 +62180 1538 1825 +62180 1549 1525 +62180 1829 1886 +62180 1678 1845 +62180 1598 1635 +62180 1650 1668 +62200 1547 1850 +62200 1547 1523 +62200 1576 1835 +62200 1617 1857 +62200 1626 1835 +62200 1644 1527 +62200 1688 1841 +62200 1688 1901 +62200 1701 1900 +62200 1850 1868 +62200 1871 1517 +62200 1920 1470 +62200 1924 1478 +62200 1583 1825 +62200 1835 1874 +62200 1841 1901 +62200 1449 1512 +62200 1755 1498 +62200 1547 1868 +62200 1811 1890 +62200 1538 1825 +62200 1549 1525 +62200 1829 1886 +62200 1678 1845 +62200 1598 1635 +62200 1650 1668 +62220 1538 1583 +62220 1544 1825 +62220 1580 1772 +62220 1583 1825 +62220 1587 1817 +62220 1648 1696 +62220 1754 1527 +62220 1771 1813 +62220 1831 1527 +62220 1835 1874 +62220 1841 1901 +62220 1449 1512 +62220 1609 1920 +62220 1755 1498 +62220 1767 1840 +62220 1547 1868 +62220 1547 1701 +62220 1701 1868 +62220 1811 1890 +62220 1538 1825 +62220 1549 1525 +62220 1829 1886 +62220 1678 1845 +62220 1598 1635 +62220 1740 1863 +62220 1650 1668 +62240 1575 1679 +62240 1591 1689 +62240 1599 1774 +62240 1609 1920 +62240 1617 1441 +62240 1688 1901 +62240 1701 1831 +62240 1755 1498 +62240 1767 1840 +62240 1872 1527 +62240 1888 1920 +62240 1547 1850 +62240 1547 1868 +62240 1547 1701 +62240 1701 1868 +62240 1811 1890 +62240 1538 1825 +62240 1549 1525 +62240 1547 1523 +62240 1829 1886 +62240 1678 1845 +62240 1598 1635 +62240 1740 1863 +62240 1650 1668 +62260 1544 1583 +62260 1547 1850 +62260 1547 1868 +62260 1547 1701 +62260 1600 1890 +62260 1701 1868 +62260 1811 1890 +62260 1825 1890 +62260 1835 1458 +62260 1924 1478 +62260 1538 1825 +62260 1549 1525 +62260 1871 1517 +62260 1600 1888 +62260 1648 1696 +62260 1857 1441 +62260 1644 1527 +62260 1547 1523 +62260 1829 1886 +62260 1678 1845 +62260 1598 1635 +62260 1740 1863 +62260 1650 1668 +62280 1538 1825 +62280 1539 1831 +62280 1549 1525 +62280 1563 1920 +62280 1617 1857 +62280 1649 1918 +62280 1669 1754 +62280 1767 1840 +62280 1825 1888 +62280 1850 1868 +62280 1855 1517 +62280 1855 1871 +62280 1871 1517 +62280 1600 1888 +62280 1648 1696 +62280 1701 1845 +62280 1857 1441 +62280 1547 1808 +62280 1599 1512 +62280 1644 1527 +62280 1841 1901 +62280 1755 1498 +62280 1547 1523 +62280 1829 1886 +62280 1678 1845 +62280 1598 1635 +62280 1740 1863 +62280 1650 1668 +62300 1566 1893 +62300 1600 1888 +62300 1602 1779 +62300 1648 1696 +62300 1684 1840 +62300 1688 1841 +62300 1701 1845 +62300 1808 1523 +62300 1857 1441 +62300 1924 1478 +62300 1547 1808 +62300 1599 1512 +62300 1644 1527 +62300 1841 1901 +62300 1755 1498 +62300 1547 1523 +62300 1829 1886 +62300 1678 1845 +62300 1598 1635 +62300 1740 1863 +62300 1650 1668 +62320 1767 1840 +62320 1835 1886 +62320 1840 1489 +62320 1871 1517 +62320 1538 1825 +62320 1547 1808 +62320 1599 1512 +62320 1644 1527 +62320 1841 1901 +62320 1755 1498 +62320 1547 1523 +62320 1825 1888 +62320 1829 1886 +62320 1678 1845 +62320 1598 1635 +62320 1740 1863 +62320 1650 1668 +62340 1538 1825 +62340 1547 1808 +62340 1587 1817 +62340 1599 1512 +62340 1617 1857 +62340 1644 1527 +62340 1684 1840 +62340 1701 1835 +62340 1701 1740 +62340 1701 1527 +62340 1841 1901 +62340 1850 1868 +62340 1425 1491 +62340 1840 1514 +62340 1592 1715 +62340 1592 1718 +62340 1648 1696 +62340 1755 1498 +62340 1547 1523 +62340 1825 1888 +62340 1829 1886 +62340 1678 1845 +62340 1600 1888 +62340 1598 1635 +62340 1740 1863 +62340 1650 1668 +62360 1576 1755 +62360 1811 1890 +62360 1840 1514 +62360 1857 1441 +62360 1868 1527 +62360 1592 1715 +62360 1592 1718 +62360 1600 1825 +62360 1648 1696 +62360 1755 1498 +62360 1835 1470 +62360 1547 1523 +62360 1825 1888 +62360 1829 1886 +62360 1678 1845 +62360 1600 1888 +62360 1598 1635 +62360 1740 1863 +62360 1650 1668 +62380 1538 1888 +62380 1566 1718 +62380 1592 1715 +62380 1592 1718 +62380 1600 1825 +62380 1648 1696 +62380 1678 1701 +62380 1840 1489 +62380 1894 1425 +62380 1547 1808 +62380 1578 1715 +62380 1755 1498 +62380 1835 1470 +62380 1547 1523 +62380 1717 1886 +62380 1825 1888 +62380 1850 1868 +62380 1829 1886 +62380 1678 1845 +62380 1600 1888 +62380 1598 1635 +62380 1599 1512 +62380 1740 1863 +62380 1650 1668 +62400 1547 1808 +62400 1569 1742 +62400 1578 1715 +62400 1669 1754 +62400 1688 1813 +62400 1717 1829 +62400 1755 1498 +62400 1835 1470 +62400 1857 1441 +62400 1538 1924 +62400 1547 1523 +62400 1717 1886 +62400 1777 1512 +62400 1811 1890 +62400 1825 1888 +62400 1850 1868 +62400 1841 1901 +62400 1829 1886 +62400 1678 1845 +62400 1600 1888 +62400 1598 1635 +62400 1599 1512 +62400 1740 1863 +62400 1650 1668 +62420 1538 1924 +62420 1547 1523 +62420 1592 1715 +62420 1599 1777 +62420 1717 1886 +62420 1777 1512 +62420 1811 1890 +62420 1845 1527 +62420 1489 1514 +62420 1825 1888 +62420 1835 1854 +62420 1840 1489 +62420 1850 1868 +62420 1599 1655 +62420 1841 1901 +62420 1829 1886 +62420 1678 1845 +62420 1871 1517 +62420 1648 1696 +62420 1600 1888 +62420 1598 1635 +62420 1599 1512 +62420 1655 1512 +62420 1740 1863 +62420 1650 1668 +62440 1569 1742 +62440 1598 1702 +62440 1645 1756 +62440 1808 1523 +62440 1825 1888 +62440 1835 1854 +62440 1840 1489 +62440 1755 1498 +62440 1850 1868 +62440 1599 1655 +62440 1841 1901 +62440 1829 1886 +62440 1678 1845 +62440 1871 1517 +62440 1648 1696 +62440 1600 1888 +62440 1598 1635 +62440 1599 1512 +62440 1655 1512 +62440 1740 1863 +62440 1650 1668 +62460 1550 1641 +62460 1609 1920 +62460 1617 1857 +62460 1755 1498 +62460 1850 1868 +62460 1599 1655 +62460 1841 1901 +62460 1787 1851 +62460 1547 1808 +62460 1829 1886 +62460 1678 1845 +62460 1871 1517 +62460 1648 1696 +62460 1600 1888 +62460 1598 1635 +62460 1599 1512 +62460 1655 1512 +62460 1740 1863 +62460 1650 1668 +62480 1547 1523 +62480 1592 1715 +62480 1599 1655 +62480 1669 1754 +62480 1721 1816 +62480 1767 1489 +62480 1841 1901 +62480 1873 1921 +62480 1549 1525 +62480 1787 1851 +62480 1485 1529 +62480 1547 1808 +62480 1592 1718 +62480 1829 1886 +62480 1678 1845 +62480 1871 1517 +62480 1648 1696 +62480 1600 1888 +62480 1598 1635 +62480 1489 1514 +62480 1599 1512 +62480 1825 1888 +62480 1655 1512 +62480 1740 1863 +62480 1650 1668 +62500 1544 1553 +62500 1549 1525 +62500 1674 1767 +62500 1787 1851 +62500 1804 1510 +62500 1816 1881 +62500 1485 1529 +62500 1547 1808 +62500 1592 1718 +62500 1617 1441 +62500 1755 1437 +62500 1829 1886 +62500 1678 1845 +62500 1850 1868 +62500 1871 1517 +62500 1648 1696 +62500 1600 1888 +62500 1598 1635 +62500 1489 1514 +62500 1617 1857 +62500 1599 1512 +62500 1825 1888 +62500 1655 1512 +62500 1740 1863 +62500 1650 1668 +62520 1544 1890 +62520 1544 1811 +62520 1547 1808 +62520 1575 1696 +62520 1592 1718 +62520 1617 1441 +62520 1625 1755 +62520 1641 1692 +62520 1710 1889 +62520 1755 1437 +62520 1829 1886 +62520 1841 1901 +62520 1625 1437 +62520 1669 1754 +62520 1678 1845 +62520 1850 1868 +62520 1592 1715 +62520 1871 1517 +62520 1575 1648 +62520 1648 1696 +62520 1808 1523 +62520 1600 1888 +62520 1598 1635 +62520 1599 1655 +62520 1489 1514 +62520 1617 1857 +62520 1599 1512 +62520 1825 1888 +62520 1655 1512 +62520 1740 1863 +62520 1650 1668 +62540 1625 1437 +62540 1641 1920 +62540 1669 1754 +62540 1678 1845 +62540 1816 1881 +62540 1816 1923 +62540 1850 1868 +62540 1857 1923 +62540 1592 1715 +62540 1692 1816 +62540 1871 1517 +62540 1575 1648 +62540 1648 1696 +62540 1808 1523 +62540 1549 1525 +62540 1600 1888 +62540 1598 1635 +62540 1599 1655 +62540 1674 1489 +62540 1489 1514 +62540 1617 1857 +62540 1599 1512 +62540 1825 1888 +62540 1655 1512 +62540 1740 1863 +62540 1650 1668 +62560 1563 1592 +62560 1575 1696 +62560 1592 1715 +62560 1625 1713 +62560 1692 1816 +62560 1710 1889 +62560 1871 1517 +62560 1890 1519 +62560 1575 1648 +62560 1648 1696 +62560 1648 1679 +62560 1808 1523 +62560 1485 1529 +62560 1549 1525 +62560 1600 1888 +62560 1841 1901 +62560 1569 1742 +62560 1598 1635 +62560 1599 1655 +62560 1674 1489 +62560 1489 1514 +62560 1617 1857 +62560 1547 1808 +62560 1599 1512 +62560 1829 1886 +62560 1825 1888 +62560 1886 1919 +62560 1655 1512 +62560 1740 1863 +62560 1650 1668 +62580 1538 1924 +62580 1544 1811 +62580 1563 1475 +62580 1575 1648 +62580 1617 1441 +62580 1648 1696 +62580 1648 1679 +62580 1679 1696 +62580 1721 1816 +62580 1721 1881 +62580 1787 1851 +62580 1808 1523 +62580 1485 1529 +62580 1544 1890 +62580 1549 1525 +62580 1600 1888 +62580 1841 1901 +62580 1569 1742 +62580 1598 1635 +62580 1599 1655 +62580 1674 1489 +62580 1713 1437 +62580 1489 1514 +62580 1617 1857 +62580 1547 1808 +62580 1599 1512 +62580 1829 1886 +62580 1829 1919 +62580 1825 1888 +62580 1886 1919 +62580 1655 1512 +62580 1740 1863 +62580 1650 1668 +62600 1544 1890 +62600 1549 1525 +62600 1592 1688 +62600 1600 1888 +62600 1728 1458 +62600 1742 1478 +62600 1841 1901 +62600 1569 1742 +62600 1598 1635 +62600 1599 1655 +62600 1674 1489 +62600 1713 1437 +62600 1767 1489 +62600 1489 1514 +62600 1617 1857 +62600 1547 1808 +62600 1599 1512 +62600 1829 1886 +62600 1829 1919 +62600 1871 1517 +62600 1825 1888 +62600 1886 1919 +62600 1655 1512 +62600 1740 1863 +62600 1650 1668 +62620 1569 1742 +62620 1598 1635 +62620 1599 1655 +62620 1674 1489 +62620 1694 1862 +62620 1713 1437 +62620 1767 1489 +62620 1808 1523 +62620 1489 1514 +62620 1617 1857 +62620 1547 1808 +62620 1609 1924 +62620 1669 1754 +62620 1599 1512 +62620 1829 1886 +62620 1829 1919 +62620 1871 1517 +62620 1825 1888 +62620 1886 1919 +62620 1655 1512 +62620 1740 1863 +62620 1650 1668 +62640 1600 1825 +62640 1617 1857 +62640 1678 1845 +62640 1721 1816 +62640 1767 1840 +62640 1547 1808 +62640 1609 1924 +62640 1669 1754 +62640 1569 1478 +62640 1599 1512 +62640 1829 1886 +62640 1829 1919 +62640 1841 1901 +62640 1871 1517 +62640 1825 1888 +62640 1544 1890 +62640 1886 1919 +62640 1655 1512 +62640 1740 1863 +62640 1635 1920 +62640 1650 1668 +62660 1547 1808 +62660 1609 1924 +62660 1625 1710 +62660 1669 1754 +62660 1713 1437 +62660 1816 1881 +62660 1485 1529 +62660 1549 1525 +62660 1569 1478 +62660 1599 1512 +62660 1808 1523 +62660 1829 1886 +62660 1829 1919 +62660 1841 1901 +62660 1871 1517 +62660 1825 1888 +62660 1544 1890 +62660 1886 1919 +62660 1655 1512 +62660 1740 1863 +62660 1635 1920 +62660 1650 1668 +62680 1549 1525 +62680 1550 1839 +62680 1551 1701 +62680 1569 1478 +62680 1599 1512 +62680 1617 1857 +62680 1808 1523 +62680 1816 1823 +62680 1829 1886 +62680 1829 1919 +62680 1841 1901 +62680 1617 1694 +62680 1678 1845 +62680 1871 1517 +62680 1694 1857 +62680 1825 1888 +62680 1544 1890 +62680 1886 1919 +62680 1694 1441 +62680 1655 1512 +62680 1740 1863 +62680 1635 1920 +62680 1650 1668 +62700 1617 1441 +62700 1617 1694 +62700 1651 1817 +62700 1674 1767 +62700 1678 1845 +62700 1823 1881 +62700 1489 1514 +62700 1688 1715 +62700 1721 1881 +62700 1871 1517 +62700 1721 1816 +62700 1694 1857 +62700 1816 1881 +62700 1825 1888 +62700 1544 1890 +62700 1886 1919 +62700 1694 1441 +62700 1857 1441 +62700 1655 1512 +62700 1740 1863 +62700 1635 1920 +62700 1650 1668 +62720 1669 1754 +62720 1674 1840 +62720 1688 1715 +62720 1721 1881 +62720 1787 1851 +62720 1816 1872 +62720 1816 1825 +62720 1857 1858 +62720 1871 1517 +62720 1602 1779 +62720 1648 1696 +62720 1721 1816 +62720 1694 1857 +62720 1816 1881 +62720 1825 1888 +62720 1841 1901 +62720 1609 1924 +62720 1544 1890 +62720 1886 1919 +62720 1694 1441 +62720 1857 1441 +62720 1655 1512 +62720 1740 1863 +62720 1489 1498 +62720 1635 1920 +62720 1650 1668 +62740 1569 1478 +62740 1602 1779 +62740 1648 1696 +62740 1721 1816 +62740 1694 1857 +62740 1816 1881 +62740 1825 1888 +62740 1841 1901 +62740 1609 1924 +62740 1544 1890 +62740 1886 1919 +62740 1694 1441 +62740 1857 1441 +62740 1816 1823 +62740 1655 1512 +62740 1740 1863 +62740 1489 1498 +62740 1635 1920 +62740 1650 1668 +62760 1538 1609 +62760 1674 1767 +62760 1678 1845 +62760 1694 1857 +62760 1721 1881 +62760 1804 1510 +62760 1816 1881 +62760 1825 1888 +62760 1841 1901 +62760 1609 1924 +62760 1544 1890 +62760 1886 1919 +62760 1694 1441 +62760 1857 1441 +62760 1816 1823 +62760 1655 1512 +62760 1740 1863 +62760 1489 1498 +62760 1635 1920 +62760 1650 1668 +62780 1569 1742 +62780 1579 1717 +62780 1609 1924 +62780 1648 1696 +62780 1544 1890 +62780 1599 1890 +62780 1688 1715 +62780 1721 1816 +62780 1886 1919 +62780 1694 1441 +62780 1857 1441 +62780 1816 1823 +62780 1655 1512 +62780 1740 1863 +62780 1829 1919 +62780 1829 1886 +62780 1489 1498 +62780 1544 1599 +62780 1635 1920 +62780 1650 1668 +62800 1544 1890 +62800 1544 1876 +62800 1599 1890 +62800 1625 1713 +62800 1688 1715 +62800 1721 1816 +62800 1825 1888 +62800 1871 1517 +62800 1886 1919 +62800 1890 1519 +62800 1599 1519 +62800 1694 1441 +62800 1857 1441 +62800 1876 1890 +62800 1470 1471 +62800 1816 1823 +62800 1655 1512 +62800 1740 1863 +62800 1829 1919 +62800 1694 1857 +62800 1829 1886 +62800 1489 1498 +62800 1678 1845 +62800 1544 1599 +62800 1635 1920 +62800 1650 1668 +62820 1544 1913 +62820 1544 1519 +62820 1583 1913 +62820 1599 1913 +62820 1599 1519 +62820 1694 1441 +62820 1721 1825 +62820 1721 1881 +62820 1811 1448 +62820 1811 1890 +62820 1811 1876 +62820 1816 1825 +62820 1857 1441 +62820 1876 1890 +62820 1470 1471 +62820 1816 1823 +62820 1913 1519 +62820 1655 1512 +62820 1740 1863 +62820 1829 1919 +62820 1694 1857 +62820 1829 1886 +62820 1489 1498 +62820 1678 1845 +62820 1544 1599 +62820 1635 1920 +62820 1650 1668 +62840 1599 1448 +62840 1669 1754 +62840 1816 1823 +62840 1913 1519 +62840 1655 1512 +62840 1871 1517 +62840 1740 1863 +62840 1602 1779 +62840 1829 1919 +62840 1886 1919 +62840 1694 1857 +62840 1829 1886 +62840 1489 1498 +62840 1678 1845 +62840 1544 1599 +62840 1635 1920 +62840 1599 1890 +62840 1650 1668 +62860 1550 1839 +62860 1553 1924 +62860 1625 1713 +62860 1655 1512 +62860 1804 1835 +62860 1816 1825 +62860 1825 1835 +62860 1835 1876 +62860 1835 1510 +62860 1871 1517 +62860 1470 1471 +62860 1599 1519 +62860 1688 1715 +62860 1721 1825 +62860 1740 1863 +62860 1816 1835 +62860 1470 1495 +62860 1602 1779 +62860 1811 1876 +62860 1829 1919 +62860 1886 1919 +62860 1890 1519 +62860 1694 1857 +62860 1829 1886 +62860 1489 1498 +62860 1678 1845 +62860 1544 1599 +62860 1635 1920 +62860 1599 1890 +62860 1650 1668 +62880 1544 1519 +62880 1550 1857 +62880 1599 1819 +62880 1599 1519 +62880 1600 1890 +62880 1688 1715 +62880 1721 1816 +62880 1721 1825 +62880 1740 1863 +62880 1816 1835 +62880 1819 1519 +62880 1913 1519 +62880 1470 1495 +62880 1602 1779 +62880 1811 1876 +62880 1829 1919 +62880 1886 1919 +62880 1890 1519 +62880 1694 1857 +62880 1694 1441 +62880 1819 1913 +62880 1857 1441 +62880 1829 1886 +62880 1489 1498 +62880 1544 1890 +62880 1825 1881 +62880 1678 1845 +62880 1804 1510 +62880 1816 1823 +62880 1544 1599 +62880 1635 1920 +62880 1599 1890 +62880 1617 1684 +62880 1650 1668 +62900 1599 1688 +62900 1602 1779 +62900 1668 1463 +62900 1669 1835 +62900 1703 1889 +62900 1811 1876 +62900 1829 1919 +62900 1886 1919 +62900 1890 1519 +62900 1600 1888 +62900 1669 1754 +62900 1694 1857 +62900 1694 1441 +62900 1819 1913 +62900 1857 1441 +62900 1829 1886 +62900 1489 1498 +62900 1544 1890 +62900 1816 1825 +62900 1825 1881 +62900 1678 1845 +62900 1804 1510 +62900 1816 1823 +62900 1544 1599 +62900 1635 1920 +62900 1599 1890 +62900 1617 1684 +62900 1650 1668 +62920 1600 1888 +62920 1669 1754 +62920 1688 1913 +62920 1688 1819 +62920 1694 1857 +62920 1694 1441 +62920 1721 1825 +62920 1740 1863 +62920 1819 1913 +62920 1857 1441 +62920 1625 1678 +62920 1829 1886 +62920 1489 1498 +62920 1544 1890 +62920 1816 1825 +62920 1825 1881 +62920 1678 1845 +62920 1804 1510 +62920 1816 1823 +62920 1544 1599 +62920 1635 1920 +62920 1599 1890 +62920 1617 1684 +62920 1650 1668 +62940 1555 1625 +62940 1625 1678 +62940 1648 1696 +62940 1651 1754 +62940 1811 1876 +62940 1829 1886 +62940 1441 1489 +62940 1489 1498 +62940 1544 1890 +62940 1816 1825 +62940 1825 1881 +62940 1678 1845 +62940 1804 1510 +62940 1816 1823 +62940 1544 1599 +62940 1549 1525 +62940 1635 1920 +62940 1599 1890 +62940 1617 1684 +62940 1835 1463 +62940 1650 1668 +62960 1544 1890 +62960 1767 1498 +62960 1816 1825 +62960 1825 1881 +62960 1890 1525 +62960 1600 1888 +62960 1678 1845 +62960 1804 1510 +62960 1816 1823 +62960 1767 1489 +62960 1544 1599 +62960 1549 1525 +62960 1635 1920 +62960 1599 1890 +62960 1617 1684 +62960 1694 1857 +62960 1835 1463 +62960 1650 1668 +62980 1599 1525 +62980 1600 1888 +62980 1678 1845 +62980 1721 1816 +62980 1721 1825 +62980 1804 1510 +62980 1816 1823 +62980 1829 1886 +62980 1767 1489 +62980 1544 1599 +62980 1549 1525 +62980 1635 1920 +62980 1599 1890 +62980 1617 1684 +62980 1694 1857 +62980 1489 1498 +62980 1835 1463 +62980 1811 1876 +62980 1740 1863 +62980 1650 1668 +63000 1563 1592 +63000 1583 1890 +63000 1648 1696 +63000 1688 1448 +63000 1721 1881 +63000 1721 1796 +63000 1767 1489 +63000 1796 1816 +63000 1544 1890 +63000 1544 1599 +63000 1549 1525 +63000 1635 1920 +63000 1819 1913 +63000 1599 1890 +63000 1617 1684 +63000 1694 1857 +63000 1694 1441 +63000 1857 1441 +63000 1489 1498 +63000 1835 1463 +63000 1811 1876 +63000 1740 1863 +63000 1650 1668 +63020 1544 1890 +63020 1544 1599 +63020 1549 1525 +63020 1569 1678 +63020 1635 1920 +63020 1669 1754 +63020 1819 1913 +63020 1829 1886 +63020 1840 1489 +63020 1841 1901 +63020 1876 1918 +63020 1890 1519 +63020 1599 1890 +63020 1617 1684 +63020 1678 1845 +63020 1694 1857 +63020 1694 1441 +63020 1857 1441 +63020 1489 1498 +63020 1825 1888 +63020 1835 1463 +63020 1600 1888 +63020 1811 1876 +63020 1740 1863 +63020 1650 1668 +63040 1563 1592 +63040 1599 1890 +63040 1602 1779 +63040 1617 1684 +63040 1648 1696 +63040 1678 1845 +63040 1871 1517 +63040 1600 1825 +63040 1694 1857 +63040 1694 1441 +63040 1857 1441 +63040 1489 1498 +63040 1825 1888 +63040 1835 1463 +63040 1600 1888 +63040 1811 1876 +63040 1740 1863 +63040 1650 1668 +63060 1569 1678 +63060 1600 1825 +63060 1679 1819 +63060 1694 1857 +63060 1694 1441 +63060 1721 1816 +63060 1816 1881 +63060 1816 1823 +63060 1857 1441 +63060 1489 1498 +63060 1825 1888 +63060 1829 1886 +63060 1835 1463 +63060 1600 1888 +63060 1655 1512 +63060 1811 1876 +63060 1924 1478 +63060 1635 1920 +63060 1678 1742 +63060 1740 1863 +63060 1650 1668 +63080 1602 1779 +63080 1663 1818 +63080 1669 1754 +63080 1796 1816 +63080 1796 1823 +63080 1825 1888 +63080 1829 1886 +63080 1835 1840 +63080 1835 1463 +63080 1884 1890 +63080 1600 1888 +63080 1655 1512 +63080 1544 1890 +63080 1811 1876 +63080 1549 1525 +63080 1841 1901 +63080 1924 1478 +63080 1635 1920 +63080 1678 1742 +63080 1740 1863 +63080 1650 1668 +63100 1600 1888 +63100 1617 1684 +63100 1655 1512 +63100 1721 1816 +63100 1728 1458 +63100 1816 1823 +63100 1816 1881 +63100 1544 1890 +63100 1599 1512 +63100 1599 1655 +63100 1811 1876 +63100 1549 1525 +63100 1841 1901 +63100 1924 1478 +63100 1569 1678 +63100 1635 1920 +63100 1678 1742 +63100 1600 1825 +63100 1740 1863 +63100 1650 1668 +63120 1544 1890 +63120 1599 1512 +63120 1599 1655 +63120 1811 1876 +63120 1840 1463 +63120 1549 1525 +63120 1669 1754 +63120 1841 1901 +63120 1924 1478 +63120 1569 1678 +63120 1635 1920 +63120 1489 1498 +63120 1678 1742 +63120 1857 1441 +63120 1694 1441 +63120 1694 1857 +63120 1600 1825 +63120 1740 1863 +63120 1650 1668 +63140 1549 1525 +63140 1669 1754 +63140 1767 1840 +63140 1816 1823 +63140 1841 1901 +63140 1871 1517 +63140 1924 1478 +63140 1602 1779 +63140 1888 1503 +63140 1569 1678 +63140 1635 1920 +63140 1489 1498 +63140 1678 1742 +63140 1857 1441 +63140 1694 1441 +63140 1694 1857 +63140 1600 1825 +63140 1740 1863 +63140 1650 1668 +63160 1599 1512 +63160 1602 1779 +63160 1679 1819 +63160 1688 1426 +63160 1721 1816 +63160 1767 1489 +63160 1816 1881 +63160 1829 1886 +63160 1888 1503 +63160 1563 1592 +63160 1617 1684 +63160 1485 1529 +63160 1569 1678 +63160 1635 1920 +63160 1489 1498 +63160 1678 1742 +63160 1857 1441 +63160 1694 1441 +63160 1694 1857 +63160 1600 1825 +63160 1740 1863 +63160 1650 1668 +63180 1563 1592 +63180 1617 1684 +63180 1659 1449 +63180 1688 1886 +63180 1841 1901 +63180 1767 1840 +63180 1924 1478 +63180 1485 1529 +63180 1549 1525 +63180 1569 1678 +63180 1635 1920 +63180 1787 1851 +63180 1819 1913 +63180 1489 1498 +63180 1678 1742 +63180 1689 1533 +63180 1857 1441 +63180 1694 1441 +63180 1694 1857 +63180 1600 1825 +63180 1740 1863 +63180 1650 1668 +63200 1655 1529 +63200 1767 1840 +63200 1796 1816 +63200 1924 1478 +63200 1485 1529 +63200 1549 1525 +63200 1569 1678 +63200 1635 1920 +63200 1787 1851 +63200 1819 1913 +63200 1602 1779 +63200 1489 1498 +63200 1678 1742 +63200 1721 1796 +63200 1689 1533 +63200 1857 1441 +63200 1694 1441 +63200 1694 1857 +63200 1669 1754 +63200 1600 1825 +63200 1740 1863 +63200 1650 1668 +63220 1549 1525 +63220 1563 1592 +63220 1569 1678 +63220 1599 1512 +63220 1635 1920 +63220 1787 1851 +63220 1811 1876 +63220 1819 1913 +63220 1829 1871 +63220 1440 1458 +63220 1829 1517 +63220 1602 1779 +63220 1489 1498 +63220 1678 1742 +63220 1721 1796 +63220 1829 1886 +63220 1689 1533 +63220 1857 1441 +63220 1694 1441 +63220 1694 1857 +63220 1669 1754 +63220 1600 1825 +63220 1740 1863 +63220 1650 1668 +63240 1630 1531 +63240 1829 1517 +63240 1602 1779 +63240 1677 1678 +63240 1489 1498 +63240 1678 1742 +63240 1721 1796 +63240 1829 1886 +63240 1767 1840 +63240 1689 1533 +63240 1796 1816 +63240 1857 1441 +63240 1694 1441 +63240 1694 1857 +63240 1669 1754 +63240 1600 1825 +63240 1547 1808 +63240 1740 1863 +63240 1650 1668 +63260 1602 1779 +63260 1617 1684 +63260 1677 1678 +63260 1688 1894 +63260 1811 1876 +63260 1448 1449 +63260 1489 1498 +63260 1678 1742 +63260 1721 1816 +63260 1721 1796 +63260 1829 1886 +63260 1871 1517 +63260 1440 1458 +63260 1767 1840 +63260 1689 1533 +63260 1796 1816 +63260 1857 1441 +63260 1694 1441 +63260 1694 1857 +63260 1669 1754 +63260 1600 1825 +63260 1547 1808 +63260 1740 1863 +63260 1650 1668 +63280 1635 1840 +63280 1635 1767 +63280 1678 1742 +63280 1721 1816 +63280 1721 1796 +63280 1829 1886 +63280 1871 1517 +63280 1440 1458 +63280 1767 1840 +63280 1689 1533 +63280 1796 1816 +63280 1857 1441 +63280 1485 1529 +63280 1694 1441 +63280 1694 1857 +63280 1669 1754 +63280 1600 1825 +63280 1547 1808 +63280 1740 1863 +63280 1650 1668 +63300 1569 1678 +63300 1600 1884 +63300 1689 1912 +63300 1767 1840 +63300 1840 1920 +63300 1689 1533 +63300 1796 1816 +63300 1857 1441 +63300 1485 1529 +63300 1617 1684 +63300 1694 1441 +63300 1694 1857 +63300 1669 1754 +63300 1489 1498 +63300 1600 1825 +63300 1547 1808 +63300 1740 1863 +63300 1650 1668 +63320 1549 1525 +63320 1635 1920 +63320 1678 1742 +63320 1689 1533 +63320 1796 1816 +63320 1857 1441 +63320 1440 1458 +63320 1485 1529 +63320 1485 1517 +63320 1871 1517 +63320 1617 1684 +63320 1635 1463 +63320 1694 1441 +63320 1694 1857 +63320 1669 1754 +63320 1489 1498 +63320 1600 1825 +63320 1547 1808 +63320 1740 1863 +63320 1650 1668 +63340 1679 1819 +63340 1679 1718 +63340 1689 1912 +63340 1718 1819 +63340 1721 1881 +63340 1871 1529 +63340 1871 1517 +63340 1517 1529 +63340 1617 1684 +63340 1635 1463 +63340 1694 1441 +63340 1694 1857 +63340 1669 1754 +63340 1489 1498 +63340 1600 1825 +63340 1547 1808 +63340 1740 1863 +63340 1650 1668 +63360 1599 1678 +63360 1617 1684 +63360 1635 1463 +63360 1694 1441 +63360 1694 1857 +63360 1829 1886 +63360 1888 1503 +63360 1669 1754 +63360 1489 1498 +63360 1600 1825 +63360 1678 1742 +63360 1547 1808 +63360 1740 1863 +63360 1650 1668 +63380 1569 1678 +63380 1579 1441 +63380 1599 1825 +63380 1599 1519 +63380 1617 1684 +63380 1635 1463 +63380 1664 1530 +63380 1694 1441 +63380 1694 1857 +63380 1787 1851 +63380 1829 1886 +63380 1857 1441 +63380 1888 1503 +63380 1549 1525 +63380 1669 1754 +63380 1489 1498 +63380 1600 1825 +63380 1678 1742 +63380 1547 1808 +63380 1579 1694 +63380 1740 1863 +63380 1650 1668 +63400 1721 1881 +63400 1857 1441 +63400 1871 1517 +63400 1888 1503 +63400 1549 1525 +63400 1669 1754 +63400 1816 1881 +63400 1796 1816 +63400 1489 1498 +63400 1600 1825 +63400 1678 1742 +63400 1689 1533 +63400 1547 1808 +63400 1598 1920 +63400 1579 1694 +63400 1740 1863 +63400 1650 1668 +63420 1549 1525 +63420 1669 1754 +63420 1816 1881 +63420 1796 1816 +63420 1489 1498 +63420 1600 1825 +63420 1678 1742 +63420 1689 1533 +63420 1547 1808 +63420 1598 1920 +63420 1579 1694 +63420 1740 1863 +63420 1650 1668 +63440 1684 1441 +63440 1796 1816 +63440 1816 1918 +63440 1829 1886 +63440 1721 1816 +63440 1857 1441 +63440 1489 1498 +63440 1599 1525 +63440 1600 1825 +63440 1617 1441 +63440 1678 1742 +63440 1689 1533 +63440 1871 1517 +63440 1547 1808 +63440 1598 1920 +63440 1579 1694 +63440 1888 1503 +63440 1740 1863 +63440 1650 1668 +63460 1669 1754 +63460 1721 1816 +63460 1816 1823 +63460 1857 1441 +63460 1489 1498 +63460 1569 1742 +63460 1569 1678 +63460 1599 1525 +63460 1600 1825 +63460 1617 1441 +63460 1678 1742 +63460 1689 1533 +63460 1871 1517 +63460 1881 1918 +63460 1547 1808 +63460 1598 1920 +63460 1617 1857 +63460 1579 1694 +63460 1888 1503 +63460 1721 1796 +63460 1740 1863 +63460 1650 1668 +63480 1569 1742 +63480 1569 1678 +63480 1579 1437 +63480 1599 1525 +63480 1600 1825 +63480 1617 1441 +63480 1678 1742 +63480 1689 1533 +63480 1728 1458 +63480 1871 1517 +63480 1881 1918 +63480 1547 1808 +63480 1598 1920 +63480 1617 1857 +63480 1579 1694 +63480 1694 1437 +63480 1888 1503 +63480 1721 1796 +63480 1740 1863 +63480 1650 1668 +63500 1547 1808 +63500 1598 1920 +63500 1602 1779 +63500 1796 1816 +63500 1857 1441 +63500 1617 1857 +63500 1579 1694 +63500 1694 1437 +63500 1888 1503 +63500 1721 1796 +63500 1740 1863 +63500 1650 1668 +63520 1617 1857 +63520 1579 1694 +63520 1694 1437 +63520 1888 1503 +63520 1871 1517 +63520 1489 1498 +63520 1721 1796 +63520 1579 1437 +63520 1549 1525 +63520 1829 1886 +63520 1740 1863 +63520 1650 1668 +63540 1579 1694 +63540 1669 1754 +63540 1694 1437 +63540 1819 1876 +63540 1575 1679 +63540 1888 1503 +63540 1547 1808 +63540 1600 1825 +63540 1871 1517 +63540 1489 1498 +63540 1721 1796 +63540 1721 1816 +63540 1796 1816 +63540 1579 1437 +63540 1549 1525 +63540 1829 1886 +63540 1740 1863 +63540 1650 1668 +63560 1575 1679 +63560 1721 1823 +63560 1841 1901 +63560 1857 1489 +63560 1888 1503 +63560 1547 1808 +63560 1600 1825 +63560 1617 1857 +63560 1721 1881 +63560 1871 1517 +63560 1489 1498 +63560 1721 1796 +63560 1721 1816 +63560 1796 1816 +63560 1579 1437 +63560 1549 1525 +63560 1829 1886 +63560 1740 1863 +63560 1678 1813 +63560 1650 1668 +63580 1547 1808 +63580 1600 1825 +63580 1617 1857 +63580 1721 1881 +63580 1871 1517 +63580 1489 1498 +63580 1721 1796 +63580 1721 1816 +63580 1796 1816 +63580 1593 1787 +63580 1579 1437 +63580 1549 1525 +63580 1829 1886 +63580 1740 1863 +63580 1678 1813 +63580 1650 1668 +63600 1669 1754 +63600 1721 1796 +63600 1721 1823 +63600 1547 1716 +63600 1575 1679 +63600 1721 1816 +63600 1796 1816 +63600 1857 1441 +63600 1593 1787 +63600 1579 1437 +63600 1549 1525 +63600 1829 1886 +63600 1740 1863 +63600 1678 1813 +63600 1650 1668 +63620 1547 1716 +63620 1575 1679 +63620 1721 1816 +63620 1796 1816 +63620 1816 1918 +63620 1857 1441 +63620 1593 1787 +63620 1579 1437 +63620 1549 1525 +63620 1829 1886 +63620 1600 1825 +63620 1740 1863 +63620 1678 1813 +63620 1650 1668 +63640 1568 1516 +63640 1593 1787 +63640 1684 1839 +63640 1721 1796 +63640 1825 1463 +63640 1579 1437 +63640 1699 1884 +63640 1549 1525 +63640 1669 1754 +63640 1489 1498 +63640 1829 1886 +63640 1600 1825 +63640 1740 1863 +63640 1678 1813 +63640 1650 1668 +63660 1579 1437 +63660 1651 1906 +63660 1699 1884 +63660 1857 1901 +63660 1871 1517 +63660 1549 1525 +63660 1669 1754 +63660 1489 1498 +63660 1841 1901 +63660 1829 1886 +63660 1600 1825 +63660 1740 1863 +63660 1678 1813 +63660 1650 1668 +63680 1547 1816 +63680 1549 1525 +63680 1617 1694 +63680 1669 1754 +63680 1816 1823 +63680 1489 1498 +63680 1841 1901 +63680 1829 1886 +63680 1600 1825 +63680 1740 1863 +63680 1678 1813 +63680 1650 1668 +63700 1796 1816 +63700 1841 1901 +63700 1599 1512 +63700 1600 1519 +63700 1651 1742 +63700 1699 1884 +63700 1829 1886 +63700 1600 1825 +63700 1740 1863 +63700 1871 1517 +63700 1678 1813 +63700 1650 1668 +63720 1599 1512 +63720 1600 1519 +63720 1650 1463 +63720 1651 1742 +63720 1699 1884 +63720 1816 1823 +63720 1829 1886 +63720 1600 1825 +63720 1617 1694 +63720 1740 1863 +63720 1549 1525 +63720 1871 1517 +63720 1678 1813 +63720 1650 1668 +63740 1651 1742 +63740 1699 1884 +63740 1718 1819 +63740 1796 1823 +63740 1816 1823 +63740 1721 1816 +63740 1796 1816 +63740 1829 1886 +63740 1600 1825 +63740 1602 1779 +63740 1617 1694 +63740 1740 1863 +63740 1549 1525 +63740 1871 1517 +63740 1678 1813 +63740 1650 1668 +63760 1715 1718 +63760 1717 1718 +63760 1721 1816 +63760 1767 1840 +63760 1796 1816 +63760 1811 1876 +63760 1829 1886 +63760 1600 1825 +63760 1602 1779 +63760 1617 1694 +63760 1740 1863 +63760 1549 1525 +63760 1841 1901 +63760 1593 1787 +63760 1600 1519 +63760 1871 1517 +63760 1678 1813 +63760 1650 1668 +63780 1600 1825 +63780 1602 1779 +63780 1617 1694 +63780 1740 1863 +63780 1533 1535 +63780 1549 1525 +63780 1841 1901 +63780 1599 1512 +63780 1816 1823 +63780 1593 1787 +63780 1699 1884 +63780 1600 1519 +63780 1587 1535 +63780 1871 1517 +63780 1678 1813 +63780 1650 1668 +63800 1549 1525 +63800 1811 1819 +63800 1811 1876 +63800 1819 1851 +63800 1841 1901 +63800 1599 1512 +63800 1816 1823 +63800 1593 1787 +63800 1699 1884 +63800 1721 1816 +63800 1767 1840 +63800 1600 1519 +63800 1587 1535 +63800 1871 1517 +63800 1678 1813 +63800 1650 1668 +63820 1547 1716 +63820 1599 1512 +63820 1617 1694 +63820 1816 1823 +63820 1593 1787 +63820 1699 1884 +63820 1721 1816 +63820 1767 1840 +63820 1489 1498 +63820 1600 1519 +63820 1587 1535 +63820 1871 1517 +63820 1678 1813 +63820 1650 1668 +63840 1593 1787 +63840 1651 1742 +63840 1721 1881 +63840 1740 1863 +63840 1857 1901 +63840 1563 1592 +63840 1699 1884 +63840 1721 1816 +63840 1767 1840 +63840 1811 1876 +63840 1819 1913 +63840 1489 1498 +63840 1600 1519 +63840 1587 1535 +63840 1871 1517 +63840 1678 1813 +63840 1650 1668 +63860 1563 1592 +63860 1699 1884 +63860 1721 1816 +63860 1767 1840 +63860 1811 1876 +63860 1819 1913 +63860 1841 1901 +63860 1489 1498 +63860 1600 1519 +63860 1587 1535 +63860 1871 1517 +63860 1678 1813 +63860 1650 1668 +63880 1547 1716 +63880 1600 1519 +63880 1665 1688 +63880 1718 1816 +63880 1718 1441 +63880 1857 1441 +63880 1587 1535 +63880 1871 1517 +63880 1678 1813 +63880 1650 1668 +63900 1563 1441 +63900 1651 1742 +63900 1721 1816 +63900 1740 1863 +63900 1811 1876 +63900 1825 1519 +63900 1857 1441 +63900 1549 1525 +63900 1587 1535 +63900 1816 1881 +63900 1489 1498 +63900 1871 1517 +63900 1678 1813 +63900 1650 1668 +63920 1549 1525 +63920 1587 1535 +63920 1598 1659 +63920 1598 1718 +63920 1715 1717 +63920 1767 1840 +63920 1816 1881 +63920 1825 1884 +63920 1563 1678 +63920 1563 1813 +63920 1819 1913 +63920 1489 1498 +63920 1871 1517 +63920 1547 1716 +63920 1678 1813 +63920 1650 1668 +63940 1563 1678 +63940 1563 1813 +63940 1593 1787 +63940 1819 1913 +63940 1857 1441 +63940 1489 1498 +63940 1871 1517 +63940 1547 1716 +63940 1678 1813 +63940 1598 1876 +63940 1650 1668 +63960 1563 1813 +63960 1587 1535 +63960 1593 1787 +63960 1699 1437 +63960 1819 1913 +63960 1857 1441 +63960 1489 1498 +63960 1841 1901 +63960 1651 1742 +63960 1598 1811 +63960 1811 1876 +63960 1871 1517 +63960 1547 1716 +63960 1678 1813 +63960 1598 1876 +63960 1650 1668 +63980 1767 1840 +63980 1796 1816 +63980 1489 1498 +63980 1841 1901 +63980 1549 1525 +63980 1651 1742 +63980 1598 1811 +63980 1811 1876 +63980 1871 1517 +63980 1547 1716 +63980 1678 1813 +63980 1598 1876 +63980 1650 1668 +64000 1825 1519 +64000 1841 1901 +64000 1549 1525 +64000 1651 1742 +64000 1598 1811 +64000 1811 1876 +64000 1871 1517 +64000 1547 1716 +64000 1678 1813 +64000 1598 1876 +64000 1650 1668 +64020 1549 1525 +64020 1597 1622 +64020 1651 1742 +64020 1819 1913 +64020 1877 1908 +64020 1593 1787 +64020 1598 1811 +64020 1811 1876 +64020 1871 1517 +64020 1721 1796 +64020 1740 1863 +64020 1816 1881 +64020 1547 1716 +64020 1796 1816 +64020 1678 1813 +64020 1598 1876 +64020 1650 1668 +64040 1593 1787 +64040 1598 1811 +64040 1767 1840 +64040 1811 1876 +64040 1871 1517 +64040 1721 1796 +64040 1740 1863 +64040 1816 1881 +64040 1547 1716 +64040 1796 1816 +64040 1678 1813 +64040 1598 1876 +64040 1650 1668 +64060 1689 1817 +64060 1721 1796 +64060 1740 1863 +64060 1816 1881 +64060 1501 1528 +64060 1651 1742 +64060 1547 1716 +64060 1796 1816 +64060 1549 1525 +64060 1678 1813 +64060 1598 1876 +64060 1650 1668 +64080 1651 1742 +64080 1669 1754 +64080 1617 1441 +64080 1547 1716 +64080 1811 1876 +64080 1598 1811 +64080 1767 1840 +64080 1796 1816 +64080 1549 1525 +64080 1678 1813 +64080 1598 1876 +64080 1650 1668 +64100 1598 1920 +64100 1617 1441 +64100 1877 1908 +64100 1547 1716 +64100 1740 1863 +64100 1811 1876 +64100 1819 1913 +64100 1598 1811 +64100 1489 1498 +64100 1767 1840 +64100 1796 1816 +64100 1549 1525 +64100 1678 1813 +64100 1598 1876 +64100 1650 1668 +64120 1547 1716 +64120 1740 1863 +64120 1811 1876 +64120 1817 1819 +64120 1819 1913 +64120 1598 1811 +64120 1489 1498 +64120 1767 1840 +64120 1796 1816 +64120 1549 1525 +64120 1678 1813 +64120 1598 1876 +64120 1650 1668 +64140 1598 1811 +64140 1617 1857 +64140 1617 1441 +64140 1721 1816 +64140 1821 1898 +64140 1489 1498 +64140 1767 1840 +64140 1857 1441 +64140 1796 1816 +64140 1549 1525 +64140 1678 1813 +64140 1598 1876 +64140 1650 1668 +64160 1598 1918 +64160 1721 1796 +64160 1489 1498 +64160 1547 1716 +64160 1811 1876 +64160 1767 1840 +64160 1857 1441 +64160 1796 1816 +64160 1549 1525 +64160 1678 1813 +64160 1598 1876 +64160 1650 1668 +64180 1613 1526 +64180 1716 1808 +64180 1721 1816 +64180 1740 1863 +64180 1819 1913 +64180 1823 1881 +64180 1489 1498 +64180 1547 1716 +64180 1796 1881 +64180 1811 1876 +64180 1877 1908 +64180 1767 1840 +64180 1857 1441 +64180 1796 1816 +64180 1549 1525 +64180 1678 1813 +64180 1598 1876 +64180 1547 1808 +64180 1650 1668 +64200 1819 1920 +64200 1840 1489 +64200 1924 1478 +64200 1547 1716 +64200 1796 1881 +64200 1811 1876 +64200 1877 1908 +64200 1767 1840 +64200 1857 1441 +64200 1669 1754 +64200 1721 1796 +64200 1796 1816 +64200 1549 1525 +64200 1678 1813 +64200 1598 1876 +64200 1547 1808 +64200 1650 1668 +64220 1547 1716 +64220 1598 1811 +64220 1598 1819 +64220 1613 1526 +64220 1796 1881 +64220 1811 1876 +64220 1877 1908 +64220 1767 1840 +64220 1857 1441 +64220 1669 1754 +64220 1721 1796 +64220 1796 1816 +64220 1549 1525 +64220 1678 1813 +64220 1716 1808 +64220 1598 1876 +64220 1547 1808 +64220 1650 1668 +64240 1592 1717 +64240 1598 1920 +64240 1651 1742 +64240 1924 1478 +64240 1767 1840 +64240 1857 1441 +64240 1669 1754 +64240 1721 1796 +64240 1796 1816 +64240 1549 1525 +64240 1678 1813 +64240 1489 1498 +64240 1716 1808 +64240 1598 1876 +64240 1547 1808 +64240 1650 1668 +64260 1598 1811 +64260 1721 1816 +64260 1767 1840 +64260 1857 1441 +64260 1913 1918 +64260 1669 1754 +64260 1721 1796 +64260 1796 1816 +64260 1796 1881 +64260 1549 1525 +64260 1678 1813 +64260 1489 1498 +64260 1716 1808 +64260 1598 1876 +64260 1547 1808 +64260 1650 1668 +64280 1548 1606 +64280 1655 1819 +64280 1811 1876 +64280 1924 1478 +64280 1669 1754 +64280 1721 1796 +64280 1796 1816 +64280 1796 1881 +64280 1549 1525 +64280 1547 1716 +64280 1678 1813 +64280 1489 1498 +64280 1716 1808 +64280 1598 1876 +64280 1547 1808 +64280 1617 1857 +64280 1650 1668 +64300 1617 1441 +64300 1669 1754 +64300 1767 1840 +64300 1857 1441 +64300 1920 1463 +64300 1721 1796 +64300 1796 1816 +64300 1796 1881 +64300 1816 1823 +64300 1549 1525 +64300 1547 1716 +64300 1592 1717 +64300 1678 1813 +64300 1489 1498 +64300 1716 1808 +64300 1598 1876 +64300 1547 1808 +64300 1617 1857 +64300 1650 1668 +64320 1599 1655 +64320 1721 1796 +64320 1767 1489 +64320 1796 1816 +64320 1796 1881 +64320 1816 1823 +64320 1840 1498 +64320 1913 1920 +64320 1549 1525 +64320 1598 1811 +64320 1466 1467 +64320 1547 1716 +64320 1592 1717 +64320 1678 1813 +64320 1840 1489 +64320 1489 1498 +64320 1716 1808 +64320 1598 1876 +64320 1547 1808 +64320 1617 1857 +64320 1650 1668 +64340 1548 1606 +64340 1549 1525 +64340 1598 1811 +64340 1718 1466 +64340 1740 1863 +64340 1811 1876 +64340 1466 1467 +64340 1547 1716 +64340 1592 1717 +64340 1678 1813 +64340 1840 1489 +64340 1489 1498 +64340 1587 1535 +64340 1716 1808 +64340 1884 1920 +64340 1598 1876 +64340 1547 1808 +64340 1617 1857 +64340 1650 1668 +64360 1547 1716 +64360 1592 1717 +64360 1599 1655 +64360 1602 1779 +64360 1678 1813 +64360 1816 1881 +64360 1840 1489 +64360 1467 1535 +64360 1489 1498 +64360 1587 1535 +64360 1716 1808 +64360 1884 1920 +64360 1598 1876 +64360 1547 1808 +64360 1617 1857 +64360 1650 1668 +64380 1549 1525 +64380 1587 1535 +64380 1669 1754 +64380 1721 1816 +64380 1767 1840 +64380 1841 1901 +64380 1716 1808 +64380 1740 1863 +64380 1884 1920 +64380 1628 1463 +64380 1816 1823 +64380 1598 1811 +64380 1598 1876 +64380 1547 1808 +64380 1617 1857 +64380 1811 1876 +64380 1884 1453 +64380 1650 1668 +64400 1689 1825 +64400 1689 1519 +64400 1703 1901 +64400 1716 1808 +64400 1740 1863 +64400 1796 1816 +64400 1884 1920 +64400 1920 1453 +64400 1628 1463 +64400 1816 1823 +64400 1598 1811 +64400 1598 1876 +64400 1599 1512 +64400 1547 1808 +64400 1617 1857 +64400 1811 1876 +64400 1547 1716 +64400 1602 1779 +64400 1884 1453 +64400 1650 1668 +64420 1598 1920 +64420 1628 1463 +64420 1721 1796 +64420 1816 1823 +64420 1841 1901 +64420 1876 1920 +64420 1924 1478 +64420 1598 1811 +64420 1598 1876 +64420 1599 1512 +64420 1669 1754 +64420 1547 1808 +64420 1617 1857 +64420 1811 1876 +64420 1547 1716 +64420 1602 1779 +64420 1655 1512 +64420 1884 1453 +64420 1592 1717 +64420 1650 1668 +64440 1598 1811 +64440 1598 1876 +64440 1599 1512 +64440 1669 1754 +64440 1718 1893 +64440 1547 1808 +64440 1617 1857 +64440 1716 1808 +64440 1796 1816 +64440 1811 1876 +64440 1547 1716 +64440 1602 1779 +64440 1655 1512 +64440 1884 1453 +64440 1592 1717 +64440 1650 1668 +64460 1547 1808 +64460 1587 1535 +64460 1617 1857 +64460 1716 1808 +64460 1721 1816 +64460 1796 1816 +64460 1796 1881 +64460 1811 1876 +64460 1816 1823 +64460 1547 1716 +64460 1602 1779 +64460 1655 1512 +64460 1816 1881 +64460 1884 1453 +64460 1924 1478 +64460 1650 1463 +64460 1841 1901 +64460 1489 1498 +64460 1592 1717 +64460 1650 1668 +64480 1547 1716 +64480 1599 1512 +64480 1602 1779 +64480 1655 1512 +64480 1668 1463 +64480 1816 1881 +64480 1825 1890 +64480 1884 1453 +64480 1924 1478 +64480 1600 1825 +64480 1650 1463 +64480 1841 1901 +64480 1489 1498 +64480 1890 1525 +64480 1592 1717 +64480 1650 1668 +64500 1600 1825 +64500 1613 1526 +64500 1650 1463 +64500 1841 1901 +64500 1489 1498 +64500 1877 1908 +64500 1890 1525 +64500 1592 1717 +64500 1650 1668 +64520 1549 1525 +64520 1617 1857 +64520 1841 1901 +64520 1489 1498 +64520 1602 1779 +64520 1718 1818 +64520 1811 1876 +64520 1877 1908 +64520 1599 1512 +64520 1549 1890 +64520 1890 1525 +64520 1716 1808 +64520 1592 1717 +64520 1650 1668 +64540 1602 1779 +64540 1718 1818 +64540 1811 1876 +64540 1877 1908 +64540 1599 1512 +64540 1599 1655 +64540 1549 1890 +64540 1767 1840 +64540 1890 1525 +64540 1716 1808 +64540 1587 1535 +64540 1592 1717 +64540 1650 1668 +64560 1549 1525 +64560 1599 1512 +64560 1599 1655 +64560 1617 1857 +64560 1655 1512 +64560 1549 1890 +64560 1767 1840 +64560 1890 1525 +64560 1754 1459 +64560 1716 1808 +64560 1587 1535 +64560 1592 1717 +64560 1650 1668 +64580 1841 1901 +64580 1898 1477 +64580 1549 1890 +64580 1767 1840 +64580 1876 1437 +64580 1884 1453 +64580 1890 1525 +64580 1754 1459 +64580 1811 1876 +64580 1716 1808 +64580 1587 1535 +64580 1592 1717 +64580 1598 1713 +64580 1650 1668 +64600 1549 1890 +64600 1600 1890 +64600 1655 1512 +64600 1767 1840 +64600 1876 1437 +64600 1884 1453 +64600 1890 1525 +64600 1890 1453 +64600 1599 1655 +64600 1617 1857 +64600 1754 1459 +64600 1811 1876 +64600 1544 1600 +64600 1716 1808 +64600 1587 1535 +64600 1592 1717 +64600 1598 1713 +64600 1650 1668 +64620 1549 1525 +64620 1599 1655 +64620 1617 1857 +64620 1703 1890 +64620 1754 1459 +64620 1740 1863 +64620 1811 1876 +64620 1544 1600 +64620 1716 1808 +64620 1587 1535 +64620 1592 1717 +64620 1598 1713 +64620 1650 1668 +64640 1549 1890 +64640 1563 1675 +64640 1617 1684 +64640 1684 1439 +64640 1740 1863 +64640 1811 1876 +64640 1857 1441 +64640 1890 1525 +64640 1544 1600 +64640 1876 1437 +64640 1767 1840 +64640 1635 1717 +64640 1669 1754 +64640 1684 1441 +64640 1716 1808 +64640 1587 1535 +64640 1684 1857 +64640 1592 1717 +64640 1598 1713 +64640 1650 1668 +64660 1544 1600 +64660 1599 1655 +64660 1821 1477 +64660 1876 1437 +64660 1767 1840 +64660 1635 1717 +64660 1669 1754 +64660 1684 1441 +64660 1716 1808 +64660 1587 1535 +64660 1684 1857 +64660 1592 1717 +64660 1598 1713 +64660 1650 1668 +64680 1593 1851 +64680 1767 1840 +64680 1841 1901 +64680 1547 1808 +64680 1635 1717 +64680 1669 1754 +64680 1684 1441 +64680 1716 1808 +64680 1787 1851 +64680 1553 1890 +64680 1547 1716 +64680 1587 1535 +64680 1684 1857 +64680 1740 1863 +64680 1592 1717 +64680 1598 1713 +64680 1650 1668 +64700 1547 1808 +64700 1617 1857 +64700 1617 1684 +64700 1617 1441 +64700 1635 1717 +64700 1650 1463 +64700 1668 1463 +64700 1669 1754 +64700 1684 1441 +64700 1716 1808 +64700 1787 1851 +64700 1857 1441 +64700 1884 1453 +64700 1553 1890 +64700 1547 1716 +64700 1587 1535 +64700 1598 1920 +64700 1684 1857 +64700 1740 1863 +64700 1563 1675 +64700 1684 1876 +64700 1876 1441 +64700 1592 1717 +64700 1617 1876 +64700 1598 1713 +64700 1857 1876 +64700 1650 1668 +64720 1553 1890 +64720 1628 1463 +64720 1767 1840 +64720 1547 1716 +64720 1549 1525 +64720 1587 1535 +64720 1598 1920 +64720 1684 1857 +64720 1740 1863 +64720 1563 1675 +64720 1684 1876 +64720 1876 1441 +64720 1592 1717 +64720 1617 1876 +64720 1598 1713 +64720 1857 1876 +64720 1650 1668 +64740 1547 1716 +64740 1549 1525 +64740 1587 1535 +64740 1598 1920 +64740 1600 1453 +64740 1650 1463 +64740 1668 1463 +64740 1684 1857 +64740 1740 1863 +64740 1884 1453 +64740 1563 1811 +64740 1563 1675 +64740 1684 1876 +64740 1857 1441 +64740 1876 1441 +64740 1592 1717 +64740 1617 1876 +64740 1669 1754 +64740 1598 1713 +64740 1857 1876 +64740 1650 1668 +64760 1563 1811 +64760 1563 1675 +64760 1597 1622 +64760 1617 1441 +64760 1617 1684 +64760 1628 1463 +64760 1877 1908 +64760 1890 1525 +64760 1684 1441 +64760 1684 1876 +64760 1857 1441 +64760 1876 1441 +64760 1592 1717 +64760 1617 1876 +64760 1669 1754 +64760 1598 1713 +64760 1857 1876 +64760 1840 1437 +64760 1650 1668 +64780 1563 1678 +64780 1583 1825 +64780 1628 1650 +64780 1628 1668 +64780 1684 1441 +64780 1684 1876 +64780 1825 1525 +64780 1857 1441 +64780 1876 1441 +64780 1592 1717 +64780 1599 1655 +64780 1617 1876 +64780 1669 1754 +64780 1598 1713 +64780 1857 1876 +64780 1555 1441 +64780 1840 1437 +64780 1549 1890 +64780 1650 1668 +64800 1592 1717 +64800 1593 1512 +64800 1599 1512 +64800 1599 1655 +64800 1617 1876 +64800 1628 1463 +64800 1669 1754 +64800 1727 1894 +64800 1501 1528 +64800 1598 1713 +64800 1811 1857 +64800 1857 1876 +64800 1555 1441 +64800 1587 1535 +64800 1840 1437 +64800 1549 1890 +64800 1884 1453 +64800 1811 1876 +64800 1650 1668 +64820 1598 1713 +64820 1628 1650 +64820 1718 1517 +64820 1811 1857 +64820 1857 1876 +64820 1890 1525 +64820 1924 1478 +64820 1555 1441 +64820 1587 1535 +64820 1617 1857 +64820 1840 1437 +64820 1547 1716 +64820 1549 1890 +64820 1884 1453 +64820 1811 1876 +64820 1857 1441 +64820 1650 1668 +64840 1544 1600 +64840 1563 1717 +64840 1555 1441 +64840 1555 1857 +64840 1587 1535 +64840 1617 1857 +64840 1840 1437 +64840 1547 1716 +64840 1549 1890 +64840 1884 1453 +64840 1811 1876 +64840 1857 1441 +64840 1650 1668 +64860 1538 1459 +64860 1555 1441 +64860 1555 1857 +64860 1569 1591 +64860 1587 1535 +64860 1628 1650 +64860 1877 1908 +64860 1563 1592 +64860 1617 1857 +64860 1840 1437 +64860 1547 1716 +64860 1549 1890 +64860 1884 1453 +64860 1811 1876 +64860 1857 1441 +64860 1650 1668 +64880 1563 1592 +64880 1617 1441 +64880 1617 1857 +64880 1840 1437 +64880 1501 1528 +64880 1547 1716 +64880 1549 1890 +64880 1598 1713 +64880 1884 1453 +64880 1811 1876 +64880 1857 1441 +64880 1650 1668 +64900 1544 1549 +64900 1547 1716 +64900 1549 1890 +64900 1598 1713 +64900 1884 1453 +64900 1811 1876 +64900 1547 1555 +64900 1857 1441 +64900 1650 1668 +64920 1549 1600 +64920 1617 1857 +64920 1630 1531 +64920 1811 1876 +64920 1547 1555 +64920 1544 1600 +64920 1587 1535 +64920 1857 1441 +64920 1924 1478 +64920 1650 1668 +64940 1547 1555 +64940 1551 1894 +64940 1669 1754 +64940 1501 1528 +64940 1544 1600 +64940 1551 1269 +64940 1587 1535 +64940 1598 1713 +64940 1787 1851 +64940 1857 1441 +64940 1890 1525 +64940 1599 1512 +64940 1924 1478 +64940 1841 1901 +64940 1884 1453 +64940 1617 1441 +64940 1650 1668 +64960 1544 1600 +64960 1551 1269 +64960 1555 1716 +64960 1587 1535 +64960 1598 1713 +64960 1599 1655 +64960 1605 1636 +64960 1617 1857 +64960 1787 1851 +64960 1840 1437 +64960 1857 1441 +64960 1890 1525 +64960 1549 1890 +64960 1599 1512 +64960 1924 1478 +64960 1841 1901 +64960 1884 1453 +64960 1547 1716 +64960 1617 1441 +64960 1650 1668 +64980 1544 1549 +64980 1549 1890 +64980 1590 1894 +64980 1599 1512 +64980 1602 1779 +64980 1924 1478 +64980 1600 1890 +64980 1538 1459 +64980 1549 1600 +64980 1544 1890 +64980 1841 1901 +64980 1884 1453 +64980 1547 1716 +64980 1617 1441 +64980 1650 1668 +65000 1544 1600 +65000 1587 1535 +65000 1600 1890 +65000 1605 1659 +65000 1787 1851 +65000 1538 1459 +65000 1547 1555 +65000 1549 1600 +65000 1555 1716 +65000 1605 1636 +65000 1669 1754 +65000 1544 1890 +65000 1841 1901 +65000 1884 1453 +65000 1547 1716 +65000 1617 1857 +65000 1617 1441 +65000 1650 1668 +65020 1538 1459 +65020 1547 1555 +65020 1549 1600 +65020 1555 1716 +65020 1598 1713 +65020 1599 1655 +65020 1605 1636 +65020 1669 1754 +65020 1857 1441 +65020 1544 1890 +65020 1841 1901 +65020 1884 1453 +65020 1547 1716 +65020 1669 1840 +65020 1617 1857 +65020 1617 1441 +65020 1650 1668 +65040 1549 1525 +65040 1544 1890 +65040 1821 1477 +65040 1841 1901 +65040 1884 1453 +65040 1547 1716 +65040 1669 1840 +65040 1617 1857 +65040 1617 1441 +65040 1650 1668 +65060 1544 1825 +65060 1544 1890 +65060 1549 1890 +65060 1555 1716 +65060 1600 1890 +65060 1605 1636 +65060 1767 1913 +65060 1821 1477 +65060 1841 1901 +65060 1884 1453 +65060 1547 1716 +65060 1669 1840 +65060 1825 1890 +65060 1617 1857 +65060 1617 1441 +65060 1650 1668 +65080 1825 1459 +65080 1890 1459 +65080 1538 1825 +65080 1538 1890 +65080 1547 1716 +65080 1669 1840 +65080 1825 1890 +65080 1549 1525 +65080 1617 1857 +65080 1617 1441 +65080 1650 1668 +65100 1538 1825 +65100 1538 1890 +65100 1547 1716 +65100 1593 1449 +65100 1669 1840 +65100 1825 1890 +65100 1549 1525 +65100 1555 1716 +65100 1617 1857 +65100 1617 1441 +65100 1884 1453 +65100 1650 1668 +65120 1549 1525 +65120 1555 1716 +65120 1605 1659 +65120 1821 1477 +65120 1829 1886 +65120 1825 1459 +65120 1924 1478 +65120 1617 1857 +65120 1617 1441 +65120 1549 1890 +65120 1884 1453 +65120 1650 1668 +65140 1538 1825 +65140 1628 1650 +65140 1628 1924 +65140 1825 1459 +65140 1924 1478 +65140 1617 1857 +65140 1669 1754 +65140 1890 1525 +65140 1617 1441 +65140 1669 1840 +65140 1549 1890 +65140 1754 1840 +65140 1884 1453 +65140 1650 1668 +65160 1605 1636 +65160 1617 1857 +65160 1669 1754 +65160 1890 1525 +65160 1549 1525 +65160 1617 1441 +65160 1669 1840 +65160 1544 1600 +65160 1549 1890 +65160 1754 1840 +65160 1884 1453 +65160 1650 1668 +65160 1592 1717 +65160 1547 1716 +65180 1549 1525 +65180 1617 1441 +65180 1649 1887 +65180 1669 1840 +65180 1857 1441 +65180 1544 1600 +65180 1549 1890 +65180 1754 1840 +65180 1884 1453 +65180 1650 1668 +65180 1592 1717 +65180 1547 1716 +65200 1544 1600 +65200 1549 1890 +65200 1628 1650 +65200 1628 1668 +65200 1821 1477 +65200 1754 1840 +65200 1884 1453 +65200 1617 1857 +65200 1650 1668 +65200 1592 1717 +65200 1547 1716 +65220 1544 1600 +65220 1544 1825 +65220 1549 1890 +65220 1600 1825 +65220 1628 1650 +65220 1628 1668 +65220 1669 1840 +65220 1740 1918 +65220 1811 1876 +65220 1890 1525 +65220 1821 1477 +65220 1754 1840 +65220 1884 1453 +65220 1549 1525 +65220 1617 1857 +65220 1650 1668 +65220 1592 1717 +65220 1547 1716 +65240 1587 1535 +65240 1628 1767 +65240 1767 1840 +65240 1821 1477 +65240 1825 1890 +65240 1754 1840 +65240 1884 1453 +65240 1549 1525 +65240 1600 1890 +65240 1617 1857 +65240 1650 1668 +65240 1592 1717 +65240 1547 1716 +65260 1754 1840 +65260 1884 1453 +65260 1549 1525 +65260 1605 1636 +65260 1600 1825 +65260 1600 1890 +65260 1617 1441 +65260 1617 1857 +65260 1650 1668 +65260 1857 1441 +65260 1592 1717 +65260 1547 1716 +65280 1549 1525 +65280 1605 1636 +65280 1669 1754 +65280 1600 1825 +65280 1600 1890 +65280 1617 1441 +65280 1890 1453 +65280 1617 1857 +65280 1767 1840 +65280 1825 1890 +65280 1650 1668 +65280 1857 1441 +65280 1592 1717 +65280 1547 1716 +65300 1600 1825 +65300 1600 1890 +65300 1600 1453 +65300 1617 1441 +65300 1884 1890 +65300 1890 1453 +65300 1617 1857 +65300 1767 1840 +65300 1600 1884 +65300 1825 1890 +65300 1650 1668 +65300 1857 1441 +65300 1592 1717 +65300 1547 1716 +65320 1549 1525 +65320 1626 1920 +65320 1605 1636 +65320 1617 1857 +65320 1767 1840 +65320 1600 1884 +65320 1825 1890 +65320 1650 1668 +65320 1857 1441 +65320 1592 1717 +65320 1547 1716 +65340 1600 1890 +65340 1605 1636 +65340 1617 1857 +65340 1825 1884 +65340 1538 1512 +65340 1767 1840 +65340 1600 1884 +65340 1841 1901 +65340 1825 1890 +65340 1650 1668 +65340 1857 1441 +65340 1439 1453 +65340 1592 1717 +65340 1547 1716 +65360 1538 1512 +65360 1549 1525 +65360 1617 1441 +65360 1660 1924 +65360 1767 1840 +65360 1825 1519 +65360 1890 1519 +65360 1924 1478 +65360 1600 1884 +65360 1628 1650 +65360 1628 1668 +65360 1841 1901 +65360 1825 1890 +65360 1650 1668 +65360 1857 1441 +65360 1439 1453 +65360 1592 1717 +65360 1547 1716 +65380 1600 1884 +65380 1617 1857 +65380 1628 1650 +65380 1628 1668 +65380 1628 1655 +65380 1819 1845 +65380 1841 1901 +65380 1554 1887 +65380 1650 1655 +65380 1825 1890 +65380 1605 1636 +65380 1626 1920 +65380 1650 1668 +65380 1655 1668 +65380 1669 1840 +65380 1857 1441 +65380 1439 1453 +65380 1592 1717 +65380 1547 1716 +65400 1554 1887 +65400 1650 1655 +65400 1825 1890 +65400 1605 1636 +65400 1626 1920 +65400 1650 1668 +65400 1655 1668 +65400 1669 1840 +65400 1857 1441 +65400 1617 1767 +65400 1439 1453 +65400 1592 1717 +65400 1547 1716 +65400 1549 1525 +65420 1553 1924 +65420 1605 1636 +65420 1626 1920 +65420 1650 1668 +65420 1655 1668 +65420 1669 1840 +65420 1754 1840 +65420 1857 1441 +65420 1617 1767 +65420 1439 1453 +65420 1592 1717 +65420 1547 1716 +65420 1549 1525 +65440 1600 1890 +65440 1600 1884 +65440 1857 1441 +65440 1617 1767 +65440 1439 1453 +65440 1592 1717 +65440 1547 1716 +65440 1549 1525 +65460 1553 1924 +65460 1563 1857 +65460 1617 1767 +65460 1439 1453 +65460 1669 1840 +65460 1825 1890 +65460 1592 1717 +65460 1547 1716 +65460 1549 1525 +65480 1605 1636 +65480 1857 1441 +65480 1884 1890 +65480 1669 1840 +65480 1825 1890 +65480 1825 1884 +65480 1924 1478 +65480 1592 1717 +65480 1547 1716 +65480 1549 1525 +65500 1655 1774 +65500 1857 1441 +65500 1884 1890 +65500 1485 1532 +65500 1669 1840 +65500 1825 1890 +65500 1754 1840 +65500 1825 1884 +65500 1924 1478 +65500 1592 1717 +65500 1547 1716 +65500 1549 1525 +65500 1617 1767 +65520 1669 1840 +65520 1825 1890 +65520 1754 1840 +65520 1617 1441 +65520 1767 1441 +65520 1825 1884 +65520 1924 1478 +65520 1592 1717 +65520 1547 1716 +65520 1549 1525 +65520 1617 1767 +65540 1655 1774 +65540 1754 1840 +65540 1884 1890 +65540 1617 1441 +65540 1767 1441 +65540 1825 1884 +65540 1924 1478 +65540 1592 1717 +65540 1547 1716 +65540 1549 1525 +65540 1617 1767 +65560 1605 1636 +65560 1617 1441 +65560 1767 1441 +65560 1520 1531 +65560 1857 1441 +65560 1825 1884 +65560 1924 1478 +65560 1592 1717 +65560 1547 1716 +65560 1549 1525 +65560 1617 1767 +65580 1825 1890 +65580 1857 1441 +65580 1669 1840 +65580 1825 1884 +65580 1924 1478 +65580 1592 1717 +65580 1547 1716 +65580 1549 1525 +65580 1617 1767 +65600 1669 1840 +65600 1749 1531 +65600 1749 1757 +65600 1825 1884 +65600 1924 1478 +65600 1592 1717 +65600 1547 1716 +65600 1549 1525 +65600 1617 1767 +65620 1563 1839 +65620 1825 1890 +65620 1592 1717 +65620 1547 1716 +65620 1549 1525 +65620 1617 1767 +65640 1569 1591 +65640 1669 1840 +65640 1825 1890 +65640 1592 1717 +65640 1547 1716 +65640 1924 1478 +65640 1549 1525 +65640 1617 1767 +65660 1592 1684 +65660 1669 1840 +65660 1684 1463 +65660 1825 1890 +65660 1592 1717 +65660 1547 1716 +65660 1924 1478 +65660 1549 1525 +65660 1617 1767 +65680 1553 1924 +65680 1845 1894 +65680 1427 1467 +65680 1575 1679 +65680 1684 1463 +65680 1787 1851 +65680 1857 1441 +65680 1825 1890 +65680 1592 1717 +65680 1547 1634 +65680 1547 1716 +65680 1924 1478 +65680 1549 1525 +65680 1617 1767 +65700 1575 1679 +65700 1684 1463 +65700 1787 1851 +65700 1857 1441 +65700 1825 1890 +65700 1592 1717 +65700 1547 1634 +65700 1547 1716 +65700 1924 1478 +65700 1549 1525 +65700 1617 1767 +65720 1544 1890 +65720 1550 1866 +65720 1825 1890 +65720 1592 1717 +65720 1547 1634 +65720 1547 1716 +65720 1924 1478 +65720 1549 1525 +65720 1617 1767 +65740 1592 1717 +65740 1669 1754 +65740 1547 1634 +65740 1547 1716 +65740 1575 1679 +65740 1684 1463 +65740 1924 1478 +65740 1549 1525 +65740 1617 1767 +65740 1634 1716 +65740 1716 1808 +65760 1544 1890 +65760 1547 1808 +65760 1547 1634 +65760 1547 1716 +65760 1553 1924 +65760 1575 1679 +65760 1669 1840 +65760 1684 1463 +65760 1754 1840 +65760 1811 1876 +65760 1857 1441 +65760 1924 1478 +65760 1549 1525 +65760 1617 1767 +65760 1634 1716 +65760 1716 1808 +65780 1634 1808 +65780 1857 1441 +65780 1924 1478 +65780 1549 1525 +65780 1684 1717 +65780 1787 1851 +65780 1825 1890 +65780 1617 1767 +65780 1634 1716 +65780 1716 1808 +65800 1549 1525 +65800 1684 1717 +65800 1718 1908 +65800 1787 1851 +65800 1547 1717 +65800 1670 1908 +65800 1825 1890 +65800 1879 1512 +65800 1547 1684 +65800 1575 1679 +65800 1617 1767 +65800 1634 1716 +65800 1716 1808 +65820 1547 1717 +65820 1634 1808 +65820 1670 1908 +65820 1811 1913 +65820 1825 1890 +65820 1879 1512 +65820 1924 1478 +65820 1547 1684 +65820 1575 1679 +65820 1617 1767 +65820 1634 1716 +65820 1716 1808 +65840 1628 1463 +65840 1754 1840 +65840 1764 1463 +65840 1924 1478 +65840 1544 1890 +65840 1547 1684 +65840 1575 1679 +65840 1617 1767 +65840 1811 1876 +65840 1634 1716 +65840 1716 1808 +65860 1655 1512 +65860 1898 1477 +65860 1544 1825 +65860 1544 1890 +65860 1547 1684 +65860 1549 1525 +65860 1575 1679 +65860 1669 1840 +65860 1825 1890 +65860 1617 1767 +65860 1811 1876 +65860 1634 1716 +65860 1716 1808 +65880 1544 1825 +65880 1544 1890 +65880 1547 1684 +65880 1549 1525 +65880 1575 1679 +65880 1612 1835 +65880 1669 1840 +65880 1754 1840 +65880 1764 1519 +65880 1825 1890 +65880 1617 1767 +65880 1811 1876 +65880 1634 1716 +65880 1716 1808 +65900 1617 1767 +65900 1670 1908 +65900 1821 1477 +65900 1811 1876 +65900 1547 1463 +65900 1634 1716 +65900 1716 1808 +65900 1634 1808 +65920 1605 1636 +65920 1684 1463 +65920 1718 1813 +65920 1811 1876 +65920 1547 1463 +65920 1547 1684 +65920 1634 1716 +65920 1716 1808 +65920 1634 1808 +65920 1544 1890 +65940 1547 1463 +65940 1575 1679 +65940 1655 1512 +65940 1547 1684 +65940 1634 1716 +65940 1716 1808 +65940 1634 1808 +65940 1669 1840 +65940 1617 1767 +65940 1544 1890 +65960 1547 1684 +65960 1563 1839 +65960 1599 1655 +65960 1634 1716 +65960 1716 1808 +65960 1634 1808 +65960 1669 1840 +65960 1684 1463 +65960 1617 1767 +65960 1544 1890 +65980 1605 1636 +65980 1634 1808 +65980 1669 1840 +65980 1684 1463 +65980 1821 1898 +65980 1617 1767 +65980 1544 1890 +66000 1634 1716 +66000 1716 1808 +66000 1825 1890 +66000 1924 1478 +66000 1440 1458 +66000 1617 1767 +66000 1544 1890 +66000 1593 1659 +66000 1628 1787 +66020 1575 1679 +66020 1605 1636 +66020 1617 1767 +66020 1787 1520 +66020 1811 1876 +66020 1544 1890 +66020 1593 1659 +66020 1628 1787 +66020 1549 1525 +66040 1544 1890 +66040 1593 1659 +66040 1727 1819 +66040 1501 1528 +66040 1628 1787 +66040 1549 1525 +66060 1575 1679 +66060 1591 1918 +66060 1617 1694 +66060 1841 1901 +66060 1628 1787 +66060 1549 1525 +66080 1617 1694 +66080 1841 1901 +66080 1485 1529 +66080 1924 1478 +66080 1593 1659 +66080 1628 1787 +66080 1549 1525 +66100 1553 1924 +66100 1599 1655 +66100 1605 1636 +66100 1655 1512 +66100 1924 1478 +66100 1593 1659 +66100 1754 1840 +66100 1617 1857 +66100 1628 1787 +66100 1694 1857 +66100 1549 1525 +66120 1605 1636 +66120 1655 1512 +66120 1677 1850 +66120 1701 1894 +66120 1924 1478 +66120 1593 1659 +66120 1754 1840 +66120 1544 1890 +66120 1617 1857 +66120 1628 1787 +66120 1694 1857 +66120 1549 1525 +66140 1593 1659 +66140 1754 1840 +66140 1544 1890 +66140 1617 1857 +66140 1628 1787 +66140 1677 1701 +66140 1694 1857 +66140 1811 1876 +66140 1553 1924 +66140 1549 1525 +66160 1544 1890 +66160 1617 1857 +66160 1628 1787 +66160 1677 1701 +66160 1694 1857 +66160 1787 1851 +66160 1811 1876 +66160 1924 1478 +66160 1553 1924 +66160 1549 1525 +66180 1553 1924 +66180 1634 1851 +66180 1754 1840 +66180 1605 1636 +66180 1884 1519 +66180 1549 1525 +66200 1605 1636 +66200 1884 1519 +66200 1811 1876 +66200 1857 1441 +66200 1544 1890 +66200 1549 1525 +66200 1593 1628 +66200 1617 1857 +66200 1694 1857 +66220 1553 1924 +66220 1554 1625 +66220 1669 1754 +66220 1734 1802 +66220 1811 1876 +66220 1841 1901 +66220 1575 1679 +66220 1857 1441 +66220 1898 1477 +66220 1544 1890 +66220 1549 1525 +66220 1593 1628 +66220 1754 1840 +66220 1924 1478 +66220 1617 1857 +66220 1694 1857 +66240 1563 1592 +66240 1575 1679 +66240 1605 1636 +66240 1787 1851 +66240 1857 1441 +66240 1898 1477 +66240 1544 1890 +66240 1544 1599 +66240 1599 1655 +66240 1549 1525 +66240 1593 1628 +66240 1716 1808 +66240 1754 1840 +66240 1924 1478 +66240 1599 1890 +66240 1617 1857 +66240 1694 1857 +66240 1655 1890 +66260 1544 1890 +66260 1544 1599 +66260 1553 1924 +66260 1599 1655 +66260 1694 1441 +66260 1549 1525 +66260 1593 1628 +66260 1669 1840 +66260 1716 1808 +66260 1754 1840 +66260 1924 1478 +66260 1599 1890 +66260 1617 1857 +66260 1694 1857 +66260 1655 1890 +66280 1549 1525 +66280 1575 1679 +66280 1593 1628 +66280 1669 1840 +66280 1857 1441 +66280 1716 1808 +66280 1754 1840 +66280 1811 1876 +66280 1924 1478 +66280 1563 1592 +66280 1599 1890 +66280 1617 1857 +66280 1694 1857 +66280 1655 1890 +66300 1603 1716 +66300 1716 1808 +66300 1716 1876 +66300 1754 1840 +66300 1811 1876 +66300 1617 1694 +66300 1924 1478 +66300 1544 1599 +66300 1563 1592 +66300 1599 1890 +66300 1617 1857 +66300 1694 1857 +66300 1655 1890 +66320 1544 1890 +66320 1593 1628 +66320 1617 1694 +66320 1635 1475 +66320 1924 1478 +66320 1544 1599 +66320 1599 1655 +66320 1857 1441 +66320 1563 1592 +66320 1599 1890 +66320 1617 1857 +66320 1694 1857 +66320 1655 1890 +66340 1541 1563 +66340 1544 1599 +66340 1599 1655 +66340 1716 1808 +66340 1829 1886 +66340 1857 1441 +66340 1544 1655 +66340 1563 1592 +66340 1599 1890 +66340 1617 1857 +66340 1694 1857 +66340 1655 1890 +66360 1886 1529 +66360 1501 1528 +66360 1754 1840 +66360 1857 1441 +66360 1924 1478 +66360 1544 1655 +66360 1563 1592 +66360 1599 1890 +66360 1617 1857 +66360 1694 1857 +66360 1655 1890 +66380 1549 1525 +66380 1553 1924 +66380 1603 1680 +66380 1605 1636 +66380 1747 1841 +66380 1617 1694 +66380 1754 1840 +66380 1857 1441 +66380 1924 1478 +66380 1544 1655 +66380 1563 1592 +66380 1599 1890 +66380 1617 1857 +66380 1694 1857 +66380 1655 1890 +66400 1617 1694 +66400 1754 1840 +66400 1857 1441 +66400 1901 1501 +66400 1924 1478 +66400 1544 1655 +66400 1563 1592 +66400 1599 1890 +66400 1617 1857 +66400 1694 1857 +66400 1655 1890 +66400 1541 1699 +66420 1544 1655 +66420 1563 1592 +66420 1599 1890 +66420 1605 1636 +66420 1669 1840 +66420 1617 1857 +66420 1694 1857 +66420 1655 1890 +66420 1541 1699 +66440 1684 1441 +66440 1563 1592 +66440 1599 1890 +66440 1598 1628 +66440 1605 1636 +66440 1669 1840 +66440 1617 1857 +66440 1694 1857 +66440 1655 1890 +66440 1541 1699 +66460 1553 1478 +66460 1563 1592 +66460 1598 1635 +66460 1603 1851 +66460 1617 1694 +66460 1630 1531 +66460 1857 1441 +66460 1439 1443 +66460 1754 1840 +66460 1924 1478 +66460 1603 1787 +66460 1669 1754 +66460 1680 1443 +66460 1599 1890 +66460 1598 1628 +66460 1605 1636 +66460 1669 1840 +66460 1617 1857 +66460 1694 1857 +66460 1655 1890 +66460 1541 1699 +66480 1575 1679 +66480 1754 1840 +66480 1829 1886 +66480 1884 1519 +66480 1924 1478 +66480 1603 1787 +66480 1669 1754 +66480 1680 1443 +66480 1716 1808 +66480 1593 1603 +66480 1599 1890 +66480 1544 1599 +66480 1598 1628 +66480 1605 1636 +66480 1669 1840 +66480 1617 1857 +66480 1694 1857 +66480 1655 1890 +66480 1541 1699 +66500 1548 1606 +66500 1599 1655 +66500 1603 1787 +66500 1669 1754 +66500 1680 1443 +66500 1684 1441 +66500 1703 1517 +66500 1716 1808 +66500 1716 1858 +66500 1593 1603 +66500 1599 1890 +66500 1544 1599 +66500 1598 1628 +66500 1605 1636 +66500 1617 1441 +66500 1669 1840 +66500 1617 1857 +66500 1694 1857 +66500 1655 1890 +66500 1541 1699 +66520 1544 1655 +66520 1593 1603 +66520 1617 1694 +66520 1829 1886 +66520 1877 1908 +66520 1924 1478 +66520 1857 1441 +66520 1599 1890 +66520 1886 1529 +66520 1544 1599 +66520 1549 1592 +66520 1598 1628 +66520 1694 1441 +66520 1605 1636 +66520 1617 1441 +66520 1669 1840 +66520 1617 1857 +66520 1694 1857 +66520 1655 1890 +66520 1541 1699 +66540 1857 1441 +66540 1599 1890 +66540 1886 1529 +66540 1886 1532 +66540 1544 1599 +66540 1599 1655 +66540 1549 1592 +66540 1576 1603 +66540 1680 1443 +66540 1598 1628 +66540 1694 1441 +66540 1605 1636 +66540 1617 1441 +66540 1669 1840 +66540 1617 1857 +66540 1694 1857 +66540 1655 1890 +66540 1541 1699 +66560 1599 1890 +66560 1716 1808 +66560 1886 1529 +66560 1886 1532 +66560 1544 1599 +66560 1599 1655 +66560 1924 1478 +66560 1549 1592 +66560 1754 1840 +66560 1576 1603 +66560 1680 1443 +66560 1598 1628 +66560 1694 1441 +66560 1605 1636 +66560 1617 1441 +66560 1669 1840 +66560 1617 1857 +66560 1694 1857 +66560 1655 1890 +66560 1541 1699 +66580 1539 1658 +66580 1544 1890 +66580 1544 1599 +66580 1548 1606 +66580 1553 1924 +66580 1575 1679 +66580 1599 1655 +66580 1630 1467 +66580 1669 1754 +66580 1857 1441 +66580 1924 1478 +66580 1548 1425 +66580 1485 1532 +66580 1549 1592 +66580 1754 1840 +66580 1576 1603 +66580 1680 1443 +66580 1598 1628 +66580 1694 1441 +66580 1605 1636 +66580 1617 1441 +66580 1669 1840 +66580 1617 1857 +66580 1694 1857 +66580 1655 1890 +66580 1541 1699 +66600 1548 1425 +66600 1877 1908 +66600 1485 1532 +66600 1543 1630 +66600 1549 1592 +66600 1617 1694 +66600 1770 1787 +66600 1786 1882 +66600 1754 1840 +66600 1576 1603 +66600 1680 1443 +66600 1598 1628 +66600 1694 1441 +66600 1605 1636 +66600 1617 1441 +66600 1669 1840 +66600 1617 1857 +66600 1694 1857 +66600 1655 1890 +66600 1541 1699 +66600 1599 1890 +66620 1543 1467 +66620 1543 1630 +66620 1549 1592 +66620 1617 1694 +66620 1684 1463 +66620 1770 1787 +66620 1786 1882 +66620 1754 1840 +66620 1576 1603 +66620 1680 1443 +66620 1924 1478 +66620 1598 1628 +66620 1694 1441 +66620 1605 1636 +66620 1617 1441 +66620 1669 1840 +66620 1544 1890 +66620 1617 1857 +66620 1694 1857 +66620 1857 1441 +66620 1655 1890 +66620 1541 1699 +66620 1599 1890 +66640 1603 1851 +66640 1603 1787 +66640 1684 1840 +66640 1754 1840 +66640 1884 1519 +66640 1576 1603 +66640 1599 1655 +66640 1886 1529 +66640 1680 1443 +66640 1924 1478 +66640 1598 1628 +66640 1694 1441 +66640 1605 1636 +66640 1617 1441 +66640 1669 1840 +66640 1544 1890 +66640 1544 1599 +66640 1617 1857 +66640 1694 1857 +66640 1857 1441 +66640 1655 1890 +66640 1541 1699 +66640 1599 1890 +66660 1544 1655 +66660 1549 1519 +66660 1566 1906 +66660 1576 1603 +66660 1599 1655 +66660 1877 1908 +66660 1886 1529 +66660 1680 1443 +66660 1924 1478 +66660 1598 1628 +66660 1694 1441 +66660 1605 1636 +66660 1617 1441 +66660 1669 1840 +66660 1544 1890 +66660 1544 1599 +66660 1617 1857 +66660 1694 1857 +66660 1857 1441 +66660 1655 1890 +66660 1541 1699 +66660 1599 1890 +66680 1630 1531 +66680 1680 1443 +66680 1754 1840 +66680 1829 1886 +66680 1924 1478 +66680 1469 1476 +66680 1598 1628 +66680 1603 1787 +66680 1617 1694 +66680 1694 1441 +66680 1605 1636 +66680 1617 1441 +66680 1669 1840 +66680 1544 1890 +66680 1544 1599 +66680 1617 1857 +66680 1694 1857 +66680 1857 1441 +66680 1655 1890 +66680 1541 1699 +66680 1599 1890 +66700 1539 1791 +66700 1598 1628 +66700 1599 1655 +66700 1603 1787 +66700 1617 1694 +66700 1694 1441 +66700 1792 1885 +66700 1884 1519 +66700 1791 1882 +66700 1598 1463 +66700 1605 1636 +66700 1617 1441 +66700 1649 1434 +66700 1669 1840 +66700 1544 1890 +66700 1544 1599 +66700 1593 1603 +66700 1617 1857 +66700 1694 1857 +66700 1857 1441 +66700 1655 1890 +66700 1541 1699 +66700 1599 1890 +66700 1598 1684 +66720 1658 1467 +66720 1680 1443 +66720 1786 1791 +66720 1791 1882 +66720 1877 1908 +66720 1598 1463 +66720 1605 1636 +66720 1617 1441 +66720 1630 1427 +66720 1649 1434 +66720 1669 1840 +66720 1544 1890 +66720 1544 1599 +66720 1593 1603 +66720 1619 1505 +66720 1617 1857 +66720 1694 1857 +66720 1857 1441 +66720 1628 1684 +66720 1655 1890 +66720 1541 1699 +66720 1599 1890 +66720 1924 1478 +66720 1598 1684 +66740 1598 1628 +66740 1598 1463 +66740 1605 1636 +66740 1617 1441 +66740 1630 1427 +66740 1649 1434 +66740 1669 1840 +66740 1673 1469 +66740 1754 1840 +66740 1544 1890 +66740 1544 1599 +66740 1593 1603 +66740 1619 1505 +66740 1829 1865 +66740 1617 1857 +66740 1617 1694 +66740 1694 1857 +66740 1694 1441 +66740 1857 1441 +66740 1599 1655 +66740 1628 1684 +66740 1655 1890 +66740 1541 1699 +66740 1599 1890 +66740 1924 1478 +66740 1865 1886 +66740 1598 1684 +66740 1829 1886 +66760 1543 1630 +66760 1544 1890 +66760 1544 1599 +66760 1593 1603 +66760 1604 1882 +66760 1619 1505 +66760 1716 1808 +66760 1829 1865 +66760 1603 1449 +66760 1617 1857 +66760 1617 1694 +66760 1694 1857 +66760 1694 1441 +66760 1787 1851 +66760 1857 1441 +66760 1599 1655 +66760 1628 1684 +66760 1798 1466 +66760 1655 1890 +66760 1541 1699 +66760 1599 1890 +66760 1924 1478 +66760 1865 1886 +66760 1598 1684 +66760 1829 1886 +66780 1593 1449 +66780 1603 1449 +66780 1617 1857 +66780 1617 1694 +66780 1658 1467 +66780 1694 1857 +66780 1694 1441 +66780 1787 1851 +66780 1857 1441 +66780 1871 1517 +66780 1599 1655 +66780 1628 1684 +66780 1658 1427 +66780 1754 1840 +66780 1798 1466 +66780 1655 1890 +66780 1541 1699 +66780 1599 1890 +66780 1924 1478 +66780 1865 1886 +66780 1598 1684 +66780 1829 1886 +66800 1543 1630 +66800 1599 1655 +66800 1628 1684 +66800 1658 1427 +66800 1669 1840 +66800 1688 1458 +66800 1688 1892 +66800 1731 1917 +66800 1731 1918 +66800 1754 1840 +66800 1792 1922 +66800 1792 1798 +66800 1798 1466 +66800 1798 1471 +66800 1553 1924 +66800 1598 1628 +66800 1655 1890 +66800 1669 1754 +66800 1541 1699 +66800 1599 1890 +66800 1924 1478 +66800 1512 1531 +66800 1865 1886 +66800 1598 1684 +66800 1829 1886 +66820 1539 1617 +66820 1544 1599 +66820 1553 1924 +66820 1598 1628 +66820 1603 1512 +66820 1619 1505 +66820 1655 1890 +66820 1665 1688 +66820 1669 1754 +66820 1694 1441 +66820 1728 1794 +66820 1728 1902 +66820 1794 1880 +66820 1828 1490 +66820 1871 1517 +66820 1541 1699 +66820 1599 1890 +66820 1688 1457 +66820 1716 1808 +66820 1921 1462 +66820 1924 1478 +66820 1512 1531 +66820 1865 1886 +66820 1617 1857 +66820 1598 1684 +66820 1603 1531 +66820 1829 1886 +66840 1541 1699 +66840 1543 1630 +66840 1544 1890 +66840 1581 1731 +66840 1599 1890 +66840 1613 1458 +66840 1630 1427 +66840 1651 1847 +66840 1669 1840 +66840 1688 1457 +66840 1716 1808 +66840 1798 1862 +66840 1921 1462 +66840 1924 1478 +66840 1715 1495 +66840 1512 1531 +66840 1865 1886 +66840 1617 1857 +66840 1598 1684 +66840 1603 1449 +66840 1603 1531 +66840 1680 1443 +66840 1829 1886 +66860 1630 1467 +66860 1665 1676 +66860 1676 1902 +66860 1676 1711 +66860 1715 1495 +66860 1512 1531 +66860 1658 1427 +66860 1865 1886 +66860 1617 1857 +66860 1598 1684 +66860 1603 1449 +66860 1603 1531 +66860 1680 1443 +66860 1829 1886 +66880 1544 1890 +66880 1562 1798 +66880 1598 1453 +66880 1645 1756 +66880 1658 1427 +66880 1716 1453 +66880 1754 1840 +66880 1786 1882 +66880 1792 1885 +66880 1798 1862 +66880 1865 1886 +66880 1617 1857 +66880 1449 1531 +66880 1622 1835 +66880 1655 1890 +66880 1669 1840 +66880 1873 1921 +66880 1598 1684 +66880 1603 1449 +66880 1603 1531 +66880 1680 1443 +66880 1599 1890 +66880 1829 1886 +66900 1549 1599 +66900 1560 1772 +66900 1617 1857 +66900 1619 1505 +66900 1622 1715 +66900 1622 1495 +66900 1665 1470 +66900 1873 1462 +66900 1449 1531 +66900 1622 1835 +66900 1655 1890 +66900 1669 1840 +66900 1873 1921 +66900 1890 1519 +66900 1579 1633 +66900 1598 1684 +66900 1603 1449 +66900 1603 1531 +66900 1680 1443 +66900 1715 1495 +66900 1924 1478 +66900 1599 1890 +66900 1829 1886 +66920 1553 1924 +66920 1569 1623 +66920 1581 1591 +66920 1599 1655 +66920 1622 1835 +66920 1640 1802 +66920 1655 1890 +66920 1669 1840 +66920 1670 1711 +66920 1716 1808 +66920 1857 1441 +66920 1865 1886 +66920 1873 1921 +66920 1890 1519 +66920 1908 1479 +66920 1921 1462 +66920 1579 1633 +66920 1591 1665 +66920 1598 1684 +66920 1603 1449 +66920 1603 1531 +66920 1629 1911 +66920 1680 1443 +66920 1715 1495 +66920 1821 1898 +66920 1924 1478 +66920 1599 1890 +66920 1829 1886 +66940 1544 1655 +66940 1579 1633 +66940 1581 1731 +66940 1591 1665 +66940 1598 1684 +66940 1603 1449 +66940 1603 1531 +66940 1629 1911 +66940 1680 1443 +66940 1718 1531 +66940 1731 1908 +66940 1754 1840 +66940 1756 1804 +66940 1784 1911 +66940 1541 1636 +66940 1715 1495 +66940 1821 1898 +66940 1924 1478 +66940 1619 1505 +66940 1669 1754 +66940 1581 1479 +66940 1599 1890 +66940 1829 1886 +66960 1541 1636 +66960 1572 1742 +66960 1591 1688 +66960 1591 1471 +66960 1658 1467 +66960 1703 1764 +66960 1715 1495 +66960 1821 1898 +66960 1543 1630 +66960 1617 1857 +66960 1716 1808 +66960 1865 1886 +66960 1924 1478 +66960 1658 1427 +66960 1619 1505 +66960 1669 1754 +66960 1731 1479 +66960 1581 1479 +66960 1599 1890 +66960 1622 1835 +66960 1829 1886 +66960 1877 1897 +66980 1537 1582 +66980 1543 1467 +66980 1543 1630 +66980 1598 1684 +66980 1617 1857 +66980 1673 1470 +66980 1716 1808 +66980 1731 1908 +66980 1865 1886 +66980 1924 1478 +66980 1579 1633 +66980 1658 1427 +66980 1787 1851 +66980 1603 1742 +66980 1619 1505 +66980 1669 1754 +66980 1731 1479 +66980 1581 1479 +66980 1599 1890 +66980 1622 1835 +66980 1688 1457 +66980 1680 1443 +66980 1655 1463 +66980 1829 1886 +66980 1877 1897 +67000 1554 1764 +67000 1579 1633 +67000 1581 1670 +67000 1582 1728 +67000 1591 1665 +67000 1599 1519 +67000 1629 1911 +67000 1658 1427 +67000 1711 1731 +67000 1784 1911 +67000 1787 1851 +67000 1792 1885 +67000 1890 1525 +67000 1581 1711 +67000 1603 1742 +67000 1619 1505 +67000 1669 1754 +67000 1731 1479 +67000 1754 1840 +67000 1581 1479 +67000 1599 1890 +67000 1890 1519 +67000 1572 1603 +67000 1622 1835 +67000 1688 1457 +67000 1680 1443 +67000 1655 1463 +67000 1829 1886 +67000 1877 1897 +67020 1581 1711 +67020 1590 1819 +67020 1603 1742 +67020 1619 1505 +67020 1669 1840 +67020 1669 1754 +67020 1711 1479 +67020 1717 1902 +67020 1731 1479 +67020 1754 1840 +67020 1821 1898 +67020 1857 1441 +67020 1581 1479 +67020 1582 1742 +67020 1599 1890 +67020 1890 1519 +67020 1572 1603 +67020 1622 1835 +67020 1688 1457 +67020 1680 1443 +67020 1655 1463 +67020 1865 1886 +67020 1715 1495 +67020 1829 1886 +67020 1877 1897 +67040 1543 1658 +67040 1550 1866 +67040 1566 1477 +67040 1572 1681 +67040 1581 1479 +67040 1582 1742 +67040 1599 1890 +67040 1603 1681 +67040 1630 1658 +67040 1630 1467 +67040 1633 1683 +67040 1716 1772 +67040 1718 1902 +67040 1872 1875 +67040 1890 1519 +67040 1924 1478 +67040 1427 1467 +67040 1582 1603 +67040 1602 1491 +67040 1602 1779 +67040 1640 1802 +67040 1841 1901 +67040 1572 1603 +67040 1622 1835 +67040 1688 1457 +67040 1731 1908 +67040 1680 1443 +67040 1655 1463 +67040 1605 1636 +67040 1699 1703 +67040 1865 1886 +67040 1715 1495 +67040 1829 1886 +67040 1877 1897 +67060 1543 1467 +67060 1582 1603 +67060 1590 1872 +67060 1602 1819 +67060 1602 1491 +67060 1602 1779 +67060 1603 1798 +67060 1640 1802 +67060 1658 1467 +67060 1669 1754 +67060 1711 1479 +67060 1734 1866 +67060 1743 1845 +67060 1789 1889 +67060 1802 1889 +67060 1802 1855 +67060 1807 1889 +67060 1807 1841 +67060 1819 1845 +67060 1821 1875 +67060 1835 1495 +67060 1841 1889 +67060 1841 1901 +67060 1857 1441 +67060 1872 1477 +67060 1875 1477 +67060 1912 1916 +67060 1487 1502 +67060 1543 1630 +67060 1550 1683 +67060 1572 1603 +67060 1602 1845 +67060 1622 1835 +67060 1651 1905 +67060 1663 1818 +67060 1688 1457 +67060 1731 1908 +67060 1734 1802 +67060 1602 1889 +67060 1680 1443 +67060 1502 1533 +67060 1655 1463 +67060 1871 1517 +67060 1605 1636 +67060 1727 1845 +67060 1699 1703 +67060 1865 1886 +67060 1715 1495 +67060 1829 1886 +67060 1877 1897 +67080 1543 1477 +67080 1543 1630 +67080 1550 1683 +67080 1555 1889 +67080 1572 1603 +67080 1602 1841 +67080 1602 1459 +67080 1602 1845 +67080 1602 1663 +67080 1602 1727 +67080 1617 1857 +67080 1622 1835 +67080 1629 1911 +67080 1651 1905 +67080 1663 1841 +67080 1663 1818 +67080 1663 1889 +67080 1688 1457 +67080 1717 1728 +67080 1731 1908 +67080 1734 1802 +67080 1734 1502 +67080 1789 1845 +67080 1841 1459 +67080 1841 1845 +67080 1845 1889 +67080 1845 1901 +67080 1845 1502 +67080 1851 1512 +67080 1924 1478 +67080 1442 1455 +67080 1550 1566 +67080 1602 1889 +67080 1680 1443 +67080 1734 1491 +67080 1501 1528 +67080 1502 1533 +67080 1655 1463 +67080 1716 1808 +67080 1871 1517 +67080 1605 1636 +67080 1727 1845 +67080 1699 1703 +67080 1865 1886 +67080 1715 1495 +67080 1829 1886 +67080 1877 1897 +67100 1550 1566 +67100 1554 1772 +67100 1590 1442 +67100 1602 1889 +67100 1602 1807 +67100 1603 1681 +67100 1619 1505 +67100 1630 1731 +67100 1663 1901 +67100 1680 1443 +67100 1688 1477 +67100 1688 1894 +67100 1731 1467 +67100 1731 1894 +67100 1734 1491 +67100 1734 1789 +67100 1775 1845 +67100 1818 1872 +67100 1818 1889 +67100 1835 1466 +67100 1836 1517 +67100 1866 1497 +67100 1877 1467 +67100 1886 1532 +67100 1912 1916 +67100 1501 1528 +67100 1502 1533 +67100 1550 1761 +67100 1655 1463 +67100 1716 1808 +67100 1871 1517 +67100 1599 1890 +67100 1605 1636 +67100 1727 1845 +67100 1640 1802 +67100 1699 1703 +67100 1865 1886 +67100 1669 1754 +67100 1715 1495 +67100 1829 1886 +67100 1877 1897 +67120 1550 1761 +67120 1629 1911 +67120 1640 1491 +67120 1655 1463 +67120 1688 1457 +67120 1716 1808 +67120 1761 1866 +67120 1802 1916 +67120 1871 1517 +67120 1485 1529 +67120 1544 1890 +67120 1550 1866 +67120 1590 1455 +67120 1599 1890 +67120 1605 1636 +67120 1663 1818 +67120 1727 1845 +67120 1761 1845 +67120 1779 1491 +67120 1640 1802 +67120 1699 1703 +67120 1767 1840 +67120 1865 1886 +67120 1669 1754 +67120 1715 1495 +67120 1787 1851 +67120 1829 1886 +67120 1605 1772 +67120 1544 1599 +67120 1779 1802 +67120 1802 1491 +67120 1877 1897 +67120 1841 1901 +67140 1544 1890 +67140 1550 1866 +67140 1581 1479 +67140 1590 1455 +67140 1599 1890 +67140 1605 1636 +67140 1616 1518 +67140 1630 1467 +67140 1663 1818 +67140 1687 1901 +67140 1712 1755 +67140 1727 1845 +67140 1727 1775 +67140 1761 1845 +67140 1779 1491 +67140 1818 1886 +67140 1590 1442 +67140 1640 1802 +67140 1699 1703 +67140 1767 1840 +67140 1865 1886 +67140 1669 1754 +67140 1715 1495 +67140 1787 1851 +67140 1829 1886 +67140 1605 1772 +67140 1680 1443 +67140 1544 1599 +67140 1636 1772 +67140 1727 1761 +67140 1779 1802 +67140 1802 1491 +67140 1877 1897 +67140 1841 1901 +67160 1550 1775 +67160 1582 1603 +67160 1590 1442 +67160 1628 1655 +67160 1640 1802 +67160 1663 1731 +67160 1673 1887 +67160 1699 1703 +67160 1755 1527 +67160 1767 1840 +67160 1818 1872 +67160 1865 1886 +67160 1617 1857 +67160 1669 1754 +67160 1715 1495 +67160 1787 1851 +67160 1829 1886 +67160 1892 1477 +67160 1605 1772 +67160 1680 1443 +67160 1544 1599 +67160 1550 1761 +67160 1636 1772 +67160 1688 1457 +67160 1727 1761 +67160 1761 1775 +67160 1779 1802 +67160 1802 1491 +67160 1877 1897 +67160 1841 1901 +67180 1605 1636 +67180 1613 1755 +67180 1613 1622 +67180 1616 1518 +67180 1617 1857 +67180 1645 1756 +67180 1663 1688 +67180 1669 1754 +67180 1715 1495 +67180 1787 1851 +67180 1829 1886 +67180 1880 1464 +67180 1892 1477 +67180 1550 1727 +67180 1566 1501 +67180 1605 1772 +67180 1673 1747 +67180 1680 1443 +67180 1761 1845 +67180 1544 1599 +67180 1550 1761 +67180 1636 1772 +67180 1688 1457 +67180 1727 1761 +67180 1761 1775 +67180 1779 1802 +67180 1802 1491 +67180 1550 1845 +67180 1877 1897 +67180 1779 1491 +67180 1841 1901 +67200 1544 1655 +67200 1550 1727 +67200 1566 1501 +67200 1590 1866 +67200 1604 1518 +67200 1604 1462 +67200 1605 1772 +67200 1652 1688 +67200 1673 1747 +67200 1680 1443 +67200 1761 1528 +67200 1761 1845 +67200 1871 1517 +67200 1544 1599 +67200 1550 1761 +67200 1550 1775 +67200 1636 1772 +67200 1688 1457 +67200 1727 1761 +67200 1731 1901 +67200 1761 1775 +67200 1779 1802 +67200 1802 1491 +67200 1898 1477 +67200 1550 1845 +67200 1599 1655 +67200 1877 1897 +67200 1779 1491 +67200 1699 1703 +67200 1841 1901 +67200 1598 1659 +67220 1544 1599 +67220 1550 1761 +67220 1550 1775 +67220 1562 1529 +67220 1622 1835 +67220 1628 1463 +67220 1630 1467 +67220 1636 1772 +67220 1640 1802 +67220 1676 1518 +67220 1688 1457 +67220 1717 1835 +67220 1727 1761 +67220 1731 1901 +67220 1761 1775 +67220 1779 1802 +67220 1802 1491 +67220 1829 1886 +67220 1898 1477 +67220 1550 1501 +67220 1550 1845 +67220 1563 1618 +67220 1599 1655 +67220 1617 1857 +67220 1716 1808 +67220 1877 1897 +67220 1779 1491 +67220 1715 1495 +67220 1835 1458 +67220 1699 1703 +67220 1841 1901 +67220 1598 1659 +67240 1544 1890 +67240 1550 1501 +67240 1550 1845 +67240 1563 1618 +67240 1579 1706 +67240 1582 1921 +67240 1599 1655 +67240 1617 1857 +67240 1676 1921 +67240 1676 1873 +67240 1680 1443 +67240 1716 1808 +67240 1727 1845 +67240 1877 1897 +67240 1880 1464 +67240 1889 1898 +67240 1889 1477 +67240 1485 1529 +67240 1727 1501 +67240 1779 1491 +67240 1845 1501 +67240 1892 1477 +67240 1715 1495 +67240 1787 1851 +67240 1835 1458 +67240 1699 1703 +67240 1841 1901 +67240 1598 1659 +67260 1543 1835 +67260 1582 1630 +67260 1640 1802 +67260 1652 1819 +67260 1655 1437 +67260 1670 1711 +67260 1688 1877 +67260 1727 1501 +67260 1775 1501 +67260 1779 1491 +67260 1845 1501 +67260 1892 1477 +67260 1715 1495 +67260 1787 1851 +67260 1835 1458 +67260 1439 1479 +67260 1599 1437 +67260 1699 1703 +67260 1581 1479 +67260 1841 1901 +67260 1598 1659 +67280 1544 1890 +67280 1581 1439 +67280 1582 1658 +67280 1582 1438 +67280 1628 1485 +67280 1630 1658 +67280 1715 1495 +67280 1787 1851 +67280 1818 1872 +67280 1835 1458 +67280 1884 1519 +67280 1439 1479 +67280 1599 1437 +67280 1622 1458 +67280 1663 1818 +67280 1699 1703 +67280 1716 1808 +67280 1877 1897 +67280 1581 1479 +67280 1617 1857 +67280 1688 1457 +67280 1841 1901 +67280 1598 1659 +67300 1580 1831 +67300 1599 1437 +67300 1622 1458 +67300 1663 1818 +67300 1699 1703 +67300 1716 1808 +67300 1877 1897 +67300 1889 1492 +67300 1581 1479 +67300 1617 1857 +67300 1640 1802 +67300 1688 1457 +67300 1541 1862 +67300 1599 1655 +67300 1841 1901 +67300 1598 1659 +67300 1636 1772 +67300 1775 1501 +67300 1562 1593 +67320 1547 1716 +67320 1575 1764 +67320 1581 1479 +67320 1602 1851 +67320 1604 1527 +67320 1605 1772 +67320 1617 1857 +67320 1640 1802 +67320 1658 1438 +67320 1688 1457 +67320 1835 1458 +67320 1884 1519 +67320 1541 1862 +67320 1544 1890 +67320 1582 1630 +67320 1599 1655 +67320 1841 1901 +67320 1850 1868 +67320 1518 1527 +67320 1598 1659 +67320 1636 1772 +67320 1685 1513 +67320 1715 1495 +67320 1775 1501 +67320 1562 1593 +67320 1680 1443 +67320 1829 1886 +67340 1541 1862 +67340 1544 1890 +67340 1581 1681 +67340 1582 1630 +67340 1599 1655 +67340 1604 1518 +67340 1616 1527 +67340 1622 1717 +67340 1628 1485 +67340 1841 1901 +67340 1850 1868 +67340 1886 1491 +67340 1518 1527 +67340 1598 1659 +67340 1636 1772 +67340 1685 1513 +67340 1715 1495 +67340 1775 1501 +67340 1562 1593 +67340 1680 1443 +67340 1829 1886 +67360 1554 1756 +67360 1598 1659 +67360 1604 1658 +67360 1616 1658 +67360 1636 1772 +67360 1685 1513 +67360 1718 1889 +67360 1920 1453 +67360 1924 1478 +67360 1617 1857 +67360 1715 1495 +67360 1775 1501 +67360 1562 1593 +67360 1835 1458 +67360 1680 1443 +67360 1829 1886 +67360 1865 1886 +67380 1617 1857 +67380 1640 1802 +67380 1658 1835 +67380 1715 1495 +67380 1742 1866 +67380 1742 1787 +67380 1775 1501 +67380 1787 1866 +67380 1875 1908 +67380 1877 1897 +67380 1562 1593 +67380 1592 1684 +67380 1835 1458 +67380 1680 1443 +67380 1829 1886 +67380 1865 1886 +67400 1555 1502 +67400 1562 1593 +67400 1592 1684 +67400 1599 1655 +67400 1687 1702 +67400 1688 1457 +67400 1702 1842 +67400 1702 1901 +67400 1835 1458 +67400 1842 1901 +67400 1908 1479 +67400 1619 1893 +67400 1680 1443 +67400 1829 1886 +67400 1579 1599 +67400 1865 1886 +67420 1579 1655 +67420 1619 1893 +67420 1640 1802 +67420 1652 1747 +67420 1734 1887 +67420 1893 1906 +67420 1669 1754 +67420 1679 1764 +67420 1680 1443 +67420 1711 1479 +67420 1541 1862 +67420 1829 1886 +67420 1579 1599 +67420 1865 1886 +67420 1924 1478 +67420 1715 1495 +67420 1684 1880 +67440 1545 1894 +67440 1580 1887 +67440 1669 1754 +67440 1670 1908 +67440 1670 1479 +67440 1679 1764 +67440 1680 1443 +67440 1688 1457 +67440 1711 1908 +67440 1711 1479 +67440 1767 1840 +67440 1541 1862 +67440 1829 1886 +67440 1908 1479 +67440 1579 1599 +67440 1865 1886 +67440 1889 1492 +67440 1924 1478 +67440 1715 1495 +67440 1684 1880 +67460 1541 1862 +67460 1789 1908 +67460 1829 1886 +67460 1908 1479 +67460 1579 1599 +67460 1640 1802 +67460 1865 1886 +67460 1889 1492 +67460 1924 1478 +67460 1562 1593 +67460 1663 1818 +67460 1715 1495 +67460 1684 1880 +67480 1553 1924 +67480 1579 1599 +67480 1593 1734 +67480 1599 1655 +67480 1617 1857 +67480 1640 1802 +67480 1663 1887 +67480 1669 1754 +67480 1865 1886 +67480 1887 1458 +67480 1887 1471 +67480 1889 1492 +67480 1924 1478 +67480 1562 1593 +67480 1663 1818 +67480 1715 1495 +67480 1544 1890 +67480 1636 1772 +67480 1680 1443 +67480 1684 1880 +67500 1562 1593 +67500 1663 1818 +67500 1688 1457 +67500 1715 1495 +67500 1544 1890 +67500 1798 1862 +67500 1877 1897 +67500 1636 1772 +67500 1680 1443 +67500 1684 1880 +67520 1541 1798 +67520 1544 1890 +67520 1591 1527 +67520 1598 1659 +67520 1640 1802 +67520 1798 1862 +67520 1877 1897 +67520 1575 1679 +67520 1636 1772 +67520 1857 1528 +67520 1680 1443 +67520 1684 1880 +67520 1825 1519 +67540 1555 1502 +67540 1575 1679 +67540 1754 1840 +67540 1841 1901 +67540 1460 1499 +67540 1497 1528 +67540 1599 1512 +67540 1636 1772 +67540 1857 1528 +67540 1680 1443 +67540 1684 1880 +67540 1825 1519 +67560 1599 1655 +67560 1655 1512 +67560 1688 1457 +67560 1688 1706 +67560 1485 1529 +67560 1599 1512 +67560 1636 1772 +67560 1715 1495 +67560 1591 1858 +67560 1857 1528 +67560 1680 1443 +67560 1877 1897 +67560 1684 1880 +67560 1825 1519 +67580 1599 1512 +67580 1617 1679 +67580 1636 1772 +67580 1872 1504 +67580 1527 1529 +67580 1715 1495 +67580 1573 1452 +67580 1591 1858 +67580 1857 1528 +67580 1640 1802 +67580 1680 1443 +67580 1877 1897 +67580 1684 1880 +67580 1825 1519 +67600 1539 1554 +67600 1591 1679 +67600 1599 1655 +67600 1617 1441 +67600 1708 1760 +67600 1715 1495 +67600 1775 1845 +67600 1890 1525 +67600 1924 1478 +67600 1573 1452 +67600 1591 1858 +67600 1703 1920 +67600 1857 1528 +67600 1640 1802 +67600 1680 1443 +67600 1683 1527 +67600 1877 1897 +67600 1684 1880 +67600 1825 1519 +67620 1573 1452 +67620 1591 1858 +67620 1703 1920 +67620 1857 1528 +67620 1872 1504 +67620 1897 1485 +67620 1617 1857 +67620 1640 1802 +67620 1680 1443 +67620 1683 1527 +67620 1877 1897 +67620 1485 1529 +67620 1734 1441 +67620 1460 1499 +67620 1684 1880 +67620 1825 1519 +67620 1636 1772 +67640 1603 1630 +67640 1617 1857 +67640 1640 1802 +67640 1680 1443 +67640 1683 1527 +67640 1734 1857 +67640 1877 1897 +67640 1924 1478 +67640 1485 1529 +67640 1734 1441 +67640 1767 1840 +67640 1715 1495 +67640 1802 1865 +67640 1460 1499 +67640 1688 1457 +67640 1684 1880 +67640 1825 1519 +67640 1636 1772 +67660 1554 1645 +67660 1630 1493 +67660 1655 1512 +67660 1727 1775 +67660 1734 1441 +67660 1767 1840 +67660 1775 1434 +67660 1605 1636 +67660 1715 1495 +67660 1802 1865 +67660 1857 1441 +67660 1460 1499 +67660 1688 1457 +67660 1619 1893 +67660 1684 1880 +67660 1825 1519 +67660 1636 1772 +67680 1554 1772 +67680 1605 1636 +67680 1628 1754 +67680 1683 1527 +67680 1715 1495 +67680 1802 1865 +67680 1857 1441 +67680 1877 1897 +67680 1924 1478 +67680 1460 1499 +67680 1688 1457 +67680 1708 1760 +67680 1573 1452 +67680 1619 1893 +67680 1684 1880 +67680 1825 1519 +67680 1636 1772 +67700 1688 1457 +67700 1688 1897 +67700 1727 1434 +67700 1605 1772 +67700 1708 1760 +67700 1884 1499 +67700 1573 1452 +67700 1619 1893 +67700 1684 1880 +67700 1825 1519 +67700 1636 1772 +67700 1547 1734 +67720 1583 1460 +67720 1601 1495 +67720 1605 1772 +67720 1708 1760 +67720 1767 1840 +67720 1802 1865 +67720 1884 1499 +67720 1884 1460 +67720 1924 1478 +67720 1573 1452 +67720 1619 1893 +67720 1716 1734 +67720 1877 1897 +67720 1683 1527 +67720 1684 1880 +67720 1825 1519 +67720 1636 1772 +67720 1655 1883 +67720 1547 1734 +67740 1563 1443 +67740 1573 1452 +67740 1619 1893 +67740 1672 1897 +67740 1715 1495 +67740 1716 1734 +67740 1877 1897 +67740 1499 1525 +67740 1683 1527 +67740 1684 1880 +67740 1825 1519 +67740 1636 1772 +67740 1655 1883 +67740 1460 1499 +67740 1547 1734 +67760 1599 1512 +67760 1640 1802 +67760 1683 1527 +67760 1802 1865 +67760 1684 1880 +67760 1680 1443 +67760 1688 1457 +67760 1688 1706 +67760 1825 1519 +67760 1636 1772 +67760 1655 1883 +67760 1460 1499 +67760 1547 1734 +67780 1619 1497 +67780 1684 1880 +67780 1708 1857 +67780 1883 1430 +67780 1680 1443 +67780 1688 1457 +67780 1688 1706 +67780 1825 1519 +67780 1767 1840 +67780 1636 1772 +67780 1655 1883 +67780 1460 1499 +67780 1547 1734 +67800 1619 1893 +67800 1640 1802 +67800 1669 1754 +67800 1680 1443 +67800 1688 1457 +67800 1688 1706 +67800 1845 1434 +67800 1825 1519 +67800 1767 1840 +67800 1636 1772 +67800 1655 1883 +67800 1460 1499 +67800 1716 1734 +67800 1547 1734 +67820 1554 1645 +67820 1605 1772 +67820 1825 1519 +67820 1554 1772 +67820 1605 1636 +67820 1767 1840 +67820 1787 1851 +67820 1636 1772 +67820 1655 1883 +67820 1460 1499 +67820 1716 1734 +67820 1547 1734 +67840 1554 1772 +67840 1593 1703 +67840 1605 1636 +67840 1727 1775 +67840 1767 1840 +67840 1787 1851 +67840 1636 1772 +67840 1655 1883 +67840 1688 1706 +67840 1688 1457 +67840 1460 1499 +67840 1716 1734 +67840 1547 1734 +67860 1541 1862 +67860 1592 1443 +67860 1624 1897 +67860 1636 1772 +67860 1655 1883 +67860 1688 1706 +67860 1829 1886 +67860 1683 1527 +67860 1688 1457 +67860 1460 1499 +67860 1716 1734 +67860 1547 1734 +67860 1563 1592 +67880 1593 1678 +67880 1598 1897 +67880 1683 1527 +67880 1688 1457 +67880 1787 1851 +67880 1460 1499 +67880 1727 1775 +67880 1655 1870 +67880 1716 1734 +67880 1547 1734 +67880 1563 1592 +67900 1554 1798 +67900 1645 1772 +67900 1767 1840 +67900 1460 1499 +67900 1541 1862 +67900 1727 1775 +67900 1825 1890 +67900 1655 1870 +67900 1716 1734 +67900 1547 1734 +67900 1563 1592 +67920 1541 1862 +67920 1553 1478 +67920 1563 1443 +67920 1683 1527 +67920 1688 1706 +67920 1727 1775 +67920 1734 1798 +67920 1825 1890 +67920 1829 1886 +67920 1592 1443 +67920 1775 1434 +67920 1655 1870 +67920 1464 1482 +67920 1716 1734 +67920 1547 1734 +67920 1563 1592 +67940 1569 1742 +67940 1592 1443 +67940 1619 1505 +67940 1678 1798 +67940 1775 1434 +67940 1787 1851 +67940 1619 1497 +67940 1645 1772 +67940 1688 1457 +67940 1655 1870 +67940 1893 1497 +67940 1605 1636 +67940 1464 1482 +67940 1716 1734 +67940 1547 1734 +67940 1563 1592 +67960 1619 1497 +67960 1645 1772 +67960 1688 1457 +67960 1727 1434 +67960 1775 1845 +67960 1655 1870 +67960 1893 1497 +67960 1605 1636 +67960 1767 1840 +67960 1464 1482 +67960 1716 1734 +67960 1547 1734 +67960 1563 1592 +67960 1886 1829 +67980 1591 1665 +67980 1599 1774 +67980 1619 1893 +67980 1655 1870 +67980 1688 1886 +67980 1893 1497 +67980 1573 1452 +67980 1605 1636 +67980 1767 1840 +67980 1787 1851 +67980 1464 1482 +67980 1716 1734 +67980 1547 1734 +67980 1563 1592 +67980 1886 1829 +68000 1541 1862 +68000 1573 1452 +68000 1598 1897 +68000 1599 1655 +68000 1605 1636 +68000 1767 1840 +68000 1787 1851 +68000 1502 1533 +68000 1893 1505 +68000 1464 1482 +68000 1694 1829 +68000 1716 1734 +68000 1547 1734 +68000 1563 1592 +68000 1886 1829 +68020 1539 1541 +68020 1562 1569 +68020 1562 1742 +68020 1734 1756 +68020 1893 1505 +68020 1464 1482 +68020 1694 1829 +68020 1840 1439 +68020 1527 1683 +68020 1825 1884 +68020 1669 1754 +68020 1716 1734 +68020 1547 1734 +68020 1563 1592 +68020 1886 1829 +68040 1678 1870 +68040 1694 1829 +68040 1541 1897 +68040 1443 1680 +68040 1840 1439 +68040 1527 1683 +68040 1499 1460 +68040 1825 1884 +68040 1669 1754 +68040 1716 1734 +68040 1547 1734 +68040 1563 1592 +68040 1886 1829 +68060 1599 1678 +68060 1694 1886 +68060 1734 1870 +68060 1787 1851 +68060 1825 1890 +68060 1825 1884 +68060 1669 1754 +68060 1840 1767 +68060 1716 1734 +68060 1547 1734 +68060 1549 1525 +68060 1482 1464 +68060 1547 1870 +68060 1563 1592 +68060 1886 1829 +68060 1716 1870 +68080 1798 1818 +68080 1798 1663 +68080 1669 1754 +68080 1840 1767 +68080 1716 1734 +68080 1547 1734 +68080 1549 1525 +68080 1663 1818 +68080 1840 1439 +68080 1680 1443 +68080 1482 1464 +68080 1547 1870 +68080 1563 1592 +68080 1886 1829 +68080 1716 1870 +68100 1547 1734 +68100 1549 1525 +68100 1573 1452 +68100 1605 1636 +68100 1663 1818 +68100 1840 1439 +68100 1920 1541 +68100 1680 1443 +68100 1482 1464 +68100 1665 1591 +68100 1547 1870 +68100 1513 1779 +68100 1563 1592 +68100 1886 1829 +68100 1716 1870 +68120 1920 1541 +68120 1680 1443 +68120 1527 1683 +68120 1840 1767 +68120 1482 1464 +68120 1665 1591 +68120 1547 1870 +68120 1513 1779 +68120 1563 1592 +68120 1886 1829 +68120 1716 1870 +68140 1680 1636 +68140 1825 1890 +68140 1840 1767 +68140 1591 1858 +68140 1605 1772 +68140 1482 1464 +68140 1665 1591 +68140 1539 1884 +68140 1547 1870 +68140 1549 1525 +68140 1513 1779 +68140 1680 1772 +68140 1563 1592 +68140 1452 1573 +68140 1886 1829 +68140 1443 1772 +68140 1716 1870 +68140 1605 1636 +68160 1665 1591 +68160 1539 1884 +68160 1547 1684 +68160 1547 1870 +68160 1549 1525 +68160 1513 1779 +68160 1825 1525 +68160 1680 1772 +68160 1851 1787 +68160 1563 1592 +68160 1452 1573 +68160 1886 1829 +68160 1443 1772 +68160 1716 1870 +68160 1605 1636 +68180 1563 1592 +68180 1884 1890 +68180 1880 1883 +68180 1825 1890 +68180 1628 1463 +68180 1452 1573 +68180 1886 1829 +68180 1443 1772 +68180 1716 1870 +68180 1605 1636 +68180 1482 1880 +68200 1680 1443 +68200 1825 1890 +68200 1628 1463 +68200 1452 1573 +68200 1886 1829 +68200 1549 1525 +68200 1513 1779 +68200 1443 1772 +68200 1716 1870 +68200 1605 1636 +68200 1598 1541 +68200 1482 1880 +68220 1665 1591 +68220 1539 1839 +68220 1549 1553 +68220 1549 1525 +68220 1592 1563 +68220 1513 1779 +68220 1439 1840 +68220 1443 1772 +68220 1716 1870 +68220 1605 1636 +68220 1598 1541 +68220 1482 1880 +68240 1665 1539 +68240 1513 1779 +68240 1439 1840 +68240 1680 1772 +68240 1443 1772 +68240 1716 1870 +68240 1605 1636 +68240 1598 1541 +68240 1482 1880 +68260 1549 1825 +68260 1680 1443 +68260 1592 1563 +68260 1680 1772 +68260 1443 1772 +68260 1716 1870 +68260 1605 1636 +68260 1598 1541 +68260 1482 1880 +68260 1591 1665 +68280 1547 1684 +68280 1897 1579 +68280 1592 1563 +68280 1851 1787 +68280 1680 1772 +68280 1443 1772 +68280 1605 1772 +68280 1482 1464 +68280 1716 1870 +68280 1605 1636 +68280 1598 1541 +68280 1482 1880 +68280 1591 1665 +68300 1680 1443 +68300 1680 1772 +68300 1692 1897 +68300 1692 1660 +68300 1443 1772 +68300 1829 1886 +68300 1605 1772 +68300 1464 1880 +68300 1636 1772 +68300 1547 1870 +68300 1482 1464 +68300 1716 1870 +68300 1605 1636 +68300 1598 1541 +68300 1482 1880 +68300 1591 1665 +68320 1672 1877 +68320 1591 1858 +68320 1464 1880 +68320 1636 1772 +68320 1547 1870 +68320 1482 1464 +68320 1716 1870 +68320 1605 1636 +68320 1598 1541 +68320 1482 1880 +68320 1591 1665 +68340 1539 1684 +68340 1547 1870 +68340 1482 1464 +68340 1573 1452 +68340 1716 1870 +68340 1605 1636 +68340 1598 1541 +68340 1482 1880 +68340 1591 1665 +68360 1580 1683 +68360 1547 1870 +68360 1692 1660 +68360 1569 1742 +68360 1851 1787 +68360 1482 1464 +68360 1734 1655 +68360 1573 1452 +68360 1716 1870 +68360 1605 1636 +68360 1825 1519 +68360 1598 1541 +68360 1482 1880 +68360 1591 1665 +68380 1792 1885 +68380 1443 1563 +68380 1573 1452 +68380 1716 1870 +68380 1605 1636 +68380 1559 1734 +68380 1825 1519 +68380 1598 1541 +68380 1482 1880 +68380 1591 1665 +68400 1580 1683 +68400 1559 1734 +68400 1692 1660 +68400 1692 1839 +68400 1566 1601 +68400 1884 1519 +68400 1464 1880 +68400 1825 1519 +68400 1684 1580 +68400 1598 1541 +68400 1482 1880 +68400 1547 1870 +68400 1591 1665 +68400 1464 1482 +68420 1692 1885 +68420 1684 1580 +68420 1598 1541 +68420 1482 1880 +68420 1605 1636 +68420 1547 1870 +68420 1591 1665 +68420 1890 1519 +68420 1464 1482 +68420 1716 1870 +68440 1884 1519 +68440 1645 1734 +68440 1684 1580 +68440 1825 1890 +68440 1825 1519 +68440 1840 1767 +68440 1598 1541 +68440 1482 1880 +68440 1884 1890 +68440 1605 1636 +68440 1549 1525 +68440 1547 1870 +68440 1591 1665 +68440 1890 1519 +68440 1464 1482 +68440 1716 1870 +68460 1756 1645 +68460 1684 1580 +68460 1563 1580 +68460 1825 1890 +68460 1825 1519 +68460 1840 1767 +68460 1464 1880 +68460 1598 1541 +68460 1482 1880 +68460 1884 1890 +68460 1512 1655 +68460 1605 1636 +68460 1549 1525 +68460 1547 1870 +68460 1591 1665 +68460 1890 1519 +68460 1464 1482 +68460 1716 1870 +68480 1566 1715 +68480 1591 1858 +68480 1734 1487 +68480 1458 1487 +68480 1605 1636 +68480 1884 1519 +68480 1549 1525 +68480 1547 1870 +68480 1591 1665 +68480 1890 1519 +68480 1464 1482 +68480 1716 1870 +68500 1569 1742 +68500 1605 1636 +68500 1655 1851 +68500 1655 1787 +68500 1884 1519 +68500 1549 1525 +68500 1684 1503 +68500 1825 1519 +68500 1547 1870 +68500 1591 1665 +68500 1890 1519 +68500 1657 1487 +68500 1464 1482 +68500 1541 1598 +68500 1880 1482 +68500 1716 1870 +68520 1549 1525 +68520 1605 1920 +68520 1684 1503 +68520 1787 1851 +68520 1825 1519 +68520 1547 1870 +68520 1591 1665 +68520 1890 1519 +68520 1657 1487 +68520 1464 1482 +68520 1657 1443 +68520 1541 1598 +68520 1880 1482 +68520 1443 1487 +68520 1716 1870 +68540 1547 1870 +68540 1591 1665 +68540 1663 1467 +68540 1890 1519 +68540 1657 1487 +68540 1464 1482 +68540 1657 1443 +68540 1541 1598 +68540 1769 1443 +68540 1880 1482 +68540 1443 1487 +68540 1716 1870 +68540 1769 1487 +68560 1657 1487 +68560 1663 1818 +68560 1787 1458 +68560 1464 1482 +68560 1569 1742 +68560 1657 1443 +68560 1884 1890 +68560 1541 1598 +68560 1769 1443 +68560 1880 1482 +68560 1443 1487 +68560 1716 1870 +68560 1769 1487 +68560 1657 1769 +68580 1569 1742 +68580 1645 1756 +68580 1660 1495 +68580 1547 1870 +68580 1880 1464 +68580 1657 1443 +68580 1884 1890 +68580 1541 1598 +68580 1769 1443 +68580 1880 1482 +68580 1890 1519 +68580 1443 1487 +68580 1716 1870 +68580 1769 1487 +68580 1657 1769 +68580 1655 1786 +68600 1547 1870 +68600 1553 1924 +68600 1591 1665 +68600 1880 1464 +68600 1464 1482 +68600 1657 1443 +68600 1884 1890 +68600 1541 1598 +68600 1769 1443 +68600 1880 1482 +68600 1890 1519 +68600 1443 1487 +68600 1657 1487 +68600 1716 1870 +68600 1769 1487 +68600 1657 1769 +68600 1655 1786 +68620 1604 1861 +68620 1663 1851 +68620 1840 1439 +68620 1657 1443 +68620 1692 1839 +68620 1792 1885 +68620 1884 1890 +68620 1541 1598 +68620 1663 1818 +68620 1769 1443 +68620 1880 1482 +68620 1890 1519 +68620 1443 1487 +68620 1629 1911 +68620 1657 1487 +68620 1716 1870 +68620 1769 1487 +68620 1657 1769 +68620 1655 1786 +68620 1920 1636 +68640 1598 1885 +68640 1657 1443 +68640 1692 1839 +68640 1792 1885 +68640 1880 1464 +68640 1884 1890 +68640 1464 1482 +68640 1541 1598 +68640 1569 1742 +68640 1663 1818 +68640 1769 1443 +68640 1880 1482 +68640 1890 1519 +68640 1443 1487 +68640 1547 1870 +68640 1629 1911 +68640 1657 1487 +68640 1716 1870 +68640 1769 1487 +68640 1601 1629 +68640 1657 1769 +68640 1655 1786 +68640 1920 1636 +68640 1665 1591 +68660 1541 1598 +68660 1562 1792 +68660 1569 1742 +68660 1663 1818 +68660 1769 1443 +68660 1880 1482 +68660 1890 1519 +68660 1443 1487 +68660 1655 1882 +68660 1547 1870 +68660 1601 1911 +68660 1629 1911 +68660 1657 1487 +68660 1716 1870 +68660 1769 1487 +68660 1601 1629 +68660 1657 1769 +68660 1580 1628 +68660 1655 1786 +68660 1920 1636 +68660 1665 1591 +68680 1655 1882 +68680 1825 1884 +68680 1547 1870 +68680 1601 1911 +68680 1629 1911 +68680 1657 1487 +68680 1684 1880 +68680 1692 1839 +68680 1716 1870 +68680 1769 1487 +68680 1884 1890 +68680 1601 1629 +68680 1657 1769 +68680 1580 1628 +68680 1655 1786 +68680 1920 1636 +68680 1464 1482 +68680 1665 1591 +68700 1547 1870 +68700 1601 1911 +68700 1629 1911 +68700 1657 1487 +68700 1663 1818 +68700 1684 1880 +68700 1692 1839 +68700 1716 1870 +68700 1769 1487 +68700 1825 1890 +68700 1884 1890 +68700 1601 1629 +68700 1657 1769 +68700 1580 1628 +68700 1655 1786 +68700 1920 1636 +68700 1593 1890 +68700 1569 1742 +68700 1598 1541 +68700 1464 1482 +68700 1665 1591 +68720 1601 1629 +68720 1633 1684 +68720 1657 1769 +68720 1672 1877 +68720 1580 1628 +68720 1655 1786 +68720 1920 1636 +68720 1593 1890 +68720 1569 1742 +68720 1920 1605 +68720 1598 1541 +68720 1464 1482 +68720 1665 1591 +68740 1911 1563 +68740 1580 1628 +68740 1679 1575 +68740 1593 1825 +68740 1655 1786 +68740 1920 1636 +68740 1593 1890 +68740 1569 1742 +68740 1920 1605 +68740 1598 1541 +68740 1605 1636 +68740 1464 1482 +68740 1665 1591 +68760 1593 1825 +68760 1655 1786 +68760 1920 1636 +68760 1593 1890 +68760 1569 1742 +68760 1920 1605 +68760 1598 1541 +68760 1605 1636 +68760 1464 1482 +68760 1665 1591 +68780 1920 1636 +68780 1679 1575 +68780 1580 1628 +68780 1880 1787 +68780 1593 1890 +68780 1569 1742 +68780 1920 1605 +68780 1598 1541 +68780 1605 1636 +68780 1464 1482 +68780 1665 1591 +68800 1439 1660 +68800 1593 1890 +68800 1569 1742 +68800 1920 1605 +68800 1598 1541 +68800 1605 1636 +68800 1464 1482 +68800 1665 1591 +68820 1573 1786 +68820 1678 1458 +68820 1684 1513 +68820 1569 1742 +68820 1580 1628 +68820 1513 1786 +68820 1840 1767 +68820 1825 1890 +68820 1920 1605 +68820 1598 1541 +68820 1605 1636 +68820 1464 1482 +68820 1665 1591 +68840 1580 1839 +68840 1678 1684 +68840 1679 1699 +68840 1839 1870 +68840 1840 1767 +68840 1458 1742 +68840 1924 1593 +68840 1825 1890 +68840 1920 1605 +68840 1598 1541 +68840 1605 1636 +68840 1464 1482 +68840 1665 1591 +68860 1920 1636 +68860 1924 1593 +68860 1547 1684 +68860 1825 1890 +68860 1920 1605 +68860 1884 1890 +68860 1458 1772 +68860 1598 1541 +68860 1605 1636 +68860 1464 1482 +68860 1678 1786 +68860 1583 1825 +68860 1665 1591 +68880 1920 1605 +68880 1924 1478 +68880 1679 1575 +68880 1605 1870 +68880 1870 1636 +68880 1592 1877 +68880 1884 1890 +68880 1458 1772 +68880 1598 1541 +68880 1605 1636 +68880 1464 1482 +68880 1678 1786 +68880 1583 1825 +68880 1665 1591 +68900 1920 1699 +68900 1458 1772 +68900 1598 1541 +68900 1605 1636 +68900 1920 1870 +68900 1679 1628 +68900 1464 1482 +68900 1678 1786 +68900 1583 1825 +68900 1665 1591 +68920 1920 1870 +68920 1924 1593 +68920 1547 1692 +68920 1679 1628 +68920 1679 1575 +68920 1884 1890 +68920 1684 1767 +68920 1464 1482 +68920 1678 1786 +68920 1583 1825 +68920 1665 1591 +68940 1808 1772 +68940 1684 1767 +68940 1464 1482 +68940 1678 1786 +68940 1583 1825 +68940 1665 1591 +68960 1924 1593 +68960 1678 1786 +68960 1583 1825 +68960 1665 1591 +68960 1599 1655 +68980 1825 1519 +68980 1575 1628 +68980 1599 1772 +68980 1678 1786 +68980 1679 1575 +68980 1684 1767 +68980 1583 1825 +68980 1458 1772 +68980 1825 1890 +68980 1605 1636 +68980 1772 1655 +68980 1458 1655 +68980 1665 1591 +68980 1599 1655 +69000 1924 1593 +69000 1678 1786 +69000 1679 1575 +69000 1684 1767 +69000 1583 1825 +69000 1458 1772 +69000 1825 1890 +69000 1605 1636 +69000 1772 1655 +69000 1458 1655 +69000 1665 1591 +69000 1599 1655 +69000 1458 1599 +69020 1825 1890 +69020 1605 1636 +69020 1772 1655 +69020 1458 1655 +69020 1665 1591 +69020 1599 1655 +69020 1599 1772 +69020 1458 1599 +69040 1835 1605 +69040 1679 1575 +69040 1591 1786 +69040 1772 1655 +69040 1458 1655 +69040 1665 1591 +69040 1599 1655 +69040 1599 1772 +69040 1458 1599 +69060 1772 1655 +69060 1458 1655 +69060 1665 1591 +69060 1458 1772 +69060 1599 1655 +69060 1599 1772 +69060 1458 1599 +69080 1924 1593 +69080 1458 1655 +69080 1464 1482 +69080 1665 1591 +69080 1458 1772 +69080 1599 1655 +69080 1599 1772 +69080 1458 1599 +69100 1665 1591 +69100 1692 1591 +69100 1458 1772 +69100 1599 1655 +69100 1772 1655 +69100 1599 1772 +69100 1679 1575 +69100 1458 1599 +69120 1684 1767 +69120 1692 1716 +69120 1458 1655 +69120 1599 1655 +69120 1772 1655 +69120 1924 1593 +69120 1599 1772 +69120 1679 1575 +69120 1464 1482 +69120 1605 1636 +69120 1458 1599 +69140 1924 1593 +69140 1599 1772 +69140 1665 1591 +69140 1679 1575 +69140 1464 1482 +69140 1605 1636 +69140 1458 1599 +69160 1665 1591 +69160 1882 1772 +69160 1458 1772 +69160 1851 1787 +69160 1679 1575 +69160 1464 1482 +69160 1605 1636 +69160 1458 1599 +69160 1599 1655 +69180 1924 1593 +69180 1679 1575 +69180 1684 1767 +69180 1464 1482 +69180 1605 1636 +69180 1458 1599 +69180 1599 1655 +69200 1464 1482 +69200 1605 1636 +69200 1458 1599 +69200 1599 1655 +69220 1593 1786 +69220 1605 1636 +69220 1458 1599 +69220 1599 1655 +69240 1840 1767 +69240 1605 1636 +69240 1458 1655 +69240 1464 1482 +69240 1458 1599 +69240 1599 1655 +69260 1882 1655 +69260 1458 1655 +69260 1464 1482 +69260 1458 1599 +69260 1599 1655 +69280 1547 1692 +69280 1458 1655 +69280 1840 1767 +69280 1825 1519 +69280 1464 1482 +69280 1458 1599 +69280 1599 1655 +69300 1679 1575 +69300 1840 1767 +69300 1851 1787 +69300 1825 1519 +69300 1464 1482 +69300 1458 1599 +69300 1599 1655 +69320 1684 1767 +69320 1825 1519 +69320 1464 1482 +69320 1458 1599 +69320 1458 1655 +69320 1599 1655 +69340 1464 1482 +69340 1458 1599 +69340 1458 1655 +69340 1599 1655 +69360 1825 1519 +69360 1458 1599 +69360 1458 1655 +69360 1599 1655 +69380 1679 1575 +69380 1684 1840 +69380 1458 1599 +69380 1458 1655 +69380 1599 1655 +69400 1458 1599 +69400 1458 1655 +69400 1840 1767 +69400 1599 1655 +69400 1605 1636 +69400 1458 1772 +69420 1882 1599 +69420 1840 1767 +69420 1599 1655 +69420 1605 1636 +69420 1458 1772 +69440 1840 1489 +69440 1679 1575 +69440 1489 1767 +69440 1599 1655 +69440 1605 1636 +69440 1458 1772 +69460 1679 1575 +69460 1882 1599 +69460 1489 1767 +69460 1599 1655 +69460 1605 1636 +69460 1458 1772 +69480 1599 1655 +69480 1605 1636 +69480 1808 1716 +69480 1458 1772 +69500 1464 1482 +69500 1808 1716 +69500 1458 1772 +69520 1882 1599 +69520 1605 1636 +69520 1808 1716 +69520 1458 1772 +69540 1882 1599 +69540 1605 1636 +69540 1808 1716 +69540 1458 1772 +69560 1839 1660 +69560 1458 1599 +69560 1605 1636 +69560 1808 1716 +69560 1458 1772 +69580 1547 1692 +69580 1678 1761 +69580 1692 1660 +69580 1808 1716 +69580 1458 1772 +69600 1692 1660 +69600 1605 1636 +69600 1808 1716 +69600 1458 1772 +69620 1692 1605 +69620 1808 1716 +69620 1458 1772 +69640 1605 1636 +69640 1482 1655 +69640 1808 1716 +69640 1458 1772 +69660 1808 1716 +69660 1458 1772 +69680 1839 1660 +69680 1547 1808 +69680 1808 1716 +69680 1692 1660 +69680 1458 1772 +69680 1605 1636 +69700 1547 1808 +69700 1825 1884 +69700 1808 1716 +69700 1692 1660 +69700 1458 1772 +69700 1605 1636 +69720 1808 1716 +69720 1683 1692 +69720 1692 1660 +69720 1458 1772 +69720 1583 1655 +69720 1605 1636 +69740 1692 1660 +69740 1547 1808 +69740 1825 1519 +69740 1458 1772 +69740 1583 1655 +69740 1605 1636 +69760 1547 1808 +69760 1547 1599 +69760 1825 1519 +69760 1882 1599 +69760 1458 1772 +69760 1464 1482 +69760 1583 1655 +69760 1605 1636 +69780 1882 1599 +69780 1458 1772 +69780 1464 1482 +69780 1599 1786 +69780 1884 1519 +69780 1583 1655 +69780 1605 1636 +69800 1692 1660 +69800 1464 1482 +69800 1599 1786 +69800 1884 1519 +69800 1599 1655 +69800 1583 1655 +69800 1605 1636 +69820 1884 1519 +69820 1583 1599 +69820 1599 1655 +69820 1583 1655 +69820 1605 1636 +69840 1464 1482 +69840 1458 1772 +69840 1884 1519 +69840 1583 1599 +69840 1599 1655 +69840 1583 1655 +69840 1599 1786 +69840 1825 1519 +69840 1605 1636 +69860 1692 1660 +69860 1458 1772 +69860 1884 1519 +69860 1583 1599 +69860 1599 1655 +69860 1684 1451 +69860 1583 1655 +69860 1599 1786 +69860 1825 1519 +69860 1605 1636 +69880 1458 1772 +69880 1464 1482 +69880 1655 1786 +69880 1884 1519 +69880 1583 1599 +69880 1599 1655 +69880 1684 1451 +69880 1583 1786 +69880 1583 1655 +69880 1599 1786 +69880 1825 1519 +69880 1605 1636 +69900 1884 1519 +69900 1583 1599 +69900 1599 1655 +69900 1684 1451 +69900 1583 1786 +69900 1583 1655 +69900 1599 1786 +69900 1825 1519 +69900 1605 1636 +69920 1882 1786 +69920 1599 1655 +69920 1655 1786 +69920 1684 1451 +69920 1583 1786 +69920 1583 1655 +69920 1599 1882 +69920 1599 1786 +69920 1825 1519 +69920 1605 1636 +69940 1684 1451 +69940 1825 1884 +69940 1583 1786 +69940 1583 1599 +69940 1884 1519 +69940 1583 1655 +69940 1599 1882 +69940 1599 1786 +69940 1825 1519 +69940 1605 1636 +69960 1884 1519 +69960 1583 1519 +69960 1583 1655 +69960 1599 1882 +69960 1458 1772 +69960 1825 1583 +69960 1599 1786 +69960 1825 1519 +69960 1605 1636 +69980 1882 1786 +69980 1825 1884 +69980 1599 1655 +69980 1458 1772 +69980 1825 1583 +69980 1655 1786 +69980 1599 1786 +69980 1825 1519 +69980 1605 1636 +70000 1599 1655 +70000 1583 1519 +70000 1458 1772 +70000 1599 1882 +70000 1825 1583 +70000 1655 1786 +70000 1599 1786 +70000 1825 1519 +70000 1884 1519 +70000 1605 1636 +70020 1583 1519 +70020 1458 1772 +70020 1599 1882 +70020 1920 1598 +70020 1825 1583 +70020 1655 1786 +70020 1599 1786 +70020 1825 1519 +70020 1884 1519 +70020 1605 1636 +70040 1920 1598 +70040 1825 1583 +70040 1884 1583 +70040 1655 1786 +70040 1599 1786 +70040 1825 1519 +70040 1884 1519 +70040 1599 1655 +70040 1605 1636 +70060 1882 1786 +70060 1825 1884 +70060 1599 1786 +70060 1825 1519 +70060 1884 1519 +70060 1599 1655 +70060 1605 1636 +70060 1882 1599 +70080 1825 1884 +70080 1599 1786 +70080 1655 1786 +70080 1808 1716 +70080 1920 1598 +70080 1825 1519 +70080 1884 1519 +70080 1599 1655 +70080 1605 1636 +70080 1882 1599 +70100 1808 1716 +70100 1884 1583 +70100 1825 1583 +70100 1920 1598 +70100 1684 1451 +70100 1825 1519 +70100 1884 1519 +70100 1599 1655 +70100 1605 1636 +70100 1882 1599 +70100 1583 1519 +70120 1825 1583 +70120 1599 1786 +70120 1920 1598 +70120 1684 1451 +70120 1825 1519 +70120 1884 1519 +70120 1655 1786 +70120 1599 1655 +70120 1605 1636 +70120 1882 1599 +70120 1583 1519 +70140 1920 1598 +70140 1684 1451 +70140 1825 1519 +70140 1884 1519 +70140 1655 1786 +70140 1599 1655 +70140 1884 1583 +70140 1605 1636 +70140 1882 1599 +70140 1583 1519 +70160 1464 1482 +70160 1599 1655 +70160 1884 1583 +70160 1605 1636 +70160 1882 1599 +70160 1583 1825 +70160 1583 1519 +70180 1884 1583 +70180 1655 1786 +70180 1605 1636 +70180 1882 1599 +70180 1583 1825 +70180 1583 1519 +70200 1605 1636 +70200 1882 1599 +70200 1583 1825 +70200 1583 1519 +70200 1825 1519 +70200 1825 1884 +70220 1884 1519 +70220 1605 1636 +70220 1882 1599 +70220 1583 1825 +70220 1583 1519 +70220 1825 1519 +70220 1825 1884 +70220 1547 1808 +70240 1884 1519 +70240 1605 1636 +70240 1882 1599 +70240 1583 1825 +70240 1583 1519 +70240 1825 1519 +70240 1825 1884 +70240 1547 1808 +70260 1884 1583 +70260 1884 1519 +70260 1599 1655 +70260 1605 1636 +70260 1882 1599 +70260 1655 1786 +70260 1583 1825 +70260 1583 1519 +70260 1825 1519 +70260 1825 1884 +70260 1547 1808 +70260 1599 1786 +70280 1882 1599 +70280 1655 1786 +70280 1583 1825 +70280 1583 1519 +70280 1825 1519 +70280 1825 1884 +70280 1547 1808 +70280 1599 1786 +70300 1464 1482 +70300 1583 1825 +70300 1583 1519 +70300 1825 1519 +70300 1825 1884 +70300 1547 1808 +70300 1599 1786 +70300 1605 1636 +70320 1583 1825 +70320 1583 1519 +70320 1825 1519 +70320 1684 1767 +70320 1825 1884 +70320 1547 1808 +70320 1599 1786 +70320 1605 1636 +70340 1684 1767 +70340 1825 1884 +70340 1884 1519 +70340 1547 1808 +70340 1599 1786 +70340 1605 1636 +70360 1825 1519 +70360 1547 1808 +70360 1851 1787 +70360 1599 1786 +70360 1605 1636 +70380 1547 1808 +70380 1464 1482 +70380 1851 1787 +70380 1599 1786 +70380 1605 1636 +70400 1825 1519 +70400 1655 1786 +70400 1825 1884 +70400 1605 1636 +70420 1882 1786 +70420 1628 1463 +70420 1851 1787 +70420 1655 1786 +70420 1825 1884 +70420 1605 1636 +70440 1595 1654 +70440 1851 1787 +70440 1655 1786 +70440 1920 1598 +70440 1825 1884 +70440 1605 1636 +70460 1884 1519 +70460 1920 1598 +70460 1825 1519 +70460 1825 1884 +70460 1605 1636 +70480 1920 1598 +70480 1825 1519 +70480 1851 1787 +70480 1655 1786 +70480 1825 1884 +70480 1605 1636 +70480 1599 1655 +70500 1825 1655 +70500 1825 1599 +70500 1884 1599 +70500 1599 1882 +70500 1599 1519 +70500 1825 1884 +70500 1605 1636 +70500 1599 1655 +70520 1599 1519 +70520 1882 1519 +70520 1825 1884 +70520 1825 1519 +70520 1605 1636 +70520 1599 1655 +70540 1825 1884 +70540 1825 1519 +70540 1605 1636 +70540 1599 1655 +70560 1599 1786 +70560 1825 1519 +70560 1605 1636 +70560 1599 1655 +70580 1882 1599 +70580 1825 1786 +70580 1862 1519 +70580 1825 1519 +70580 1605 1636 +70580 1599 1655 +70600 1825 1655 +70600 1825 1884 +70600 1825 1519 +70600 1605 1636 +70600 1599 1655 +70620 1825 1884 +70620 1825 1519 +70620 1605 1636 +70620 1884 1519 +70620 1599 1655 +70640 1924 1478 +70640 1716 1605 +70640 1884 1519 +70640 1599 1655 +70660 1605 1636 +70660 1825 1884 +70660 1825 1519 +70660 1599 1655 +70680 1882 1655 +70680 1605 1636 +70680 1605 1503 +70680 1825 1884 +70680 1825 1519 +70680 1599 1655 +70700 1825 1884 +70700 1884 1519 +70700 1808 1716 +70700 1825 1519 +70700 1599 1655 +70700 1547 1808 +70720 1655 1786 +70720 1808 1716 +70720 1825 1519 +70720 1882 1655 +70720 1599 1655 +70720 1924 1478 +70720 1547 1808 +70740 1808 1716 +70740 1825 1884 +70740 1825 1519 +70740 1882 1655 +70740 1599 1655 +70740 1924 1478 +70740 1547 1808 +70760 1599 1655 +70760 1884 1519 +70760 1519 1655 +70760 1924 1478 +70760 1599 1786 +70760 1547 1808 +70780 1599 1519 +70780 1519 1655 +70780 1924 1478 +70780 1599 1786 +70780 1547 1808 +70780 1808 1716 +70800 1924 1478 +70800 1884 1519 +70800 1599 1786 +70800 1547 1808 +70800 1599 1655 +70800 1808 1716 +70820 1547 1808 +70820 1882 1786 +70820 1882 1599 +70820 1882 1655 +70820 1655 1786 +70820 1599 1655 +70820 1808 1716 +70840 1924 1478 +70840 1599 1655 +70840 1808 1716 +70860 1924 1553 +70860 1825 1519 +70860 1808 1716 +70880 1547 1808 +70880 1655 1786 +70880 1808 1716 +70900 1884 1519 +70900 1655 1786 +70900 1808 1716 +70900 1684 1463 +70920 1808 1716 +70920 1684 1463 +70920 1599 1786 +70940 1924 1553 +70940 1882 1599 +70940 1599 1786 +70940 1599 1655 +70940 1924 1478 +70960 1808 1716 +70960 1825 1628 +70960 1924 1478 +70980 1655 1786 +70980 1599 1655 +70980 1924 1478 +71000 1599 1655 +71000 1924 1478 +71000 1808 1716 +71020 1599 1786 +71020 1924 1478 +71020 1808 1716 +71040 1924 1478 +71040 1655 1786 +71040 1808 1716 +71060 1808 1716 +71080 1808 1716 +71080 1851 1787 +71080 1655 1786 +71100 1512 1786 +71100 1924 1478 +71100 1655 1786 +71120 1924 1478 +71120 1599 1512 +71120 1599 1655 +71120 1655 1786 +71140 1547 1808 +71140 1808 1716 +71180 1547 1808 +71180 1599 1512 +71180 1512 1655 +71180 1924 1478 +71200 1553 1825 +71200 1924 1478 +71220 1924 1478 +71220 1870 1851 +71240 1553 1825 +71240 1808 1716 +71240 1512 1655 +71240 1547 1808 +71260 1924 1478 +71260 1808 1716 +71260 1512 1655 +71260 1547 1808 +71280 1808 1716 +71280 1512 1655 +71280 1547 1808 +71300 1463 1628 +71300 1594 1475 +71300 1599 1655 +71300 1547 1808 +71320 1547 1808 +71340 1547 1808 +71340 1808 1716 +71340 1924 1478 +71360 1924 1478 +71380 1594 1475 +71400 1924 1478 +71400 1547 1808 +71420 1678 1870 +71420 1599 1512 +71440 1463 1628 +71440 1599 1512 +71440 1882 1655 +71460 1882 1655 +71480 1882 1655 +71500 1882 1655 +71520 1599 1512 +71520 1882 1655 +71580 1684 1628 +71600 1684 1463 +71600 1684 1628 +71620 1684 1628 +71640 1684 1628 +71660 1684 1628 +71720 1547 1808 +71720 1463 1628 +71720 1774 1716 +71760 1655 1599 +71780 1512 1655 +71780 1463 1628 +71800 1512 1599 +71800 1512 1655 +71800 1463 1628 +71820 1463 1628 +71920 1655 1882 +71980 1451 1684 +71980 1655 1599 +72020 1512 1599 +72060 1599 1512 +72080 1684 1451 +72100 1599 1512 +72180 1512 1599 +72220 1512 1599 +72220 1655 1599 +72240 1655 1599 +72260 1655 1599 +72300 1512 1599 +72320 1882 1655 +72460 1787 1851 +72620 1655 1882 +72640 1512 1599 +72660 1512 1599 +72660 1655 1599 +72700 1655 1599 +72720 1655 1599 +72780 1512 1599 +72800 1512 1599 +72820 1512 1599 +72840 1512 1599 +72900 1512 1599 +72940 1851 1787 +72960 1851 1787 +72980 1512 1599 +73040 1512 1599 +73040 1655 1599 +73060 1655 1599 +73080 1655 1882 +73080 1655 1599 +73120 1521 1655 +73120 1655 1599 +73160 1787 1851 +73160 1655 1599 +73180 1851 1521 +73240 1851 1593 +73260 1787 1593 +73260 1851 1593 +73280 1882 1599 +73280 1851 1593 +73300 1512 1599 +73300 1851 1593 +73300 1787 1851 +73320 1787 1851 +73340 1787 1851 +73340 1851 1521 +73360 1521 1593 +73380 1787 1851 +73380 1521 1593 +73380 1521 1851 +73380 1851 1593 +73400 1521 1593 +73400 1655 1599 +73400 1521 1851 +73400 1851 1593 +73420 1521 1851 +73420 1851 1593 +73440 1512 1599 +73440 1851 1593 +73460 1655 1882 +73460 1851 1593 +73460 1655 1599 +73480 1512 1655 +73480 1851 1593 +73480 1655 1599 +73500 1787 1851 +73500 1851 1593 +73500 1655 1599 +73520 1512 1599 +73520 1851 1593 +73520 1655 1599 +73540 1787 1593 +73600 1787 1851 +73600 1655 1599 +73620 1787 1851 +73620 1655 1599 +73680 1818 1663 +73700 1655 1599 +73700 1818 1663 +73720 1818 1663 +73720 1851 1787 +73800 1559 1599 +73820 1787 1851 +73820 1559 1599 +73840 1559 1599 +73860 1851 1787 +73880 1559 1599 +73900 1851 1452 +73900 1573 1452 +73900 1559 1599 +73900 1559 1791 +73900 1599 1791 +73920 1559 1791 +73920 1851 1787 +73920 1599 1791 +73940 1599 1791 +73960 1599 1791 +73980 1599 1791 +74020 1791 1599 +74020 1655 1599 +74040 1655 1599 +74080 1791 1559 +74080 1559 1655 +74100 1559 1655 +74120 1559 1599 +74120 1559 1655 +74120 1655 1599 +74140 1559 1882 +74140 1559 1655 +74140 1655 1599 +74180 1559 1599 +74200 1559 1655 +74880 1787 1851 +74940 1851 1787 +74960 1851 1787 +75300 1851 1787 +75340 1851 1787 +75360 1851 1787 +75380 1851 1787 +75400 1851 1787 +75420 1851 1787 +75460 1851 1716 +75540 1851 1787 +75620 1851 1787 +75880 1582 1622 +75900 1427 1622 +75900 1582 1593 +75900 1603 1527 +75920 1543 1597 +75920 1676 1562 +75920 1562 1630 +75920 1603 1493 +75940 1543 1676 +75940 1543 1613 +75940 1676 1504 +75940 1676 1613 +75940 1550 1580 +75940 1550 1439 +75940 1562 1443 +75940 1580 1613 +75940 1676 1580 +75940 1597 1613 +75960 1676 1580 +75960 1597 1613 +75960 1543 1550 +75980 1543 1550 +76000 1851 1787 +76000 1543 1550 +76020 1543 1562 +76020 1543 1550 +76020 1550 1562 +76020 1550 1526 +76040 1504 1613 +76140 1851 1787 +76160 1851 1787 +76180 1851 1787 +76240 1593 1787 +76320 1851 1787 +76360 1787 1851 +76380 1787 1851 +77460 1622 1562 +77480 1453 1467 +77500 1453 1467 +77540 1543 1467 +77540 1453 1467 +77540 1543 1453 +77560 1603 1467 +77560 1543 1453 +77560 1443 1545 +77580 1443 1545 +115900 1521 1593 +116980 1761 1550 +117000 1761 1550 +117020 1761 1550 +117080 1512 1547 +117100 1761 1550 +117100 1512 1547 +117120 1512 1547 +117180 1761 1531 +117200 1761 1531 +117220 1761 1550 +117220 1761 1531 +117240 1761 1550 +117240 1761 1531 +117240 1531 1550 +117260 1531 1658 +117260 1761 1531 +117260 1531 1550 +117280 1761 1658 +117280 1531 1658 +117280 1761 1531 +117280 1531 1550 +117300 1761 1531 +117300 1761 1550 +117300 1531 1550 +117320 1531 1550 +117340 1761 1531 +117360 1761 1531 +117360 1550 1531 +117380 1761 1531 +117380 1550 1531 +117540 1512 1531 +117560 1512 1531 +117620 1512 1531 +117640 1512 1531 +117660 1512 1531 +117680 1512 1531 +117720 1512 1531 +117740 1512 1531 +117760 1512 1547 +117760 1512 1531 +117800 1512 1531 +117820 1512 1531 +117840 1512 1531 +117860 1512 1531 +117880 1512 1531 +117900 1512 1531 +117960 1512 1531 +118000 1531 1512 +118000 1521 1593 +118020 1521 1593 +118040 1521 1593 +118040 1531 1512 +118060 1521 1593 +118060 1531 1512 +118080 1543 1582 +118080 1545 1512 +118080 1557 1468 +118080 1531 1512 +118080 1545 1531 +118100 1545 1512 +118100 1557 1468 +118100 1531 1512 +118100 1545 1531 +118100 1582 1512 +118100 1582 1531 +118100 1545 1582 +118120 1531 1512 +118120 1545 1531 +118120 1582 1512 +118120 1582 1531 +118120 1545 1582 +118140 1545 1531 +118140 1582 1512 +118140 1582 1531 +118140 1593 1521 +118140 1545 1582 +118160 1545 1582 +118180 1543 1550 +118180 1545 1582 +118200 1547 1512 +118240 1593 1521 +118260 1593 1521 +118280 1543 1550 +118280 1593 1521 +118300 1543 1550 +118300 1593 1521 +118320 1557 1558 +118320 1593 1521 +118340 1557 1468 +118340 1593 1521 +118360 1716 1512 +118380 1593 1521 +118400 1676 1761 +118400 1593 1521 +118400 1550 1513 +118420 1550 1513 +118460 1547 1512 +118460 1550 1526 +118460 1493 1531 +118480 1557 1468 +118480 1582 1513 +118480 1593 1521 +118500 1543 1550 +118500 1593 1521 +118520 1543 1526 +118520 1543 1550 +118520 1562 1787 +118520 1593 1521 +118540 1543 1550 +118540 1562 1787 +118540 1593 1521 +118540 1505 1893 +118560 1557 1468 +118560 1505 1893 +118580 1550 1740 +118580 1505 1893 +118600 1543 1526 +118600 1550 1740 +118600 1505 1893 +118600 1562 1593 +118620 1550 1740 +118620 1505 1893 +118620 1562 1593 +118640 1550 1775 +118640 1427 1715 +118640 1593 1787 +118640 1550 1434 +118640 1562 1593 +118660 1427 1715 +118660 1439 1761 +118660 1593 1787 +118660 1434 1775 +118660 1550 1434 +118660 1505 1893 +118660 1562 1593 +118680 1439 1453 +118680 1593 1787 +118680 1434 1775 +118680 1550 1434 +118680 1505 1893 +118680 1562 1593 +118700 1556 1894 +118700 1434 1775 +118700 1593 1521 +118700 1550 1434 +118700 1505 1893 +118700 1562 1593 +118700 1562 1521 +118720 1550 1434 +118720 1505 1893 +118720 1562 1593 +118720 1562 1521 +118740 1550 1775 +118740 1453 1590 +118740 1593 1521 +118740 1550 1434 +118740 1505 1893 +118740 1562 1593 +118740 1562 1521 +118760 1562 1787 +118760 1593 1521 +118760 1434 1775 +118760 1497 1893 +118760 1550 1434 +118760 1505 1893 +118760 1562 1593 +118760 1562 1521 +118780 1434 1775 +118780 1497 1893 +118780 1550 1434 +118780 1550 1775 +118780 1505 1893 +118780 1562 1593 +118780 1562 1521 +118800 1550 1434 +118800 1550 1775 +118800 1505 1893 +118800 1562 1593 +118800 1562 1521 +118820 1505 1893 +118820 1562 1593 +118820 1497 1893 +118820 1562 1521 +118840 1562 1593 +118840 1497 1505 +118840 1497 1893 +118840 1774 1521 +118840 1676 1761 +118840 1562 1521 +118840 1593 1521 +118840 1593 1774 +118860 1676 1761 +118860 1562 1521 +118860 1593 1521 +118860 1593 1787 +118860 1593 1774 +118880 1543 1434 +118880 1543 1775 +118880 1562 1593 +118900 1761 1740 +118900 1562 1593 +118920 1716 1599 +118920 1866 1505 +118920 1505 1893 +118920 1562 1593 +118920 1866 1893 +118940 1735 1465 +118940 1716 1599 +118940 1866 1505 +118940 1497 1893 +118940 1505 1893 +118940 1562 1593 +118940 1866 1893 +118960 1715 1740 +118960 1716 1655 +118960 1716 1599 +118960 1866 1505 +118960 1497 1893 +118960 1505 1893 +118960 1562 1593 +118960 1866 1893 +118980 1716 1599 +118980 1866 1505 +118980 1497 1893 +118980 1505 1893 +118980 1562 1593 +118980 1866 1893 +119000 1599 1512 +119000 1512 1655 +119000 1562 1593 +119000 1716 1655 +119000 1866 1893 +119020 1562 1593 +119020 1599 1655 +119020 1497 1893 +119020 1716 1655 +119020 1866 1893 +119040 1761 1676 +119040 1761 1740 +119040 1676 1740 +119040 1562 1593 +119040 1711 1877 +119040 1599 1655 +119040 1512 1655 +119040 1547 1655 +119040 1497 1893 +119040 1716 1655 +119040 1866 1893 +119060 1547 1655 +119060 1497 1893 +119060 1716 1655 +119060 1866 1893 +119080 1547 1655 +119080 1711 1479 +119080 1512 1655 +119080 1599 1655 +119080 1497 1893 +119080 1538 1655 +119080 1716 1655 +119080 1562 1593 +119080 1866 1893 +119100 1547 1716 +119100 1599 1655 +119100 1740 1761 +119100 1497 1893 +119100 1538 1655 +119100 1676 1761 +119100 1716 1655 +119100 1676 1740 +119100 1562 1593 +119100 1866 1893 +119120 1538 1655 +119120 1676 1761 +119120 1439 1453 +119120 1716 1655 +119120 1512 1655 +119120 1676 1740 +119120 1562 1593 +119120 1599 1512 +119120 1866 1893 +119140 1676 1740 +119140 1599 1655 +119140 1562 1593 +119140 1599 1512 +119140 1740 1761 +119140 1593 1768 +119140 1703 1900 +119140 1562 1768 +119140 1497 1893 +119140 1866 1893 +119160 1807 1742 +119160 1562 1593 +119160 1599 1512 +119160 1740 1761 +119160 1593 1768 +119160 1703 1900 +119160 1562 1768 +119160 1497 1893 +119160 1512 1655 +119160 1866 1893 +119180 1505 1866 +119180 1562 1768 +119180 1497 1893 +119180 1512 1655 +119180 1866 1893 +119200 1439 1894 +119200 1465 1735 +119200 1599 1512 +119200 1599 1655 +119200 1512 1655 +119200 1866 1893 +119220 1670 1908 +119220 1562 1768 +119220 1439 1894 +119220 1465 1735 +119220 1599 1512 +119220 1599 1655 +119220 1512 1655 +119220 1497 1893 +119220 1866 1893 +119240 1512 1655 +119240 1866 1505 +119240 1497 1893 +119240 1866 1893 +119260 1518 1604 +119260 1866 1505 +119260 1497 1893 +119260 1866 1893 +119280 1590 1771 +119280 1599 1655 +119280 1497 1893 +119280 1866 1893 +119300 1703 1900 +119300 1599 1655 +119300 1470 1530 +119300 1497 1893 +119300 1866 1893 +119320 1673 1652 +119320 1497 1893 +119320 1866 1893 +119340 1500 1511 +119340 1505 1893 +119340 1512 1655 +119340 1470 1530 +119340 1866 1893 +119360 1866 1893 +119360 1497 1893 +119400 1866 1497 +119420 1590 1771 +119480 1599 1655 +119500 1573 1530 +119500 1599 1655 +119520 1599 1655 +119540 1449 1599 +119540 1599 1655 +119540 1512 1655 +119540 1449 1655 +119540 1882 1655 +119560 1449 1655 +119560 1882 1655 +119580 1707 1764 +119580 1599 1655 +119580 1882 1655 +119600 1698 1764 +119600 1599 1655 +119600 1882 1655 +119600 1512 1655 +119600 1698 1707 +119600 1449 1599 +119620 1698 1707 +119620 1449 1599 +119640 1882 1655 +119660 1882 1655 +119660 1698 1707 +119680 1439 1640 +119680 1439 1590 +119680 1698 1707 +119700 1521 1919 +119720 1882 1655 +119720 1771 1914 +119720 1698 1707 +119740 1771 1914 +119740 1882 1599 +119740 1698 1707 +119760 1882 1599 +119760 1696 1499 +119760 1698 1707 +119780 1698 1521 +119780 1707 1521 +119780 1696 1791 +119780 1698 1707 +119800 1696 1791 +119800 1538 1524 +119800 1460 1499 +119800 1599 1882 +119800 1698 1707 +119820 1538 1524 +119820 1698 1473 +119820 1698 1465 +119820 1707 1453 +119820 1707 1473 +119820 1460 1499 +119820 1599 1882 +119820 1698 1707 +119840 1707 1473 +119840 1460 1499 +119840 1599 1882 +119840 1698 1707 +119860 1707 1453 +119860 1599 1882 +119860 1698 1707 +119880 1707 1473 +119880 1599 1882 +119880 1698 1707 +119900 1698 1453 +119900 1593 1787 +119900 1676 1761 +119900 1707 1473 +119900 1599 1882 +119900 1698 1707 +119920 1439 1492 +119920 1676 1761 +119920 1707 1473 +119920 1599 1882 +119920 1698 1707 +119940 1439 1698 +119940 1439 1707 +119940 1453 1502 +119940 1676 1761 +119940 1707 1473 +119940 1599 1882 +119940 1698 1707 +119960 1676 1761 +119960 1707 1473 +119960 1599 1882 +119960 1698 1707 +119980 1829 1886 +119980 1707 1473 +119980 1599 1882 +119980 1698 1707 +120000 1829 1886 +120000 1707 1473 +120000 1599 1882 +120000 1698 1707 +120020 1829 1886 +120020 1453 1492 +120020 1875 1498 +120020 1707 1473 +120020 1599 1882 +120020 1698 1707 +120040 1453 1492 +120040 1875 1498 +120040 1707 1473 +120040 1599 1882 +120040 1698 1707 +120060 1465 1789 +120060 1707 1473 +120060 1599 1882 +120060 1676 1761 +120060 1698 1707 +120080 1803 1623 +120080 1498 1593 +120080 1707 1473 +120080 1599 1882 +120080 1676 1761 +120080 1698 1707 +120100 1707 1473 +120100 1537 1521 +120100 1599 1882 +120100 1875 1593 +120100 1676 1761 +120100 1698 1707 +120120 1537 1521 +120120 1599 1882 +120120 1875 1593 +120120 1875 1498 +120120 1593 1498 +120120 1676 1761 +120120 1698 1707 +120140 1676 1761 +120140 1694 1599 +120140 1707 1473 +120140 1698 1707 +120160 1707 1473 +120160 1599 1882 +120160 1698 1707 +120180 1882 1593 +120180 1698 1707 +120200 1707 1473 +120200 1593 1599 +120200 1698 1707 +120220 1882 1599 +120220 1593 1599 +120220 1698 1707 +120240 1707 1473 +120240 1698 1707 +120260 1707 1473 +120260 1698 1707 +120280 1439 1707 +120280 1707 1453 +120280 1599 1882 +120280 1707 1473 +120280 1698 1707 +120300 1698 1473 +120300 1599 1882 +120300 1707 1473 +120300 1698 1707 +120320 1599 1882 +120320 1707 1473 +120320 1698 1707 +120340 1599 1593 +120340 1599 1882 +120340 1707 1473 +120340 1698 1707 +120360 1593 1882 +120360 1599 1882 +120360 1707 1473 +120360 1698 1707 +120380 1829 1886 +120380 1593 1882 +120380 1599 1882 +120380 1707 1473 +120380 1698 1707 +120400 1599 1882 +120400 1707 1473 +120400 1698 1707 +120420 1707 1473 +120420 1453 1473 +120420 1498 1521 +120420 1698 1707 +120440 1519 1825 +120440 1829 1886 +120440 1498 1521 +120440 1698 1707 +120460 1498 1521 +120460 1707 1473 +120460 1698 1707 +120480 1537 1829 +120480 1825 1519 +120480 1707 1473 +120480 1698 1707 +120500 1707 1473 +120500 1829 1886 +120500 1698 1707 +120520 1551 1269 +120520 1825 1519 +120520 1707 1473 +120520 1829 1886 +120520 1698 1707 +120540 1593 1512 +120540 1599 1512 +120540 1829 1886 +120540 1698 1707 +120560 1707 1473 +120560 1707 1453 +120560 1441 1269 +120560 1498 1521 +120560 1441 1857 +120560 1829 1886 +120560 1698 1707 +120580 1498 1521 +120580 1441 1857 +120580 1441 1918 +120580 1829 1886 +120580 1857 1269 +120580 1617 1269 +120580 1874 1906 +120580 1698 1707 +120600 1551 1269 +120600 1698 1707 +120600 1696 1598 +120600 1875 1598 +120620 1829 1886 +120620 1498 1521 +120620 1698 1707 +120620 1648 1598 +120620 1696 1598 +120620 1875 1598 +120640 1498 1521 +120640 1875 1696 +120640 1698 1707 +120640 1551 1269 +120640 1648 1598 +120640 1696 1598 +120640 1875 1598 +120660 1808 1441 +120660 1441 1617 +120660 1829 1886 +120660 1875 1696 +120660 1698 1707 +120660 1551 1269 +120660 1648 1598 +120660 1696 1598 +120660 1875 1598 +120680 1829 1886 +120680 1875 1696 +120680 1698 1707 +120680 1551 1269 +120680 1648 1598 +120680 1696 1598 +120680 1875 1598 +120700 1698 1707 +120700 1599 1512 +120700 1551 1269 +120700 1648 1598 +120700 1696 1598 +120700 1875 1598 +120720 1551 1269 +120720 1648 1598 +120720 1696 1598 +120720 1875 1598 +120740 1924 1478 +120740 1441 1857 +120740 1593 1512 +120740 1648 1598 +120740 1696 1598 +120740 1875 1598 +120760 1696 1598 +120760 1875 1598 +120780 1924 1478 +120780 1829 1886 +120780 1648 1598 +120780 1696 1598 +120780 1875 1598 +120780 1593 1512 +120800 1696 1875 +120800 1696 1598 +120800 1463 1628 +120800 1875 1598 +120800 1593 1512 +120820 1924 1478 +120820 1676 1761 +120820 1696 1598 +120820 1463 1628 +120820 1875 1598 +120820 1593 1512 +120840 1599 1882 +120840 1698 1707 +120840 1696 1875 +120860 1599 1882 +120860 1698 1707 +120860 1696 1875 +120880 1698 1707 +120880 1880 1905 +120880 1727 1845 +120880 1803 1623 +120880 1696 1875 +120880 1707 1453 +120880 1808 1595 +120900 1803 1623 +120900 1696 1875 +120900 1698 1453 +120900 1707 1453 +120900 1808 1595 +120920 1808 1595 +120920 1698 1707 +120940 1825 1519 +120940 1590 1771 +120940 1593 1787 +120960 1803 1623 +120960 1717 1598 +120960 1698 1707 +120960 1924 1478 +120960 1590 1771 +120960 1463 1628 +120960 1593 1787 +120980 1924 1478 +120980 1590 1771 +120980 1463 1628 +120980 1593 1787 +120980 1441 1617 +121000 1441 1617 +121000 1829 1886 +121000 1717 1857 +121000 1560 1580 +121020 1924 1478 +121020 1803 1623 +121020 1463 1628 +121020 1875 1519 +121020 1560 1580 +121040 1560 1580 +121040 1560 1461 +121040 1829 1886 +121060 1560 1580 +121060 1560 1461 +121060 1441 1617 +121060 1829 1886 +121060 1463 1628 +121060 1698 1707 +121080 1599 1512 +121080 1829 1886 +121080 1463 1628 +121080 1590 1771 +121080 1698 1707 +121100 1580 1560 +121100 1617 1628 +121100 1845 1727 +121100 1590 1771 +121100 1698 1707 +121120 1617 1628 +121120 1882 1512 +121120 1845 1727 +121120 1590 1771 +121120 1924 1478 +121120 1829 1886 +121120 1698 1707 +121140 1845 1727 +121140 1590 1771 +121140 1463 1628 +121140 1441 1617 +121140 1553 1519 +121140 1924 1478 +121140 1829 1886 +121140 1698 1707 +121160 1553 1519 +121160 1502 1906 +121160 1874 1906 +121160 1924 1478 +121160 1829 1886 +121160 1698 1707 +121180 1727 1659 +121180 1924 1478 +121180 1694 1617 +121180 1808 1829 +121180 1829 1886 +121180 1698 1707 +121200 1808 1886 +121200 1924 1478 +121200 1694 1617 +121200 1440 1854 +121200 1803 1623 +121200 1808 1829 +121200 1829 1886 +121200 1698 1707 +121220 1924 1478 +121220 1694 1617 +121220 1694 1441 +121220 1440 1854 +121220 1845 1659 +121220 1803 1623 +121220 1808 1829 +121220 1599 1512 +121220 1829 1886 +121220 1698 1707 +121240 1920 1598 +121240 1452 1453 +121240 1803 1623 +121240 1808 1829 +121240 1502 1906 +121240 1599 1512 +121240 1740 1761 +121240 1808 1886 +121240 1829 1886 +121240 1441 1617 +121240 1698 1707 +121260 1924 1478 +121260 1808 1886 +121260 1485 1529 +121260 1829 1886 +121260 1441 1617 +121260 1698 1707 +121280 1829 1886 +121280 1598 1920 +121280 1441 1617 +121280 1698 1707 +121300 1441 1617 +121300 1659 1845 +121300 1502 1906 +121300 1512 1599 +121300 1698 1707 +121320 1551 1697 +121320 1551 1269 +121320 1684 1595 +121320 1485 1529 +121320 1502 1906 +121320 1512 1599 +121320 1698 1707 +121340 1433 1845 +121340 1857 1617 +121340 1920 1598 +121340 1829 1886 +121340 1502 1906 +121340 1512 1599 +121340 1698 1707 +121360 1857 1617 +121360 1857 1441 +121360 1628 1886 +121360 1920 1598 +121360 1829 1886 +121360 1502 1906 +121360 1512 1599 +121360 1698 1707 +121380 1920 1598 +121380 1684 1595 +121380 1825 1519 +121380 1441 1617 +121380 1829 1886 +121380 1882 1512 +121380 1502 1906 +121380 1512 1599 +121380 1698 1707 +121400 1502 1906 +121400 1698 1453 +121400 1512 1599 +121400 1551 1269 +121400 1441 1857 +121400 1698 1707 +121420 1697 1551 +121420 1882 1512 +121420 1551 1269 +121420 1684 1595 +121420 1441 1857 +121420 1698 1707 +121440 1551 1269 +121440 1684 1595 +121440 1599 1512 +121440 1727 1845 +121440 1485 1529 +121440 1829 1886 +121440 1441 1857 +121440 1502 1906 +121440 1698 1707 +121460 1829 1886 +121460 1441 1857 +121460 1552 1761 +121460 1502 1906 +121460 1698 1453 +121460 1698 1707 +121480 1441 1857 +121480 1552 1761 +121480 1502 1906 +121480 1698 1453 +121480 1590 1771 +121480 1599 1512 +121480 1698 1707 +121500 1727 1845 +121500 1829 1886 +121500 1698 1707 +121520 1599 1512 +121520 1502 1906 +121520 1698 1707 +121540 1698 1453 +121540 1453 1492 +121540 1441 1617 +121540 1829 1886 +121540 1698 1707 +121560 1551 1269 +121560 1502 1906 +121560 1599 1512 +121560 1718 1889 +121560 1829 1886 +121560 1845 1727 +121560 1698 1707 +121580 1920 1598 +121580 1829 1886 +121580 1845 1727 +121580 1698 1707 +121600 1502 1906 +121600 1920 1598 +121600 1829 1886 +121600 1845 1727 +121600 1698 1707 +121620 1920 1598 +121620 1551 1269 +121620 1684 1617 +121620 1560 1880 +121620 1825 1628 +121620 1829 1886 +121620 1845 1727 +121620 1698 1707 +121640 1825 1628 +121640 1829 1886 +121640 1599 1882 +121640 1850 1868 +121640 1857 1617 +121640 1441 1684 +121640 1845 1727 +121640 1698 1707 +121660 1698 1453 +121660 1850 1868 +121660 1857 1617 +121660 1593 1592 +121660 1441 1684 +121660 1560 1880 +121660 1502 1906 +121660 1845 1727 +121660 1485 1529 +121660 1698 1707 +121680 1441 1684 +121680 1560 1880 +121680 1502 1906 +121680 1845 1727 +121680 1485 1529 +121680 1698 1707 +121700 1502 1906 +121700 1845 1727 +121700 1850 1868 +121700 1485 1529 +121700 1698 1707 +121720 1767 1684 +121720 1697 1269 +121720 1850 1868 +121720 1551 1269 +121720 1512 1599 +121720 1771 1914 +121720 1485 1529 +121720 1560 1880 +121720 1698 1707 +121740 1803 1623 +121740 1698 1453 +121740 1485 1529 +121740 1560 1880 +121740 1441 1767 +121740 1502 1906 +121740 1698 1707 +121760 1580 1448 +121760 1560 1880 +121760 1441 1767 +121760 1727 1845 +121760 1868 1850 +121760 1502 1906 +121760 1698 1707 +121760 1551 1269 +121760 1857 1617 +121780 1694 1696 +121780 1698 1707 +121780 1829 1886 +121780 1551 1269 +121780 1857 1617 +121800 1599 1512 +121800 1857 1617 +121820 1599 1531 +121820 1502 1906 +121820 1694 1696 +121820 1829 1886 +121820 1857 1617 +121840 1857 1617 +121840 1551 1269 +121860 1684 1770 +121860 1694 1696 +121860 1825 1875 +121860 1699 1551 +121860 1593 1880 +121860 1551 1269 +121860 1502 1906 +121860 1512 1599 +121860 1698 1707 +121880 1924 1478 +121880 1684 1628 +121880 1684 1463 +121880 1829 1886 +121880 1502 1906 +121880 1512 1599 +121880 1617 1857 +121880 1698 1707 +121880 1727 1845 +121900 1694 1696 +121900 1583 1519 +121900 1551 1269 +121900 1617 1857 +121900 1698 1707 +121900 1727 1845 +121920 1583 1519 +121920 1441 1617 +121920 1551 1269 +121920 1617 1857 +121920 1698 1707 +121920 1727 1845 +121940 1551 1269 +121940 1617 1857 +121940 1698 1707 +121940 1727 1845 +121960 1920 1915 +121960 1684 1628 +121960 1696 1648 +121960 1829 1886 +121960 1583 1519 +121960 1512 1599 +121960 1617 1857 +121960 1441 1617 +121960 1698 1707 +121960 1727 1845 +121980 1574 1527 +121980 1875 1770 +121980 1617 1857 +121980 1441 1617 +121980 1698 1707 +121980 1727 1845 +122000 1599 1512 +122000 1599 1882 +122000 1617 1857 +122000 1920 1915 +122000 1441 1617 +122000 1698 1707 +122000 1727 1845 +122000 1551 1269 +122020 1920 1915 +122020 1441 1617 +122020 1792 1885 +122020 1698 1707 +122020 1829 1886 +122020 1727 1845 +122020 1769 1657 +122020 1551 1269 +122040 1792 1885 +122040 1698 1707 +122040 1829 1886 +122040 1727 1845 +122040 1769 1657 +122040 1551 1269 +122060 1441 1880 +122060 1882 1599 +122060 1769 1657 +122060 1551 1269 +122080 1803 1623 +122080 1684 1770 +122080 1885 1638 +122080 1684 1855 +122080 1551 1269 +122100 1684 1855 +122100 1845 1727 +122100 1920 1915 +122100 1551 1269 +122100 1707 1453 +122100 1698 1707 +122100 1792 1885 +122120 1920 1915 +122120 1551 1269 +122120 1529 1485 +122120 1707 1453 +122120 1599 1882 +122120 1498 1755 +122120 1885 1638 +122120 1698 1707 +122120 1792 1885 +122120 1574 1887 +122140 1698 1707 +122140 1792 1885 +122140 1574 1887 +122160 1920 1727 +122160 1698 1707 +122160 1885 1529 +122160 1502 1906 +122160 1792 1885 +122160 1574 1887 +122160 1915 1920 +122160 1583 1519 +122180 1551 1269 +122180 1792 1885 +122180 1574 1887 +122180 1915 1920 +122180 1583 1519 +122180 1684 1855 +122200 1599 1512 +122200 1599 1882 +122200 1465 1789 +122200 1792 1885 +122200 1727 1845 +122200 1574 1887 +122200 1915 1920 +122200 1583 1519 +122200 1684 1855 +122220 1792 1885 +122220 1502 1906 +122220 1727 1845 +122220 1574 1887 +122220 1915 1920 +122220 1583 1519 +122220 1684 1855 +122240 1574 1887 +122240 1770 1792 +122240 1880 1885 +122240 1915 1920 +122240 1583 1519 +122240 1684 1855 +122260 1435 1755 +122260 1696 1875 +122260 1583 1519 +122260 1519 1885 +122260 1583 1792 +122260 1880 1628 +122260 1583 1885 +122260 1551 1269 +122260 1684 1855 +122260 1707 1698 +122280 1575 1679 +122280 1583 1792 +122280 1880 1628 +122280 1727 1845 +122280 1583 1885 +122280 1551 1269 +122280 1684 1855 +122280 1707 1698 +122300 1880 1628 +122300 1502 1906 +122300 1727 1845 +122300 1792 1885 +122300 1583 1885 +122300 1583 1519 +122300 1700 1598 +122300 1551 1269 +122300 1684 1855 +122300 1707 1698 +122320 1792 1885 +122320 1792 1583 +122320 1583 1884 +122320 1583 1885 +122320 1583 1519 +122320 1700 1598 +122320 1551 1269 +122320 1684 1855 +122320 1855 1770 +122320 1707 1698 +122340 1551 1269 +122340 1684 1855 +122340 1599 1519 +122340 1855 1770 +122340 1707 1698 +122340 1583 1599 +122360 1792 1885 +122360 1707 1698 +122360 1583 1519 +122360 1583 1599 +122380 1920 1700 +122380 1707 1698 +122380 1551 1269 +122380 1825 1599 +122380 1599 1519 +122380 1583 1519 +122380 1845 1727 +122380 1583 1599 +122400 1583 1519 +122400 1845 1727 +122400 1679 1885 +122400 1825 1519 +122400 1792 1770 +122400 1583 1599 +122400 1792 1885 +122420 1880 1825 +122420 1880 1583 +122420 1599 1825 +122420 1628 1463 +122420 1825 1519 +122420 1792 1770 +122420 1575 1770 +122420 1551 1269 +122420 1583 1599 +122420 1792 1885 +122420 1792 1575 +122420 1575 1885 +122440 1792 1770 +122440 1575 1770 +122440 1583 1825 +122440 1679 1770 +122440 1885 1770 +122440 1698 1707 +122440 1551 1269 +122440 1583 1599 +122440 1792 1885 +122440 1792 1575 +122440 1575 1885 +122460 1599 1825 +122460 1698 1707 +122460 1551 1269 +122460 1583 1599 +122460 1792 1885 +122460 1792 1575 +122460 1575 1885 +122480 1684 1855 +122480 1551 1269 +122480 1677 1701 +122480 1583 1599 +122480 1792 1885 +122480 1792 1575 +122480 1575 1885 +122500 1551 1269 +122500 1583 1825 +122500 1592 1433 +122500 1599 1825 +122500 1677 1701 +122500 1924 1478 +122500 1583 1599 +122500 1792 1885 +122500 1792 1575 +122500 1575 1885 +122520 1727 1845 +122520 1583 1599 +122520 1698 1707 +122520 1792 1885 +122520 1792 1575 +122520 1575 1885 +122540 1583 1599 +122540 1698 1707 +122540 1792 1885 +122540 1792 1575 +122540 1575 1885 +122560 1803 1623 +122560 1551 1269 +122560 1727 1845 +122560 1463 1599 +122560 1698 1707 +122560 1599 1628 +122560 1792 1885 +122560 1792 1575 +122560 1575 1885 +122560 1825 1583 +122580 1924 1478 +122580 1698 1707 +122580 1599 1628 +122580 1825 1519 +122580 1792 1885 +122580 1792 1575 +122580 1575 1885 +122580 1825 1583 +122600 1599 1628 +122600 1583 1519 +122600 1727 1845 +122600 1825 1519 +122600 1551 1269 +122600 1792 1885 +122600 1599 1437 +122600 1792 1575 +122600 1575 1885 +122600 1825 1583 +122620 1684 1857 +122620 1727 1845 +122620 1825 1519 +122620 1551 1269 +122620 1792 1885 +122620 1599 1437 +122620 1792 1575 +122620 1575 1885 +122620 1829 1886 +122620 1825 1583 +122640 1679 1792 +122640 1727 1845 +122640 1825 1519 +122640 1921 1462 +122640 1551 1269 +122640 1583 1519 +122640 1628 1767 +122640 1792 1885 +122640 1599 1437 +122640 1792 1575 +122640 1575 1885 +122640 1829 1886 +122640 1825 1583 +122660 1551 1269 +122660 1583 1519 +122660 1628 1767 +122660 1792 1885 +122660 1599 1437 +122660 1684 1857 +122660 1792 1575 +122660 1575 1885 +122660 1829 1886 +122660 1825 1583 +122680 1599 1437 +122680 1684 1857 +122680 1792 1575 +122680 1575 1885 +122680 1829 1886 +122680 1825 1583 +122700 1792 1575 +122700 1575 1885 +122700 1628 1767 +122700 1829 1886 +122700 1583 1519 +122700 1882 1920 +122700 1699 1886 +122700 1825 1583 +122720 1845 1727 +122720 1628 1767 +122720 1924 1478 +122720 1829 1886 +122720 1699 1829 +122720 1583 1519 +122720 1882 1920 +122720 1699 1886 +122720 1825 1583 +122740 1924 1478 +122740 1829 1886 +122740 1463 1628 +122740 1792 1885 +122740 1699 1829 +122740 1595 1767 +122740 1583 1519 +122740 1882 1920 +122740 1906 1502 +122740 1699 1886 +122740 1825 1583 +122760 1551 1269 +122760 1592 1880 +122760 1771 1914 +122760 1792 1885 +122760 1699 1829 +122760 1845 1727 +122760 1595 1767 +122760 1583 1519 +122760 1882 1920 +122760 1906 1502 +122760 1699 1886 +122760 1825 1583 +122780 1792 1885 +122780 1699 1829 +122780 1845 1727 +122780 1595 1767 +122780 1583 1519 +122780 1882 1920 +122780 1906 1502 +122780 1699 1886 +122780 1825 1583 +122800 1583 1519 +122800 1882 1920 +122800 1551 1269 +122800 1906 1502 +122800 1699 1886 +122800 1825 1583 +122800 1829 1886 +122820 1579 1500 +122820 1595 1767 +122820 1789 1465 +122820 1918 1500 +122820 1551 1269 +122820 1906 1502 +122820 1699 1829 +122820 1699 1886 +122820 1825 1583 +122820 1829 1886 +122840 1583 1519 +122840 1628 1463 +122840 1727 1845 +122840 1551 1269 +122840 1906 1502 +122840 1699 1829 +122840 1699 1886 +122840 1825 1583 +122840 1829 1886 +122860 1551 1269 +122860 1608 1530 +122860 1918 1495 +122860 1789 1465 +122860 1906 1502 +122860 1699 1829 +122860 1699 1886 +122860 1825 1583 +122860 1829 1886 +122880 1590 1871 +122880 1707 1453 +122880 1789 1465 +122880 1906 1502 +122880 1825 1519 +122880 1699 1829 +122880 1699 1886 +122880 1825 1583 +122880 1829 1886 +122900 1551 1269 +122900 1825 1519 +122900 1583 1519 +122900 1699 1829 +122900 1699 1886 +122900 1825 1583 +122900 1829 1886 +122920 1555 1734 +122920 1595 1767 +122920 1608 1530 +122920 1614 1698 +122920 1633 1465 +122920 1707 1492 +122920 1825 1519 +122920 1428 1495 +122920 1583 1519 +122920 1699 1829 +122920 1699 1886 +122920 1698 1707 +122920 1825 1583 +122920 1829 1886 +122940 1551 1269 +122940 1623 1894 +122940 1698 1473 +122940 1698 1894 +122940 1707 1465 +122940 1707 1771 +122940 1789 1465 +122940 1866 1452 +122940 1874 1502 +122940 1894 1452 +122940 1906 1502 +122940 1452 1492 +122940 1465 1492 +122940 1583 1519 +122940 1699 1829 +122940 1699 1886 +122940 1698 1707 +122940 1825 1583 +122940 1829 1886 +122960 1583 1519 +122960 1595 1767 +122960 1699 1829 +122960 1699 1886 +122960 1862 1486 +122960 1892 1898 +122960 1698 1707 +122960 1894 1492 +122960 1825 1583 +122960 1829 1886 +122980 1698 1707 +122980 1825 1884 +122980 1894 1492 +122980 1825 1583 +122980 1829 1886 +123000 1628 1463 +123000 1477 1892 +123000 1892 1898 +123000 1825 1583 +123000 1829 1886 +123020 1551 1269 +123020 1825 1519 +123020 1892 1898 +123020 1825 1583 +123020 1829 1886 +123040 1465 1735 +123040 1700 1659 +123040 1590 1871 +123040 1892 1898 +123040 1825 1583 +123040 1829 1886 +123060 1687 1841 +123060 1628 1463 +123060 1825 1519 +123060 1583 1519 +123060 1825 1583 +123060 1829 1886 +123080 1583 1525 +123080 1628 1463 +123080 1687 1901 +123080 1825 1519 +123080 1583 1519 +123080 1825 1583 +123080 1829 1886 +123100 1551 1269 +123100 1740 1919 +123100 1825 1519 +123100 1583 1519 +123100 1825 1583 +123100 1829 1886 +123120 1880 1886 +123120 1813 1659 +123120 1841 1901 +123120 1477 1892 +123120 1583 1519 +123120 1825 1583 +123120 1829 1886 +123140 1664 1821 +123140 1583 1519 +123140 1593 1787 +123140 1892 1898 +123140 1551 1269 +123140 1829 1880 +123140 1463 1628 +123140 1749 1757 +123140 1684 1441 +123140 1825 1583 +123140 1829 1886 +123160 1551 1269 +123160 1829 1880 +123160 1463 1628 +123160 1477 1898 +123160 1880 1886 +123160 1698 1707 +123160 1749 1757 +123160 1684 1441 +123160 1825 1583 +123160 1829 1886 +123180 1551 1882 +123180 1593 1512 +123180 1477 1898 +123180 1880 1886 +123180 1813 1659 +123180 1698 1707 +123180 1749 1757 +123180 1684 1441 +123180 1825 1519 +123180 1583 1519 +123180 1825 1583 +123180 1829 1886 +123200 1670 1908 +123200 1813 1659 +123200 1698 1707 +123200 1749 1757 +123200 1684 1441 +123200 1825 1519 +123200 1583 1519 +123200 1825 1583 +123200 1829 1886 +123220 1808 1908 +123220 1684 1441 +123220 1439 1453 +123220 1884 1825 +123220 1477 1892 +123220 1825 1519 +123220 1892 1898 +123220 1583 1519 +123220 1825 1583 +123220 1829 1886 +123220 1551 1269 +123240 1549 1825 +123240 1811 1876 +123240 1583 1519 +123240 1825 1583 +123240 1829 1886 +123240 1551 1269 +123260 1813 1659 +123260 1825 1583 +123260 1884 1583 +123260 1684 1628 +123260 1829 1886 +123260 1670 1908 +123260 1551 1269 +123280 1549 1825 +123280 1453 1439 +123280 1684 1628 +123280 1816 1881 +123280 1829 1886 +123280 1670 1908 +123280 1551 1269 +123300 1684 1628 +123300 1816 1881 +123300 1796 1899 +123300 1829 1886 +123300 1670 1908 +123300 1551 1269 +123300 1694 1880 +123320 1670 1908 +123320 1551 1269 +123320 1694 1880 +123320 1583 1525 +123340 1670 1908 +123340 1551 1269 +123340 1694 1880 +123340 1583 1525 +123360 1670 1908 +123360 1825 1519 +123360 1549 1884 +123360 1551 1269 +123360 1694 1880 +123360 1583 1525 +123380 1549 1884 +123380 1551 1269 +123380 1684 1767 +123380 1813 1659 +123380 1583 1825 +123380 1829 1886 +123380 1694 1880 +123380 1583 1525 +123400 1684 1617 +123400 1816 1721 +123400 1816 1881 +123400 1816 1823 +123400 1829 1886 +123400 1694 1880 +123400 1583 1525 +123420 1816 1823 +123420 1439 1453 +123420 1829 1886 +123420 1694 1880 +123420 1583 1525 +123440 1439 1453 +123440 1704 1643 +123440 1829 1886 +123440 1694 1880 +123440 1583 1525 +123460 1670 1908 +123460 1684 1617 +123460 1761 1643 +123460 1551 1269 +123460 1531 1512 +123460 1829 1886 +123460 1813 1659 +123460 1694 1880 +123460 1583 1525 +123480 1551 1269 +123480 1531 1512 +123480 1829 1886 +123480 1439 1453 +123480 1813 1659 +123480 1694 1880 +123480 1583 1525 +123500 1549 1583 +123500 1684 1441 +123500 1439 1453 +123500 1704 1643 +123500 1813 1659 +123500 1694 1880 +123500 1531 1599 +123500 1583 1525 +123520 1670 1908 +123520 1813 1659 +123520 1694 1880 +123520 1531 1599 +123520 1583 1525 +123540 1813 1704 +123540 1813 1659 +123540 1694 1880 +123540 1531 1599 +123540 1583 1525 +123560 1684 1463 +123560 1694 1880 +123560 1512 1531 +123560 1829 1886 +123560 1599 1512 +123560 1531 1599 +123560 1583 1525 +123580 1829 1886 +123580 1599 1512 +123580 1920 1704 +123580 1920 1643 +123580 1628 1783 +123580 1531 1599 +123580 1583 1525 +123600 1920 1704 +123600 1920 1643 +123600 1628 1783 +123600 1628 1463 +123600 1531 1599 +123600 1704 1643 +123600 1583 1525 +123600 1694 1829 +123620 1884 1583 +123620 1549 1583 +123620 1704 1643 +123620 1670 1908 +123620 1540 1542 +123620 1583 1525 +123620 1694 1829 +123640 1540 1542 +123640 1593 1521 +123640 1583 1525 +123640 1694 1829 +123660 1825 1519 +123660 1704 1839 +123660 1670 1908 +123660 1583 1525 +123660 1704 1643 +123660 1694 1829 +123680 1670 1908 +123680 1884 1583 +123680 1583 1525 +123680 1549 1583 +123680 1704 1643 +123680 1684 1908 +123680 1694 1829 +123700 1549 1583 +123700 1704 1643 +123700 1684 1908 +123700 1783 1531 +123700 1694 1829 +123720 1670 1684 +123720 1808 1628 +123720 1808 1583 +123720 1583 1767 +123720 1704 1643 +123720 1684 1908 +123720 1783 1531 +123720 1694 1886 +123720 1694 1829 +123720 1829 1886 +123740 1684 1908 +123740 1439 1453 +123740 1583 1463 +123740 1783 1531 +123740 1694 1886 +123740 1694 1829 +123740 1829 1886 +123760 1808 1628 +123760 1813 1659 +123760 1549 1525 +123760 1694 1886 +123760 1694 1829 +123760 1829 1886 +123780 1679 1575 +123780 1808 1583 +123780 1549 1525 +123780 1694 1886 +123780 1694 1829 +123780 1583 1519 +123780 1684 1908 +123780 1829 1886 +123800 1628 1808 +123800 1813 1659 +123800 1463 1531 +123800 1549 1525 +123800 1694 1886 +123800 1531 1628 +123800 1694 1829 +123800 1583 1519 +123800 1684 1908 +123800 1829 1886 +123820 1670 1908 +123820 1549 1525 +123820 1694 1886 +123820 1531 1628 +123820 1694 1829 +123820 1583 1519 +123820 1684 1908 +123820 1829 1886 +123820 1583 1531 +123840 1670 1684 +123840 1813 1659 +123840 1694 1829 +123840 1583 1519 +123840 1583 1825 +123840 1531 1825 +123840 1463 1628 +123840 1593 1521 +123840 1684 1908 +123840 1829 1886 +123840 1583 1531 +123860 1924 1808 +123860 1583 1825 +123860 1531 1825 +123860 1463 1628 +123860 1593 1521 +123860 1549 1525 +123860 1825 1519 +123860 1684 1908 +123860 1829 1886 +123860 1583 1531 +123880 1593 1521 +123880 1670 1684 +123880 1549 1525 +123880 1825 1519 +123880 1684 1908 +123880 1829 1886 +123880 1583 1531 +123900 1670 1684 +123900 1549 1525 +123900 1825 1519 +123900 1575 1704 +123900 1583 1519 +123900 1684 1908 +123900 1583 1825 +123900 1531 1825 +123900 1829 1886 +123900 1670 1908 +123900 1583 1531 +123920 1531 1519 +123920 1825 1519 +123920 1575 1704 +123920 1583 1519 +123920 1684 1908 +123920 1583 1825 +123920 1531 1825 +123920 1829 1886 +123920 1670 1908 +123920 1583 1531 +123920 1593 1521 +123920 1599 1882 +123940 1924 1478 +123940 1549 1825 +123940 1684 1908 +123940 1583 1825 +123940 1694 1886 +123940 1531 1825 +123940 1549 1525 +123940 1857 1617 +123940 1829 1886 +123940 1670 1908 +123940 1583 1531 +123940 1593 1521 +123940 1599 1882 +123960 1549 1525 +123960 1679 1643 +123960 1813 1659 +123960 1857 1617 +123960 1441 1617 +123960 1829 1886 +123960 1670 1684 +123960 1670 1908 +123960 1575 1704 +123960 1575 1643 +123960 1583 1531 +123960 1593 1521 +123960 1599 1882 +123980 1441 1617 +123980 1829 1886 +123980 1670 1684 +123980 1670 1908 +123980 1684 1908 +123980 1575 1704 +123980 1575 1643 +123980 1583 1531 +123980 1593 1521 +123980 1599 1882 +124000 1829 1643 +124000 1829 1886 +124000 1704 1886 +124000 1670 1684 +124000 1670 1908 +124000 1684 1908 +124000 1575 1704 +124000 1575 1643 +124000 1583 1531 +124000 1593 1521 +124000 1599 1882 +124020 1441 1617 +124020 1857 1617 +124020 1670 1684 +124020 1670 1908 +124020 1684 1908 +124020 1575 1704 +124020 1575 1643 +124020 1583 1531 +124020 1593 1521 +124020 1599 1882 +124020 1825 1519 +124040 1549 1829 +124040 1825 1531 +124040 1441 1617 +124040 1441 1857 +124040 1463 1767 +124040 1857 1617 +124040 1670 1684 +124040 1670 1908 +124040 1684 1908 +124040 1575 1704 +124040 1575 1643 +124040 1583 1531 +124040 1593 1521 +124040 1599 1882 +124040 1829 1886 +124040 1825 1519 +124060 1670 1684 +124060 1670 1908 +124060 1684 1908 +124060 1813 1659 +124060 1575 1704 +124060 1575 1643 +124060 1583 1531 +124060 1593 1521 +124060 1599 1882 +124060 1829 1886 +124060 1825 1519 +124080 1704 1643 +124080 1575 1704 +124080 1575 1643 +124080 1583 1531 +124080 1593 1521 +124080 1599 1882 +124080 1829 1886 +124080 1825 1519 +124100 1575 1704 +124100 1575 1643 +124100 1583 1531 +124100 1593 1521 +124100 1599 1882 +124100 1829 1886 +124100 1825 1519 +124120 1531 1829 +124120 1829 1525 +124120 1583 1531 +124120 1684 1783 +124120 1593 1521 +124120 1599 1882 +124120 1670 1908 +124120 1829 1886 +124120 1825 1519 +124140 1829 1563 +124140 1575 1643 +124140 1583 1531 +124140 1684 1783 +124140 1593 1521 +124140 1599 1882 +124140 1670 1908 +124140 1829 1886 +124140 1825 1519 +124140 1441 1617 +124160 1575 1704 +124160 1704 1643 +124160 1583 1531 +124160 1684 1783 +124160 1563 1592 +124160 1593 1521 +124160 1599 1882 +124160 1670 1908 +124160 1829 1886 +124160 1825 1519 +124160 1441 1617 +124180 1684 1783 +124180 1563 1592 +124180 1593 1521 +124180 1825 1583 +124180 1599 1882 +124180 1670 1908 +124180 1829 1886 +124180 1825 1519 +124180 1441 1617 +124200 1825 1583 +124200 1583 1525 +124200 1583 1519 +124200 1599 1882 +124200 1670 1908 +124200 1829 1886 +124200 1825 1519 +124200 1441 1617 +124220 1920 1563 +124220 1920 1643 +124220 1563 1592 +124220 1599 1882 +124220 1553 1583 +124220 1670 1908 +124220 1829 1886 +124220 1825 1519 +124220 1441 1617 +124240 1563 1592 +124240 1599 1882 +124240 1553 1583 +124240 1825 1583 +124240 1583 1519 +124240 1670 1908 +124240 1829 1886 +124240 1825 1519 +124240 1441 1617 +124260 1553 1825 +124260 1553 1583 +124260 1813 1659 +124260 1825 1583 +124260 1583 1519 +124260 1670 1908 +124260 1829 1886 +124260 1825 1519 +124260 1441 1617 +124280 1670 1908 +124280 1829 1886 +124280 1549 1583 +124280 1825 1519 +124280 1441 1617 +124280 1583 1525 +124300 1829 1886 +124300 1549 1583 +124300 1825 1519 +124300 1531 1783 +124300 1441 1617 +124300 1583 1525 +124320 1684 1840 +124320 1829 1886 +124320 1549 1583 +124320 1825 1519 +124320 1531 1783 +124320 1441 1617 +124320 1549 1525 +124320 1583 1525 +124320 1670 1908 +124340 1669 1754 +124340 1549 1583 +124340 1825 1519 +124340 1840 1463 +124340 1531 1783 +124340 1704 1643 +124340 1441 1617 +124340 1593 1521 +124340 1549 1525 +124340 1583 1525 +124340 1670 1908 +124360 1825 1884 +124360 1704 1643 +124360 1884 1583 +124360 1441 1617 +124360 1593 1521 +124360 1825 1525 +124360 1884 1525 +124360 1549 1525 +124360 1583 1825 +124360 1583 1525 +124360 1670 1908 +124360 1829 1886 +124380 1531 1783 +124380 1441 1617 +124380 1549 1825 +124380 1593 1521 +124380 1825 1525 +124380 1884 1525 +124380 1549 1525 +124380 1583 1825 +124380 1583 1525 +124380 1549 1583 +124380 1825 1519 +124380 1670 1908 +124380 1829 1886 +124400 1549 1825 +124400 1593 1521 +124400 1599 1512 +124400 1825 1884 +124400 1825 1525 +124400 1884 1525 +124400 1549 1525 +124400 1583 1884 +124400 1857 1441 +124400 1583 1825 +124400 1583 1525 +124400 1583 1519 +124400 1549 1583 +124400 1825 1519 +124400 1670 1908 +124400 1829 1886 +124420 1549 1525 +124420 1704 1643 +124420 1583 1884 +124420 1857 1441 +124420 1549 1519 +124420 1583 1825 +124420 1583 1525 +124420 1583 1519 +124420 1549 1583 +124420 1825 1519 +124420 1519 1525 +124420 1670 1908 +124420 1441 1617 +124420 1829 1886 +124440 1669 1754 +124440 1549 1825 +124440 1549 1519 +124440 1583 1825 +124440 1825 1884 +124440 1583 1525 +124440 1583 1519 +124440 1549 1583 +124440 1593 1521 +124440 1825 1519 +124440 1519 1525 +124440 1670 1908 +124440 1840 1767 +124440 1441 1617 +124440 1829 1886 +124460 1583 1525 +124460 1583 1519 +124460 1531 1783 +124460 1549 1583 +124460 1583 1884 +124460 1593 1521 +124460 1825 1519 +124460 1519 1525 +124460 1670 1908 +124460 1840 1767 +124460 1441 1617 +124460 1829 1886 +124480 1669 1754 +124480 1549 1583 +124480 1549 1519 +124480 1704 1643 +124480 1583 1884 +124480 1593 1521 +124480 1825 1519 +124480 1519 1525 +124480 1670 1908 +124480 1583 1825 +124480 1840 1767 +124480 1441 1617 +124480 1829 1886 +124500 1563 1592 +124500 1825 1519 +124500 1519 1525 +124500 1670 1908 +124500 1882 1531 +124500 1549 1825 +124500 1583 1825 +124500 1840 1767 +124500 1441 1617 +124500 1829 1886 +124520 1670 1908 +124520 1732 1754 +124520 1882 1531 +124520 1549 1825 +124520 1583 1825 +124520 1840 1767 +124520 1593 1521 +124520 1549 1583 +124520 1441 1617 +124520 1829 1886 +124540 1549 1825 +124540 1563 1592 +124540 1583 1825 +124540 1840 1767 +124540 1512 1531 +124540 1593 1521 +124540 1549 1583 +124540 1441 1617 +124540 1704 1643 +124540 1829 1886 +124560 1593 1521 +124560 1594 1475 +124560 1670 1908 +124560 1549 1583 +124560 1441 1617 +124560 1704 1643 +124560 1829 1886 +124580 1593 1521 +124580 1594 1475 +124580 1670 1908 +124580 1512 1531 +124580 1549 1825 +124580 1549 1583 +124580 1583 1825 +124580 1882 1531 +124580 1441 1617 +124580 1704 1643 +124580 1829 1886 +124600 1670 1908 +124600 1512 1531 +124600 1549 1825 +124600 1549 1583 +124600 1583 1825 +124600 1882 1531 +124600 1441 1617 +124600 1704 1643 +124600 1829 1886 +124620 1549 1825 +124620 1549 1583 +124620 1583 1825 +124620 1829 1908 +124620 1593 1521 +124620 1882 1531 +124620 1783 1531 +124620 1441 1617 +124620 1704 1643 +124620 1829 1886 +124640 1441 1617 +124640 1512 1531 +124640 1704 1643 +124640 1463 1628 +124640 1829 1886 +124660 1924 1478 +124660 1678 1684 +124660 1704 1643 +124660 1463 1628 +124660 1583 1525 +124660 1829 1886 +124680 1563 1592 +124680 1463 1628 +124680 1599 1512 +124680 1583 1525 +124680 1829 1886 +124700 1684 1882 +124700 1704 1643 +124700 1882 1678 +124700 1583 1525 +124700 1840 1767 +124700 1678 1684 +124700 1829 1886 +124720 1576 1835 +124720 1599 1512 +124720 1563 1592 +124720 1583 1525 +124720 1840 1767 +124720 1463 1628 +124720 1678 1684 +124720 1825 1519 +124720 1829 1886 +124740 1563 1592 +124740 1704 1643 +124740 1583 1525 +124740 1840 1767 +124740 1463 1628 +124740 1835 1772 +124740 1678 1684 +124740 1825 1519 +124740 1829 1886 +124760 1924 1478 +124760 1829 1678 +124760 1576 1626 +124760 1835 1772 +124760 1678 1684 +124760 1890 1525 +124760 1825 1519 +124760 1678 1886 +124760 1626 1772 +124760 1835 1626 +124760 1829 1886 +124780 1678 1684 +124780 1628 1463 +124780 1840 1767 +124780 1890 1525 +124780 1825 1519 +124780 1678 1886 +124780 1626 1772 +124780 1835 1626 +124780 1704 1643 +124780 1829 1886 +124780 1806 1767 +124800 1825 1519 +124800 1829 1678 +124800 1678 1886 +124800 1835 1772 +124800 1626 1772 +124800 1835 1626 +124800 1583 1882 +124800 1704 1643 +124800 1829 1886 +124800 1806 1767 +124820 1549 1825 +124820 1549 1884 +124820 1806 1840 +124820 1835 1772 +124820 1840 1767 +124820 1626 1772 +124820 1835 1626 +124820 1583 1882 +124820 1704 1643 +124820 1829 1886 +124820 1806 1767 +124840 1835 1626 +124840 1583 1882 +124840 1628 1463 +124840 1829 1678 +124840 1704 1643 +124840 1829 1886 +124840 1806 1767 +124840 1890 1525 +124860 1583 1882 +124860 1628 1463 +124860 1857 1617 +124860 1829 1678 +124860 1704 1643 +124860 1678 1886 +124860 1829 1886 +124860 1806 1767 +124860 1890 1525 +124880 1549 1890 +124880 1829 1678 +124880 1704 1643 +124880 1678 1886 +124880 1829 1886 +124880 1806 1767 +124880 1890 1525 +124900 1924 1478 +124900 1829 1886 +124900 1592 1563 +124900 1806 1767 +124900 1890 1525 +124920 1806 1767 +124920 1857 1617 +124920 1890 1525 +124940 1806 1767 +124940 1704 1643 +124940 1857 1617 +124940 1890 1525 +124940 1829 1886 +124960 1924 1478 +124960 1890 1525 +124960 1825 1519 +124960 1829 1886 +124980 1924 1478 +124980 1549 1519 +124980 1890 1525 +124980 1549 1825 +124980 1825 1519 +124980 1829 1886 +124980 1806 1767 +125000 1549 1825 +125000 1825 1519 +125000 1829 1886 +125000 1806 1767 +125020 1704 1643 +125020 1829 1886 +125020 1563 1592 +125020 1857 1617 +125020 1890 1525 +125020 1806 1767 +125040 1441 1617 +125040 1829 1886 +125040 1563 1592 +125040 1857 1617 +125040 1890 1525 +125040 1825 1519 +125040 1806 1767 +125060 1563 1592 +125060 1704 1643 +125060 1857 1617 +125060 1890 1525 +125060 1825 1519 +125060 1806 1767 +125080 1704 1643 +125080 1583 1882 +125080 1857 1617 +125080 1890 1525 +125080 1825 1519 +125080 1806 1767 +125100 1890 1525 +125100 1825 1519 +125100 1806 1767 +125120 1669 1754 +125120 1549 1525 +125120 1704 1643 +125120 1890 1525 +125120 1521 1787 +125120 1829 1886 +125120 1857 1617 +125120 1825 1519 +125120 1806 1767 +125140 1829 1886 +125140 1840 1806 +125140 1840 1767 +125140 1857 1617 +125140 1825 1519 +125140 1806 1767 +125160 1549 1525 +125160 1857 1617 +125160 1521 1787 +125160 1592 1563 +125160 1825 1519 +125160 1806 1767 +125160 1441 1617 +125180 1592 1563 +125180 1890 1525 +125180 1825 1519 +125180 1806 1767 +125180 1441 1617 +125200 1549 1890 +125200 1592 1563 +125200 1890 1525 +125200 1825 1519 +125200 1806 1767 +125200 1441 1617 +125220 1549 1890 +125220 1592 1563 +125220 1890 1525 +125220 1521 1787 +125220 1825 1519 +125220 1704 1643 +125220 1806 1767 +125220 1441 1617 +125240 1825 1519 +125240 1704 1643 +125240 1806 1767 +125240 1441 1617 +125260 1704 1643 +125260 1549 1890 +125260 1890 1525 +125260 1592 1563 +125260 1806 1767 +125260 1441 1617 +125280 1549 1890 +125280 1890 1525 +125280 1592 1563 +125280 1806 1767 +125280 1441 1617 +125280 1825 1519 +125300 1825 1884 +125300 1592 1563 +125300 1806 1767 +125300 1441 1617 +125300 1825 1519 +125320 1592 1563 +125320 1704 1643 +125320 1598 1628 +125320 1890 1525 +125320 1806 1767 +125320 1441 1617 +125320 1825 1519 +125340 1669 1754 +125340 1437 1840 +125340 1441 1857 +125340 1592 1563 +125340 1704 1643 +125340 1598 1628 +125340 1890 1525 +125340 1806 1767 +125340 1441 1617 +125340 1825 1519 +125360 1694 1617 +125360 1592 1563 +125360 1857 1617 +125360 1694 1857 +125360 1704 1643 +125360 1598 1628 +125360 1890 1525 +125360 1806 1767 +125360 1441 1617 +125360 1678 1684 +125360 1825 1519 +125380 1669 1754 +125380 1549 1525 +125380 1694 1857 +125380 1704 1643 +125380 1598 1628 +125380 1583 1882 +125380 1890 1525 +125380 1806 1767 +125380 1441 1617 +125380 1678 1684 +125380 1825 1519 +125400 1583 1882 +125400 1890 1525 +125400 1806 1767 +125400 1441 1617 +125400 1678 1684 +125400 1563 1592 +125400 1825 1519 +125420 1583 1882 +125420 1890 1525 +125420 1806 1767 +125420 1441 1617 +125420 1628 1463 +125420 1704 1643 +125420 1678 1684 +125420 1563 1592 +125420 1825 1519 +125440 1563 1839 +125440 1806 1767 +125440 1441 1617 +125440 1628 1463 +125440 1704 1643 +125440 1678 1684 +125440 1563 1592 +125440 1825 1519 +125460 1669 1754 +125460 1583 1882 +125460 1441 1641 +125460 1617 1641 +125460 1806 1767 +125460 1441 1617 +125460 1628 1463 +125460 1704 1643 +125460 1678 1684 +125460 1563 1592 +125460 1825 1519 +125480 1679 1575 +125480 1441 1617 +125480 1890 1525 +125480 1628 1463 +125480 1599 1882 +125480 1704 1643 +125480 1678 1684 +125480 1563 1592 +125480 1825 1519 +125500 1583 1882 +125500 1441 1617 +125500 1617 1806 +125500 1890 1525 +125500 1628 1463 +125500 1840 1598 +125500 1599 1882 +125500 1704 1643 +125500 1678 1684 +125500 1549 1525 +125500 1563 1592 +125500 1825 1519 +125520 1628 1463 +125520 1840 1598 +125520 1599 1882 +125520 1704 1643 +125520 1512 1531 +125520 1678 1684 +125520 1549 1525 +125520 1563 1592 +125520 1825 1519 +125540 1704 1643 +125540 1512 1531 +125540 1678 1684 +125540 1549 1525 +125540 1563 1592 +125540 1825 1519 +125560 1678 1684 +125560 1583 1882 +125560 1549 1890 +125560 1890 1525 +125560 1549 1525 +125560 1563 1592 +125560 1825 1519 +125580 1549 1890 +125580 1890 1525 +125580 1549 1525 +125580 1825 1463 +125580 1704 1643 +125580 1563 1592 +125580 1825 1519 +125600 1549 1525 +125600 1825 1463 +125600 1704 1643 +125600 1563 1592 +125600 1825 1519 +125620 1563 1592 +125620 1599 1882 +125620 1890 1525 +125620 1825 1519 +125640 1678 1592 +125640 1678 1839 +125640 1563 1592 +125640 1599 1882 +125640 1890 1525 +125640 1825 1519 +125660 1825 1884 +125660 1441 1617 +125660 1825 1519 +125680 1549 1525 +125680 1617 1767 +125680 1825 1519 +125680 1808 1897 +125700 1825 1519 +125700 1704 1643 +125700 1808 1897 +125720 1704 1643 +125720 1884 1825 +125720 1599 1882 +125720 1521 1787 +125720 1808 1897 +125720 1563 1592 +125740 1549 1890 +125740 1617 1767 +125740 1808 1897 +125740 1890 1525 +125740 1678 1908 +125740 1563 1592 +125760 1808 1897 +125760 1890 1525 +125760 1884 1825 +125760 1678 1908 +125760 1563 1592 +125780 1808 1897 +125780 1704 1643 +125780 1890 1525 +125780 1884 1825 +125780 1678 1908 +125780 1563 1592 +125800 1884 1825 +125800 1678 1908 +125800 1563 1592 +125800 1684 1463 +125820 1563 1592 +125820 1643 1908 +125820 1704 1643 +125820 1684 1463 +125840 1704 1643 +125840 1684 1463 +125860 1598 1767 +125860 1684 1463 +125860 1617 1767 +125860 1549 1890 +125880 1684 1463 +125880 1704 1643 +125880 1617 1767 +125880 1549 1890 +125900 1617 1767 +125900 1549 1890 +125900 1890 1525 +125920 1599 1512 +125920 1825 1609 +125920 1617 1767 +125920 1549 1890 +125920 1890 1525 +125940 1549 1890 +125940 1890 1525 +125960 1563 1592 +125960 1549 1890 +125960 1890 1525 +125980 1549 1890 +125980 1890 1525 +126000 1549 1890 +126000 1704 1643 +126000 1449 1521 +126000 1603 1562 +126000 1890 1525 +126020 1920 1609 +126020 1603 1562 +126020 1703 1635 +126020 1890 1525 +126020 1549 1525 +126040 1563 1592 +126040 1703 1609 +126040 1704 1643 +126040 1890 1525 +126040 1441 1617 +126040 1549 1525 +126060 1449 1603 +126060 1593 1644 +126060 1603 1562 +126060 1890 1525 +126060 1441 1617 +126060 1549 1525 +126060 1684 1593 +126080 1603 1562 +126080 1825 1601 +126080 1609 1635 +126080 1884 1519 +126080 1643 1644 +126080 1890 1525 +126080 1562 1449 +126080 1441 1617 +126080 1549 1525 +126080 1704 1643 +126080 1684 1593 +126100 1563 1593 +126100 1563 1643 +126100 1825 1635 +126100 1890 1525 +126100 1813 1644 +126100 1562 1449 +126100 1877 1908 +126100 1441 1617 +126100 1549 1525 +126100 1704 1643 +126100 1684 1593 +126120 1684 1563 +126120 1813 1644 +126120 1562 1449 +126120 1825 1884 +126120 1825 1519 +126120 1593 1598 +126120 1479 1908 +126120 1877 1908 +126120 1920 1601 +126120 1441 1617 +126120 1884 1519 +126120 1549 1525 +126120 1704 1643 +126120 1479 1877 +126120 1684 1593 +126140 1920 1601 +126140 1549 1890 +126140 1441 1628 +126140 1441 1609 +126140 1890 1525 +126140 1684 1644 +126140 1441 1617 +126140 1884 1519 +126140 1549 1525 +126140 1704 1643 +126140 1479 1877 +126140 1684 1593 +126160 1890 1525 +126160 1684 1644 +126160 1562 1449 +126160 1441 1617 +126160 1884 1519 +126160 1549 1525 +126160 1808 1479 +126160 1704 1643 +126160 1479 1877 +126160 1684 1593 +126180 1808 1877 +126180 1684 1644 +126180 1562 1449 +126180 1441 1617 +126180 1609 1643 +126180 1884 1519 +126180 1549 1525 +126180 1808 1479 +126180 1549 1890 +126180 1704 1643 +126180 1813 1644 +126180 1479 1877 +126180 1684 1593 +126180 1598 1635 +126200 1857 1441 +126200 1857 1617 +126200 1549 1525 +126200 1679 1575 +126200 1808 1479 +126200 1463 1628 +126200 1767 1900 +126200 1908 1877 +126200 1549 1890 +126200 1704 1643 +126200 1813 1644 +126200 1479 1877 +126200 1684 1593 +126200 1890 1525 +126200 1908 1479 +126200 1598 1635 +126220 1549 1890 +126220 1704 1643 +126220 1479 1711 +126220 1813 1644 +126220 1479 1877 +126220 1684 1593 +126220 1890 1525 +126220 1908 1479 +126220 1598 1635 +126240 1813 1644 +126240 1479 1877 +126240 1825 1519 +126240 1617 1857 +126240 1877 1908 +126240 1884 1643 +126240 1825 1643 +126240 1684 1593 +126240 1890 1525 +126240 1908 1479 +126240 1598 1635 +126260 1884 1643 +126260 1884 1519 +126260 1679 1575 +126260 1441 1617 +126260 1825 1643 +126260 1441 1857 +126260 1684 1593 +126260 1890 1525 +126260 1908 1479 +126260 1598 1635 +126280 1549 1890 +126280 1441 1857 +126280 1713 1857 +126280 1711 1473 +126280 1684 1593 +126280 1441 1713 +126280 1877 1908 +126280 1479 1877 +126280 1890 1525 +126280 1908 1479 +126280 1598 1635 +126300 1441 1857 +126300 1713 1857 +126300 1711 1473 +126300 1684 1593 +126300 1441 1713 +126300 1877 1908 +126300 1479 1877 +126300 1563 1592 +126300 1890 1525 +126300 1908 1479 +126300 1598 1635 +126320 1920 1617 +126320 1684 1593 +126320 1441 1713 +126320 1599 1882 +126320 1643 1825 +126320 1803 1678 +126320 1475 1594 +126320 1877 1908 +126320 1549 1525 +126320 1479 1877 +126320 1563 1592 +126320 1669 1754 +126320 1890 1525 +126320 1908 1479 +126320 1598 1635 +126340 1643 1825 +126340 1670 1711 +126340 1884 1825 +126340 1803 1678 +126340 1475 1594 +126340 1698 1707 +126340 1704 1519 +126340 1463 1628 +126340 1877 1908 +126340 1549 1525 +126340 1704 1643 +126340 1479 1877 +126340 1563 1592 +126340 1669 1754 +126340 1890 1525 +126340 1908 1479 +126340 1598 1635 +126360 1920 1598 +126360 1549 1525 +126360 1704 1643 +126360 1592 1617 +126360 1479 1877 +126360 1563 1592 +126360 1441 1713 +126360 1669 1754 +126360 1890 1525 +126360 1908 1479 +126360 1598 1635 +126380 1643 1525 +126380 1857 1641 +126380 1563 1592 +126380 1698 1707 +126380 1594 1475 +126380 1877 1908 +126380 1884 1519 +126380 1441 1713 +126380 1643 1519 +126380 1669 1754 +126380 1890 1525 +126380 1704 1519 +126380 1908 1479 +126380 1598 1635 +126380 1670 1711 +126400 1884 1704 +126400 1884 1643 +126400 1884 1519 +126400 1549 1890 +126400 1441 1713 +126400 1449 1521 +126400 1643 1519 +126400 1549 1525 +126400 1669 1754 +126400 1890 1525 +126400 1704 1519 +126400 1908 1479 +126400 1617 1628 +126400 1598 1635 +126400 1670 1711 +126420 1698 1740 +126420 1847 1503 +126420 1920 1598 +126420 1549 1525 +126420 1669 1754 +126420 1890 1525 +126420 1924 1478 +126420 1704 1519 +126420 1908 1479 +126420 1617 1628 +126420 1598 1635 +126420 1877 1908 +126420 1670 1711 +126440 1920 1598 +126440 1549 1890 +126440 1549 1525 +126440 1825 1704 +126440 1707 1839 +126440 1608 1530 +126440 1669 1754 +126440 1890 1525 +126440 1924 1478 +126440 1704 1519 +126440 1908 1479 +126440 1617 1628 +126440 1598 1635 +126440 1877 1908 +126440 1670 1711 +126460 1573 1789 +126460 1608 1530 +126460 1635 1473 +126460 1848 1458 +126460 1684 1767 +126460 1669 1754 +126460 1890 1525 +126460 1924 1478 +126460 1704 1519 +126460 1908 1479 +126460 1617 1628 +126460 1598 1635 +126460 1877 1908 +126460 1670 1711 +126480 1542 1573 +126480 1549 1525 +126480 1684 1767 +126480 1707 1767 +126480 1789 1808 +126480 1549 1890 +126480 1669 1754 +126480 1890 1525 +126480 1924 1478 +126480 1704 1519 +126480 1877 1479 +126480 1908 1479 +126480 1617 1628 +126480 1598 1635 +126480 1877 1908 +126480 1670 1711 +126500 1549 1890 +126500 1669 1754 +126500 1890 1525 +126500 1924 1478 +126500 1704 1519 +126500 1877 1479 +126500 1908 1479 +126500 1617 1628 +126500 1598 1635 +126500 1877 1908 +126500 1670 1711 +126520 1573 1458 +126520 1608 1530 +126520 1643 1825 +126520 1643 1884 +126520 1684 1767 +126520 1825 1884 +126520 1825 1519 +126520 1921 1462 +126520 1598 1920 +126520 1890 1525 +126520 1924 1478 +126520 1704 1825 +126520 1789 1808 +126520 1643 1519 +126520 1704 1519 +126520 1573 1452 +126520 1877 1479 +126520 1908 1479 +126520 1617 1628 +126520 1598 1635 +126520 1877 1908 +126520 1670 1711 +126540 1549 1525 +126540 1598 1920 +126540 1598 1530 +126540 1608 1635 +126540 1635 1920 +126540 1698 1523 +126540 1786 1500 +126540 1847 1452 +126540 1847 1503 +126540 1890 1525 +126540 1924 1478 +126540 1704 1825 +126540 1713 1441 +126540 1789 1808 +126540 1643 1519 +126540 1704 1519 +126540 1573 1452 +126540 1877 1479 +126540 1908 1479 +126540 1617 1628 +126540 1598 1635 +126540 1877 1908 +126540 1670 1711 +126560 1542 1641 +126560 1546 1468 +126560 1573 1808 +126560 1598 1458 +126560 1635 1458 +126560 1643 1825 +126560 1657 1769 +126560 1704 1825 +126560 1713 1441 +126560 1789 1808 +126560 1442 1455 +126560 1549 1890 +126560 1643 1519 +126560 1704 1519 +126560 1717 1458 +126560 1500 1511 +126560 1593 1449 +126560 1775 1808 +126560 1573 1452 +126560 1877 1479 +126560 1908 1479 +126560 1617 1628 +126560 1598 1635 +126560 1825 1919 +126560 1678 1848 +126560 1877 1908 +126560 1670 1711 +126580 1549 1890 +126580 1635 1473 +126580 1643 1884 +126580 1643 1519 +126580 1665 1775 +126580 1678 1765 +126580 1704 1519 +126580 1717 1458 +126580 1734 1868 +126580 1848 1517 +126580 1500 1511 +126580 1593 1449 +126580 1775 1808 +126580 1857 1441 +126580 1573 1452 +126580 1643 1704 +126580 1877 1479 +126580 1908 1479 +126580 1617 1628 +126580 1603 1449 +126580 1598 1635 +126580 1593 1603 +126580 1825 1919 +126580 1678 1848 +126580 1678 1517 +126580 1877 1908 +126580 1670 1711 +126600 1593 1449 +126600 1635 1688 +126600 1638 1906 +126600 1638 1894 +126600 1638 1911 +126600 1684 1711 +126600 1688 1717 +126600 1701 1885 +126600 1775 1808 +126600 1857 1441 +126600 1921 1462 +126600 1460 1499 +126600 1562 1641 +126600 1573 1452 +126600 1590 1455 +126600 1643 1704 +126600 1657 1769 +126600 1877 1479 +126600 1884 1519 +126600 1908 1479 +126600 1617 1628 +126600 1603 1449 +126600 1598 1635 +126600 1829 1886 +126600 1593 1603 +126600 1825 1919 +126600 1678 1848 +126600 1678 1517 +126600 1877 1908 +126600 1670 1711 +126620 1562 1641 +126620 1568 1635 +126620 1573 1452 +126620 1590 1455 +126620 1594 1475 +126620 1641 1698 +126620 1643 1704 +126620 1647 1889 +126620 1647 1466 +126620 1657 1769 +126620 1664 1821 +126620 1665 1775 +126620 1713 1441 +126620 1727 1845 +126620 1775 1908 +126620 1877 1479 +126620 1884 1519 +126620 1908 1479 +126620 1458 1473 +126620 1617 1628 +126620 1718 1889 +126620 1603 1449 +126620 1848 1905 +126620 1890 1525 +126620 1598 1635 +126620 1665 1808 +126620 1829 1886 +126620 1593 1603 +126620 1825 1919 +126620 1678 1848 +126620 1678 1517 +126620 1877 1908 +126620 1670 1711 +126640 1549 1890 +126640 1549 1525 +126640 1568 1688 +126640 1568 1469 +126640 1581 1635 +126640 1613 1685 +126640 1617 1628 +126640 1672 1717 +126640 1678 1905 +126640 1688 1717 +126640 1704 1483 +126640 1704 1893 +126640 1717 1469 +126640 1718 1889 +126640 1834 1491 +126640 1899 1520 +126640 1921 1462 +126640 1460 1499 +126640 1593 1449 +126640 1603 1449 +126640 1765 1894 +126640 1802 1865 +126640 1811 1876 +126640 1848 1905 +126640 1890 1525 +126640 1905 1517 +126640 1504 1528 +126640 1598 1635 +126640 1717 1473 +126640 1641 1908 +126640 1665 1808 +126640 1829 1886 +126640 1593 1603 +126640 1825 1919 +126640 1678 1848 +126640 1678 1517 +126640 1877 1908 +126640 1670 1711 +126660 1537 1581 +126660 1538 1426 +126660 1539 1635 +126660 1554 1848 +126660 1554 1678 +126660 1562 1908 +126660 1568 1520 +126660 1581 1904 +126660 1593 1449 +126660 1603 1449 +126660 1613 1482 +126660 1638 1713 +126660 1684 1767 +126660 1698 1465 +126660 1698 1911 +126660 1704 1458 +126660 1765 1894 +126660 1269 1440 +126660 1802 1865 +126660 1811 1876 +126660 1826 1519 +126660 1834 1903 +126660 1848 1905 +126660 1890 1525 +126660 1905 1517 +126660 1441 1491 +126660 1465 1491 +126660 1469 1520 +126660 1500 1511 +126660 1504 1528 +126660 1520 1527 +126660 1562 1707 +126660 1590 1455 +126660 1598 1635 +126660 1644 1921 +126660 1717 1473 +126660 1641 1908 +126660 1641 1765 +126660 1641 1877 +126660 1665 1808 +126660 1857 1441 +126660 1829 1886 +126660 1765 1908 +126660 1593 1603 +126660 1825 1919 +126660 1678 1848 +126660 1678 1517 +126660 1877 1908 +126660 1670 1711 +126680 1537 1643 +126680 1542 1834 +126680 1542 1491 +126680 1542 1765 +126680 1551 1556 +126680 1554 1448 +126680 1554 1485 +126680 1554 1517 +126680 1562 1707 +126680 1568 1458 +126680 1590 1455 +126680 1598 1635 +126680 1643 1704 +126680 1644 1921 +126680 1647 1792 +126680 1647 1708 +126680 1647 1885 +126680 1698 1908 +126680 1707 1479 +126680 1717 1473 +126680 1717 1469 +126680 1717 1921 +126680 1727 1492 +126680 1765 1834 +126680 1790 1442 +126680 1790 1455 +126680 1884 1519 +126680 1540 1520 +126680 1549 1890 +126680 1641 1908 +126680 1641 1765 +126680 1641 1877 +126680 1647 1487 +126680 1665 1808 +126680 1848 1517 +126680 1857 1441 +126680 1442 1455 +126680 1829 1886 +126680 1765 1908 +126680 1921 1462 +126680 1591 1858 +126680 1593 1603 +126680 1718 1889 +126680 1825 1919 +126680 1617 1628 +126680 1678 1848 +126680 1678 1517 +126680 1877 1908 +126680 1670 1711 +126700 1539 1568 +126700 1540 1520 +126700 1549 1890 +126700 1551 1269 +126700 1554 1808 +126700 1554 1915 +126700 1570 1492 +126700 1623 1437 +126700 1635 1875 +126700 1638 1698 +126700 1638 1740 +126700 1641 1698 +126700 1641 1908 +126700 1641 1765 +126700 1641 1877 +126700 1643 1728 +126700 1647 1487 +126700 1664 1520 +126700 1665 1808 +126700 1678 1680 +126700 1680 1848 +126700 1680 1455 +126700 1717 1458 +126700 1269 1440 +126700 1790 1451 +126700 1792 1451 +126700 1811 1876 +126700 1848 1428 +126700 1848 1517 +126700 1857 1441 +126700 1893 1469 +126700 1894 1491 +126700 1428 1517 +126700 1442 1455 +126700 1660 1692 +126700 1829 1886 +126700 1847 1503 +126700 1890 1525 +126700 1568 1483 +126700 1698 1707 +126700 1765 1908 +126700 1765 1877 +126700 1765 1479 +126700 1657 1769 +126700 1921 1462 +126700 1591 1858 +126700 1593 1603 +126700 1598 1875 +126700 1718 1889 +126700 1825 1919 +126700 1598 1715 +126700 1617 1628 +126700 1678 1848 +126700 1678 1517 +126700 1877 1908 +126700 1754 1821 +126700 1670 1711 +126720 1546 1713 +126720 1551 1440 +126720 1551 1482 +126720 1554 1448 +126720 1554 1502 +126720 1556 1920 +126720 1556 1568 +126720 1557 1499 +126720 1598 1635 +126720 1635 1715 +126720 1638 1707 +126720 1641 1911 +126720 1643 1704 +126720 1660 1692 +126720 1664 1527 +126720 1680 1459 +126720 1680 1428 +126720 1684 1900 +126720 1692 1802 +126720 1698 1834 +126720 1698 1485 +126720 1704 1520 +126720 1713 1807 +126720 1829 1886 +126720 1847 1503 +126720 1848 1865 +126720 1877 1479 +126720 1884 1519 +126720 1890 1525 +126720 1899 1458 +126720 1915 1455 +126720 1444 1466 +126720 1504 1528 +126720 1568 1483 +126720 1631 1503 +126720 1638 1911 +126720 1647 1482 +126720 1698 1707 +126720 1765 1908 +126720 1765 1877 +126720 1765 1479 +126720 1789 1857 +126720 1908 1479 +126720 1657 1769 +126720 1921 1462 +126720 1591 1858 +126720 1593 1603 +126720 1598 1875 +126720 1718 1889 +126720 1825 1919 +126720 1598 1715 +126720 1617 1628 +126720 1678 1848 +126720 1678 1517 +126720 1877 1908 +126720 1754 1821 +126720 1670 1711 +126720 1546 1557 +126740 1537 1532 +126740 1546 1847 +126740 1546 1708 +126740 1546 1503 +126740 1551 1269 +126740 1554 1435 +126740 1557 1503 +126740 1568 1483 +126740 1587 1504 +126740 1598 1701 +126740 1631 1503 +126740 1635 1875 +126740 1638 1792 +126740 1638 1513 +126740 1638 1911 +126740 1647 1482 +126740 1698 1707 +126740 1708 1848 +126740 1713 1907 +126740 1765 1466 +126740 1765 1908 +126740 1765 1877 +126740 1765 1479 +126740 1768 1811 +126740 1771 1908 +126740 1789 1857 +126740 1808 1915 +126740 1831 1460 +126740 1865 1517 +126740 1899 1532 +126740 1908 1479 +126740 1921 1461 +126740 1573 1455 +126740 1604 1786 +126740 1638 1885 +126740 1638 1641 +126740 1641 1792 +126740 1657 1769 +126740 1792 1885 +126740 1889 1458 +126740 1921 1462 +126740 1591 1858 +126740 1593 1603 +126740 1598 1875 +126740 1718 1889 +126740 1825 1919 +126740 1549 1890 +126740 1562 1908 +126740 1598 1715 +126740 1617 1628 +126740 1678 1848 +126740 1678 1517 +126740 1813 1872 +126740 1877 1908 +126740 1831 1499 +126740 1754 1821 +126740 1670 1711 +126740 1546 1557 +126760 1549 1525 +126760 1554 1834 +126760 1554 1661 +126760 1562 1652 +126760 1573 1455 +126760 1575 1679 +126760 1603 1449 +126760 1604 1786 +126760 1613 1847 +126760 1613 1503 +126760 1635 1701 +126760 1638 1897 +126760 1638 1885 +126760 1638 1641 +126760 1641 1792 +126760 1641 1765 +126760 1643 1704 +126760 1657 1769 +126760 1672 1889 +126760 1672 1718 +126760 1678 1680 +126760 1698 1491 +126760 1717 1893 +126760 1718 1728 +126760 1718 1458 +126760 1789 1834 +126760 1792 1885 +126760 1831 1907 +126760 1848 1914 +126760 1889 1458 +126760 1890 1525 +126760 1907 1923 +126760 1907 1499 +126760 1921 1462 +126760 1482 1503 +126760 1540 1672 +126760 1556 1504 +126760 1573 1452 +126760 1591 1858 +126760 1593 1603 +126760 1598 1875 +126760 1641 1885 +126760 1710 1455 +126760 1718 1889 +126760 1825 1919 +126760 1840 1487 +126760 1549 1890 +126760 1562 1908 +126760 1598 1715 +126760 1617 1628 +126760 1638 1765 +126760 1678 1848 +126760 1678 1517 +126760 1680 1517 +126760 1458 1532 +126760 1602 1631 +126760 1635 1715 +126760 1813 1872 +126760 1877 1479 +126760 1829 1886 +126760 1877 1908 +126760 1598 1635 +126760 1831 1499 +126760 1754 1821 +126760 1847 1503 +126760 1670 1711 +126760 1546 1557 +126760 1554 1857 +126780 1539 1717 +126780 1540 1672 +126780 1545 1582 +126780 1554 1789 +126780 1556 1504 +126780 1556 1889 +126780 1568 1483 +126780 1570 1734 +126780 1573 1907 +126780 1573 1452 +126780 1575 1591 +126780 1591 1858 +126780 1593 1603 +126780 1598 1875 +126780 1616 1518 +126780 1635 1875 +126780 1638 1528 +126780 1641 1771 +126780 1641 1444 +126780 1641 1885 +126780 1647 1806 +126780 1660 1692 +126780 1673 1516 +126780 1678 1914 +126780 1679 1858 +126780 1701 1473 +126780 1701 1898 +126780 1710 1455 +126780 1717 1461 +126780 1718 1889 +126780 1718 1461 +126780 1718 1446 +126780 1728 1428 +126780 1771 1885 +126780 1771 1790 +126780 1792 1528 +126780 1825 1919 +126780 1834 1491 +126780 1840 1487 +126780 1848 1517 +126780 1885 1448 +126780 1885 1513 +126780 1885 1897 +126780 1920 1473 +126780 1504 1522 +126780 1537 1568 +126780 1537 1718 +126780 1549 1890 +126780 1551 1808 +126780 1556 1718 +126780 1562 1908 +126780 1598 1715 +126780 1612 1847 +126780 1617 1628 +126780 1638 1765 +126780 1675 1749 +126780 1678 1848 +126780 1678 1517 +126780 1680 1517 +126780 1692 1829 +126780 1692 1886 +126780 1721 1796 +126780 1811 1923 +126780 1892 1898 +126780 1698 1707 +126780 1761 1493 +126780 1458 1532 +126780 1602 1631 +126780 1635 1715 +126780 1813 1872 +126780 1877 1479 +126780 1701 1920 +126780 1829 1886 +126780 1877 1908 +126780 1924 1478 +126780 1598 1635 +126780 1831 1499 +126780 1754 1821 +126780 1847 1503 +126780 1670 1711 +126780 1546 1557 +126780 1908 1479 +126780 1554 1857 +126800 1537 1568 +126800 1537 1556 +126800 1537 1718 +126800 1545 1613 +126800 1549 1890 +126800 1551 1808 +126800 1556 1664 +126800 1556 1718 +126800 1557 1767 +126800 1562 1908 +126800 1568 1664 +126800 1598 1715 +126800 1612 1847 +126800 1617 1628 +126800 1617 1894 +126800 1638 1792 +126800 1638 1897 +126800 1638 1765 +126800 1641 1528 +126800 1641 1790 +126800 1643 1462 +126800 1652 1865 +126800 1661 1900 +126800 1675 1749 +126800 1678 1848 +126800 1678 1680 +126800 1678 1517 +126800 1680 1517 +126800 1692 1829 +126800 1692 1886 +126800 1701 1477 +126800 1717 1921 +126800 1717 1718 +126800 1721 1796 +126800 1728 1458 +126800 1735 1465 +126800 1742 1520 +126800 1765 1897 +126800 1765 1471 +126800 1790 1876 +126800 1792 1885 +126800 1808 1455 +126800 1811 1923 +126800 1847 1482 +126800 1865 1466 +126800 1884 1519 +126800 1889 1899 +126800 1892 1898 +126800 1899 1462 +126800 1920 1477 +126800 1482 1503 +126800 1556 1462 +126800 1579 1787 +126800 1657 1769 +126800 1680 1848 +126800 1698 1707 +126800 1702 1901 +126800 1761 1493 +126800 1865 1491 +126800 1898 1920 +126800 1458 1532 +126800 1602 1613 +126800 1602 1631 +126800 1831 1460 +126800 1635 1715 +126800 1643 1704 +126800 1813 1872 +126800 1877 1479 +126800 1701 1920 +126800 1829 1886 +126800 1877 1908 +126800 1924 1478 +126800 1598 1635 +126800 1768 1504 +126800 1831 1499 +126800 1754 1821 +126800 1847 1503 +126800 1670 1711 +126800 1546 1557 +126800 1908 1479 +126800 1554 1857 +126820 1539 1703 +126820 1554 1811 +126820 1554 1923 +126820 1554 1441 +126820 1556 1462 +126820 1568 1462 +126820 1570 1573 +126820 1573 1455 +126820 1579 1787 +126820 1602 1482 +126820 1612 1426 +126820 1612 1517 +126820 1613 1482 +126820 1617 1441 +126820 1641 1471 +126820 1657 1769 +126820 1673 1899 +126820 1680 1848 +126820 1698 1707 +126820 1702 1901 +126820 1703 1717 +126820 1734 1913 +126820 1740 1876 +126820 1761 1493 +126820 1789 1857 +126820 1811 1857 +126820 1847 1517 +126820 1848 1901 +126820 1857 1876 +126820 1865 1491 +126820 1876 1907 +126820 1890 1924 +126820 1892 1920 +126820 1893 1458 +126820 1898 1920 +126820 1458 1532 +126820 1546 1661 +126820 1602 1613 +126820 1602 1631 +126820 1617 1857 +126820 1635 1875 +126820 1715 1875 +126820 1728 1920 +126820 1825 1919 +126820 1831 1460 +126820 1876 1923 +126820 1460 1499 +126820 1554 1617 +126820 1635 1715 +126820 1643 1704 +126820 1701 1728 +126820 1789 1441 +126820 1813 1872 +126820 1877 1479 +126820 1665 1519 +126820 1701 1920 +126820 1829 1886 +126820 1877 1908 +126820 1924 1478 +126820 1598 1875 +126820 1598 1635 +126820 1768 1504 +126820 1831 1499 +126820 1708 1808 +126820 1754 1821 +126820 1847 1503 +126820 1670 1711 +126820 1546 1557 +126820 1908 1479 +126820 1554 1857 +126820 1568 1483 +126820 1718 1889 +126840 1546 1661 +126840 1549 1890 +126840 1552 1443 +126840 1552 1613 +126840 1554 1789 +126840 1556 1703 +126840 1558 1516 +126840 1562 1877 +126840 1562 1582 +126840 1582 1707 +126840 1582 1698 +126840 1582 1638 +126840 1587 1701 +126840 1602 1613 +126840 1602 1631 +126840 1604 1721 +126840 1608 1532 +126840 1612 1901 +126840 1617 1857 +126840 1623 1865 +126840 1628 1485 +126840 1635 1875 +126840 1638 1707 +126840 1641 1907 +126840 1660 1692 +126840 1672 1532 +126840 1692 1848 +126840 1692 1772 +126840 1692 1499 +126840 1707 1908 +126840 1707 1471 +126840 1715 1875 +126840 1728 1920 +126840 1734 1749 +126840 1825 1919 +126840 1831 1460 +126840 1841 1848 +126840 1847 1510 +126840 1876 1923 +126840 1892 1458 +126840 1893 1428 +126840 1894 1465 +126840 1901 1510 +126840 1907 1471 +126840 1920 1473 +126840 1428 1458 +126840 1460 1499 +126840 1471 1479 +126840 1503 1510 +126840 1507 1530 +126840 1530 1532 +126840 1554 1617 +126840 1573 1452 +126840 1623 1437 +126840 1635 1715 +126840 1643 1704 +126840 1701 1728 +126840 1771 1792 +126840 1771 1885 +126840 1789 1441 +126840 1813 1872 +126840 1877 1479 +126840 1540 1672 +126840 1598 1715 +126840 1608 1530 +126840 1665 1519 +126840 1678 1848 +126840 1701 1920 +126840 1829 1886 +126840 1877 1908 +126840 1924 1478 +126840 1598 1875 +126840 1591 1858 +126840 1598 1635 +126840 1617 1789 +126840 1684 1840 +126840 1735 1465 +126840 1768 1504 +126840 1831 1499 +126840 1921 1462 +126840 1708 1808 +126840 1754 1821 +126840 1847 1503 +126840 1670 1711 +126840 1546 1557 +126840 1908 1479 +126840 1554 1857 +126840 1568 1483 +126840 1718 1889 +126860 1545 1647 +126860 1554 1617 +126860 1562 1698 +126860 1562 1707 +126860 1562 1455 +126860 1568 1889 +126860 1568 1718 +126860 1570 1485 +126860 1573 1452 +126860 1587 1458 +126860 1608 1899 +126860 1613 1442 +126860 1617 1441 +126860 1623 1437 +126860 1635 1715 +126860 1638 1698 +126860 1640 1718 +126860 1643 1704 +126860 1665 1825 +126860 1687 1841 +126860 1692 1829 +126860 1692 1886 +126860 1698 1528 +126860 1701 1728 +126860 1707 1907 +126860 1734 1886 +126860 1740 1497 +126860 1742 1520 +126860 1749 1757 +126860 1765 1455 +126860 1771 1792 +126860 1771 1885 +126860 1789 1441 +126860 1803 1441 +126860 1813 1872 +126860 1825 1884 +126860 1841 1510 +126860 1847 1886 +126860 1877 1479 +126860 1886 1503 +126860 1899 1530 +126860 1446 1458 +126860 1458 1516 +126860 1479 1485 +126860 1540 1672 +126860 1587 1899 +126860 1598 1715 +126860 1604 1901 +126860 1608 1530 +126860 1665 1519 +126860 1678 1848 +126860 1698 1707 +126860 1701 1920 +126860 1707 1764 +126860 1829 1886 +126860 1877 1908 +126860 1924 1478 +126860 1556 1718 +126860 1593 1603 +126860 1595 1654 +126860 1598 1875 +126860 1598 1703 +126860 1612 1678 +126860 1806 1808 +126860 1892 1898 +126860 1570 1582 +126860 1591 1858 +126860 1598 1635 +126860 1617 1789 +126860 1684 1840 +126860 1703 1875 +126860 1735 1465 +126860 1761 1493 +126860 1768 1504 +126860 1831 1499 +126860 1921 1462 +126860 1708 1808 +126860 1754 1821 +126860 1847 1503 +126860 1670 1711 +126860 1546 1557 +126860 1657 1769 +126860 1908 1479 +126860 1554 1857 +126860 1568 1483 +126860 1718 1889 +126880 1537 1483 +126880 1538 1524 +126880 1540 1672 +126880 1546 1554 +126880 1546 1900 +126880 1554 1557 +126880 1554 1441 +126880 1556 1568 +126880 1556 1527 +126880 1558 1516 +126880 1562 1564 +126880 1562 1886 +126880 1570 1437 +126880 1573 1885 +126880 1587 1899 +126880 1595 1886 +126880 1598 1715 +126880 1604 1901 +126880 1608 1530 +126880 1612 1848 +126880 1613 1692 +126880 1617 1908 +126880 1623 1908 +126880 1638 1465 +126880 1641 1901 +126880 1652 1466 +126880 1664 1458 +126880 1665 1519 +126880 1673 1516 +126880 1678 1848 +126880 1678 1829 +126880 1688 1899 +126880 1698 1707 +126880 1698 1485 +126880 1698 1479 +126880 1701 1920 +126880 1707 1764 +126880 1707 1479 +126880 1718 1520 +126880 1718 1527 +126880 1734 1855 +126880 1749 1761 +126880 1757 1761 +126880 1792 1452 +126880 1811 1923 +126880 1811 1876 +126880 1829 1886 +126880 1876 1923 +126880 1877 1908 +126880 1885 1452 +126880 1889 1520 +126880 1899 1461 +126880 1900 1518 +126880 1924 1478 +126880 1556 1889 +126880 1556 1718 +126880 1593 1603 +126880 1595 1654 +126880 1598 1875 +126880 1598 1703 +126880 1604 1641 +126880 1612 1678 +126880 1700 1848 +126880 1806 1808 +126880 1892 1898 +126880 1920 1473 +126880 1570 1582 +126880 1591 1858 +126880 1598 1635 +126880 1617 1789 +126880 1635 1875 +126880 1684 1840 +126880 1703 1875 +126880 1708 1806 +126880 1728 1920 +126880 1735 1465 +126880 1761 1493 +126880 1768 1504 +126880 1825 1919 +126880 1831 1499 +126880 1921 1462 +126880 1906 1455 +126880 1708 1808 +126880 1754 1821 +126880 1847 1503 +126880 1670 1711 +126880 1546 1557 +126880 1657 1769 +126880 1908 1479 +126880 1554 1857 +126880 1568 1483 +126880 1718 1889 +126900 1546 1616 +126900 1552 1749 +126900 1556 1889 +126900 1556 1458 +126900 1556 1462 +126900 1556 1718 +126900 1562 1848 +126900 1562 1612 +126900 1562 1734 +126900 1573 1829 +126900 1573 1886 +126900 1573 1877 +126900 1579 1503 +126900 1593 1603 +126900 1595 1654 +126900 1598 1875 +126900 1598 1703 +126900 1604 1641 +126900 1604 1269 +126900 1612 1680 +126900 1612 1678 +126900 1613 1426 +126900 1613 1687 +126900 1623 1771 +126900 1631 1898 +126900 1635 1703 +126900 1638 1894 +126900 1638 1487 +126900 1700 1848 +126900 1702 1269 +126900 1718 1458 +126900 1791 1453 +126900 1806 1808 +126900 1811 1465 +126900 1834 1903 +126900 1848 1503 +126900 1885 1485 +126900 1886 1452 +126900 1889 1458 +126900 1892 1898 +126900 1920 1473 +126900 1441 1485 +126900 1441 1479 +126900 1570 1582 +126900 1591 1858 +126900 1598 1635 +126900 1602 1898 +126900 1617 1829 +126900 1617 1789 +126900 1617 1479 +126900 1631 1892 +126900 1635 1875 +126900 1684 1840 +126900 1703 1875 +126900 1708 1806 +126900 1728 1920 +126900 1735 1465 +126900 1749 1493 +126900 1761 1493 +126900 1768 1504 +126900 1825 1919 +126900 1831 1499 +126900 1857 1441 +126900 1876 1465 +126900 1921 1462 +126900 1549 1525 +126900 1573 1452 +126900 1906 1455 +126900 1460 1499 +126900 1708 1808 +126900 1742 1520 +126900 1754 1821 +126900 1847 1503 +126900 1643 1704 +126900 1670 1711 +126900 1546 1557 +126900 1831 1460 +126900 1657 1769 +126900 1908 1479 +126900 1554 1857 +126900 1568 1483 +126900 1718 1889 +126920 1549 1890 +126920 1551 1923 +126920 1562 1579 +126920 1562 1499 +126920 1570 1617 +126920 1570 1886 +126920 1570 1582 +126920 1573 1855 +126920 1587 1671 +126920 1591 1858 +126920 1598 1635 +126920 1602 1898 +126920 1602 1892 +126920 1602 1757 +126920 1604 1792 +126920 1604 1885 +126920 1617 1829 +126920 1617 1789 +126920 1617 1886 +126920 1617 1479 +126920 1623 1841 +126920 1631 1892 +126920 1635 1875 +126920 1641 1901 +126920 1654 1510 +126920 1660 1692 +126920 1665 1519 +126920 1678 1786 +126920 1684 1840 +126920 1688 1492 +126920 1702 1792 +126920 1703 1875 +126920 1707 1754 +126920 1708 1806 +126920 1728 1920 +126920 1734 1848 +126920 1735 1465 +126920 1749 1761 +126920 1749 1493 +126920 1761 1493 +126920 1768 1504 +126920 1792 1485 +126920 1825 1919 +126920 1831 1499 +126920 1857 1441 +126920 1876 1465 +126920 1877 1886 +126920 1886 1479 +126920 1921 1462 +126920 1924 1478 +126920 1549 1525 +126920 1554 1441 +126920 1554 1886 +126920 1573 1641 +126920 1573 1452 +126920 1602 1749 +126920 1602 1631 +126920 1608 1530 +126920 1641 1855 +126920 1672 1920 +126920 1673 1899 +126920 1678 1685 +126920 1701 1532 +126920 1702 1841 +126920 1702 1901 +126920 1906 1455 +126920 1460 1499 +126920 1708 1808 +126920 1841 1885 +126920 1520 1530 +126920 1680 1772 +126920 1698 1707 +126920 1703 1920 +126920 1742 1520 +126920 1754 1821 +126920 1877 1908 +126920 1877 1479 +126920 1847 1503 +126920 1643 1704 +126920 1670 1711 +126920 1841 1901 +126920 1546 1557 +126920 1831 1460 +126920 1890 1525 +126920 1657 1769 +126920 1908 1479 +126920 1554 1857 +126920 1568 1483 +126920 1829 1441 +126920 1829 1886 +126920 1718 1889 +126940 1542 1841 +126940 1542 1426 +126940 1546 1613 +126940 1549 1525 +126940 1551 1900 +126940 1554 1441 +126940 1554 1886 +126940 1562 1503 +126940 1563 1592 +126940 1563 1458 +126940 1570 1485 +126940 1573 1616 +126940 1573 1641 +126940 1573 1452 +126940 1579 1602 +126940 1579 1631 +126940 1587 1919 +126940 1602 1688 +126940 1602 1749 +126940 1602 1631 +126940 1604 1901 +126940 1604 1765 +126940 1608 1530 +126940 1616 1740 +126940 1623 1885 +126940 1631 1749 +126940 1641 1855 +126940 1672 1920 +126940 1673 1899 +126940 1678 1685 +126940 1698 1465 +126940 1701 1532 +126940 1702 1841 +126940 1702 1901 +126940 1731 1457 +126940 1732 1919 +126940 1790 1806 +126940 1805 1888 +126940 1811 1876 +126940 1906 1455 +126940 1428 1458 +126940 1460 1499 +126940 1582 1907 +126940 1587 1889 +126940 1587 1718 +126940 1654 1808 +126940 1702 1885 +126940 1708 1808 +126940 1789 1452 +126940 1792 1841 +126940 1841 1885 +126940 1520 1530 +126940 1598 1875 +126940 1680 1772 +126940 1698 1707 +126940 1703 1920 +126940 1715 1875 +126940 1742 1520 +126940 1754 1821 +126940 1792 1885 +126940 1877 1908 +126940 1877 1479 +126940 1659 1439 +126940 1708 1517 +126940 1892 1898 +126940 1552 1453 +126940 1598 1715 +126940 1847 1503 +126940 1643 1704 +126940 1670 1711 +126940 1841 1901 +126940 1546 1557 +126940 1831 1460 +126940 1890 1525 +126940 1554 1617 +126940 1657 1769 +126940 1908 1479 +126940 1554 1857 +126940 1568 1483 +126940 1829 1441 +126940 1829 1886 +126940 1886 1441 +126940 1718 1889 +126960 1540 1672 +126960 1542 1546 +126960 1542 1853 +126960 1545 1625 +126960 1551 1426 +126960 1551 1908 +126960 1568 1921 +126960 1568 1587 +126960 1582 1513 +126960 1582 1907 +126960 1587 1664 +126960 1587 1889 +126960 1587 1921 +126960 1587 1718 +126960 1598 1473 +126960 1608 1492 +126960 1608 1701 +126960 1612 1518 +126960 1612 1767 +126960 1613 1792 +126960 1613 1700 +126960 1613 1765 +126960 1638 1894 +126960 1641 1765 +126960 1641 1901 +126960 1647 1493 +126960 1654 1808 +126960 1664 1492 +126960 1665 1519 +126960 1678 1883 +126960 1698 1923 +126960 1700 1740 +126960 1700 1885 +126960 1701 1742 +126960 1702 1792 +126960 1702 1885 +126960 1707 1923 +126960 1708 1808 +126960 1728 1920 +126960 1765 1792 +126960 1765 1901 +126960 1765 1841 +126960 1789 1452 +126960 1789 1806 +126960 1792 1841 +126960 1841 1885 +126960 1857 1426 +126960 1897 1924 +126960 1897 1487 +126960 1924 1478 +126960 1435 1452 +126960 1443 1453 +126960 1492 1520 +126960 1492 1530 +126960 1520 1530 +126960 1598 1875 +126960 1647 1761 +126960 1680 1772 +126960 1698 1707 +126960 1700 1765 +126960 1700 1901 +126960 1701 1520 +126960 1701 1921 +126960 1701 1462 +126960 1703 1920 +126960 1707 1764 +126960 1715 1875 +126960 1740 1497 +126960 1742 1520 +126960 1754 1821 +126960 1792 1885 +126960 1877 1908 +126960 1877 1479 +126960 1613 1901 +126960 1659 1439 +126960 1708 1517 +126960 1892 1898 +126960 1921 1462 +126960 1552 1453 +126960 1598 1715 +126960 1847 1503 +126960 1643 1704 +126960 1670 1711 +126960 1841 1901 +126960 1546 1557 +126960 1831 1460 +126960 1890 1525 +126960 1554 1617 +126960 1657 1769 +126960 1908 1479 +126960 1554 1857 +126960 1568 1483 +126960 1829 1441 +126960 1829 1886 +126960 1886 1441 +126960 1549 1890 +126960 1718 1889 +126980 1542 1642 +126980 1542 1654 +126980 1546 1642 +126980 1556 1458 +126980 1562 1696 +126980 1563 1579 +126980 1570 1617 +126980 1570 1485 +126980 1573 1765 +126980 1575 1679 +126980 1598 1875 +126980 1604 1855 +126980 1628 1463 +126980 1631 1688 +126980 1631 1731 +126980 1641 1841 +126980 1647 1761 +126980 1658 1835 +126980 1664 1462 +126980 1678 1706 +126980 1678 1887 +126980 1680 1772 +126980 1688 1913 +126980 1698 1707 +126980 1698 1491 +126980 1700 1765 +126980 1700 1901 +126980 1701 1520 +126980 1701 1921 +126980 1701 1462 +126980 1701 1889 +126980 1703 1920 +126980 1703 1883 +126980 1707 1764 +126980 1715 1473 +126980 1715 1875 +126980 1740 1497 +126980 1742 1520 +126980 1749 1516 +126980 1749 1892 +126980 1749 1438 +126980 1754 1821 +126980 1761 1493 +126980 1768 1438 +126980 1771 1440 +126980 1792 1485 +126980 1792 1885 +126980 1816 1881 +126980 1825 1853 +126980 1877 1908 +126980 1877 1479 +126980 1885 1485 +126980 1898 1477 +126980 1906 1523 +126980 1919 1921 +126980 1500 1511 +126980 1503 1511 +126980 1538 1524 +126980 1573 1700 +126980 1592 1858 +126980 1613 1841 +126980 1613 1901 +126980 1613 1702 +126980 1622 1835 +126980 1659 1439 +126980 1664 1889 +126980 1664 1718 +126980 1702 1841 +126980 1702 1901 +126980 1708 1517 +126980 1892 1898 +126980 1921 1462 +126980 1551 1269 +126980 1552 1453 +126980 1598 1715 +126980 1811 1876 +126980 1831 1499 +126980 1847 1503 +126980 1876 1923 +126980 1582 1593 +126980 1643 1704 +126980 1670 1711 +126980 1841 1901 +126980 1546 1557 +126980 1831 1460 +126980 1890 1525 +126980 1554 1617 +126980 1657 1769 +126980 1908 1479 +126980 1554 1857 +126980 1834 1903 +126980 1568 1483 +126980 1829 1441 +126980 1608 1530 +126980 1829 1886 +126980 1886 1441 +126980 1549 1890 +126980 1718 1889 +127000 1538 1524 +127000 1540 1920 +127000 1540 1672 +127000 1546 1562 +127000 1564 1908 +127000 1573 1595 +127000 1573 1700 +127000 1577 1913 +127000 1579 1458 +127000 1587 1527 +127000 1592 1858 +127000 1602 1911 +127000 1602 1631 +127000 1613 1841 +127000 1613 1901 +127000 1613 1702 +127000 1613 1641 +127000 1617 1642 +127000 1622 1835 +127000 1638 1458 +127000 1638 1717 +127000 1642 1886 +127000 1659 1439 +127000 1664 1889 +127000 1664 1718 +127000 1678 1680 +127000 1683 1516 +127000 1702 1841 +127000 1702 1901 +127000 1706 1790 +127000 1708 1517 +127000 1768 1493 +127000 1836 1427 +127000 1842 1887 +127000 1847 1427 +127000 1863 1427 +127000 1882 1900 +127000 1892 1898 +127000 1921 1462 +127000 1427 1503 +127000 1438 1516 +127000 1551 1269 +127000 1551 1426 +127000 1552 1453 +127000 1554 1886 +127000 1598 1715 +127000 1811 1876 +127000 1831 1499 +127000 1847 1503 +127000 1876 1923 +127000 1582 1593 +127000 1919 1462 +127000 1520 1530 +127000 1549 1525 +127000 1577 1599 +127000 1643 1704 +127000 1670 1711 +127000 1749 1757 +127000 1841 1901 +127000 1546 1557 +127000 1598 1473 +127000 1831 1460 +127000 1836 1863 +127000 1890 1525 +127000 1554 1617 +127000 1657 1769 +127000 1573 1452 +127000 1908 1479 +127000 1554 1857 +127000 1834 1903 +127000 1568 1483 +127000 1829 1441 +127000 1608 1530 +127000 1829 1886 +127000 1886 1441 +127000 1549 1890 +127000 1718 1889 +127020 1551 1857 +127020 1551 1642 +127020 1551 1269 +127020 1551 1426 +127020 1551 1617 +127020 1552 1453 +127020 1554 1886 +127020 1557 1427 +127020 1587 1718 +127020 1596 1792 +127020 1598 1715 +127020 1644 1677 +127020 1647 1913 +127020 1647 1516 +127020 1692 1427 +127020 1701 1897 +127020 1701 1882 +127020 1703 1840 +127020 1708 1808 +127020 1749 1913 +127020 1768 1899 +127020 1769 1427 +127020 1790 1511 +127020 1796 1839 +127020 1806 1841 +127020 1806 1901 +127020 1811 1876 +127020 1831 1499 +127020 1847 1503 +127020 1876 1923 +127020 1906 1455 +127020 1500 1511 +127020 1545 1768 +127020 1546 1510 +127020 1582 1593 +127020 1790 1455 +127020 1792 1885 +127020 1919 1462 +127020 1520 1530 +127020 1549 1525 +127020 1577 1599 +127020 1598 1871 +127020 1643 1704 +127020 1670 1711 +127020 1680 1772 +127020 1749 1757 +127020 1841 1901 +127020 1546 1557 +127020 1598 1473 +127020 1612 1775 +127020 1831 1460 +127020 1836 1863 +127020 1890 1525 +127020 1554 1617 +127020 1657 1769 +127020 1573 1452 +127020 1908 1479 +127020 1554 1857 +127020 1834 1903 +127020 1568 1483 +127020 1698 1707 +127020 1829 1441 +127020 1608 1530 +127020 1877 1908 +127020 1829 1886 +127020 1886 1441 +127020 1549 1890 +127020 1718 1889 +127020 1761 1493 +127040 1538 1524 +127040 1545 1768 +127040 1546 1510 +127040 1556 1876 +127040 1556 1487 +127040 1559 1461 +127040 1563 1592 +127040 1581 1661 +127040 1582 1593 +127040 1587 1872 +127040 1593 1907 +127040 1604 1513 +127040 1625 1688 +127040 1625 1731 +127040 1635 1688 +127040 1635 1898 +127040 1640 1887 +127040 1647 1761 +127040 1657 1790 +127040 1677 1688 +127040 1678 1848 +127040 1688 1920 +127040 1701 1502 +127040 1742 1520 +127040 1749 1761 +127040 1749 1493 +127040 1757 1493 +127040 1790 1455 +127040 1792 1885 +127040 1816 1881 +127040 1866 1479 +127040 1887 1530 +127040 1919 1462 +127040 1516 1527 +127040 1520 1530 +127040 1549 1525 +127040 1577 1599 +127040 1598 1871 +127040 1635 1899 +127040 1643 1704 +127040 1670 1711 +127040 1673 1731 +127040 1680 1772 +127040 1698 1735 +127040 1704 1492 +127040 1749 1757 +127040 1786 1517 +127040 1841 1901 +127040 1924 1502 +127040 1546 1557 +127040 1598 1473 +127040 1612 1775 +127040 1643 1492 +127040 1831 1460 +127040 1836 1863 +127040 1890 1525 +127040 1554 1617 +127040 1657 1769 +127040 1706 1805 +127040 1573 1452 +127040 1877 1479 +127040 1908 1479 +127040 1554 1857 +127040 1834 1903 +127040 1568 1483 +127040 1698 1707 +127040 1829 1441 +127040 1608 1530 +127040 1877 1908 +127040 1829 1886 +127040 1886 1441 +127040 1549 1890 +127040 1718 1889 +127040 1761 1493 +127060 1549 1525 +127060 1551 1886 +127060 1552 1443 +127060 1552 1453 +127060 1557 1808 +127060 1577 1599 +127060 1591 1765 +127060 1598 1524 +127060 1598 1871 +127060 1613 1901 +127060 1613 1702 +127060 1635 1899 +127060 1641 1702 +127060 1643 1704 +127060 1644 1899 +127060 1652 1511 +127060 1657 1471 +127060 1667 1471 +127060 1670 1711 +127060 1673 1731 +127060 1673 1887 +127060 1680 1816 +127060 1680 1772 +127060 1688 1899 +127060 1694 1491 +127060 1698 1803 +127060 1698 1735 +127060 1702 1901 +127060 1704 1492 +127060 1711 1887 +127060 1721 1518 +127060 1749 1757 +127060 1761 1913 +127060 1769 1471 +127060 1772 1881 +127060 1786 1517 +127060 1816 1823 +127060 1841 1901 +127060 1875 1887 +127060 1886 1497 +127060 1894 1458 +127060 1899 1457 +127060 1924 1502 +127060 1500 1511 +127060 1546 1557 +127060 1598 1473 +127060 1603 1622 +127060 1612 1775 +127060 1616 1706 +127060 1617 1857 +127060 1642 1907 +127060 1643 1492 +127060 1694 1900 +127060 1811 1923 +127060 1831 1460 +127060 1836 1863 +127060 1890 1525 +127060 1554 1617 +127060 1657 1769 +127060 1706 1805 +127060 1573 1452 +127060 1573 1654 +127060 1789 1920 +127060 1831 1499 +127060 1877 1479 +127060 1908 1479 +127060 1554 1857 +127060 1678 1816 +127060 1834 1903 +127060 1876 1923 +127060 1669 1754 +127060 1568 1483 +127060 1638 1807 +127060 1698 1707 +127060 1847 1503 +127060 1829 1441 +127060 1608 1530 +127060 1877 1908 +127060 1829 1886 +127060 1886 1441 +127060 1549 1890 +127060 1718 1889 +127060 1761 1493 +127080 1538 1749 +127080 1540 1672 +127080 1545 1635 +127080 1546 1557 +127080 1554 1886 +127080 1556 1570 +127080 1563 1592 +127080 1569 1887 +127080 1573 1595 +127080 1575 1688 +127080 1582 1593 +127080 1582 1485 +127080 1587 1647 +127080 1598 1473 +127080 1602 1887 +127080 1603 1622 +127080 1612 1775 +127080 1616 1706 +127080 1617 1857 +127080 1642 1907 +127080 1643 1492 +127080 1678 1823 +127080 1694 1900 +127080 1700 1839 +127080 1702 1841 +127080 1754 1435 +127080 1772 1816 +127080 1811 1923 +127080 1811 1511 +127080 1831 1460 +127080 1836 1863 +127080 1876 1511 +127080 1887 1899 +127080 1890 1525 +127080 1438 1524 +127080 1457 1492 +127080 1538 1524 +127080 1546 1681 +127080 1554 1269 +127080 1554 1617 +127080 1556 1732 +127080 1604 1513 +127080 1657 1769 +127080 1678 1881 +127080 1706 1805 +127080 1823 1881 +127080 1866 1908 +127080 1905 1517 +127080 1919 1462 +127080 1551 1857 +127080 1551 1554 +127080 1573 1452 +127080 1573 1654 +127080 1789 1920 +127080 1831 1499 +127080 1877 1479 +127080 1908 1479 +127080 1554 1857 +127080 1602 1631 +127080 1678 1816 +127080 1811 1876 +127080 1816 1881 +127080 1834 1903 +127080 1876 1923 +127080 1669 1754 +127080 1568 1483 +127080 1638 1807 +127080 1698 1707 +127080 1767 1840 +127080 1847 1503 +127080 1857 1441 +127080 1829 1441 +127080 1608 1530 +127080 1582 1907 +127080 1877 1908 +127080 1829 1886 +127080 1551 1617 +127080 1551 1269 +127080 1886 1441 +127080 1549 1890 +127080 1688 1457 +127080 1718 1889 +127080 1761 1493 +127100 1538 1524 +127100 1546 1681 +127100 1554 1269 +127100 1554 1617 +127100 1556 1652 +127100 1556 1732 +127100 1557 1613 +127100 1582 1706 +127100 1591 1765 +127100 1593 1437 +127100 1602 1911 +127100 1604 1513 +127100 1616 1805 +127100 1617 1740 +127100 1625 1673 +127100 1628 1711 +127100 1647 1889 +127100 1657 1769 +127100 1670 1711 +127100 1678 1881 +127100 1703 1840 +127100 1706 1907 +127100 1706 1805 +127100 1727 1845 +127100 1742 1520 +127100 1765 1876 +127100 1791 1453 +127100 1792 1885 +127100 1805 1485 +127100 1823 1881 +127100 1866 1908 +127100 1884 1887 +127100 1905 1517 +127100 1919 1462 +127100 1551 1857 +127100 1551 1554 +127100 1559 1461 +127100 1573 1452 +127100 1573 1654 +127100 1622 1498 +127100 1625 1825 +127100 1703 1711 +127100 1789 1920 +127100 1831 1499 +127100 1841 1471 +127100 1877 1479 +127100 1906 1455 +127100 1908 1479 +127100 1914 1440 +127100 1500 1511 +127100 1549 1525 +127100 1554 1857 +127100 1559 1887 +127100 1602 1631 +127100 1678 1816 +127100 1811 1876 +127100 1816 1881 +127100 1834 1903 +127100 1876 1923 +127100 1669 1754 +127100 1568 1483 +127100 1638 1807 +127100 1698 1707 +127100 1767 1840 +127100 1847 1503 +127100 1857 1441 +127100 1829 1441 +127100 1608 1530 +127100 1582 1907 +127100 1877 1908 +127100 1829 1886 +127100 1551 1617 +127100 1551 1269 +127100 1886 1441 +127100 1549 1890 +127100 1688 1457 +127100 1718 1889 +127100 1761 1493 +127100 1598 1871 +127120 1541 1608 +127120 1546 1554 +127120 1546 1907 +127120 1546 1485 +127120 1551 1857 +127120 1551 1554 +127120 1557 1907 +127120 1559 1461 +127120 1563 1592 +127120 1563 1487 +127120 1573 1452 +127120 1573 1654 +127120 1582 1790 +127120 1602 1890 +127120 1602 1519 +127120 1616 1437 +127120 1622 1498 +127120 1622 1676 +127120 1625 1825 +127120 1631 1899 +127120 1638 1919 +127120 1641 1526 +127120 1642 1523 +127120 1642 1887 +127120 1664 1439 +127120 1703 1711 +127120 1706 1855 +127120 1734 1848 +127120 1761 1458 +127120 1789 1920 +127120 1789 1458 +127120 1831 1499 +127120 1831 1460 +127120 1841 1471 +127120 1855 1437 +127120 1877 1479 +127120 1906 1455 +127120 1908 1479 +127120 1914 1440 +127120 1428 1520 +127120 1500 1511 +127120 1549 1525 +127120 1554 1441 +127120 1554 1886 +127120 1554 1857 +127120 1559 1887 +127120 1602 1825 +127120 1602 1899 +127120 1602 1884 +127120 1602 1631 +127120 1884 1899 +127120 1617 1269 +127120 1678 1816 +127120 1811 1876 +127120 1816 1881 +127120 1834 1903 +127120 1876 1923 +127120 1901 1471 +127120 1669 1754 +127120 1676 1831 +127120 1811 1923 +127120 1831 1498 +127120 1920 1458 +127120 1568 1483 +127120 1638 1807 +127120 1698 1707 +127120 1640 1853 +127120 1767 1840 +127120 1847 1503 +127120 1857 1441 +127120 1829 1441 +127120 1857 1886 +127120 1608 1530 +127120 1582 1907 +127120 1877 1908 +127120 1829 1886 +127120 1551 1617 +127120 1551 1269 +127120 1886 1441 +127120 1549 1890 +127120 1688 1457 +127120 1718 1889 +127120 1761 1493 +127120 1598 1871 +127140 1541 1520 +127140 1542 1708 +127140 1545 1635 +127140 1546 1711 +127140 1549 1525 +127140 1554 1441 +127140 1554 1886 +127140 1554 1857 +127140 1559 1887 +127140 1568 1473 +127140 1568 1749 +127140 1568 1789 +127140 1570 1479 +127140 1573 1805 +127140 1591 1528 +127140 1602 1825 +127140 1602 1899 +127140 1602 1884 +127140 1602 1631 +127140 1604 1914 +127140 1613 1641 +127140 1616 1440 +127140 1643 1704 +127140 1643 1858 +127140 1647 1911 +127140 1659 1894 +127140 1703 1858 +127140 1706 1901 +127140 1708 1808 +127140 1718 1527 +127140 1728 1768 +127140 1749 1428 +127140 1761 1789 +127140 1792 1886 +127140 1825 1899 +127140 1880 1921 +127140 1884 1899 +127140 1887 1435 +127140 1924 1502 +127140 1461 1519 +127140 1485 1529 +127140 1604 1437 +127140 1617 1269 +127140 1631 1825 +127140 1678 1816 +127140 1692 1427 +127140 1708 1786 +127140 1727 1845 +127140 1811 1876 +127140 1816 1881 +127140 1825 1884 +127140 1834 1903 +127140 1876 1923 +127140 1901 1471 +127140 1538 1524 +127140 1669 1754 +127140 1676 1498 +127140 1676 1831 +127140 1811 1923 +127140 1831 1498 +127140 1920 1458 +127140 1538 1579 +127140 1568 1483 +127140 1602 1640 +127140 1638 1807 +127140 1698 1707 +127140 1792 1885 +127140 1924 1492 +127140 1563 1579 +127140 1612 1775 +127140 1640 1853 +127140 1767 1840 +127140 1847 1503 +127140 1857 1441 +127140 1657 1769 +127140 1829 1441 +127140 1857 1886 +127140 1608 1530 +127140 1790 1426 +127140 1865 1914 +127140 1579 1524 +127140 1582 1907 +127140 1877 1908 +127140 1829 1886 +127140 1551 1617 +127140 1551 1269 +127140 1731 1443 +127140 1886 1441 +127140 1549 1890 +127140 1688 1457 +127140 1718 1889 +127140 1761 1493 +127140 1598 1871 +127140 1665 1519 +127160 1537 1703 +127160 1541 1921 +127160 1546 1557 +127160 1573 1796 +127160 1602 1461 +127160 1604 1437 +127160 1613 1711 +127160 1617 1269 +127160 1622 1816 +127160 1625 1825 +127160 1631 1825 +127160 1631 1461 +127160 1634 1728 +127160 1643 1876 +127160 1657 1706 +127160 1657 1667 +127160 1677 1749 +127160 1678 1816 +127160 1692 1427 +127160 1695 1526 +127160 1706 1471 +127160 1708 1786 +127160 1711 1792 +127160 1711 1887 +127160 1718 1749 +127160 1727 1845 +127160 1761 1438 +127160 1811 1876 +127160 1816 1881 +127160 1825 1884 +127160 1825 1461 +127160 1829 1857 +127160 1834 1903 +127160 1876 1923 +127160 1901 1471 +127160 1538 1524 +127160 1622 1676 +127160 1622 1685 +127160 1631 1899 +127160 1669 1754 +127160 1676 1498 +127160 1676 1831 +127160 1711 1440 +127160 1811 1923 +127160 1831 1498 +127160 1920 1458 +127160 1538 1579 +127160 1568 1483 +127160 1602 1640 +127160 1602 1853 +127160 1614 1526 +127160 1638 1807 +127160 1698 1707 +127160 1792 1885 +127160 1906 1437 +127160 1924 1492 +127160 1500 1511 +127160 1563 1579 +127160 1612 1775 +127160 1640 1853 +127160 1767 1840 +127160 1847 1503 +127160 1857 1441 +127160 1657 1769 +127160 1829 1441 +127160 1857 1886 +127160 1538 1563 +127160 1608 1530 +127160 1790 1426 +127160 1865 1914 +127160 1579 1524 +127160 1582 1907 +127160 1877 1908 +127160 1563 1524 +127160 1829 1886 +127160 1551 1617 +127160 1551 1269 +127160 1731 1443 +127160 1886 1441 +127160 1549 1890 +127160 1688 1457 +127160 1718 1889 +127160 1761 1493 +127160 1598 1871 +127160 1665 1519 +127180 1538 1524 +127180 1545 1430 +127180 1562 1892 +127180 1573 1427 +127180 1573 1839 +127180 1582 1499 +127180 1602 1899 +127180 1602 1884 +127180 1604 1906 +127180 1622 1676 +127180 1622 1685 +127180 1631 1640 +127180 1631 1899 +127180 1638 1825 +127180 1643 1704 +127180 1667 1841 +127180 1669 1754 +127180 1676 1498 +127180 1676 1831 +127180 1711 1440 +127180 1792 1886 +127180 1811 1923 +127180 1816 1823 +127180 1831 1498 +127180 1841 1471 +127180 1876 1887 +127180 1920 1458 +127180 1921 1461 +127180 1427 1485 +127180 1452 1499 +127180 1478 1492 +127180 1538 1579 +127180 1549 1525 +127180 1568 1483 +127180 1602 1640 +127180 1602 1853 +127180 1614 1526 +127180 1622 1831 +127180 1638 1807 +127180 1698 1707 +127180 1742 1520 +127180 1749 1789 +127180 1792 1885 +127180 1825 1921 +127180 1906 1437 +127180 1924 1492 +127180 1924 1502 +127180 1500 1511 +127180 1559 1463 +127180 1563 1579 +127180 1612 1775 +127180 1640 1853 +127180 1767 1840 +127180 1847 1503 +127180 1853 1884 +127180 1857 1441 +127180 1657 1769 +127180 1703 1470 +127180 1829 1441 +127180 1857 1886 +127180 1538 1563 +127180 1608 1530 +127180 1703 1707 +127180 1790 1426 +127180 1865 1914 +127180 1579 1524 +127180 1582 1907 +127180 1877 1908 +127180 1563 1524 +127180 1635 1443 +127180 1829 1886 +127180 1635 1731 +127180 1551 1617 +127180 1551 1269 +127180 1731 1443 +127180 1886 1441 +127180 1549 1890 +127180 1688 1457 +127180 1718 1889 +127180 1761 1493 +127180 1598 1871 +127180 1665 1519 +127180 1552 1453 +127200 1538 1579 +127200 1549 1525 +127200 1554 1665 +127200 1554 1463 +127200 1568 1761 +127200 1568 1483 +127200 1573 1831 +127200 1598 1458 +127200 1602 1640 +127200 1602 1853 +127200 1604 1437 +127200 1614 1526 +127200 1616 1513 +127200 1622 1769 +127200 1622 1831 +127200 1638 1921 +127200 1638 1807 +127200 1641 1526 +127200 1642 1863 +127200 1643 1765 +127200 1676 1708 +127200 1687 1907 +127200 1698 1707 +127200 1698 1703 +127200 1718 1520 +127200 1731 1816 +127200 1742 1520 +127200 1749 1789 +127200 1792 1885 +127200 1816 1836 +127200 1825 1921 +127200 1871 1458 +127200 1887 1469 +127200 1900 1911 +127200 1906 1437 +127200 1919 1532 +127200 1924 1492 +127200 1924 1502 +127200 1500 1511 +127200 1559 1463 +127200 1563 1579 +127200 1568 1493 +127200 1599 1882 +127200 1612 1775 +127200 1613 1840 +127200 1640 1853 +127200 1767 1840 +127200 1847 1503 +127200 1853 1884 +127200 1857 1441 +127200 1657 1769 +127200 1703 1470 +127200 1829 1441 +127200 1857 1886 +127200 1924 1478 +127200 1538 1563 +127200 1640 1884 +127200 1834 1903 +127200 1608 1530 +127200 1703 1707 +127200 1790 1426 +127200 1865 1914 +127200 1579 1524 +127200 1582 1907 +127200 1877 1908 +127200 1563 1524 +127200 1635 1443 +127200 1829 1886 +127200 1617 1269 +127200 1635 1731 +127200 1702 1841 +127200 1551 1617 +127200 1551 1269 +127200 1731 1443 +127200 1886 1441 +127200 1549 1890 +127200 1688 1457 +127200 1718 1889 +127200 1761 1493 +127200 1598 1871 +127200 1665 1519 +127200 1552 1453 +127220 1538 1592 +127220 1541 1718 +127220 1554 1635 +127220 1554 1573 +127220 1556 1616 +127220 1557 1579 +127220 1559 1463 +127220 1562 1816 +127220 1563 1592 +127220 1563 1579 +127220 1568 1920 +127220 1568 1493 +127220 1570 1616 +127220 1591 1865 +127220 1592 1487 +127220 1595 1437 +127220 1595 1654 +127220 1599 1882 +127220 1612 1775 +127220 1613 1840 +127220 1613 1665 +127220 1613 1898 +127220 1617 1441 +127220 1640 1853 +127220 1643 1469 +127220 1669 1754 +127220 1685 1816 +127220 1706 1471 +127220 1711 1441 +127220 1718 1880 +127220 1767 1840 +127220 1792 1865 +127220 1805 1870 +127220 1816 1523 +127220 1840 1898 +127220 1841 1855 +127220 1847 1503 +127220 1853 1884 +127220 1857 1441 +127220 1880 1889 +127220 1890 1525 +127220 1921 1532 +127220 1507 1522 +127220 1545 1768 +127220 1546 1579 +127220 1596 1792 +127220 1657 1769 +127220 1703 1470 +127220 1829 1441 +127220 1857 1886 +127220 1892 1898 +127220 1924 1478 +127220 1538 1563 +127220 1604 1857 +127220 1640 1884 +127220 1721 1816 +127220 1876 1479 +127220 1622 1695 +127220 1695 1526 +127220 1816 1823 +127220 1834 1903 +127220 1608 1530 +127220 1703 1707 +127220 1790 1426 +127220 1865 1914 +127220 1579 1524 +127220 1582 1907 +127220 1676 1498 +127220 1877 1908 +127220 1563 1524 +127220 1581 1479 +127220 1635 1443 +127220 1829 1886 +127220 1617 1269 +127220 1622 1526 +127220 1635 1731 +127220 1702 1841 +127220 1551 1617 +127220 1551 1269 +127220 1731 1443 +127220 1886 1441 +127220 1549 1890 +127220 1688 1457 +127220 1718 1889 +127220 1761 1493 +127220 1598 1871 +127220 1665 1519 +127220 1552 1453 +127240 1537 1647 +127240 1545 1768 +127240 1546 1520 +127240 1546 1579 +127240 1554 1816 +127240 1554 1821 +127240 1562 1768 +127240 1573 1673 +127240 1579 1520 +127240 1596 1792 +127240 1596 1885 +127240 1654 1437 +127240 1657 1769 +127240 1673 1825 +127240 1678 1459 +127240 1698 1707 +127240 1703 1470 +127240 1704 1792 +127240 1802 1816 +127240 1802 1440 +127240 1825 1921 +127240 1829 1441 +127240 1857 1886 +127240 1892 1898 +127240 1924 1502 +127240 1924 1478 +127240 1462 1532 +127240 1478 1492 +127240 1485 1517 +127240 1538 1563 +127240 1538 1524 +127240 1541 1880 +127240 1604 1857 +127240 1634 1920 +127240 1640 1884 +127240 1721 1816 +127240 1876 1479 +127240 1538 1579 +127240 1622 1695 +127240 1695 1526 +127240 1698 1703 +127240 1816 1823 +127240 1834 1903 +127240 1608 1530 +127240 1703 1707 +127240 1790 1426 +127240 1865 1914 +127240 1579 1524 +127240 1582 1907 +127240 1676 1498 +127240 1877 1908 +127240 1563 1524 +127240 1581 1479 +127240 1613 1625 +127240 1635 1443 +127240 1829 1886 +127240 1924 1492 +127240 1617 1269 +127240 1622 1526 +127240 1635 1731 +127240 1702 1841 +127240 1796 1816 +127240 1551 1617 +127240 1551 1269 +127240 1731 1443 +127240 1886 1441 +127240 1549 1890 +127240 1688 1457 +127240 1718 1889 +127240 1761 1493 +127240 1598 1871 +127240 1665 1519 +127240 1552 1453 +127260 1538 1563 +127260 1538 1524 +127260 1541 1880 +127260 1541 1881 +127260 1546 1708 +127260 1546 1557 +127260 1556 1643 +127260 1557 1749 +127260 1570 1479 +127260 1573 1440 +127260 1573 1921 +127260 1579 1708 +127260 1604 1857 +127260 1634 1920 +127260 1635 1821 +127260 1640 1884 +127260 1673 1865 +127260 1673 1914 +127260 1688 1911 +127260 1706 1471 +127260 1721 1816 +127260 1731 1821 +127260 1761 1863 +127260 1765 1889 +127260 1789 1427 +127260 1789 1435 +127260 1805 1888 +127260 1866 1908 +127260 1876 1479 +127260 1880 1462 +127260 1889 1502 +127260 1921 1440 +127260 1921 1523 +127260 1921 1532 +127260 1487 1520 +127260 1500 1511 +127260 1502 1532 +127260 1507 1522 +127260 1538 1579 +127260 1622 1695 +127260 1625 1825 +127260 1625 1821 +127260 1695 1526 +127260 1698 1703 +127260 1711 1802 +127260 1816 1823 +127260 1831 1499 +127260 1834 1903 +127260 1920 1483 +127260 1608 1530 +127260 1703 1707 +127260 1790 1426 +127260 1865 1914 +127260 1579 1524 +127260 1582 1907 +127260 1676 1498 +127260 1877 1908 +127260 1892 1477 +127260 1563 1579 +127260 1563 1524 +127260 1581 1479 +127260 1613 1625 +127260 1635 1443 +127260 1829 1886 +127260 1924 1492 +127260 1617 1269 +127260 1622 1526 +127260 1635 1731 +127260 1702 1841 +127260 1796 1816 +127260 1551 1617 +127260 1551 1269 +127260 1731 1443 +127260 1541 1462 +127260 1886 1441 +127260 1642 1704 +127260 1825 1510 +127260 1549 1890 +127260 1688 1457 +127260 1718 1889 +127260 1761 1493 +127260 1598 1871 +127260 1665 1519 +127260 1552 1453 +127280 1538 1579 +127280 1540 1520 +127280 1551 1604 +127280 1556 1427 +127280 1557 1599 +127280 1559 1569 +127280 1562 1635 +127280 1568 1920 +127280 1604 1617 +127280 1608 1502 +127280 1612 1775 +127280 1613 1825 +127280 1613 1821 +127280 1622 1695 +127280 1625 1825 +127280 1625 1821 +127280 1664 1728 +127280 1673 1433 +127280 1673 1718 +127280 1695 1526 +127280 1698 1703 +127280 1703 1520 +127280 1703 1764 +127280 1711 1802 +127280 1792 1427 +127280 1816 1823 +127280 1821 1825 +127280 1823 1881 +127280 1831 1499 +127280 1834 1903 +127280 1836 1882 +127280 1840 1892 +127280 1920 1483 +127280 1440 1502 +127280 1502 1530 +127280 1608 1530 +127280 1669 1754 +127280 1703 1707 +127280 1790 1426 +127280 1802 1469 +127280 1865 1914 +127280 1919 1924 +127280 1485 1517 +127280 1579 1524 +127280 1582 1907 +127280 1657 1769 +127280 1676 1498 +127280 1877 1908 +127280 1892 1477 +127280 1563 1579 +127280 1563 1524 +127280 1581 1479 +127280 1613 1625 +127280 1642 1643 +127280 1635 1443 +127280 1829 1886 +127280 1924 1492 +127280 1617 1269 +127280 1622 1526 +127280 1635 1731 +127280 1702 1841 +127280 1796 1816 +127280 1816 1881 +127280 1551 1617 +127280 1551 1269 +127280 1731 1443 +127280 1541 1462 +127280 1886 1441 +127280 1642 1704 +127280 1825 1510 +127280 1643 1704 +127280 1549 1890 +127280 1688 1457 +127280 1718 1889 +127280 1761 1493 +127280 1598 1871 +127280 1665 1519 +127280 1552 1453 +127300 1542 1554 +127300 1545 1430 +127300 1562 1613 +127300 1591 1865 +127300 1608 1530 +127300 1608 1866 +127300 1612 1802 +127300 1613 1921 +127300 1634 1920 +127300 1641 1695 +127300 1643 1520 +127300 1669 1754 +127300 1698 1764 +127300 1702 1901 +127300 1703 1707 +127300 1708 1789 +127300 1749 1765 +127300 1790 1426 +127300 1802 1469 +127300 1836 1502 +127300 1841 1901 +127300 1865 1914 +127300 1870 1906 +127300 1919 1924 +127300 1485 1517 +127300 1562 1882 +127300 1579 1524 +127300 1582 1907 +127300 1599 1532 +127300 1657 1769 +127300 1676 1498 +127300 1761 1438 +127300 1792 1885 +127300 1877 1908 +127300 1892 1477 +127300 1538 1563 +127300 1563 1579 +127300 1563 1524 +127300 1581 1479 +127300 1613 1625 +127300 1642 1643 +127300 1670 1908 +127300 1635 1443 +127300 1796 1881 +127300 1829 1886 +127300 1829 1441 +127300 1890 1525 +127300 1892 1898 +127300 1924 1492 +127300 1546 1557 +127300 1617 1269 +127300 1622 1526 +127300 1635 1731 +127300 1702 1841 +127300 1721 1816 +127300 1796 1816 +127300 1816 1881 +127300 1551 1617 +127300 1551 1269 +127300 1731 1443 +127300 1500 1511 +127300 1541 1462 +127300 1886 1441 +127300 1642 1704 +127300 1825 1510 +127300 1643 1704 +127300 1549 1890 +127300 1688 1457 +127300 1718 1889 +127300 1761 1493 +127300 1598 1871 +127300 1665 1519 +127300 1552 1453 +127320 1538 1579 +127320 1562 1440 +127320 1562 1882 +127320 1563 1633 +127320 1569 1520 +127320 1579 1524 +127320 1580 1816 +127320 1582 1907 +127320 1599 1440 +127320 1599 1882 +127320 1599 1532 +127320 1604 1857 +127320 1608 1520 +127320 1612 1692 +127320 1613 1825 +127320 1648 1685 +127320 1657 1769 +127320 1670 1877 +127320 1676 1498 +127320 1685 1696 +127320 1695 1526 +127320 1727 1845 +127320 1732 1889 +127320 1761 1438 +127320 1783 1531 +127320 1792 1885 +127320 1840 1477 +127320 1877 1908 +127320 1892 1477 +127320 1921 1520 +127320 1538 1563 +127320 1563 1579 +127320 1563 1524 +127320 1581 1479 +127320 1613 1625 +127320 1642 1643 +127320 1664 1728 +127320 1670 1908 +127320 1635 1443 +127320 1676 1790 +127320 1698 1707 +127320 1754 1906 +127320 1796 1881 +127320 1829 1886 +127320 1829 1441 +127320 1840 1892 +127320 1890 1525 +127320 1892 1898 +127320 1924 1492 +127320 1546 1557 +127320 1576 1680 +127320 1617 1269 +127320 1622 1526 +127320 1622 1695 +127320 1635 1731 +127320 1702 1841 +127320 1721 1816 +127320 1796 1816 +127320 1816 1823 +127320 1816 1881 +127320 1551 1617 +127320 1551 1269 +127320 1731 1443 +127320 1500 1511 +127320 1541 1462 +127320 1669 1906 +127320 1886 1441 +127320 1642 1704 +127320 1825 1510 +127320 1643 1704 +127320 1549 1890 +127320 1790 1498 +127320 1688 1457 +127320 1718 1889 +127320 1761 1493 +127320 1598 1871 +127320 1665 1519 +127320 1552 1453 +127340 1538 1563 +127340 1542 1765 +127340 1542 1789 +127340 1557 1684 +127340 1558 1516 +127340 1563 1592 +127340 1563 1579 +127340 1563 1524 +127340 1568 1768 +127340 1568 1514 +127340 1581 1479 +127340 1582 1667 +127340 1590 1522 +127340 1595 1654 +127340 1613 1625 +127340 1617 1857 +127340 1642 1643 +127340 1664 1728 +127340 1670 1908 +127340 1717 1439 +127340 1749 1757 +127340 1761 1883 +127340 1765 1532 +127340 1789 1532 +127340 1831 1499 +127340 1857 1497 +127340 1877 1479 +127340 1907 1908 +127340 1908 1479 +127340 1554 1434 +127340 1554 1612 +127340 1599 1825 +127340 1635 1443 +127340 1676 1790 +127340 1698 1707 +127340 1698 1764 +127340 1707 1764 +127340 1754 1906 +127340 1767 1892 +127340 1796 1881 +127340 1829 1857 +127340 1829 1886 +127340 1829 1441 +127340 1840 1892 +127340 1890 1525 +127340 1892 1898 +127340 1924 1492 +127340 1461 1500 +127340 1546 1557 +127340 1576 1680 +127340 1617 1269 +127340 1622 1526 +127340 1622 1695 +127340 1635 1731 +127340 1641 1526 +127340 1702 1841 +127340 1711 1802 +127340 1721 1816 +127340 1796 1816 +127340 1816 1823 +127340 1816 1881 +127340 1551 1617 +127340 1551 1269 +127340 1608 1919 +127340 1731 1443 +127340 1834 1903 +127340 1500 1511 +127340 1541 1462 +127340 1669 1906 +127340 1886 1441 +127340 1580 1628 +127340 1642 1704 +127340 1581 1908 +127340 1670 1479 +127340 1825 1510 +127340 1502 1530 +127340 1580 1463 +127340 1582 1437 +127340 1643 1704 +127340 1549 1890 +127340 1680 1835 +127340 1790 1498 +127340 1688 1457 +127340 1718 1889 +127340 1840 1898 +127340 1761 1493 +127340 1598 1871 +127340 1665 1519 +127340 1552 1453 +127360 1538 1579 +127360 1542 1688 +127360 1542 1749 +127360 1551 1857 +127360 1554 1434 +127360 1554 1612 +127360 1562 1880 +127360 1563 1618 +127360 1568 1443 +127360 1576 1835 +127360 1599 1825 +127360 1601 1652 +127360 1604 1839 +127360 1613 1483 +127360 1635 1443 +127360 1648 1696 +127360 1676 1790 +127360 1695 1526 +127360 1698 1707 +127360 1698 1764 +127360 1700 1718 +127360 1707 1764 +127360 1710 1734 +127360 1734 1786 +127360 1754 1906 +127360 1765 1443 +127360 1767 1892 +127360 1796 1881 +127360 1829 1857 +127360 1829 1886 +127360 1829 1441 +127360 1840 1892 +127360 1890 1525 +127360 1892 1898 +127360 1924 1492 +127360 1461 1500 +127360 1461 1511 +127360 1538 1524 +127360 1546 1557 +127360 1576 1680 +127360 1608 1520 +127360 1617 1269 +127360 1622 1526 +127360 1622 1695 +127360 1635 1731 +127360 1641 1526 +127360 1702 1841 +127360 1711 1802 +127360 1721 1816 +127360 1796 1816 +127360 1816 1823 +127360 1816 1881 +127360 1919 1492 +127360 1551 1617 +127360 1551 1269 +127360 1608 1919 +127360 1703 1707 +127360 1731 1443 +127360 1834 1903 +127360 1500 1511 +127360 1541 1462 +127360 1573 1919 +127360 1669 1906 +127360 1792 1885 +127360 1886 1441 +127360 1580 1628 +127360 1642 1704 +127360 1581 1908 +127360 1670 1479 +127360 1825 1510 +127360 1502 1530 +127360 1580 1463 +127360 1582 1437 +127360 1643 1704 +127360 1549 1890 +127360 1680 1835 +127360 1790 1498 +127360 1688 1457 +127360 1718 1889 +127360 1840 1898 +127360 1761 1493 +127360 1598 1871 +127360 1665 1519 +127360 1552 1453 +127380 1538 1524 +127380 1546 1557 +127380 1549 1525 +127380 1554 1568 +127380 1556 1601 +127380 1558 1516 +127380 1563 1592 +127380 1563 1579 +127380 1570 1707 +127380 1575 1761 +127380 1576 1680 +127380 1608 1520 +127380 1612 1532 +127380 1612 1613 +127380 1613 1625 +127380 1613 1635 +127380 1617 1269 +127380 1622 1526 +127380 1622 1695 +127380 1635 1880 +127380 1635 1731 +127380 1635 1532 +127380 1635 1502 +127380 1641 1734 +127380 1641 1526 +127380 1664 1728 +127380 1673 1440 +127380 1684 1888 +127380 1694 1717 +127380 1702 1841 +127380 1706 1901 +127380 1711 1857 +127380 1711 1802 +127380 1721 1816 +127380 1734 1806 +127380 1749 1757 +127380 1749 1821 +127380 1775 1898 +127380 1796 1816 +127380 1802 1857 +127380 1802 1469 +127380 1816 1823 +127380 1816 1881 +127380 1865 1876 +127380 1880 1532 +127380 1919 1492 +127380 1921 1492 +127380 1551 1617 +127380 1551 1269 +127380 1573 1608 +127380 1573 1520 +127380 1591 1471 +127380 1608 1919 +127380 1644 1661 +127380 1698 1487 +127380 1703 1707 +127380 1731 1443 +127380 1834 1903 +127380 1919 1924 +127380 1920 1505 +127380 1500 1511 +127380 1541 1462 +127380 1559 1463 +127380 1573 1919 +127380 1579 1524 +127380 1613 1518 +127380 1669 1754 +127380 1669 1906 +127380 1761 1920 +127380 1792 1885 +127380 1886 1441 +127380 1924 1520 +127380 1580 1628 +127380 1642 1704 +127380 1642 1643 +127380 1581 1908 +127380 1877 1908 +127380 1670 1479 +127380 1825 1510 +127380 1502 1530 +127380 1580 1463 +127380 1582 1437 +127380 1643 1704 +127380 1549 1890 +127380 1538 1563 +127380 1680 1835 +127380 1790 1498 +127380 1688 1457 +127380 1718 1889 +127380 1840 1898 +127380 1761 1493 +127380 1598 1871 +127380 1665 1519 +127380 1552 1453 +127400 1538 1511 +127400 1551 1568 +127400 1551 1617 +127400 1551 1269 +127400 1551 1857 +127400 1552 1819 +127400 1554 1562 +127400 1554 1532 +127400 1554 1613 +127400 1554 1502 +127400 1556 1865 +127400 1556 1718 +127400 1556 1889 +127400 1559 1580 +127400 1562 1530 +127400 1562 1483 +127400 1562 1612 +127400 1570 1708 +127400 1573 1608 +127400 1573 1520 +127400 1591 1471 +127400 1595 1654 +127400 1598 1845 +127400 1608 1492 +127400 1608 1919 +127400 1612 1502 +127400 1613 1532 +127400 1635 1647 +127400 1644 1661 +127400 1648 1920 +127400 1698 1803 +127400 1698 1487 +127400 1700 1876 +127400 1703 1707 +127400 1731 1443 +127400 1731 1532 +127400 1767 1789 +127400 1816 1442 +127400 1834 1903 +127400 1865 1889 +127400 1881 1442 +127400 1883 1516 +127400 1890 1525 +127400 1919 1520 +127400 1919 1924 +127400 1919 1478 +127400 1920 1505 +127400 1500 1511 +127400 1511 1524 +127400 1518 1532 +127400 1541 1462 +127400 1559 1463 +127400 1563 1511 +127400 1573 1919 +127400 1579 1524 +127400 1599 1882 +127400 1613 1518 +127400 1669 1754 +127400 1669 1906 +127400 1761 1920 +127400 1792 1885 +127400 1829 1441 +127400 1886 1441 +127400 1920 1493 +127400 1924 1520 +127400 1478 1520 +127400 1568 1684 +127400 1580 1628 +127400 1642 1704 +127400 1642 1643 +127400 1841 1448 +127400 1581 1908 +127400 1877 1908 +127400 1670 1479 +127400 1825 1510 +127400 1502 1530 +127400 1580 1463 +127400 1582 1437 +127400 1643 1704 +127400 1549 1890 +127400 1538 1563 +127400 1680 1835 +127400 1790 1498 +127400 1688 1457 +127400 1754 1906 +127400 1718 1889 +127400 1840 1898 +127400 1761 1493 +127400 1598 1871 +127400 1665 1519 +127400 1552 1453 +127420 1541 1574 +127420 1541 1462 +127420 1554 1688 +127420 1556 1681 +127420 1556 1886 +127420 1559 1463 +127420 1562 1518 +127420 1563 1579 +127420 1563 1511 +127420 1569 1458 +127420 1573 1919 +127420 1579 1524 +127420 1599 1882 +127420 1599 1510 +127420 1604 1816 +127420 1613 1518 +127420 1616 1855 +127420 1617 1886 +127420 1628 1463 +127420 1647 1452 +127420 1667 1865 +127420 1667 1718 +127420 1667 1889 +127420 1669 1754 +127420 1669 1906 +127420 1694 1717 +127420 1698 1461 +127420 1698 1511 +127420 1700 1526 +127420 1701 1883 +127420 1711 1740 +127420 1718 1865 +127420 1761 1920 +127420 1792 1885 +127420 1802 1469 +127420 1819 1453 +127420 1829 1441 +127420 1886 1441 +127420 1920 1493 +127420 1924 1520 +127420 1924 1478 +127420 1478 1520 +127420 1485 1517 +127420 1518 1530 +127420 1538 1524 +127420 1568 1684 +127420 1580 1628 +127420 1641 1460 +127420 1642 1704 +127420 1642 1643 +127420 1816 1823 +127420 1841 1448 +127420 1574 1518 +127420 1581 1908 +127420 1581 1877 +127420 1613 1625 +127420 1711 1908 +127420 1711 1877 +127420 1877 1908 +127420 1549 1525 +127420 1573 1924 +127420 1670 1479 +127420 1825 1510 +127420 1502 1530 +127420 1580 1463 +127420 1582 1437 +127420 1643 1704 +127420 1829 1886 +127420 1549 1890 +127420 1563 1524 +127420 1538 1563 +127420 1680 1835 +127420 1790 1498 +127420 1688 1457 +127420 1754 1906 +127420 1718 1889 +127420 1840 1898 +127420 1761 1493 +127420 1598 1871 +127420 1665 1519 +127420 1552 1453 +127440 1538 1524 +127440 1540 1554 +127440 1551 1568 +127440 1554 1579 +127440 1556 1441 +127440 1568 1684 +127440 1580 1628 +127440 1593 1765 +127440 1595 1816 +127440 1599 1499 +127440 1599 1884 +127440 1608 1483 +127440 1625 1882 +127440 1641 1460 +127440 1641 1710 +127440 1642 1704 +127440 1642 1643 +127440 1644 1661 +127440 1656 1717 +127440 1679 1821 +127440 1685 1443 +127440 1702 1448 +127440 1703 1707 +127440 1713 1734 +127440 1717 1511 +127440 1727 1819 +127440 1734 1848 +127440 1816 1823 +127440 1831 1526 +127440 1841 1448 +127440 1847 1503 +127440 1848 1517 +127440 1889 1921 +127440 1898 1477 +127440 1562 1613 +127440 1564 1681 +127440 1573 1478 +127440 1574 1518 +127440 1581 1908 +127440 1581 1877 +127440 1581 1711 +127440 1595 1654 +127440 1613 1825 +127440 1613 1625 +127440 1711 1908 +127440 1711 1877 +127440 1727 1845 +127440 1877 1908 +127440 1549 1525 +127440 1576 1680 +127440 1641 1713 +127440 1834 1903 +127440 1573 1924 +127440 1670 1479 +127440 1825 1510 +127440 1502 1530 +127440 1580 1463 +127440 1582 1437 +127440 1643 1704 +127440 1829 1886 +127440 1549 1890 +127440 1563 1524 +127440 1890 1525 +127440 1538 1563 +127440 1617 1441 +127440 1680 1835 +127440 1790 1498 +127440 1688 1457 +127440 1754 1906 +127440 1718 1889 +127440 1840 1898 +127440 1761 1493 +127440 1598 1871 +127440 1665 1519 +127440 1552 1453 +127460 1554 1592 +127460 1554 1651 +127460 1556 1617 +127460 1556 1532 +127460 1562 1825 +127460 1562 1613 +127460 1563 1703 +127460 1564 1681 +127460 1573 1478 +127460 1574 1518 +127460 1581 1908 +127460 1581 1877 +127460 1581 1711 +127460 1590 1664 +127460 1593 1848 +127460 1593 1676 +127460 1595 1654 +127460 1613 1825 +127460 1613 1882 +127460 1613 1625 +127460 1617 1532 +127460 1701 1717 +127460 1701 1511 +127460 1702 1841 +127460 1711 1908 +127460 1711 1877 +127460 1717 1803 +127460 1727 1845 +127460 1734 1448 +127460 1786 1451 +127460 1796 1816 +127460 1877 1908 +127460 1441 1532 +127460 1545 1531 +127460 1549 1525 +127460 1563 1698 +127460 1576 1680 +127460 1626 1680 +127460 1641 1713 +127460 1834 1903 +127460 1500 1511 +127460 1573 1924 +127460 1670 1479 +127460 1825 1510 +127460 1455 1517 +127460 1502 1530 +127460 1580 1463 +127460 1582 1437 +127460 1643 1704 +127460 1829 1886 +127460 1549 1890 +127460 1550 1572 +127460 1563 1524 +127460 1590 1717 +127460 1890 1525 +127460 1538 1563 +127460 1617 1441 +127460 1680 1835 +127460 1694 1491 +127460 1790 1498 +127460 1669 1906 +127460 1688 1457 +127460 1754 1906 +127460 1718 1889 +127460 1840 1898 +127460 1761 1493 +127460 1541 1462 +127460 1598 1871 +127460 1698 1703 +127460 1665 1519 +127460 1552 1453 +127480 1541 1518 +127480 1545 1531 +127480 1549 1525 +127480 1556 1816 +127480 1556 1881 +127480 1563 1698 +127480 1573 1520 +127480 1576 1680 +127480 1577 1882 +127480 1580 1628 +127480 1593 1437 +127480 1613 1530 +127480 1614 1532 +127480 1626 1680 +127480 1635 1664 +127480 1641 1713 +127480 1664 1516 +127480 1664 1487 +127480 1664 1439 +127480 1679 1821 +127480 1681 1513 +127480 1701 1504 +127480 1718 1470 +127480 1768 1446 +127480 1802 1469 +127480 1825 1525 +127480 1834 1903 +127480 1924 1520 +127480 1500 1511 +127480 1568 1840 +127480 1573 1924 +127480 1599 1644 +127480 1635 1439 +127480 1670 1479 +127480 1767 1840 +127480 1825 1510 +127480 1455 1517 +127480 1502 1530 +127480 1580 1463 +127480 1582 1437 +127480 1599 1884 +127480 1643 1704 +127480 1829 1886 +127480 1549 1890 +127480 1550 1572 +127480 1563 1524 +127480 1590 1717 +127480 1890 1525 +127480 1538 1563 +127480 1617 1441 +127480 1680 1835 +127480 1694 1491 +127480 1790 1498 +127480 1669 1906 +127480 1688 1457 +127480 1754 1906 +127480 1718 1889 +127480 1840 1898 +127480 1761 1493 +127480 1538 1524 +127480 1541 1462 +127480 1598 1871 +127480 1698 1703 +127480 1665 1519 +127480 1552 1453 +127500 1551 1568 +127500 1558 1516 +127500 1560 1498 +127500 1560 1790 +127500 1568 1840 +127500 1568 1802 +127500 1573 1924 +127500 1574 1819 +127500 1581 1908 +127500 1581 1479 +127500 1595 1654 +127500 1599 1644 +127500 1616 1876 +127500 1617 1816 +127500 1635 1439 +127500 1670 1479 +127500 1695 1731 +127500 1711 1479 +127500 1735 1503 +127500 1767 1840 +127500 1792 1885 +127500 1796 1881 +127500 1825 1510 +127500 1877 1479 +127500 1908 1479 +127500 1455 1517 +127500 1500 1516 +127500 1502 1530 +127500 1511 1516 +127500 1580 1463 +127500 1582 1437 +127500 1599 1884 +127500 1635 1666 +127500 1643 1704 +127500 1678 1835 +127500 1829 1886 +127500 1442 1446 +127500 1546 1557 +127500 1549 1890 +127500 1550 1572 +127500 1563 1524 +127500 1590 1717 +127500 1616 1831 +127500 1670 1711 +127500 1890 1525 +127500 1538 1563 +127500 1617 1441 +127500 1680 1835 +127500 1694 1491 +127500 1727 1845 +127500 1790 1498 +127500 1669 1906 +127500 1688 1457 +127500 1754 1906 +127500 1840 1892 +127500 1892 1898 +127500 1604 1924 +127500 1718 1889 +127500 1840 1898 +127500 1761 1493 +127500 1538 1524 +127500 1541 1462 +127500 1598 1871 +127500 1698 1703 +127500 1665 1519 +127500 1552 1453 +127500 1657 1769 +127520 1541 1574 +127520 1556 1731 +127520 1562 1731 +127520 1579 1792 +127520 1579 1883 +127520 1579 1590 +127520 1580 1463 +127520 1581 1877 +127520 1582 1437 +127520 1590 1792 +127520 1590 1511 +127520 1599 1884 +127520 1604 1520 +127520 1612 1792 +127520 1612 1717 +127520 1614 1816 +127520 1616 1513 +127520 1635 1666 +127520 1641 1503 +127520 1643 1704 +127520 1678 1835 +127520 1681 1876 +127520 1685 1443 +127520 1698 1708 +127520 1754 1426 +127520 1792 1511 +127520 1829 1886 +127520 1840 1477 +127520 1857 1870 +127520 1877 1470 +127520 1892 1477 +127520 1924 1520 +127520 1442 1446 +127520 1546 1557 +127520 1549 1890 +127520 1550 1572 +127520 1556 1568 +127520 1563 1524 +127520 1577 1882 +127520 1590 1717 +127520 1616 1831 +127520 1670 1711 +127520 1702 1901 +127520 1718 1921 +127520 1841 1901 +127520 1890 1525 +127520 1500 1511 +127520 1526 1528 +127520 1538 1563 +127520 1617 1441 +127520 1680 1835 +127520 1694 1491 +127520 1727 1845 +127520 1790 1498 +127520 1580 1628 +127520 1669 1906 +127520 1669 1754 +127520 1688 1457 +127520 1754 1906 +127520 1840 1892 +127520 1892 1898 +127520 1604 1924 +127520 1670 1877 +127520 1718 1889 +127520 1840 1898 +127520 1761 1493 +127520 1538 1524 +127520 1541 1462 +127520 1598 1871 +127520 1698 1703 +127520 1665 1519 +127520 1552 1453 +127520 1657 1769 +127540 1545 1531 +127540 1546 1557 +127540 1549 1890 +127540 1549 1525 +127540 1550 1572 +127540 1551 1802 +127540 1556 1568 +127540 1563 1524 +127540 1568 1520 +127540 1568 1882 +127540 1568 1798 +127540 1574 1520 +127540 1574 1502 +127540 1577 1882 +127540 1590 1643 +127540 1590 1717 +127540 1590 1885 +127540 1592 1635 +127540 1593 1437 +127540 1599 1519 +127540 1612 1708 +127540 1616 1831 +127540 1635 1821 +127540 1643 1792 +127540 1670 1711 +127540 1688 1530 +127540 1702 1841 +127540 1702 1901 +127540 1704 1717 +127540 1711 1877 +127540 1713 1532 +127540 1717 1792 +127540 1718 1921 +127540 1721 1816 +127540 1734 1834 +127540 1768 1528 +127540 1841 1901 +127540 1890 1525 +127540 1890 1430 +127540 1901 1448 +127540 1448 1532 +127540 1500 1511 +127540 1526 1528 +127540 1538 1563 +127540 1554 1613 +127540 1574 1890 +127540 1582 1672 +127540 1625 1866 +127540 1673 1887 +127540 1708 1717 +127540 1711 1528 +127540 1857 1886 +127540 1442 1520 +127540 1568 1510 +127540 1617 1441 +127540 1643 1717 +127540 1680 1835 +127540 1694 1491 +127540 1727 1845 +127540 1790 1498 +127540 1599 1882 +127540 1625 1728 +127540 1580 1628 +127540 1669 1906 +127540 1669 1754 +127540 1688 1457 +127540 1754 1906 +127540 1834 1903 +127540 1840 1892 +127540 1892 1898 +127540 1604 1924 +127540 1670 1877 +127540 1718 1889 +127540 1840 1898 +127540 1761 1493 +127540 1538 1524 +127540 1541 1462 +127540 1598 1871 +127540 1698 1703 +127540 1665 1519 +127540 1552 1453 +127540 1657 1769 +127560 1538 1563 +127560 1543 1498 +127560 1543 1790 +127560 1543 1503 +127560 1554 1613 +127560 1560 1582 +127560 1562 1568 +127560 1562 1599 +127560 1563 1698 +127560 1563 1885 +127560 1563 1703 +127560 1574 1890 +127560 1576 1680 +127560 1581 1883 +127560 1582 1672 +127560 1601 1652 +127560 1614 1426 +127560 1617 1734 +127560 1617 1479 +127560 1625 1866 +127560 1635 1530 +127560 1648 1696 +127560 1652 1711 +127560 1673 1887 +127560 1676 1503 +127560 1678 1680 +127560 1694 1704 +127560 1701 1461 +127560 1707 1908 +127560 1708 1717 +127560 1711 1528 +127560 1754 1426 +127560 1765 1503 +127560 1816 1479 +127560 1848 1503 +127560 1857 1886 +127560 1858 1448 +127560 1883 1908 +127560 1442 1520 +127560 1514 1520 +127560 1568 1510 +127560 1617 1441 +127560 1643 1717 +127560 1643 1439 +127560 1680 1835 +127560 1694 1491 +127560 1727 1845 +127560 1269 1870 +127560 1790 1498 +127560 1568 1825 +127560 1573 1478 +127560 1599 1882 +127560 1617 1816 +127560 1625 1728 +127560 1580 1628 +127560 1616 1889 +127560 1626 1520 +127560 1669 1906 +127560 1669 1754 +127560 1688 1457 +127560 1754 1906 +127560 1834 1903 +127560 1840 1892 +127560 1892 1898 +127560 1604 1924 +127560 1670 1877 +127560 1718 1889 +127560 1829 1886 +127560 1840 1898 +127560 1761 1493 +127560 1538 1524 +127560 1541 1462 +127560 1598 1871 +127560 1734 1441 +127560 1698 1703 +127560 1665 1519 +127560 1825 1510 +127560 1552 1453 +127560 1657 1769 +127580 1551 1870 +127580 1551 1269 +127580 1554 1872 +127580 1554 1462 +127580 1556 1692 +127580 1556 1734 +127580 1560 1664 +127580 1568 1574 +127580 1568 1510 +127580 1591 1641 +127580 1599 1446 +127580 1612 1491 +127580 1614 1685 +127580 1616 1513 +127580 1617 1441 +127580 1617 1470 +127580 1623 1706 +127580 1635 1749 +127580 1642 1681 +127580 1643 1708 +127580 1643 1516 +127580 1643 1717 +127580 1643 1439 +127580 1664 1831 +127580 1670 1711 +127580 1680 1835 +127580 1694 1491 +127580 1711 1883 +127580 1718 1513 +127580 1727 1845 +127580 1734 1816 +127580 1269 1870 +127580 1790 1498 +127580 1790 1796 +127580 1792 1885 +127580 1816 1441 +127580 1862 1470 +127580 1882 1446 +127580 1475 1522 +127580 1537 1628 +127580 1568 1825 +127580 1573 1478 +127580 1599 1882 +127580 1616 1718 +127580 1617 1816 +127580 1625 1728 +127580 1711 1877 +127580 1269 1886 +127580 1792 1908 +127580 1816 1881 +127580 1537 1580 +127580 1549 1890 +127580 1580 1628 +127580 1612 1694 +127580 1616 1889 +127580 1626 1520 +127580 1669 1906 +127580 1669 1754 +127580 1688 1457 +127580 1754 1906 +127580 1834 1903 +127580 1840 1892 +127580 1890 1525 +127580 1892 1898 +127580 1551 1886 +127580 1604 1924 +127580 1647 1713 +127580 1651 1883 +127580 1670 1877 +127580 1718 1889 +127580 1829 1886 +127580 1840 1898 +127580 1761 1493 +127580 1538 1524 +127580 1541 1462 +127580 1598 1871 +127580 1734 1441 +127580 1581 1908 +127580 1698 1703 +127580 1665 1519 +127580 1825 1510 +127580 1552 1453 +127580 1657 1769 +127600 1537 1628 +127600 1560 1831 +127600 1563 1698 +127600 1568 1825 +127600 1573 1478 +127600 1574 1825 +127600 1596 1427 +127600 1599 1882 +127600 1613 1914 +127600 1616 1718 +127600 1617 1816 +127600 1625 1728 +127600 1647 1901 +127600 1664 1887 +127600 1664 1479 +127600 1698 1908 +127600 1702 1841 +127600 1703 1908 +127600 1708 1516 +127600 1711 1877 +127600 1269 1886 +127600 1792 1908 +127600 1798 1877 +127600 1802 1901 +127600 1816 1881 +127600 1877 1883 +127600 1885 1908 +127600 1427 1483 +127600 1500 1511 +127600 1537 1580 +127600 1549 1890 +127600 1551 1857 +127600 1551 1829 +127600 1554 1871 +127600 1563 1524 +127600 1579 1717 +127600 1580 1628 +127600 1612 1694 +127600 1616 1889 +127600 1626 1520 +127600 1669 1906 +127600 1669 1754 +127600 1672 1498 +127600 1688 1457 +127600 1721 1816 +127600 1754 1906 +127600 1786 1517 +127600 1834 1903 +127600 1840 1892 +127600 1890 1525 +127600 1892 1898 +127600 1551 1886 +127600 1604 1924 +127600 1647 1713 +127600 1651 1883 +127600 1670 1877 +127600 1718 1889 +127600 1829 1886 +127600 1840 1898 +127600 1855 1427 +127600 1599 1499 +127600 1761 1493 +127600 1786 1455 +127600 1538 1524 +127600 1541 1462 +127600 1598 1871 +127600 1734 1441 +127600 1581 1908 +127600 1698 1703 +127600 1665 1519 +127600 1825 1510 +127600 1857 1470 +127600 1552 1453 +127600 1657 1769 +127620 1537 1568 +127620 1537 1580 +127620 1549 1890 +127620 1551 1857 +127620 1551 1829 +127620 1554 1871 +127620 1556 1601 +127620 1556 1580 +127620 1562 1678 +127620 1563 1524 +127620 1579 1717 +127620 1580 1906 +127620 1580 1628 +127620 1587 1688 +127620 1612 1694 +127620 1616 1889 +127620 1617 1887 +127620 1626 1520 +127620 1635 1469 +127620 1642 1681 +127620 1669 1906 +127620 1669 1754 +127620 1670 1479 +127620 1670 1711 +127620 1671 1491 +127620 1672 1498 +127620 1688 1457 +127620 1711 1479 +127620 1717 1811 +127620 1718 1513 +127620 1721 1816 +127620 1754 1906 +127620 1786 1517 +127620 1816 1887 +127620 1831 1887 +127620 1834 1903 +127620 1840 1892 +127620 1883 1511 +127620 1889 1513 +127620 1890 1525 +127620 1892 1898 +127620 1550 1572 +127620 1551 1886 +127620 1576 1680 +127620 1604 1924 +127620 1616 1513 +127620 1647 1713 +127620 1651 1883 +127620 1670 1427 +127620 1670 1877 +127620 1718 1889 +127620 1727 1845 +127620 1816 1823 +127620 1829 1886 +127620 1840 1898 +127620 1855 1427 +127620 1599 1499 +127620 1667 1889 +127620 1717 1442 +127620 1761 1493 +127620 1786 1455 +127620 1538 1524 +127620 1541 1462 +127620 1591 1858 +127620 1598 1871 +127620 1734 1441 +127620 1581 1908 +127620 1698 1703 +127620 1665 1519 +127620 1877 1427 +127620 1825 1510 +127620 1857 1470 +127620 1552 1453 +127620 1657 1769 +127640 1550 1572 +127640 1551 1886 +127640 1563 1885 +127640 1573 1922 +127640 1576 1680 +127640 1590 1727 +127640 1604 1924 +127640 1604 1478 +127640 1614 1520 +127640 1616 1513 +127640 1635 1857 +127640 1635 1870 +127640 1635 1887 +127640 1643 1715 +127640 1647 1713 +127640 1651 1883 +127640 1670 1427 +127640 1670 1877 +127640 1711 1877 +127640 1718 1889 +127640 1727 1845 +127640 1816 1823 +127640 1819 1866 +127640 1829 1886 +127640 1836 1487 +127640 1840 1898 +127640 1855 1427 +127640 1855 1483 +127640 1863 1438 +127640 1885 1908 +127640 1427 1479 +127640 1427 1483 +127640 1452 1471 +127640 1491 1502 +127640 1554 1692 +127640 1569 1742 +127640 1599 1499 +127640 1613 1643 +127640 1616 1718 +127640 1643 1704 +127640 1652 1426 +127640 1667 1889 +127640 1667 1718 +127640 1711 1427 +127640 1717 1442 +127640 1761 1493 +127640 1786 1455 +127640 1625 1728 +127640 1680 1835 +127640 1538 1524 +127640 1541 1462 +127640 1591 1858 +127640 1598 1871 +127640 1734 1441 +127640 1702 1841 +127640 1576 1835 +127640 1581 1908 +127640 1698 1703 +127640 1665 1519 +127640 1792 1885 +127640 1877 1427 +127640 1825 1510 +127640 1857 1470 +127640 1552 1453 +127640 1657 1769 +127660 1538 1563 +127660 1546 1557 +127660 1551 1684 +127660 1551 1767 +127660 1554 1692 +127660 1556 1590 +127660 1556 1727 +127660 1563 1792 +127660 1569 1742 +127660 1590 1514 +127660 1599 1499 +127660 1601 1692 +127660 1612 1427 +127660 1613 1643 +127660 1616 1718 +127660 1643 1704 +127660 1652 1426 +127660 1667 1889 +127660 1667 1718 +127660 1671 1479 +127660 1672 1498 +127660 1704 1819 +127660 1711 1427 +127660 1717 1442 +127660 1761 1531 +127660 1761 1493 +127660 1767 1840 +127660 1786 1455 +127660 1802 1471 +127660 1821 1427 +127660 1889 1921 +127660 1441 1517 +127660 1526 1528 +127660 1625 1728 +127660 1642 1681 +127660 1664 1754 +127660 1680 1835 +127660 1702 1718 +127660 1834 1903 +127660 1538 1524 +127660 1541 1462 +127660 1591 1858 +127660 1598 1871 +127660 1672 1676 +127660 1688 1457 +127660 1823 1881 +127660 1884 1499 +127660 1734 1441 +127660 1702 1841 +127660 1576 1835 +127660 1581 1908 +127660 1698 1703 +127660 1665 1519 +127660 1792 1885 +127660 1892 1898 +127660 1877 1427 +127660 1825 1510 +127660 1857 1470 +127660 1552 1453 +127660 1493 1531 +127660 1657 1769 +127680 1538 1711 +127680 1541 1643 +127680 1554 1517 +127680 1554 1734 +127680 1554 1887 +127680 1563 1698 +127680 1563 1587 +127680 1563 1798 +127680 1563 1479 +127680 1570 1587 +127680 1576 1680 +127680 1592 1479 +127680 1599 1446 +127680 1608 1883 +127680 1608 1651 +127680 1625 1728 +127680 1642 1681 +127680 1648 1696 +127680 1651 1883 +127680 1664 1754 +127680 1664 1669 +127680 1670 1479 +127680 1678 1772 +127680 1680 1835 +127680 1694 1435 +127680 1702 1718 +127680 1702 1921 +127680 1711 1524 +127680 1718 1921 +127680 1798 1479 +127680 1816 1823 +127680 1819 1460 +127680 1819 1439 +127680 1834 1903 +127680 1841 1921 +127680 1890 1525 +127680 1538 1524 +127680 1541 1462 +127680 1550 1572 +127680 1551 1269 +127680 1558 1516 +127680 1574 1825 +127680 1587 1479 +127680 1591 1858 +127680 1598 1871 +127680 1617 1829 +127680 1635 1857 +127680 1672 1676 +127680 1676 1498 +127680 1688 1457 +127680 1704 1443 +127680 1772 1503 +127680 1792 1479 +127680 1823 1881 +127680 1829 1441 +127680 1884 1499 +127680 1446 1499 +127680 1552 1761 +127680 1734 1441 +127680 1702 1841 +127680 1576 1835 +127680 1581 1908 +127680 1698 1703 +127680 1665 1519 +127680 1727 1845 +127680 1792 1885 +127680 1892 1898 +127680 1877 1427 +127680 1825 1510 +127680 1857 1470 +127680 1552 1453 +127680 1493 1531 +127680 1657 1769 +127700 1538 1579 +127700 1538 1524 +127700 1541 1462 +127700 1550 1572 +127700 1551 1269 +127700 1556 1819 +127700 1558 1516 +127700 1574 1825 +127700 1575 1462 +127700 1587 1479 +127700 1590 1593 +127700 1591 1858 +127700 1592 1514 +127700 1598 1871 +127700 1599 1499 +127700 1617 1829 +127700 1623 1706 +127700 1635 1857 +127700 1635 1470 +127700 1643 1443 +127700 1667 1907 +127700 1672 1676 +127700 1676 1498 +127700 1678 1700 +127700 1688 1457 +127700 1704 1443 +127700 1718 1841 +127700 1718 1452 +127700 1731 1888 +127700 1772 1503 +127700 1792 1798 +127700 1792 1479 +127700 1823 1881 +127700 1829 1441 +127700 1884 1499 +127700 1446 1499 +127700 1549 1525 +127700 1552 1761 +127700 1596 1855 +127700 1643 1704 +127700 1713 1802 +127700 1734 1441 +127700 1734 1517 +127700 1702 1841 +127700 1717 1427 +127700 1734 1839 +127700 1576 1835 +127700 1581 1908 +127700 1698 1703 +127700 1665 1519 +127700 1727 1845 +127700 1792 1885 +127700 1892 1898 +127700 1441 1517 +127700 1877 1427 +127700 1825 1510 +127700 1857 1470 +127700 1552 1453 +127700 1493 1531 +127700 1657 1769 +127700 1443 1487 +127720 1537 1572 +127720 1543 1678 +127720 1549 1525 +127720 1551 1886 +127720 1552 1761 +127720 1556 1688 +127720 1556 1457 +127720 1556 1701 +127720 1563 1688 +127720 1563 1922 +127720 1563 1711 +127720 1573 1734 +127720 1579 1708 +127720 1580 1661 +127720 1587 1688 +127720 1587 1792 +127720 1591 1905 +127720 1592 1711 +127720 1596 1855 +127720 1608 1821 +127720 1643 1704 +127720 1643 1493 +127720 1643 1847 +127720 1648 1847 +127720 1666 1866 +127720 1678 1482 +127720 1679 1906 +127720 1688 1792 +127720 1694 1435 +127720 1700 1871 +127720 1704 1761 +127720 1704 1493 +127720 1713 1802 +127720 1718 1921 +127720 1734 1441 +127720 1734 1517 +127720 1761 1920 +127720 1761 1847 +127720 1802 1841 +127720 1819 1457 +127720 1834 1903 +127720 1848 1887 +127720 1887 1503 +127720 1890 1525 +127720 1439 1528 +127720 1526 1528 +127720 1587 1885 +127720 1608 1807 +127720 1688 1885 +127720 1702 1841 +127720 1702 1718 +127720 1717 1427 +127720 1734 1839 +127720 1767 1892 +127720 1876 1923 +127720 1541 1872 +127720 1576 1835 +127720 1581 1908 +127720 1670 1711 +127720 1698 1703 +127720 1711 1479 +127720 1582 1593 +127720 1665 1519 +127720 1727 1845 +127720 1792 1885 +127720 1892 1898 +127720 1441 1517 +127720 1576 1680 +127720 1877 1427 +127720 1825 1510 +127720 1857 1470 +127720 1563 1792 +127720 1552 1453 +127720 1680 1835 +127720 1493 1531 +127720 1657 1769 +127720 1443 1487 +127740 1551 1269 +127740 1563 1866 +127740 1570 1847 +127740 1573 1710 +127740 1580 1871 +127740 1587 1885 +127740 1590 1839 +127740 1592 1885 +127740 1604 1821 +127740 1608 1807 +127740 1614 1678 +127740 1616 1426 +127740 1617 1497 +127740 1641 1839 +127740 1672 1498 +127740 1688 1885 +127740 1688 1711 +127740 1702 1841 +127740 1702 1718 +127740 1704 1453 +127740 1713 1821 +127740 1717 1427 +127740 1734 1839 +127740 1767 1892 +127740 1792 1866 +127740 1816 1881 +127740 1816 1444 +127740 1819 1462 +127740 1840 1898 +127740 1847 1491 +127740 1857 1441 +127740 1857 1517 +127740 1866 1885 +127740 1876 1923 +127740 1889 1921 +127740 1901 1532 +127740 1446 1499 +127740 1527 1531 +127740 1541 1872 +127740 1563 1885 +127740 1573 1829 +127740 1576 1835 +127740 1581 1908 +127740 1670 1711 +127740 1688 1922 +127740 1698 1703 +127740 1711 1479 +127740 1772 1503 +127740 1883 1437 +127740 1921 1452 +127740 1500 1511 +127740 1582 1593 +127740 1598 1871 +127740 1665 1519 +127740 1727 1845 +127740 1792 1885 +127740 1892 1898 +127740 1441 1517 +127740 1538 1524 +127740 1576 1680 +127740 1877 1427 +127740 1825 1510 +127740 1575 1906 +127740 1857 1470 +127740 1563 1792 +127740 1552 1453 +127740 1680 1835 +127740 1699 1530 +127740 1493 1531 +127740 1657 1769 +127740 1443 1487 +127760 1541 1872 +127760 1549 1890 +127760 1551 1573 +127760 1551 1734 +127760 1563 1698 +127760 1563 1813 +127760 1563 1885 +127760 1573 1829 +127760 1576 1835 +127760 1581 1908 +127760 1587 1608 +127760 1590 1811 +127760 1599 1754 +127760 1599 1623 +127760 1608 1465 +127760 1608 1717 +127760 1623 1789 +127760 1635 1734 +127760 1641 1441 +127760 1642 1681 +127760 1643 1704 +127760 1664 1734 +127760 1669 1754 +127760 1670 1479 +127760 1670 1711 +127760 1676 1498 +127760 1688 1922 +127760 1688 1708 +127760 1698 1792 +127760 1698 1703 +127760 1711 1479 +127760 1718 1921 +127760 1731 1839 +127760 1734 1517 +127760 1772 1503 +127760 1821 1439 +127760 1841 1921 +127760 1883 1437 +127760 1884 1499 +127760 1885 1904 +127760 1921 1452 +127760 1500 1511 +127760 1563 1581 +127760 1582 1593 +127760 1598 1871 +127760 1665 1519 +127760 1727 1845 +127760 1792 1885 +127760 1802 1865 +127760 1816 1823 +127760 1892 1898 +127760 1441 1517 +127760 1538 1524 +127760 1576 1680 +127760 1877 1427 +127760 1825 1510 +127760 1575 1906 +127760 1834 1903 +127760 1579 1717 +127760 1591 1858 +127760 1857 1470 +127760 1563 1792 +127760 1552 1453 +127760 1633 1772 +127760 1680 1835 +127760 1699 1530 +127760 1493 1531 +127760 1549 1525 +127760 1657 1769 +127760 1443 1487 +127760 1890 1525 +127780 1537 1839 +127780 1543 1551 +127780 1551 1769 +127780 1554 1839 +127780 1556 1698 +127780 1563 1581 +127780 1568 1821 +127780 1568 1590 +127780 1582 1593 +127780 1587 1502 +127780 1598 1871 +127780 1608 1703 +127780 1643 1528 +127780 1647 1841 +127780 1657 1455 +127780 1659 1661 +127780 1665 1519 +127780 1666 1688 +127780 1666 1703 +127780 1667 1865 +127780 1667 1713 +127780 1678 1872 +127780 1678 1731 +127780 1701 1883 +127780 1703 1711 +127780 1703 1479 +127780 1708 1904 +127780 1727 1845 +127780 1767 1898 +127780 1792 1885 +127780 1802 1865 +127780 1811 1517 +127780 1816 1881 +127780 1816 1883 +127780 1816 1823 +127780 1819 1491 +127780 1847 1462 +127780 1889 1471 +127780 1892 1898 +127780 1908 1479 +127780 1441 1517 +127780 1499 1520 +127780 1538 1524 +127780 1554 1811 +127780 1556 1847 +127780 1576 1680 +127780 1578 1920 +127780 1619 1908 +127780 1786 1437 +127780 1840 1886 +127780 1877 1427 +127780 1825 1510 +127780 1562 1755 +127780 1575 1906 +127780 1834 1903 +127780 1579 1717 +127780 1591 1858 +127780 1857 1470 +127780 1563 1792 +127780 1718 1889 +127780 1552 1453 +127780 1633 1772 +127780 1680 1835 +127780 1699 1530 +127780 1493 1531 +127780 1549 1525 +127780 1657 1769 +127780 1443 1487 +127780 1890 1525 +127800 1538 1524 +127800 1546 1557 +127800 1550 1554 +127800 1550 1451 +127800 1550 1517 +127800 1551 1269 +127800 1554 1664 +127800 1554 1811 +127800 1554 1684 +127800 1554 1517 +127800 1556 1847 +127800 1572 1482 +127800 1575 1491 +127800 1576 1680 +127800 1578 1920 +127800 1579 1698 +127800 1579 1877 +127800 1590 1819 +127800 1592 1688 +127800 1593 1786 +127800 1599 1517 +127800 1608 1698 +127800 1619 1908 +127800 1641 1657 +127800 1648 1731 +127800 1652 1426 +127800 1664 1482 +127800 1670 1688 +127800 1670 1711 +127800 1676 1498 +127800 1684 1482 +127800 1688 1908 +127800 1696 1731 +127800 1703 1708 +127800 1717 1427 +127800 1717 1877 +127800 1786 1437 +127800 1831 1841 +127800 1839 1848 +127800 1839 1451 +127800 1840 1886 +127800 1877 1427 +127800 1901 1905 +127800 1482 1517 +127800 1527 1531 +127800 1698 1708 +127800 1710 1441 +127800 1734 1886 +127800 1825 1510 +127800 1437 1455 +127800 1441 1492 +127800 1500 1511 +127800 1562 1873 +127800 1562 1755 +127800 1575 1906 +127800 1579 1427 +127800 1608 1688 +127800 1834 1903 +127800 1847 1485 +127800 1579 1717 +127800 1549 1890 +127800 1591 1858 +127800 1857 1470 +127800 1563 1792 +127800 1582 1455 +127800 1718 1889 +127800 1920 1526 +127800 1552 1453 +127800 1633 1772 +127800 1680 1835 +127800 1699 1530 +127800 1711 1479 +127800 1493 1531 +127800 1581 1479 +127800 1581 1711 +127800 1549 1525 +127800 1657 1769 +127800 1443 1487 +127800 1890 1525 +127820 1550 1492 +127820 1554 1574 +127820 1554 1462 +127820 1560 1713 +127820 1563 1590 +127820 1576 1835 +127820 1591 1786 +127820 1592 1883 +127820 1592 1798 +127820 1617 1786 +127820 1651 1462 +127820 1688 1877 +127820 1688 1798 +127820 1688 1479 +127820 1698 1883 +127820 1698 1708 +127820 1704 1920 +127820 1708 1502 +127820 1710 1441 +127820 1718 1880 +127820 1718 1462 +127820 1734 1886 +127820 1755 1873 +127820 1767 1886 +127820 1792 1885 +127820 1802 1841 +127820 1811 1901 +127820 1825 1510 +127820 1889 1462 +127820 1437 1455 +127820 1441 1492 +127820 1500 1511 +127820 1554 1889 +127820 1562 1873 +127820 1562 1755 +127820 1575 1906 +127820 1579 1427 +127820 1608 1688 +127820 1670 1479 +127820 1775 1816 +127820 1805 1888 +127820 1816 1823 +127820 1834 1903 +127820 1847 1485 +127820 1482 1520 +127820 1499 1520 +127820 1579 1717 +127820 1711 1877 +127820 1549 1890 +127820 1591 1858 +127820 1857 1470 +127820 1563 1792 +127820 1563 1885 +127820 1582 1455 +127820 1665 1519 +127820 1718 1889 +127820 1920 1526 +127820 1552 1453 +127820 1633 1772 +127820 1680 1835 +127820 1699 1530 +127820 1892 1898 +127820 1711 1479 +127820 1493 1531 +127820 1581 1479 +127820 1581 1711 +127820 1549 1525 +127820 1657 1769 +127820 1598 1871 +127820 1443 1487 +127820 1890 1525 +127840 1537 1821 +127840 1541 1679 +127840 1554 1889 +127840 1554 1718 +127840 1556 1485 +127840 1562 1873 +127840 1562 1755 +127840 1565 1802 +127840 1568 1578 +127840 1575 1906 +127840 1578 1520 +127840 1579 1427 +127840 1595 1790 +127840 1608 1688 +127840 1626 1651 +127840 1643 1704 +127840 1643 1920 +127840 1651 1889 +127840 1651 1718 +127840 1670 1479 +127840 1699 1502 +127840 1749 1906 +127840 1769 1492 +127840 1775 1816 +127840 1791 1462 +127840 1792 1908 +127840 1805 1888 +127840 1816 1823 +127840 1834 1903 +127840 1847 1485 +127840 1451 1517 +127840 1463 1464 +127840 1482 1520 +127840 1499 1520 +127840 1579 1717 +127840 1604 1749 +127840 1684 1451 +127840 1711 1877 +127840 1749 1807 +127840 1767 1840 +127840 1857 1441 +127840 1877 1479 +127840 1549 1890 +127840 1591 1858 +127840 1670 1711 +127840 1857 1470 +127840 1563 1792 +127840 1563 1885 +127840 1582 1455 +127840 1665 1519 +127840 1718 1889 +127840 1920 1526 +127840 1552 1453 +127840 1633 1772 +127840 1680 1835 +127840 1699 1530 +127840 1884 1499 +127840 1892 1898 +127840 1427 1524 +127840 1711 1479 +127840 1493 1531 +127840 1581 1479 +127840 1581 1711 +127840 1549 1525 +127840 1576 1680 +127840 1657 1769 +127840 1598 1871 +127840 1551 1269 +127840 1920 1528 +127840 1443 1487 +127840 1890 1525 +127860 1538 1427 +127860 1543 1685 +127860 1568 1572 +127860 1578 1482 +127860 1579 1717 +127860 1587 1718 +127860 1590 1811 +127860 1590 1830 +127860 1592 1485 +127860 1604 1883 +127860 1604 1749 +127860 1684 1451 +127860 1684 1886 +127860 1698 1889 +127860 1698 1718 +127860 1700 1727 +127860 1704 1731 +127860 1711 1877 +127860 1717 1442 +127860 1734 1840 +127860 1734 1898 +127860 1734 1767 +127860 1749 1883 +127860 1749 1807 +127860 1754 1464 +127860 1767 1840 +127860 1805 1520 +127860 1829 1520 +127860 1835 1492 +127860 1857 1441 +127860 1877 1479 +127860 1437 1455 +127860 1517 1520 +127860 1549 1890 +127860 1591 1858 +127860 1592 1688 +127860 1670 1711 +127860 1857 1470 +127860 1546 1557 +127860 1563 1792 +127860 1563 1885 +127860 1582 1455 +127860 1665 1519 +127860 1718 1889 +127860 1792 1885 +127860 1825 1510 +127860 1920 1526 +127860 1552 1453 +127860 1626 1453 +127860 1633 1772 +127860 1680 1835 +127860 1699 1530 +127860 1749 1757 +127860 1884 1499 +127860 1892 1898 +127860 1427 1524 +127860 1711 1479 +127860 1493 1531 +127860 1581 1479 +127860 1581 1711 +127860 1678 1874 +127860 1549 1525 +127860 1576 1680 +127860 1657 1769 +127860 1598 1871 +127860 1551 1269 +127860 1710 1441 +127860 1920 1528 +127860 1443 1487 +127860 1890 1525 +127880 1537 1520 +127880 1549 1890 +127880 1554 1819 +127880 1569 1458 +127880 1587 1889 +127880 1591 1858 +127880 1592 1688 +127880 1599 1512 +127880 1670 1711 +127880 1688 1711 +127880 1692 1495 +127880 1701 1455 +127880 1707 1491 +127880 1727 1807 +127880 1757 1883 +127880 1816 1881 +127880 1831 1495 +127880 1857 1470 +127880 1880 1435 +127880 1886 1520 +127880 1886 1495 +127880 1905 1471 +127880 1921 1462 +127880 1495 1520 +127880 1520 1532 +127880 1546 1557 +127880 1563 1792 +127880 1563 1885 +127880 1582 1455 +127880 1595 1654 +127880 1665 1519 +127880 1718 1889 +127880 1792 1885 +127880 1825 1510 +127880 1829 1451 +127880 1840 1892 +127880 1920 1526 +127880 1475 1522 +127880 1552 1453 +127880 1626 1453 +127880 1633 1772 +127880 1680 1835 +127880 1699 1530 +127880 1749 1757 +127880 1884 1499 +127880 1892 1898 +127880 1427 1524 +127880 1500 1511 +127880 1711 1479 +127880 1493 1531 +127880 1576 1835 +127880 1581 1479 +127880 1581 1711 +127880 1678 1874 +127880 1829 1886 +127880 1549 1525 +127880 1576 1680 +127880 1657 1769 +127880 1598 1871 +127880 1551 1269 +127880 1710 1441 +127880 1920 1528 +127880 1443 1487 +127880 1731 1493 +127880 1890 1525 +127900 1538 1427 +127900 1539 1905 +127900 1543 1685 +127900 1546 1557 +127900 1549 1569 +127900 1563 1792 +127900 1563 1688 +127900 1563 1885 +127900 1568 1435 +127900 1582 1455 +127900 1587 1688 +127900 1590 1495 +127900 1590 1455 +127900 1591 1470 +127900 1595 1654 +127900 1596 1502 +127900 1604 1883 +127900 1635 1754 +127900 1643 1704 +127900 1652 1865 +127900 1652 1907 +127900 1665 1519 +127900 1684 1829 +127900 1700 1734 +127900 1701 1437 +127900 1718 1889 +127900 1721 1816 +127900 1792 1885 +127900 1816 1502 +127900 1825 1890 +127900 1825 1510 +127900 1829 1451 +127900 1831 1520 +127900 1840 1898 +127900 1840 1892 +127900 1858 1901 +127900 1870 1463 +127900 1920 1526 +127900 1475 1522 +127900 1541 1679 +127900 1552 1453 +127900 1626 1453 +127900 1633 1772 +127900 1680 1835 +127900 1699 1530 +127900 1711 1877 +127900 1749 1757 +127900 1884 1499 +127900 1892 1898 +127900 1427 1524 +127900 1458 1520 +127900 1500 1511 +127900 1684 1451 +127900 1711 1479 +127900 1493 1531 +127900 1570 1666 +127900 1576 1835 +127900 1581 1479 +127900 1581 1711 +127900 1678 1874 +127900 1727 1845 +127900 1877 1479 +127900 1829 1886 +127900 1549 1525 +127900 1576 1680 +127900 1657 1769 +127900 1598 1871 +127900 1551 1269 +127900 1710 1441 +127900 1920 1528 +127900 1443 1487 +127900 1731 1493 +127900 1755 1873 +127900 1890 1525 +127920 1541 1679 +127920 1552 1626 +127920 1552 1453 +127920 1580 1628 +127920 1590 1635 +127920 1591 1635 +127920 1613 1889 +127920 1626 1453 +127920 1633 1772 +127920 1635 1821 +127920 1680 1835 +127920 1694 1427 +127920 1699 1530 +127920 1707 1502 +127920 1711 1877 +127920 1740 1497 +127920 1749 1757 +127920 1796 1831 +127920 1825 1884 +127920 1834 1903 +127920 1858 1470 +127920 1884 1499 +127920 1892 1898 +127920 1427 1524 +127920 1458 1520 +127920 1500 1511 +127920 1563 1440 +127920 1684 1451 +127920 1711 1479 +127920 1493 1531 +127920 1570 1666 +127920 1576 1835 +127920 1581 1479 +127920 1581 1877 +127920 1581 1711 +127920 1591 1858 +127920 1678 1874 +127920 1727 1845 +127920 1816 1881 +127920 1877 1479 +127920 1905 1471 +127920 1554 1688 +127920 1599 1512 +127920 1829 1886 +127920 1549 1525 +127920 1576 1680 +127920 1657 1769 +127920 1857 1470 +127920 1880 1495 +127920 1601 1911 +127920 1598 1871 +127920 1551 1269 +127920 1710 1441 +127920 1920 1528 +127920 1443 1487 +127920 1731 1493 +127920 1755 1873 +127920 1890 1525 +127940 1538 1592 +127940 1546 1557 +127940 1556 1761 +127940 1563 1440 +127940 1563 1511 +127940 1568 1807 +127940 1574 1531 +127940 1578 1495 +127940 1590 1664 +127940 1590 1767 +127940 1609 1518 +127940 1634 1802 +127940 1635 1441 +127940 1635 1641 +127940 1642 1757 +127940 1643 1821 +127940 1670 1440 +127940 1684 1451 +127940 1698 1871 +127940 1704 1754 +127940 1711 1479 +127940 1717 1907 +127940 1718 1458 +127940 1731 1531 +127940 1749 1905 +127940 1761 1531 +127940 1767 1840 +127940 1767 1892 +127940 1792 1885 +127940 1792 1805 +127940 1829 1451 +127940 1871 1889 +127940 1889 1458 +127940 1908 1440 +127940 1439 1462 +127940 1440 1479 +127940 1491 1530 +127940 1493 1531 +127940 1570 1666 +127940 1576 1835 +127940 1581 1479 +127940 1581 1877 +127940 1581 1711 +127940 1591 1858 +127940 1664 1821 +127940 1670 1877 +127940 1670 1479 +127940 1678 1874 +127940 1701 1437 +127940 1727 1845 +127940 1816 1881 +127940 1877 1908 +127940 1877 1479 +127940 1892 1477 +127940 1898 1477 +127940 1905 1471 +127940 1908 1479 +127940 1549 1890 +127940 1554 1688 +127940 1599 1512 +127940 1711 1908 +127940 1829 1886 +127940 1924 1478 +127940 1549 1525 +127940 1576 1680 +127940 1657 1769 +127940 1718 1889 +127940 1857 1470 +127940 1880 1495 +127940 1601 1911 +127940 1598 1871 +127940 1551 1269 +127940 1710 1441 +127940 1920 1528 +127940 1443 1487 +127940 1731 1493 +127940 1755 1873 +127940 1890 1525 +127960 1556 1920 +127960 1570 1666 +127960 1576 1835 +127960 1578 1877 +127960 1581 1479 +127960 1581 1908 +127960 1581 1877 +127960 1581 1711 +127960 1591 1858 +127960 1596 1841 +127960 1635 1735 +127960 1643 1704 +127960 1664 1821 +127960 1670 1877 +127960 1670 1479 +127960 1678 1874 +127960 1701 1437 +127960 1703 1866 +127960 1704 1437 +127960 1727 1845 +127960 1740 1497 +127960 1772 1441 +127960 1772 1434 +127960 1783 1526 +127960 1789 1458 +127960 1798 1908 +127960 1816 1881 +127960 1821 1532 +127960 1825 1519 +127960 1877 1908 +127960 1877 1479 +127960 1892 1477 +127960 1898 1477 +127960 1905 1471 +127960 1908 1479 +127960 1453 1531 +127960 1538 1524 +127960 1549 1890 +127960 1554 1688 +127960 1599 1512 +127960 1711 1908 +127960 1829 1886 +127960 1924 1478 +127960 1475 1522 +127960 1549 1525 +127960 1576 1680 +127960 1657 1769 +127960 1718 1889 +127960 1857 1470 +127960 1880 1495 +127960 1601 1911 +127960 1680 1835 +127960 1598 1871 +127960 1551 1269 +127960 1710 1441 +127960 1920 1528 +127960 1443 1487 +127960 1892 1898 +127960 1731 1493 +127960 1755 1873 +127960 1890 1525 +127980 1538 1524 +127980 1549 1890 +127980 1554 1688 +127980 1556 1520 +127980 1563 1688 +127980 1599 1512 +127980 1609 1518 +127980 1704 1772 +127980 1711 1908 +127980 1792 1458 +127980 1821 1455 +127980 1825 1446 +127980 1829 1886 +127980 1880 1532 +127980 1924 1478 +127980 1465 1500 +127980 1475 1522 +127980 1549 1525 +127980 1576 1680 +127980 1657 1769 +127980 1684 1451 +127980 1718 1889 +127980 1831 1471 +127980 1857 1470 +127980 1880 1495 +127980 1601 1911 +127980 1680 1835 +127980 1455 1463 +127980 1598 1871 +127980 1551 1269 +127980 1710 1441 +127980 1920 1528 +127980 1443 1487 +127980 1892 1898 +127980 1731 1493 +127980 1755 1873 +127980 1890 1525 +128000 1541 1575 +128000 1549 1525 +128000 1563 1433 +128000 1576 1680 +128000 1591 1858 +128000 1592 1908 +128000 1635 1834 +128000 1643 1437 +128000 1657 1769 +128000 1676 1498 +128000 1676 1434 +128000 1678 1680 +128000 1678 1874 +128000 1684 1451 +128000 1692 1829 +128000 1701 1437 +128000 1711 1847 +128000 1713 1855 +128000 1718 1889 +128000 1816 1881 +128000 1816 1502 +128000 1825 1499 +128000 1831 1471 +128000 1857 1470 +128000 1880 1495 +128000 1601 1911 +128000 1680 1835 +128000 1816 1823 +128000 1434 1498 +128000 1455 1463 +128000 1587 1775 +128000 1598 1871 +128000 1551 1269 +128000 1576 1835 +128000 1710 1441 +128000 1920 1528 +128000 1443 1487 +128000 1892 1898 +128000 1670 1711 +128000 1731 1493 +128000 1905 1471 +128000 1755 1873 +128000 1890 1525 +128020 1539 1749 +128020 1552 1623 +128020 1556 1848 +128020 1563 1465 +128020 1568 1581 +128020 1575 1679 +128020 1601 1911 +128020 1612 1732 +128020 1617 1441 +128020 1664 1877 +128020 1680 1835 +128020 1698 1825 +128020 1740 1530 +128020 1772 1880 +128020 1772 1532 +128020 1798 1444 +128020 1811 1871 +128020 1816 1823 +128020 1825 1519 +128020 1884 1499 +128020 1911 1465 +128020 1921 1462 +128020 1434 1498 +128020 1444 1527 +128020 1455 1463 +128020 1470 1530 +128020 1587 1775 +128020 1598 1871 +128020 1664 1479 +128020 1727 1845 +128020 1783 1526 +128020 1551 1269 +128020 1554 1575 +128020 1576 1835 +128020 1710 1441 +128020 1920 1528 +128020 1443 1487 +128020 1892 1898 +128020 1877 1479 +128020 1670 1711 +128020 1731 1493 +128020 1905 1471 +128020 1755 1873 +128020 1890 1525 +128020 1664 1821 +128020 1550 1635 +128040 1538 1563 +128040 1539 1754 +128040 1541 1554 +128040 1549 1890 +128040 1568 1772 +128040 1570 1427 +128040 1573 1470 +128040 1587 1775 +128040 1591 1689 +128040 1598 1871 +128040 1601 1698 +128040 1617 1641 +128040 1634 1880 +128040 1641 1441 +128040 1664 1479 +128040 1688 1491 +128040 1698 1908 +128040 1704 1470 +128040 1717 1876 +128040 1749 1921 +128040 1802 1426 +128040 1825 1499 +128040 1834 1903 +128040 1865 1880 +128040 1876 1880 +128040 1905 1532 +128040 1440 1491 +128040 1441 1470 +128040 1471 1532 +128040 1563 1491 +128040 1727 1845 +128040 1831 1460 +128040 1921 1471 +128040 1617 1857 +128040 1783 1526 +128040 1829 1886 +128040 1551 1269 +128040 1554 1575 +128040 1576 1835 +128040 1710 1441 +128040 1920 1528 +128040 1443 1487 +128040 1892 1898 +128040 1877 1479 +128040 1670 1711 +128040 1731 1493 +128040 1905 1471 +128040 1549 1525 +128040 1755 1873 +128040 1890 1525 +128040 1657 1769 +128040 1664 1821 +128040 1550 1635 +128060 1563 1491 +128060 1568 1457 +128060 1573 1754 +128060 1573 1740 +128060 1590 1626 +128060 1609 1518 +128060 1613 1907 +128060 1613 1427 +128060 1634 1802 +128060 1683 1426 +128060 1708 1448 +128060 1718 1889 +128060 1727 1845 +128060 1811 1531 +128060 1831 1905 +128060 1831 1460 +128060 1866 1444 +128060 1874 1503 +128060 1905 1921 +128060 1921 1471 +128060 1580 1772 +128060 1593 1521 +128060 1616 1463 +128060 1617 1857 +128060 1783 1526 +128060 1829 1886 +128060 1905 1462 +128060 1551 1269 +128060 1554 1575 +128060 1576 1835 +128060 1710 1441 +128060 1920 1528 +128060 1443 1487 +128060 1580 1628 +128060 1892 1898 +128060 1648 1696 +128060 1735 1465 +128060 1877 1479 +128060 1670 1711 +128060 1731 1493 +128060 1905 1471 +128060 1549 1525 +128060 1592 1491 +128060 1755 1873 +128060 1890 1525 +128060 1657 1769 +128060 1664 1821 +128060 1550 1635 +128080 1541 1698 +128080 1554 1727 +128080 1556 1848 +128080 1563 1698 +128080 1573 1871 +128080 1575 1727 +128080 1580 1772 +128080 1593 1521 +128080 1616 1463 +128080 1617 1857 +128080 1628 1772 +128080 1630 1531 +128080 1652 1880 +128080 1656 1919 +128080 1688 1495 +128080 1688 1727 +128080 1698 1491 +128080 1783 1526 +128080 1807 1458 +128080 1825 1519 +128080 1829 1886 +128080 1831 1471 +128080 1840 1517 +128080 1905 1452 +128080 1905 1462 +128080 1907 1495 +128080 1452 1471 +128080 1551 1269 +128080 1554 1575 +128080 1576 1835 +128080 1582 1749 +128080 1591 1858 +128080 1592 1433 +128080 1680 1689 +128080 1688 1457 +128080 1710 1441 +128080 1767 1840 +128080 1835 1875 +128080 1920 1528 +128080 1443 1487 +128080 1543 1685 +128080 1580 1628 +128080 1643 1704 +128080 1831 1462 +128080 1892 1898 +128080 1569 1626 +128080 1648 1696 +128080 1735 1465 +128080 1761 1791 +128080 1796 1816 +128080 1877 1479 +128080 1670 1711 +128080 1731 1493 +128080 1905 1471 +128080 1664 1877 +128080 1549 1525 +128080 1592 1491 +128080 1755 1873 +128080 1890 1525 +128080 1657 1769 +128080 1664 1821 +128080 1550 1635 +128100 1538 1524 +128100 1551 1269 +128100 1554 1575 +128100 1563 1727 +128100 1576 1835 +128100 1582 1749 +128100 1591 1858 +128100 1592 1433 +128100 1601 1503 +128100 1626 1871 +128100 1678 1680 +128100 1680 1689 +128100 1688 1457 +128100 1688 1772 +128100 1689 1835 +128100 1701 1530 +128100 1708 1530 +128100 1710 1441 +128100 1715 1919 +128100 1767 1840 +128100 1794 1802 +128100 1802 1865 +128100 1823 1881 +128100 1835 1875 +128100 1855 1426 +128100 1865 1880 +128100 1875 1503 +128100 1892 1517 +128100 1920 1528 +128100 1433 1491 +128100 1443 1487 +128100 1543 1685 +128100 1580 1628 +128100 1635 1676 +128100 1643 1704 +128100 1683 1865 +128100 1831 1462 +128100 1892 1898 +128100 1455 1463 +128100 1569 1626 +128100 1648 1696 +128100 1687 1702 +128100 1735 1465 +128100 1761 1791 +128100 1874 1458 +128100 1460 1499 +128100 1796 1816 +128100 1877 1479 +128100 1670 1711 +128100 1731 1493 +128100 1905 1471 +128100 1664 1877 +128100 1598 1871 +128100 1698 1707 +128100 1549 1525 +128100 1592 1491 +128100 1755 1873 +128100 1890 1525 +128100 1657 1769 +128100 1664 1821 +128100 1550 1635 +128120 1541 1491 +128120 1543 1685 +128120 1550 1560 +128120 1580 1628 +128120 1598 1626 +128120 1635 1676 +128120 1643 1704 +128120 1647 1831 +128120 1680 1503 +128120 1683 1865 +128120 1694 1426 +128120 1695 1717 +128120 1702 1441 +128120 1706 1749 +128120 1728 1440 +128120 1802 1880 +128120 1825 1499 +128120 1829 1886 +128120 1831 1462 +128120 1847 1906 +128120 1892 1898 +128120 1441 1451 +128120 1455 1463 +128120 1499 1519 +128120 1569 1626 +128120 1587 1775 +128120 1648 1696 +128120 1687 1702 +128120 1735 1465 +128120 1761 1443 +128120 1761 1527 +128120 1761 1791 +128120 1825 1469 +128120 1874 1458 +128120 1460 1499 +128120 1796 1816 +128120 1877 1479 +128120 1538 1426 +128120 1670 1711 +128120 1731 1493 +128120 1819 1913 +128120 1905 1471 +128120 1664 1877 +128120 1598 1871 +128120 1698 1707 +128120 1549 1890 +128120 1549 1525 +128120 1592 1491 +128120 1755 1873 +128120 1890 1525 +128120 1657 1769 +128120 1664 1821 +128120 1727 1845 +128120 1550 1635 +128120 1560 1680 +128140 1543 1749 +128140 1554 1679 +128140 1562 1591 +128140 1568 1704 +128140 1568 1643 +128140 1569 1626 +128140 1576 1835 +128140 1579 1596 +128140 1580 1643 +128140 1581 1876 +128140 1587 1775 +128140 1596 1906 +128140 1596 1717 +128140 1612 1865 +128140 1623 1875 +128140 1641 1441 +128140 1643 1427 +128140 1643 1791 +128140 1648 1672 +128140 1648 1696 +128140 1687 1702 +128140 1701 1907 +128140 1717 1906 +128140 1721 1816 +128140 1721 1823 +128140 1735 1465 +128140 1761 1443 +128140 1761 1527 +128140 1761 1791 +128140 1764 1847 +128140 1767 1840 +128140 1772 1906 +128140 1816 1881 +128140 1825 1469 +128140 1840 1479 +128140 1874 1458 +128140 1460 1499 +128140 1580 1427 +128140 1664 1684 +128140 1796 1816 +128140 1796 1881 +128140 1802 1865 +128140 1816 1855 +128140 1877 1479 +128140 1475 1522 +128140 1538 1426 +128140 1670 1711 +128140 1684 1451 +128140 1731 1493 +128140 1761 1495 +128140 1819 1913 +128140 1905 1471 +128140 1664 1877 +128140 1598 1871 +128140 1664 1479 +128140 1698 1707 +128140 1549 1890 +128140 1552 1453 +128140 1549 1525 +128140 1554 1575 +128140 1592 1491 +128140 1755 1873 +128140 1890 1525 +128140 1920 1528 +128140 1657 1769 +128140 1551 1269 +128140 1664 1821 +128140 1727 1845 +128140 1550 1635 +128140 1560 1680 +128160 1543 1685 +128160 1563 1707 +128160 1574 1643 +128160 1579 1772 +128160 1579 1590 +128160 1580 1427 +128160 1580 1628 +128160 1590 1694 +128160 1592 1717 +128160 1598 1427 +128160 1623 1680 +128160 1623 1835 +128160 1647 1675 +128160 1656 1446 +128160 1664 1684 +128160 1678 1689 +128160 1684 1479 +128160 1698 1717 +128160 1704 1495 +128160 1704 1791 +128160 1731 1920 +128160 1772 1865 +128160 1772 1802 +128160 1772 1876 +128160 1794 1880 +128160 1796 1816 +128160 1796 1881 +128160 1796 1823 +128160 1802 1865 +128160 1816 1855 +128160 1829 1886 +128160 1847 1440 +128160 1857 1517 +128160 1865 1876 +128160 1877 1479 +128160 1884 1499 +128160 1455 1463 +128160 1475 1522 +128160 1495 1502 +128160 1538 1426 +128160 1603 1449 +128160 1669 1754 +128160 1670 1711 +128160 1673 1768 +128160 1684 1451 +128160 1731 1493 +128160 1761 1495 +128160 1819 1913 +128160 1905 1471 +128160 1664 1877 +128160 1598 1871 +128160 1664 1479 +128160 1672 1696 +128160 1698 1707 +128160 1541 1707 +128160 1549 1890 +128160 1592 1707 +128160 1426 1524 +128160 1552 1453 +128160 1683 1880 +128160 1549 1525 +128160 1554 1575 +128160 1592 1491 +128160 1755 1873 +128160 1890 1525 +128160 1920 1528 +128160 1657 1769 +128160 1551 1269 +128160 1664 1821 +128160 1727 1845 +128160 1550 1635 +128160 1560 1680 +128180 1538 1426 +128180 1541 1604 +128180 1542 1457 +128180 1568 1805 +128180 1590 1816 +128180 1592 1604 +128180 1596 1613 +128180 1603 1449 +128180 1643 1704 +128180 1648 1696 +128180 1652 1923 +128180 1664 1898 +128180 1669 1754 +128180 1670 1711 +128180 1673 1768 +128180 1680 1897 +128180 1684 1451 +128180 1685 1749 +128180 1688 1865 +128180 1688 1802 +128180 1695 1443 +128180 1727 1775 +128180 1731 1493 +128180 1740 1772 +128180 1761 1495 +128180 1767 1840 +128180 1819 1913 +128180 1835 1897 +128180 1901 1517 +128180 1905 1471 +128180 1635 1676 +128180 1664 1877 +128180 1678 1708 +128180 1688 1772 +128180 1592 1698 +128180 1598 1871 +128180 1617 1857 +128180 1648 1672 +128180 1664 1479 +128180 1672 1696 +128180 1698 1707 +128180 1434 1493 +128180 1541 1707 +128180 1549 1890 +128180 1592 1707 +128180 1426 1524 +128180 1541 1698 +128180 1552 1453 +128180 1598 1626 +128180 1617 1441 +128180 1683 1880 +128180 1495 1527 +128180 1549 1525 +128180 1554 1575 +128180 1592 1491 +128180 1755 1873 +128180 1890 1525 +128180 1920 1528 +128180 1775 1845 +128180 1874 1458 +128180 1657 1769 +128180 1551 1269 +128180 1664 1821 +128180 1727 1845 +128180 1550 1635 +128180 1560 1680 +128200 1560 1835 +128200 1574 1711 +128200 1603 1756 +128200 1604 1491 +128200 1635 1676 +128200 1664 1877 +128200 1678 1708 +128200 1688 1772 +128200 1707 1876 +128200 1708 1835 +128200 1711 1761 +128200 1731 1427 +128200 1798 1437 +128200 1805 1825 +128200 1829 1886 +128200 1921 1462 +128200 1477 1498 +128200 1592 1698 +128200 1598 1871 +128200 1617 1857 +128200 1648 1672 +128200 1664 1479 +128200 1672 1696 +128200 1698 1707 +128200 1757 1921 +128200 1816 1881 +128200 1847 1440 +128200 1434 1493 +128200 1541 1707 +128200 1549 1890 +128200 1592 1707 +128200 1802 1865 +128200 1426 1524 +128200 1541 1698 +128200 1552 1453 +128200 1598 1626 +128200 1617 1441 +128200 1683 1880 +128200 1794 1880 +128200 1877 1479 +128200 1495 1527 +128200 1549 1525 +128200 1554 1575 +128200 1592 1491 +128200 1755 1873 +128200 1890 1525 +128200 1816 1823 +128200 1920 1528 +128200 1775 1845 +128200 1874 1458 +128200 1603 1689 +128200 1563 1688 +128200 1657 1769 +128200 1551 1269 +128200 1664 1821 +128200 1727 1845 +128200 1550 1635 +128200 1560 1680 +128220 1539 1708 +128220 1543 1685 +128220 1587 1772 +128220 1591 1858 +128220 1592 1698 +128220 1598 1871 +128220 1604 1717 +128220 1617 1857 +128220 1643 1704 +128220 1648 1672 +128220 1664 1479 +128220 1672 1696 +128220 1684 1451 +128220 1698 1707 +128220 1698 1717 +128220 1701 1877 +128220 1713 1427 +128220 1742 1802 +128220 1757 1921 +128220 1802 1437 +128220 1816 1881 +128220 1819 1913 +128220 1825 1499 +128220 1847 1440 +128220 1857 1441 +128220 1872 1514 +128220 1898 1477 +128220 1908 1433 +128220 1919 1441 +128220 1434 1493 +128220 1538 1426 +128220 1541 1707 +128220 1543 1706 +128220 1549 1890 +128220 1550 1835 +128220 1592 1707 +128220 1625 1703 +128220 1675 1865 +128220 1772 1487 +128220 1802 1865 +128220 1905 1471 +128220 1426 1524 +128220 1541 1698 +128220 1552 1453 +128220 1598 1626 +128220 1617 1441 +128220 1683 1880 +128220 1792 1885 +128220 1794 1880 +128220 1877 1479 +128220 1495 1527 +128220 1549 1525 +128220 1554 1575 +128220 1592 1491 +128220 1755 1873 +128220 1890 1525 +128220 1816 1823 +128220 1920 1528 +128220 1775 1845 +128220 1874 1458 +128220 1603 1689 +128220 1727 1775 +128220 1892 1898 +128220 1563 1688 +128220 1796 1816 +128220 1657 1769 +128220 1551 1269 +128220 1664 1821 +128220 1727 1845 +128220 1550 1635 +128220 1560 1680 +128240 1538 1426 +128240 1538 1524 +128240 1541 1707 +128240 1543 1706 +128240 1549 1890 +128240 1550 1835 +128240 1569 1598 +128240 1592 1707 +128240 1625 1703 +128240 1635 1676 +128240 1643 1921 +128240 1643 1819 +128240 1643 1462 +128240 1645 1876 +128240 1670 1487 +128240 1675 1865 +128240 1684 1711 +128240 1684 1877 +128240 1684 1479 +128240 1704 1921 +128240 1717 1847 +128240 1756 1453 +128240 1757 1875 +128240 1772 1487 +128240 1792 1887 +128240 1796 1823 +128240 1802 1865 +128240 1819 1921 +128240 1819 1462 +128240 1871 1530 +128240 1876 1493 +128240 1877 1451 +128240 1885 1887 +128240 1905 1471 +128240 1921 1462 +128240 1426 1524 +128240 1439 1448 +128240 1451 1479 +128240 1541 1698 +128240 1552 1453 +128240 1569 1626 +128240 1598 1626 +128240 1617 1441 +128240 1683 1880 +128240 1711 1877 +128240 1711 1479 +128240 1735 1465 +128240 1783 1787 +128240 1787 1526 +128240 1792 1885 +128240 1794 1880 +128240 1877 1479 +128240 1495 1527 +128240 1549 1525 +128240 1554 1575 +128240 1592 1491 +128240 1755 1873 +128240 1890 1525 +128240 1507 1522 +128240 1608 1694 +128240 1816 1823 +128240 1920 1528 +128240 1775 1845 +128240 1874 1458 +128240 1603 1689 +128240 1727 1775 +128240 1892 1898 +128240 1563 1688 +128240 1796 1816 +128240 1657 1769 +128240 1551 1269 +128240 1664 1821 +128240 1727 1845 +128240 1550 1635 +128240 1560 1680 +128260 1541 1698 +128260 1541 1717 +128260 1551 1835 +128260 1552 1453 +128260 1568 1876 +128260 1568 1479 +128260 1569 1626 +128260 1574 1434 +128260 1598 1626 +128260 1617 1441 +128260 1617 1857 +128260 1617 1919 +128260 1643 1701 +128260 1676 1921 +128260 1680 1761 +128260 1683 1880 +128260 1684 1451 +128260 1689 1802 +128260 1701 1731 +128260 1703 1841 +128260 1711 1877 +128260 1711 1479 +128260 1731 1882 +128260 1731 1877 +128260 1731 1479 +128260 1735 1465 +128260 1757 1471 +128260 1783 1787 +128260 1787 1526 +128260 1792 1885 +128260 1794 1880 +128260 1876 1514 +128260 1877 1479 +128260 1905 1487 +128260 1908 1495 +128260 1924 1478 +128260 1495 1527 +128260 1549 1525 +128260 1554 1575 +128260 1592 1698 +128260 1592 1491 +128260 1688 1717 +128260 1707 1491 +128260 1711 1731 +128260 1721 1816 +128260 1755 1873 +128260 1890 1525 +128260 1507 1522 +128260 1608 1694 +128260 1684 1498 +128260 1816 1823 +128260 1920 1528 +128260 1775 1845 +128260 1874 1458 +128260 1603 1689 +128260 1727 1775 +128260 1892 1898 +128260 1563 1688 +128260 1796 1816 +128260 1657 1769 +128260 1551 1269 +128260 1664 1821 +128260 1727 1845 +128260 1550 1635 +128260 1560 1680 +128280 1549 1890 +128280 1549 1525 +128280 1554 1575 +128280 1568 1786 +128280 1568 1731 +128280 1568 1527 +128280 1568 1711 +128280 1572 1711 +128280 1576 1443 +128280 1582 1437 +128280 1592 1698 +128280 1592 1491 +128280 1630 1921 +128280 1643 1704 +128280 1643 1664 +128280 1643 1463 +128280 1645 1495 +128280 1647 1831 +128280 1684 1473 +128280 1688 1717 +128280 1688 1491 +128280 1698 1717 +128280 1703 1479 +128280 1707 1491 +128280 1707 1717 +128280 1711 1731 +128280 1721 1816 +128280 1755 1873 +128280 1756 1479 +128280 1767 1840 +128280 1802 1865 +128280 1876 1434 +128280 1882 1519 +128280 1890 1525 +128280 1921 1462 +128280 1441 1517 +128280 1507 1522 +128280 1543 1706 +128280 1608 1694 +128280 1635 1676 +128280 1684 1498 +128280 1816 1823 +128280 1871 1530 +128280 1876 1469 +128280 1920 1528 +128280 1453 1493 +128280 1775 1845 +128280 1874 1458 +128280 1876 1890 +128280 1603 1689 +128280 1727 1775 +128280 1892 1898 +128280 1563 1688 +128280 1796 1816 +128280 1552 1626 +128280 1657 1769 +128280 1551 1269 +128280 1664 1821 +128280 1727 1845 +128280 1698 1707 +128280 1550 1635 +128280 1572 1731 +128280 1592 1717 +128280 1560 1680 +128300 1543 1706 +128300 1592 1688 +128300 1592 1847 +128300 1598 1643 +128300 1608 1694 +128300 1617 1919 +128300 1635 1676 +128300 1645 1756 +128300 1669 1754 +128300 1677 1479 +128300 1683 1880 +128300 1684 1498 +128300 1701 1825 +128300 1711 1877 +128300 1715 1905 +128300 1816 1823 +128300 1825 1499 +128300 1855 1923 +128300 1857 1441 +128300 1871 1530 +128300 1876 1491 +128300 1876 1469 +128300 1901 1451 +128300 1920 1528 +128300 1426 1524 +128300 1453 1493 +128300 1570 1761 +128300 1657 1517 +128300 1711 1908 +128300 1775 1845 +128300 1825 1890 +128300 1874 1458 +128300 1876 1890 +128300 1908 1479 +128300 1593 1526 +128300 1603 1689 +128300 1727 1775 +128300 1819 1913 +128300 1892 1898 +128300 1538 1426 +128300 1563 1688 +128300 1711 1479 +128300 1796 1816 +128300 1552 1626 +128300 1626 1453 +128300 1626 1527 +128300 1657 1769 +128300 1551 1269 +128300 1664 1821 +128300 1727 1845 +128300 1698 1707 +128300 1550 1635 +128300 1572 1731 +128300 1592 1717 +128300 1560 1680 +128300 1877 1908 +128320 1538 1524 +128320 1552 1527 +128320 1570 1761 +128320 1574 1876 +128320 1593 1783 +128320 1612 1717 +128320 1645 1923 +128320 1657 1517 +128320 1701 1704 +128320 1711 1841 +128320 1711 1908 +128320 1721 1816 +128320 1732 1761 +128320 1743 1905 +128320 1775 1845 +128320 1825 1890 +128320 1825 1519 +128320 1874 1458 +128320 1876 1890 +128320 1877 1479 +128320 1884 1890 +128320 1908 1479 +128320 1913 1471 +128320 1593 1526 +128320 1603 1689 +128320 1617 1514 +128320 1727 1775 +128320 1786 1519 +128320 1819 1913 +128320 1892 1898 +128320 1538 1426 +128320 1512 1531 +128320 1563 1688 +128320 1703 1920 +128320 1711 1479 +128320 1796 1816 +128320 1831 1532 +128320 1552 1626 +128320 1626 1453 +128320 1626 1527 +128320 1657 1769 +128320 1825 1876 +128320 1890 1499 +128320 1551 1269 +128320 1664 1821 +128320 1727 1845 +128320 1698 1707 +128320 1550 1635 +128320 1572 1731 +128320 1592 1717 +128320 1560 1680 +128320 1877 1908 +128340 1579 1761 +128340 1593 1526 +128340 1598 1704 +128340 1603 1689 +128340 1612 1841 +128340 1617 1441 +128340 1617 1514 +128340 1645 1756 +128340 1694 1761 +128340 1727 1775 +128340 1761 1426 +128340 1786 1519 +128340 1802 1865 +128340 1819 1913 +128340 1829 1886 +128340 1841 1495 +128340 1842 1920 +128340 1892 1898 +128340 1892 1919 +128340 1924 1478 +128340 1444 1487 +128340 1455 1463 +128340 1538 1426 +128340 1538 1694 +128340 1590 1487 +128340 1512 1531 +128340 1563 1688 +128340 1703 1920 +128340 1711 1479 +128340 1921 1462 +128340 1598 1643 +128340 1796 1816 +128340 1831 1532 +128340 1920 1479 +128340 1552 1626 +128340 1626 1453 +128340 1626 1527 +128340 1657 1769 +128340 1549 1525 +128340 1825 1876 +128340 1890 1499 +128340 1551 1269 +128340 1664 1821 +128340 1727 1845 +128340 1698 1707 +128340 1550 1635 +128340 1572 1731 +128340 1592 1717 +128340 1560 1680 +128340 1877 1908 +128360 1538 1426 +128360 1538 1579 +128360 1538 1694 +128360 1560 1808 +128360 1590 1487 +128360 1598 1473 +128360 1667 1761 +128360 1694 1426 +128360 1703 1479 +128360 1721 1816 +128360 1728 1857 +128360 1757 1913 +128360 1767 1840 +128360 1840 1857 +128360 1871 1530 +128360 1913 1471 +128360 1426 1524 +128360 1512 1531 +128360 1563 1688 +128360 1703 1920 +128360 1711 1920 +128360 1711 1479 +128360 1921 1462 +128360 1598 1528 +128360 1598 1643 +128360 1796 1816 +128360 1831 1532 +128360 1874 1458 +128360 1920 1479 +128360 1552 1626 +128360 1626 1453 +128360 1626 1527 +128360 1657 1769 +128360 1549 1525 +128360 1816 1881 +128360 1825 1876 +128360 1890 1499 +128360 1551 1269 +128360 1664 1821 +128360 1590 1519 +128360 1727 1845 +128360 1698 1707 +128360 1550 1635 +128360 1572 1731 +128360 1592 1717 +128360 1560 1680 +128360 1877 1908 +128380 1538 1495 +128380 1552 1527 +128380 1563 1688 +128380 1563 1717 +128380 1657 1517 +128380 1688 1847 +128380 1703 1920 +128380 1711 1920 +128380 1711 1479 +128380 1728 1517 +128380 1757 1471 +128380 1769 1441 +128380 1783 1526 +128380 1786 1923 +128380 1802 1865 +128380 1842 1920 +128380 1857 1451 +128380 1921 1462 +128380 1924 1510 +128380 1441 1517 +128380 1507 1522 +128380 1598 1528 +128380 1598 1643 +128380 1630 1443 +128380 1727 1775 +128380 1796 1816 +128380 1831 1532 +128380 1874 1458 +128380 1593 1783 +128380 1669 1754 +128380 1857 1441 +128380 1920 1479 +128380 1552 1626 +128380 1626 1453 +128380 1626 1527 +128380 1657 1769 +128380 1873 1920 +128380 1549 1525 +128380 1816 1881 +128380 1825 1876 +128380 1890 1499 +128380 1453 1493 +128380 1543 1728 +128380 1551 1269 +128380 1664 1821 +128380 1590 1519 +128380 1727 1845 +128380 1698 1707 +128380 1550 1635 +128380 1572 1731 +128380 1592 1717 +128380 1560 1680 +128380 1877 1908 +128400 1541 1698 +128400 1543 1923 +128400 1578 1688 +128400 1598 1528 +128400 1598 1643 +128400 1617 1923 +128400 1630 1443 +128400 1642 1471 +128400 1643 1704 +128400 1683 1479 +128400 1688 1717 +128400 1727 1775 +128400 1728 1434 +128400 1796 1816 +128400 1829 1886 +128400 1831 1532 +128400 1841 1901 +128400 1874 1458 +128400 1884 1890 +128400 1898 1901 +128400 1923 1517 +128400 1593 1783 +128400 1669 1754 +128400 1683 1920 +128400 1857 1441 +128400 1873 1479 +128400 1920 1479 +128400 1487 1493 +128400 1552 1626 +128400 1626 1453 +128400 1626 1527 +128400 1657 1769 +128400 1873 1920 +128400 1549 1525 +128400 1816 1881 +128400 1825 1876 +128400 1890 1499 +128400 1453 1493 +128400 1543 1728 +128400 1551 1269 +128400 1664 1821 +128400 1892 1898 +128400 1590 1519 +128400 1727 1845 +128400 1698 1707 +128400 1550 1635 +128400 1572 1731 +128400 1592 1717 +128400 1560 1680 +128400 1877 1908 +128420 1555 1428 +128420 1556 1921 +128420 1593 1526 +128420 1593 1783 +128420 1603 1689 +128420 1635 1676 +128420 1669 1754 +128420 1683 1920 +128420 1692 1841 +128420 1692 1901 +128420 1698 1717 +128420 1704 1866 +128420 1786 1452 +128420 1841 1919 +128420 1857 1441 +128420 1873 1479 +128420 1920 1479 +128420 1441 1444 +128420 1487 1493 +128420 1552 1626 +128420 1626 1453 +128420 1626 1527 +128420 1657 1769 +128420 1873 1920 +128420 1549 1525 +128420 1603 1680 +128420 1816 1881 +128420 1825 1876 +128420 1890 1499 +128420 1453 1493 +128420 1543 1728 +128420 1551 1269 +128420 1892 1923 +128420 1664 1821 +128420 1680 1443 +128420 1892 1898 +128420 1684 1498 +128420 1590 1519 +128420 1727 1845 +128420 1698 1707 +128420 1550 1635 +128420 1572 1731 +128420 1592 1717 +128420 1735 1465 +128420 1560 1680 +128420 1877 1908 +128420 1563 1688 +128440 1552 1626 +128440 1552 1527 +128440 1560 1449 +128440 1568 1487 +128440 1592 1688 +128440 1617 1514 +128440 1626 1453 +128440 1626 1527 +128440 1645 1756 +128440 1657 1769 +128440 1687 1702 +128440 1708 1848 +128440 1711 1479 +128440 1731 1487 +128440 1772 1908 +128440 1772 1877 +128440 1783 1526 +128440 1794 1495 +128440 1796 1881 +128440 1873 1920 +128440 1884 1499 +128440 1898 1923 +128440 1455 1463 +128440 1512 1531 +128440 1549 1525 +128440 1554 1575 +128440 1560 1603 +128440 1563 1578 +128440 1603 1680 +128440 1603 1443 +128440 1816 1881 +128440 1825 1876 +128440 1884 1890 +128440 1890 1499 +128440 1453 1493 +128440 1543 1728 +128440 1546 1557 +128440 1551 1269 +128440 1598 1528 +128440 1603 1449 +128440 1831 1532 +128440 1874 1458 +128440 1892 1923 +128440 1538 1524 +128440 1664 1821 +128440 1560 1443 +128440 1680 1443 +128440 1892 1898 +128440 1684 1498 +128440 1590 1519 +128440 1727 1845 +128440 1698 1707 +128440 1550 1635 +128440 1572 1731 +128440 1592 1717 +128440 1735 1465 +128440 1560 1680 +128440 1877 1908 +128440 1563 1688 +128460 1549 1525 +128460 1554 1575 +128460 1560 1603 +128460 1563 1578 +128460 1582 1514 +128460 1590 1825 +128460 1590 1626 +128460 1593 1783 +128460 1598 1643 +128460 1603 1680 +128460 1603 1443 +128460 1626 1890 +128460 1635 1808 +128460 1641 1479 +128460 1702 1923 +128460 1711 1905 +128460 1713 1530 +128460 1727 1775 +128460 1757 1857 +128460 1757 1514 +128460 1807 1876 +128460 1816 1881 +128460 1825 1876 +128460 1884 1890 +128460 1890 1499 +128460 1905 1479 +128460 1453 1493 +128460 1543 1728 +128460 1546 1557 +128460 1551 1269 +128460 1598 1528 +128460 1603 1449 +128460 1616 1798 +128460 1798 1885 +128460 1500 1511 +128460 1767 1840 +128460 1831 1532 +128460 1874 1458 +128460 1892 1923 +128460 1538 1524 +128460 1664 1821 +128460 1560 1443 +128460 1574 1890 +128460 1680 1443 +128460 1892 1898 +128460 1684 1498 +128460 1590 1519 +128460 1727 1845 +128460 1698 1707 +128460 1550 1635 +128460 1572 1731 +128460 1592 1717 +128460 1735 1465 +128460 1560 1680 +128460 1877 1908 +128460 1563 1688 +128480 1543 1728 +128480 1546 1557 +128480 1551 1269 +128480 1575 1786 +128480 1582 1441 +128480 1598 1528 +128480 1603 1449 +128480 1616 1798 +128480 1657 1819 +128480 1657 1517 +128480 1688 1717 +128480 1711 1479 +128480 1732 1755 +128480 1769 1819 +128480 1792 1885 +128480 1794 1495 +128480 1798 1885 +128480 1823 1881 +128480 1857 1441 +128480 1913 1517 +128480 1924 1478 +128480 1500 1511 +128480 1552 1453 +128480 1587 1604 +128480 1603 1520 +128480 1617 1441 +128480 1687 1702 +128480 1704 1876 +128480 1767 1840 +128480 1831 1532 +128480 1874 1458 +128480 1876 1528 +128480 1892 1923 +128480 1538 1524 +128480 1598 1704 +128480 1626 1825 +128480 1664 1821 +128480 1560 1443 +128480 1574 1890 +128480 1680 1443 +128480 1892 1898 +128480 1684 1498 +128480 1590 1519 +128480 1727 1845 +128480 1657 1769 +128480 1698 1707 +128480 1550 1635 +128480 1572 1731 +128480 1703 1920 +128480 1592 1717 +128480 1735 1465 +128480 1560 1680 +128480 1877 1908 +128480 1563 1688 +128500 1539 1603 +128500 1552 1453 +128500 1578 1688 +128500 1582 1857 +128500 1587 1604 +128500 1592 1688 +128500 1593 1783 +128500 1603 1520 +128500 1617 1441 +128500 1687 1702 +128500 1699 1464 +128500 1704 1876 +128500 1707 1847 +128500 1767 1840 +128500 1786 1487 +128500 1831 1532 +128500 1880 1449 +128500 1885 1491 +128500 1455 1530 +128500 1643 1703 +128500 1874 1458 +128500 1876 1528 +128500 1892 1923 +128500 1538 1524 +128500 1568 1574 +128500 1598 1704 +128500 1754 1913 +128500 1626 1825 +128500 1453 1493 +128500 1598 1876 +128500 1664 1821 +128500 1560 1443 +128500 1574 1890 +128500 1680 1443 +128500 1892 1898 +128500 1905 1924 +128500 1684 1498 +128500 1549 1525 +128500 1590 1519 +128500 1727 1845 +128500 1603 1880 +128500 1657 1769 +128500 1698 1707 +128500 1550 1635 +128500 1572 1731 +128500 1703 1920 +128500 1592 1717 +128500 1735 1465 +128500 1560 1680 +128500 1877 1908 +128500 1563 1688 +128520 1550 1676 +128520 1560 1880 +128520 1598 1528 +128520 1603 1449 +128520 1643 1703 +128520 1680 1880 +128520 1721 1881 +128520 1728 1772 +128520 1794 1495 +128520 1816 1881 +128520 1874 1458 +128520 1876 1528 +128520 1892 1923 +128520 1924 1478 +128520 1500 1511 +128520 1538 1524 +128520 1560 1603 +128520 1568 1574 +128520 1598 1704 +128520 1664 1452 +128520 1754 1913 +128520 1626 1825 +128520 1643 1704 +128520 1453 1493 +128520 1598 1876 +128520 1617 1857 +128520 1664 1821 +128520 1688 1717 +128520 1711 1877 +128520 1560 1443 +128520 1574 1890 +128520 1680 1443 +128520 1877 1479 +128520 1892 1898 +128520 1905 1924 +128520 1684 1498 +128520 1549 1525 +128520 1590 1519 +128520 1727 1845 +128520 1603 1880 +128520 1657 1769 +128520 1698 1707 +128520 1550 1635 +128520 1572 1731 +128520 1908 1479 +128520 1703 1920 +128520 1592 1717 +128520 1735 1465 +128520 1560 1680 +128520 1877 1908 +128520 1563 1688 +128540 1538 1524 +128540 1560 1603 +128540 1568 1805 +128540 1568 1574 +128540 1574 1590 +128540 1598 1704 +128540 1603 1680 +128540 1664 1452 +128540 1685 1749 +128540 1692 1441 +128540 1704 1920 +128540 1717 1847 +128540 1754 1913 +128540 1767 1840 +128540 1840 1913 +128540 1883 1913 +128540 1898 1923 +128540 1919 1441 +128540 1552 1453 +128540 1554 1604 +128540 1626 1825 +128540 1643 1704 +128540 1775 1845 +128540 1453 1493 +128540 1554 1587 +128540 1598 1876 +128540 1617 1857 +128540 1664 1821 +128540 1688 1717 +128540 1711 1877 +128540 1560 1443 +128540 1568 1890 +128540 1574 1890 +128540 1680 1443 +128540 1877 1479 +128540 1892 1898 +128540 1905 1924 +128540 1721 1816 +128540 1684 1498 +128540 1549 1525 +128540 1590 1519 +128540 1727 1845 +128540 1603 1880 +128540 1657 1769 +128540 1698 1707 +128540 1550 1635 +128540 1572 1731 +128540 1711 1479 +128540 1711 1908 +128540 1908 1479 +128540 1703 1920 +128540 1592 1717 +128540 1598 1842 +128540 1735 1465 +128540 1560 1680 +128540 1877 1908 +128540 1563 1688 +128560 1541 1464 +128560 1543 1434 +128560 1550 1841 +128560 1552 1453 +128560 1554 1604 +128560 1563 1578 +128560 1568 1493 +128560 1581 1591 +128560 1582 1831 +128560 1587 1604 +128560 1590 1819 +128560 1626 1825 +128560 1643 1704 +128560 1695 1875 +128560 1707 1847 +128560 1735 1816 +128560 1769 1532 +128560 1775 1845 +128560 1819 1519 +128560 1911 1524 +128560 1453 1493 +128560 1554 1587 +128560 1574 1913 +128560 1592 1688 +128560 1598 1876 +128560 1617 1857 +128560 1626 1493 +128560 1664 1821 +128560 1688 1717 +128560 1711 1877 +128560 1727 1775 +128560 1816 1881 +128560 1857 1441 +128560 1560 1443 +128560 1568 1890 +128560 1574 1890 +128560 1649 1880 +128560 1680 1443 +128560 1877 1479 +128560 1892 1898 +128560 1905 1924 +128560 1603 1649 +128560 1721 1816 +128560 1538 1493 +128560 1684 1498 +128560 1549 1525 +128560 1590 1519 +128560 1727 1845 +128560 1603 1880 +128560 1657 1769 +128560 1698 1707 +128560 1550 1635 +128560 1572 1731 +128560 1711 1479 +128560 1711 1908 +128560 1908 1479 +128560 1703 1920 +128560 1592 1717 +128560 1598 1842 +128560 1735 1465 +128560 1819 1913 +128560 1538 1825 +128560 1560 1680 +128560 1877 1908 +128560 1563 1688 +128580 1539 1841 +128580 1546 1557 +128580 1554 1587 +128580 1560 1841 +128580 1563 1592 +128580 1574 1913 +128580 1574 1626 +128580 1592 1688 +128580 1598 1876 +128580 1599 1512 +128580 1617 1857 +128580 1626 1493 +128580 1634 1491 +128580 1664 1821 +128580 1680 1841 +128580 1688 1717 +128580 1706 1857 +128580 1711 1877 +128580 1727 1775 +128580 1816 1881 +128580 1821 1530 +128580 1821 1452 +128580 1842 1876 +128580 1857 1441 +128580 1435 1502 +128580 1458 1528 +128580 1512 1531 +128580 1560 1443 +128580 1568 1890 +128580 1574 1890 +128580 1643 1876 +128580 1649 1880 +128580 1667 1816 +128580 1680 1443 +128580 1717 1847 +128580 1874 1458 +128580 1877 1479 +128580 1892 1898 +128580 1905 1924 +128580 1593 1526 +128580 1603 1649 +128580 1664 1452 +128580 1721 1816 +128580 1796 1816 +128580 1883 1463 +128580 1455 1530 +128580 1538 1493 +128580 1617 1892 +128580 1684 1498 +128580 1825 1493 +128580 1543 1437 +128580 1549 1525 +128580 1590 1519 +128580 1727 1845 +128580 1598 1643 +128580 1603 1880 +128580 1657 1769 +128580 1698 1707 +128580 1550 1635 +128580 1572 1731 +128580 1711 1479 +128580 1711 1908 +128580 1908 1479 +128580 1703 1920 +128580 1592 1717 +128580 1598 1842 +128580 1735 1465 +128580 1819 1913 +128580 1538 1825 +128580 1560 1680 +128580 1877 1908 +128580 1563 1688 +128600 1560 1443 +128600 1568 1890 +128600 1574 1890 +128600 1574 1590 +128600 1574 1519 +128600 1582 1706 +128600 1630 1831 +128600 1641 1707 +128600 1643 1876 +128600 1649 1880 +128600 1667 1816 +128600 1680 1443 +128600 1684 1451 +128600 1717 1727 +128600 1717 1847 +128600 1721 1796 +128600 1728 1517 +128600 1794 1495 +128600 1825 1890 +128600 1858 1923 +128600 1874 1458 +128600 1877 1479 +128600 1890 1469 +128600 1892 1898 +128600 1905 1924 +128600 1451 1498 +128600 1543 1434 +128600 1593 1526 +128600 1593 1783 +128600 1603 1649 +128600 1664 1452 +128600 1721 1816 +128600 1796 1816 +128600 1883 1463 +128600 1455 1530 +128600 1538 1493 +128600 1617 1898 +128600 1617 1892 +128600 1684 1498 +128600 1825 1493 +128600 1543 1437 +128600 1549 1525 +128600 1590 1519 +128600 1727 1845 +128600 1538 1890 +128600 1598 1704 +128600 1598 1643 +128600 1603 1880 +128600 1657 1769 +128600 1698 1707 +128600 1550 1635 +128600 1572 1731 +128600 1711 1479 +128600 1711 1908 +128600 1908 1479 +128600 1703 1920 +128600 1592 1717 +128600 1598 1842 +128600 1735 1465 +128600 1819 1913 +128600 1857 1892 +128600 1538 1825 +128600 1560 1680 +128600 1877 1908 +128600 1563 1688 +128600 1617 1441 +128620 1543 1434 +128620 1568 1805 +128620 1574 1767 +128620 1593 1526 +128620 1593 1783 +128620 1603 1649 +128620 1617 1857 +128620 1648 1696 +128620 1649 1808 +128620 1657 1706 +128620 1664 1452 +128620 1666 1885 +128620 1680 1841 +128620 1688 1913 +128620 1688 1731 +128620 1711 1877 +128620 1721 1816 +128620 1727 1775 +128620 1796 1816 +128620 1796 1881 +128620 1816 1881 +128620 1819 1876 +128620 1870 1498 +128620 1876 1913 +128620 1883 1463 +128620 1890 1426 +128620 1890 1493 +128620 1898 1441 +128620 1455 1530 +128620 1538 1493 +128620 1617 1898 +128620 1617 1892 +128620 1626 1493 +128620 1643 1704 +128620 1684 1498 +128620 1825 1493 +128620 1543 1437 +128620 1549 1525 +128620 1590 1519 +128620 1727 1845 +128620 1538 1890 +128620 1551 1269 +128620 1598 1704 +128620 1598 1643 +128620 1603 1880 +128620 1657 1769 +128620 1698 1707 +128620 1775 1845 +128620 1603 1528 +128620 1871 1530 +128620 1550 1635 +128620 1572 1731 +128620 1711 1479 +128620 1711 1908 +128620 1908 1479 +128620 1703 1920 +128620 1592 1717 +128620 1598 1842 +128620 1735 1465 +128620 1819 1913 +128620 1857 1892 +128620 1538 1825 +128620 1560 1680 +128620 1877 1908 +128620 1563 1688 +128620 1617 1441 +128640 1538 1493 +128640 1563 1664 +128640 1569 1603 +128640 1582 1443 +128640 1604 1471 +128640 1617 1898 +128640 1617 1892 +128640 1626 1493 +128640 1630 1443 +128640 1643 1704 +128640 1648 1792 +128640 1657 1487 +128640 1664 1458 +128640 1664 1451 +128640 1664 1806 +128640 1667 1453 +128640 1669 1754 +128640 1678 1841 +128640 1684 1498 +128640 1688 1458 +128640 1688 1806 +128640 1688 1527 +128640 1761 1847 +128640 1767 1840 +128640 1769 1487 +128640 1772 1840 +128640 1772 1519 +128640 1825 1493 +128640 1543 1437 +128640 1546 1557 +128640 1549 1525 +128640 1582 1630 +128640 1590 1519 +128640 1727 1845 +128640 1728 1517 +128640 1806 1458 +128640 1905 1924 +128640 1538 1890 +128640 1551 1269 +128640 1598 1704 +128640 1598 1643 +128640 1603 1880 +128640 1657 1769 +128640 1698 1707 +128640 1721 1881 +128640 1775 1845 +128640 1603 1528 +128640 1871 1530 +128640 1550 1635 +128640 1572 1731 +128640 1711 1479 +128640 1673 1875 +128640 1711 1908 +128640 1908 1479 +128640 1703 1920 +128640 1569 1520 +128640 1592 1717 +128640 1598 1842 +128640 1735 1465 +128640 1877 1479 +128640 1819 1913 +128640 1857 1892 +128640 1538 1825 +128640 1560 1680 +128640 1877 1908 +128640 1563 1688 +128640 1617 1441 +128640 1816 1823 +128660 1538 1519 +128660 1543 1437 +128660 1546 1557 +128660 1549 1525 +128660 1568 1455 +128660 1575 1679 +128660 1582 1630 +128660 1590 1667 +128660 1590 1519 +128660 1667 1913 +128660 1667 1772 +128660 1667 1806 +128660 1721 1816 +128660 1727 1845 +128660 1727 1775 +128660 1728 1517 +128660 1734 1792 +128660 1772 1806 +128660 1806 1458 +128660 1807 1427 +128660 1816 1881 +128660 1825 1455 +128660 1831 1857 +128660 1880 1528 +128660 1905 1924 +128660 1905 1478 +128660 1538 1890 +128660 1551 1269 +128660 1598 1704 +128660 1598 1643 +128660 1603 1880 +128660 1657 1769 +128660 1698 1707 +128660 1721 1881 +128660 1775 1845 +128660 1825 1890 +128660 1603 1528 +128660 1871 1530 +128660 1550 1635 +128660 1572 1731 +128660 1711 1479 +128660 1673 1875 +128660 1593 1449 +128660 1711 1908 +128660 1908 1479 +128660 1703 1920 +128660 1569 1520 +128660 1592 1717 +128660 1598 1842 +128660 1735 1465 +128660 1877 1479 +128660 1819 1913 +128660 1857 1892 +128660 1538 1825 +128660 1560 1680 +128660 1877 1908 +128660 1563 1688 +128660 1617 1441 +128660 1816 1823 +128680 1538 1890 +128680 1551 1269 +128680 1552 1453 +128680 1563 1568 +128680 1568 1688 +128680 1576 1688 +128680 1590 1664 +128680 1595 1883 +128680 1598 1704 +128680 1598 1643 +128680 1603 1880 +128680 1616 1798 +128680 1617 1857 +128680 1630 1831 +128680 1634 1734 +128680 1642 1898 +128680 1643 1842 +128680 1654 1841 +128680 1657 1769 +128680 1698 1707 +128680 1717 1727 +128680 1721 1881 +128680 1734 1491 +128680 1772 1458 +128680 1772 1871 +128680 1775 1845 +128680 1783 1526 +128680 1825 1890 +128680 1830 1841 +128680 1841 1919 +128680 1871 1458 +128680 1539 1587 +128680 1603 1528 +128680 1626 1493 +128680 1626 1527 +128680 1857 1441 +128680 1871 1530 +128680 1892 1441 +128680 1448 1487 +128680 1550 1635 +128680 1572 1731 +128680 1711 1877 +128680 1711 1479 +128680 1648 1798 +128680 1673 1875 +128680 1593 1449 +128680 1711 1908 +128680 1908 1479 +128680 1703 1920 +128680 1569 1520 +128680 1592 1717 +128680 1598 1842 +128680 1735 1465 +128680 1877 1479 +128680 1796 1881 +128680 1819 1913 +128680 1857 1892 +128680 1538 1825 +128680 1560 1680 +128680 1877 1908 +128680 1563 1688 +128680 1617 1441 +128680 1816 1823 +128700 1539 1587 +128700 1543 1684 +128700 1579 1764 +128700 1598 1772 +128700 1603 1528 +128700 1603 1883 +128700 1626 1493 +128700 1626 1527 +128700 1649 1857 +128700 1654 1919 +128700 1749 1847 +128700 1807 1427 +128700 1841 1883 +128700 1857 1441 +128700 1871 1530 +128700 1880 1883 +128700 1892 1441 +128700 1441 1466 +128700 1448 1487 +128700 1550 1635 +128700 1572 1731 +128700 1678 1841 +128700 1711 1877 +128700 1711 1479 +128700 1617 1892 +128700 1648 1798 +128700 1673 1875 +128700 1593 1449 +128700 1711 1908 +128700 1908 1479 +128700 1703 1920 +128700 1569 1520 +128700 1592 1717 +128700 1598 1842 +128700 1735 1465 +128700 1877 1479 +128700 1796 1881 +128700 1819 1913 +128700 1857 1892 +128700 1538 1825 +128700 1560 1680 +128700 1877 1908 +128700 1563 1688 +128700 1617 1441 +128700 1816 1823 +128720 1550 1635 +128720 1551 1269 +128720 1570 1630 +128720 1572 1731 +128720 1587 1617 +128720 1587 1630 +128720 1587 1831 +128720 1604 1463 +128720 1635 1772 +128720 1649 1898 +128720 1669 1754 +128720 1678 1841 +128720 1711 1877 +128720 1711 1479 +128720 1727 1517 +128720 1772 1434 +128720 1883 1520 +128720 1905 1924 +128720 1603 1680 +128720 1617 1892 +128720 1626 1731 +128720 1648 1798 +128720 1673 1875 +128720 1582 1443 +128720 1593 1449 +128720 1698 1707 +128720 1711 1908 +128720 1727 1845 +128720 1908 1479 +128720 1703 1920 +128720 1569 1520 +128720 1592 1717 +128720 1598 1842 +128720 1825 1890 +128720 1735 1465 +128720 1877 1479 +128720 1796 1881 +128720 1819 1913 +128720 1857 1892 +128720 1572 1626 +128720 1538 1825 +128720 1560 1680 +128720 1549 1525 +128720 1877 1908 +128720 1563 1688 +128720 1617 1441 +128720 1816 1823 +128740 1541 1579 +128740 1543 1498 +128740 1552 1453 +128740 1568 1635 +128740 1569 1695 +128740 1570 1520 +128740 1582 1905 +128740 1598 1530 +128740 1603 1680 +128740 1617 1892 +128740 1626 1731 +128740 1645 1495 +128740 1648 1798 +128740 1660 1692 +128740 1667 1870 +128740 1673 1875 +128740 1696 1798 +128740 1707 1493 +128740 1775 1517 +128740 1807 1427 +128740 1841 1503 +128740 1871 1530 +128740 1458 1469 +128740 1582 1443 +128740 1593 1449 +128740 1698 1707 +128740 1711 1908 +128740 1727 1845 +128740 1892 1441 +128740 1908 1479 +128740 1579 1727 +128740 1595 1654 +128740 1703 1920 +128740 1569 1520 +128740 1592 1717 +128740 1598 1842 +128740 1825 1890 +128740 1735 1465 +128740 1877 1479 +128740 1796 1881 +128740 1819 1913 +128740 1857 1892 +128740 1572 1626 +128740 1538 1825 +128740 1560 1680 +128740 1603 1880 +128740 1549 1525 +128740 1877 1908 +128740 1563 1688 +128740 1617 1441 +128740 1816 1823 +128760 1582 1443 +128760 1590 1498 +128760 1592 1731 +128760 1593 1449 +128760 1608 1455 +128760 1617 1772 +128760 1630 1461 +128760 1643 1704 +128760 1680 1695 +128760 1698 1707 +128760 1711 1908 +128760 1717 1731 +128760 1727 1845 +128760 1731 1768 +128760 1794 1855 +128760 1892 1441 +128760 1908 1479 +128760 1458 1504 +128760 1538 1890 +128760 1579 1727 +128760 1590 1684 +128760 1595 1654 +128760 1599 1512 +128760 1676 1498 +128760 1703 1920 +128760 1569 1520 +128760 1590 1876 +128760 1592 1717 +128760 1598 1842 +128760 1604 1463 +128760 1825 1890 +128760 1876 1898 +128760 1735 1465 +128760 1877 1479 +128760 1711 1479 +128760 1796 1881 +128760 1819 1913 +128760 1857 1892 +128760 1572 1626 +128760 1538 1825 +128760 1560 1680 +128760 1603 1880 +128760 1549 1525 +128760 1877 1908 +128760 1563 1688 +128760 1617 1441 +128760 1543 1831 +128760 1543 1630 +128760 1816 1823 +128780 1538 1890 +128780 1579 1731 +128780 1579 1479 +128780 1579 1727 +128780 1590 1684 +128780 1595 1654 +128780 1598 1813 +128780 1599 1512 +128780 1626 1504 +128780 1676 1498 +128780 1703 1920 +128780 1731 1495 +128780 1796 1816 +128780 1841 1919 +128780 1850 1868 +128780 1569 1520 +128780 1579 1877 +128780 1590 1876 +128780 1592 1717 +128780 1598 1842 +128780 1604 1463 +128780 1825 1890 +128780 1617 1892 +128780 1876 1898 +128780 1617 1857 +128780 1735 1465 +128780 1877 1479 +128780 1711 1479 +128780 1796 1881 +128780 1819 1913 +128780 1857 1892 +128780 1572 1626 +128780 1626 1871 +128780 1630 1831 +128780 1538 1825 +128780 1560 1680 +128780 1603 1880 +128780 1549 1525 +128780 1877 1908 +128780 1563 1688 +128780 1617 1441 +128780 1551 1269 +128780 1543 1831 +128780 1543 1630 +128780 1572 1871 +128780 1816 1823 +128800 1556 1921 +128800 1569 1520 +128800 1577 1703 +128800 1579 1908 +128800 1579 1877 +128800 1590 1840 +128800 1590 1641 +128800 1590 1498 +128800 1590 1876 +128800 1592 1717 +128800 1598 1842 +128800 1604 1463 +128800 1617 1684 +128800 1660 1692 +128800 1669 1754 +128800 1684 1441 +128800 1688 1695 +128800 1717 1495 +128800 1721 1796 +128800 1807 1427 +128800 1825 1890 +128800 1873 1427 +128800 1890 1525 +128800 1913 1504 +128800 1549 1890 +128800 1552 1453 +128800 1617 1892 +128800 1876 1898 +128800 1501 1521 +128800 1617 1857 +128800 1711 1877 +128800 1735 1465 +128800 1877 1479 +128800 1711 1908 +128800 1908 1479 +128800 1711 1479 +128800 1796 1881 +128800 1819 1913 +128800 1857 1892 +128800 1572 1626 +128800 1626 1871 +128800 1630 1831 +128800 1538 1825 +128800 1560 1680 +128800 1649 1699 +128800 1603 1880 +128800 1549 1525 +128800 1877 1908 +128800 1563 1688 +128800 1617 1441 +128800 1551 1269 +128800 1543 1831 +128800 1543 1630 +128800 1572 1871 +128800 1816 1823 +128800 1657 1769 +128820 1549 1890 +128820 1552 1453 +128820 1617 1703 +128820 1617 1892 +128820 1648 1696 +128820 1698 1495 +128820 1707 1495 +128820 1731 1458 +128820 1734 1491 +128820 1794 1855 +128820 1857 1441 +128820 1876 1898 +128820 1924 1478 +128820 1501 1521 +128820 1590 1905 +128820 1617 1857 +128820 1634 1491 +128820 1698 1707 +128820 1711 1877 +128820 1735 1465 +128820 1877 1479 +128820 1711 1908 +128820 1908 1479 +128820 1711 1479 +128820 1796 1881 +128820 1819 1913 +128820 1857 1892 +128820 1892 1441 +128820 1572 1626 +128820 1626 1871 +128820 1630 1831 +128820 1538 1825 +128820 1560 1680 +128820 1649 1699 +128820 1603 1880 +128820 1549 1525 +128820 1877 1908 +128820 1563 1688 +128820 1617 1441 +128820 1551 1269 +128820 1543 1831 +128820 1543 1630 +128820 1572 1871 +128820 1816 1823 +128820 1657 1769 +128840 1554 1440 +128840 1590 1905 +128840 1592 1458 +128840 1604 1495 +128840 1617 1857 +128840 1634 1491 +128840 1634 1734 +128840 1641 1892 +128840 1698 1707 +128840 1703 1876 +128840 1711 1877 +128840 1727 1845 +128840 1735 1465 +128840 1764 1458 +128840 1775 1517 +128840 1807 1427 +128840 1821 1858 +128840 1825 1495 +128840 1841 1503 +128840 1850 1498 +128840 1877 1479 +128840 1908 1493 +128840 1479 1493 +128840 1495 1519 +128840 1711 1908 +128840 1877 1458 +128840 1908 1458 +128840 1908 1479 +128840 1711 1479 +128840 1796 1881 +128840 1819 1913 +128840 1857 1892 +128840 1892 1441 +128840 1572 1626 +128840 1626 1871 +128840 1630 1831 +128840 1538 1825 +128840 1560 1680 +128840 1649 1699 +128840 1841 1919 +128840 1603 1880 +128840 1549 1525 +128840 1587 1883 +128840 1877 1908 +128840 1563 1688 +128840 1617 1441 +128840 1551 1269 +128840 1543 1831 +128840 1543 1630 +128840 1572 1871 +128840 1816 1823 +128840 1657 1769 +128860 1568 1880 +128860 1568 1570 +128860 1617 1892 +128860 1678 1868 +128860 1711 1908 +128860 1711 1717 +128860 1717 1908 +128860 1877 1458 +128860 1908 1458 +128860 1908 1479 +128860 1603 1680 +128860 1711 1479 +128860 1792 1885 +128860 1796 1881 +128860 1819 1913 +128860 1857 1892 +128860 1892 1441 +128860 1572 1626 +128860 1626 1871 +128860 1630 1831 +128860 1538 1825 +128860 1560 1680 +128860 1649 1699 +128860 1680 1880 +128860 1924 1478 +128860 1841 1919 +128860 1603 1880 +128860 1549 1525 +128860 1587 1883 +128860 1877 1908 +128860 1563 1688 +128860 1617 1441 +128860 1551 1269 +128860 1543 1831 +128860 1543 1630 +128860 1572 1871 +128860 1816 1823 +128860 1657 1769 +128880 1552 1453 +128880 1554 1440 +128880 1590 1740 +128880 1603 1680 +128880 1635 1426 +128880 1670 1711 +128880 1670 1479 +128880 1672 1684 +128880 1679 1479 +128880 1680 1495 +128880 1684 1688 +128880 1704 1920 +128880 1711 1479 +128880 1713 1427 +128880 1727 1845 +128880 1792 1885 +128880 1796 1881 +128880 1819 1913 +128880 1840 1495 +128880 1857 1892 +128880 1892 1441 +128880 1458 1513 +128880 1572 1626 +128880 1590 1711 +128880 1590 1479 +128880 1626 1871 +128880 1688 1427 +128880 1617 1857 +128880 1630 1831 +128880 1857 1441 +128880 1538 1825 +128880 1560 1680 +128880 1592 1717 +128880 1649 1699 +128880 1680 1880 +128880 1924 1478 +128880 1841 1919 +128880 1575 1479 +128880 1603 1880 +128880 1549 1525 +128880 1587 1883 +128880 1877 1908 +128880 1563 1688 +128880 1617 1441 +128880 1735 1465 +128880 1551 1269 +128880 1543 1831 +128880 1543 1630 +128880 1572 1871 +128880 1816 1823 +128880 1657 1769 +128900 1572 1825 +128900 1572 1626 +128900 1574 1876 +128900 1577 1850 +128900 1577 1868 +128900 1590 1711 +128900 1590 1670 +128900 1590 1479 +128900 1595 1703 +128900 1603 1667 +128900 1626 1913 +128900 1626 1873 +128900 1626 1871 +128900 1647 1761 +128900 1672 1892 +128900 1676 1448 +128900 1684 1452 +128900 1688 1427 +128900 1701 1492 +128900 1754 1504 +128900 1755 1813 +128900 1868 1904 +128900 1556 1921 +128900 1617 1857 +128900 1630 1831 +128900 1857 1441 +128900 1538 1825 +128900 1560 1680 +128900 1592 1717 +128900 1649 1699 +128900 1680 1880 +128900 1850 1868 +128900 1892 1898 +128900 1924 1478 +128900 1841 1919 +128900 1575 1479 +128900 1603 1880 +128900 1549 1525 +128900 1587 1883 +128900 1877 1908 +128900 1563 1688 +128900 1617 1441 +128900 1568 1659 +128900 1735 1465 +128900 1551 1269 +128900 1543 1831 +128900 1543 1630 +128900 1572 1871 +128900 1816 1823 +128900 1657 1769 +128920 1551 1574 +128920 1556 1921 +128920 1569 1487 +128920 1578 1592 +128920 1592 1772 +128920 1617 1857 +128920 1630 1831 +128920 1667 1503 +128920 1670 1479 +128920 1676 1439 +128920 1688 1698 +128920 1717 1772 +128920 1731 1427 +128920 1754 1495 +128920 1857 1441 +128920 1871 1913 +128920 1922 1471 +128920 1440 1513 +128920 1538 1825 +128920 1560 1680 +128920 1592 1717 +128920 1649 1699 +128920 1680 1880 +128920 1775 1517 +128920 1796 1881 +128920 1819 1913 +128920 1850 1868 +128920 1892 1898 +128920 1924 1478 +128920 1552 1453 +128920 1670 1711 +128920 1841 1919 +128920 1890 1525 +128920 1575 1479 +128920 1603 1880 +128920 1549 1890 +128920 1549 1525 +128920 1587 1883 +128920 1877 1908 +128920 1563 1688 +128920 1617 1441 +128920 1727 1845 +128920 1568 1659 +128920 1735 1465 +128920 1551 1269 +128920 1543 1831 +128920 1543 1630 +128920 1572 1871 +128920 1816 1823 +128920 1657 1769 +128940 1538 1825 +128940 1538 1519 +128940 1560 1680 +128940 1579 1440 +128940 1582 1688 +128940 1587 1680 +128940 1592 1717 +128940 1603 1680 +128940 1649 1699 +128940 1654 1876 +128940 1669 1495 +128940 1671 1767 +128940 1680 1880 +128940 1688 1847 +128940 1692 1427 +128940 1699 1727 +128940 1761 1825 +128940 1761 1819 +128940 1775 1517 +128940 1819 1490 +128940 1871 1490 +128940 1913 1490 +128940 1434 1458 +128940 1570 1427 +128940 1595 1654 +128940 1664 1892 +128940 1673 1439 +128940 1796 1881 +128940 1819 1913 +128940 1850 1868 +128940 1892 1898 +128940 1924 1478 +128940 1552 1453 +128940 1670 1711 +128940 1841 1919 +128940 1890 1525 +128940 1575 1479 +128940 1603 1880 +128940 1703 1876 +128940 1549 1890 +128940 1549 1525 +128940 1587 1883 +128940 1673 1676 +128940 1877 1908 +128940 1563 1688 +128940 1617 1441 +128940 1727 1845 +128940 1568 1659 +128940 1735 1465 +128940 1551 1269 +128940 1543 1831 +128940 1543 1630 +128940 1572 1871 +128940 1816 1823 +128940 1657 1769 +128960 1556 1921 +128960 1570 1427 +128960 1570 1731 +128960 1579 1908 +128960 1590 1520 +128960 1595 1654 +128960 1599 1512 +128960 1648 1798 +128960 1664 1892 +128960 1667 1920 +128960 1670 1688 +128960 1670 1490 +128960 1673 1439 +128960 1688 1711 +128960 1695 1772 +128960 1698 1731 +128960 1711 1490 +128960 1735 1761 +128960 1796 1881 +128960 1819 1913 +128960 1847 1522 +128960 1850 1868 +128960 1892 1898 +128960 1924 1478 +128960 1552 1453 +128960 1579 1592 +128960 1670 1711 +128960 1698 1441 +128960 1717 1772 +128960 1841 1919 +128960 1847 1458 +128960 1890 1525 +128960 1575 1479 +128960 1603 1880 +128960 1703 1876 +128960 1549 1890 +128960 1549 1525 +128960 1587 1883 +128960 1673 1676 +128960 1857 1441 +128960 1877 1908 +128960 1563 1688 +128960 1617 1441 +128960 1678 1841 +128960 1727 1845 +128960 1568 1659 +128960 1731 1427 +128960 1735 1465 +128960 1551 1269 +128960 1543 1831 +128960 1543 1630 +128960 1630 1831 +128960 1572 1871 +128960 1816 1823 +128960 1657 1769 +128980 1552 1453 +128980 1574 1437 +128980 1579 1592 +128980 1579 1688 +128980 1579 1717 +128980 1592 1755 +128980 1626 1665 +128980 1670 1711 +128980 1688 1740 +128980 1698 1441 +128980 1717 1772 +128980 1717 1517 +128980 1717 1755 +128980 1772 1513 +128980 1841 1919 +128980 1847 1458 +128980 1870 1452 +128980 1890 1525 +128980 1575 1479 +128980 1592 1717 +128980 1598 1667 +128980 1603 1880 +128980 1645 1756 +128980 1679 1490 +128980 1688 1517 +128980 1703 1876 +128980 1549 1890 +128980 1549 1525 +128980 1576 1493 +128980 1587 1883 +128980 1673 1676 +128980 1857 1441 +128980 1877 1908 +128980 1563 1688 +128980 1617 1441 +128980 1678 1841 +128980 1727 1845 +128980 1568 1659 +128980 1731 1427 +128980 1735 1465 +128980 1551 1269 +128980 1543 1831 +128980 1543 1630 +128980 1630 1831 +128980 1572 1871 +128980 1816 1823 +128980 1657 1769 +129000 1543 1761 +129000 1563 1717 +129000 1575 1490 +129000 1575 1479 +129000 1579 1517 +129000 1579 1847 +129000 1592 1688 +129000 1592 1717 +129000 1598 1667 +129000 1603 1880 +129000 1603 1492 +129000 1645 1458 +129000 1645 1756 +129000 1649 1699 +129000 1676 1439 +129000 1678 1492 +129000 1679 1490 +129000 1688 1517 +129000 1688 1717 +129000 1698 1522 +129000 1698 1754 +129000 1699 1845 +129000 1699 1727 +129000 1703 1876 +129000 1707 1427 +129000 1841 1492 +129000 1880 1492 +129000 1493 1495 +129000 1549 1890 +129000 1549 1525 +129000 1576 1493 +129000 1587 1883 +129000 1648 1798 +129000 1673 1676 +129000 1796 1881 +129000 1857 1441 +129000 1877 1908 +129000 1892 1898 +129000 1924 1478 +129000 1563 1688 +129000 1617 1857 +129000 1617 1441 +129000 1678 1841 +129000 1727 1845 +129000 1673 1761 +129000 1676 1761 +129000 1568 1659 +129000 1731 1427 +129000 1735 1465 +129000 1551 1269 +129000 1543 1831 +129000 1543 1630 +129000 1630 1831 +129000 1673 1439 +129000 1572 1871 +129000 1816 1823 +129000 1657 1769 +129020 1549 1890 +129020 1549 1525 +129020 1576 1493 +129020 1587 1883 +129020 1598 1643 +129020 1626 1847 +129020 1648 1798 +129020 1664 1876 +129020 1667 1847 +129020 1673 1676 +129020 1676 1495 +129020 1704 1920 +129020 1717 1772 +129020 1796 1881 +129020 1819 1479 +129020 1857 1441 +129020 1877 1908 +129020 1892 1898 +129020 1913 1479 +129020 1924 1478 +129020 1448 1451 +129020 1492 1504 +129020 1549 1755 +129020 1563 1688 +129020 1575 1679 +129020 1617 1857 +129020 1617 1441 +129020 1678 1841 +129020 1727 1845 +129020 1884 1499 +129020 1522 1524 +129020 1673 1761 +129020 1676 1761 +129020 1568 1659 +129020 1574 1437 +129020 1582 1443 +129020 1603 1522 +129020 1603 1524 +129020 1731 1427 +129020 1735 1465 +129020 1551 1269 +129020 1543 1831 +129020 1543 1630 +129020 1630 1831 +129020 1673 1439 +129020 1755 1890 +129020 1890 1525 +129020 1850 1868 +129020 1572 1871 +129020 1755 1525 +129020 1816 1823 +129020 1657 1769 +129040 1539 1855 +129040 1546 1557 +129040 1549 1755 +129040 1563 1688 +129040 1575 1679 +129040 1595 1703 +129040 1617 1857 +129040 1617 1441 +129040 1667 1850 +129040 1672 1717 +129040 1678 1841 +129040 1678 1503 +129040 1688 1455 +129040 1721 1816 +129040 1727 1845 +129040 1884 1499 +129040 1919 1504 +129040 1492 1527 +129040 1522 1524 +129040 1552 1453 +129040 1673 1761 +129040 1676 1761 +129040 1825 1874 +129040 1568 1659 +129040 1574 1437 +129040 1582 1443 +129040 1603 1522 +129040 1603 1524 +129040 1731 1427 +129040 1735 1465 +129040 1551 1269 +129040 1543 1831 +129040 1543 1630 +129040 1630 1831 +129040 1673 1439 +129040 1755 1890 +129040 1890 1525 +129040 1850 1868 +129040 1572 1871 +129040 1755 1525 +129040 1816 1823 +129040 1657 1769 +129060 1543 1706 +129060 1543 1439 +129060 1552 1453 +129060 1572 1592 +129060 1617 1876 +129060 1669 1754 +129060 1673 1761 +129060 1676 1761 +129060 1688 1868 +129060 1756 1458 +129060 1798 1885 +129060 1825 1874 +129060 1898 1479 +129060 1920 1453 +129060 1568 1659 +129060 1574 1437 +129060 1582 1443 +129060 1603 1522 +129060 1603 1524 +129060 1731 1427 +129060 1735 1465 +129060 1857 1441 +129060 1551 1269 +129060 1645 1458 +129060 1543 1831 +129060 1543 1630 +129060 1630 1831 +129060 1673 1676 +129060 1673 1439 +129060 1755 1890 +129060 1890 1525 +129060 1850 1868 +129060 1572 1871 +129060 1755 1525 +129060 1676 1439 +129060 1587 1883 +129060 1816 1823 +129060 1598 1711 +129060 1657 1769 +129080 1556 1921 +129080 1563 1578 +129080 1568 1659 +129080 1574 1437 +129080 1582 1443 +129080 1592 1855 +129080 1592 1455 +129080 1603 1876 +129080 1603 1522 +129080 1603 1524 +129080 1617 1441 +129080 1671 1767 +129080 1721 1816 +129080 1727 1845 +129080 1731 1427 +129080 1735 1465 +129080 1783 1791 +129080 1796 1816 +129080 1825 1890 +129080 1857 1441 +129080 1871 1490 +129080 1871 1479 +129080 1499 1519 +129080 1551 1269 +129080 1645 1458 +129080 1819 1913 +129080 1884 1499 +129080 1543 1831 +129080 1543 1630 +129080 1630 1831 +129080 1673 1676 +129080 1673 1439 +129080 1755 1890 +129080 1890 1525 +129080 1850 1868 +129080 1572 1871 +129080 1755 1525 +129080 1550 1761 +129080 1676 1439 +129080 1587 1883 +129080 1816 1823 +129080 1598 1711 +129080 1657 1769 +129100 1551 1269 +129100 1579 1592 +129100 1592 1649 +129100 1592 1772 +129100 1592 1717 +129100 1626 1688 +129100 1645 1458 +129100 1648 1798 +129100 1664 1684 +129100 1698 1455 +129100 1703 1892 +129100 1819 1913 +129100 1877 1908 +129100 1884 1499 +129100 1920 1453 +129100 1543 1831 +129100 1543 1630 +129100 1630 1831 +129100 1673 1676 +129100 1673 1439 +129100 1755 1890 +129100 1890 1525 +129100 1643 1704 +129100 1825 1874 +129100 1850 1868 +129100 1448 1451 +129100 1572 1871 +129100 1669 1754 +129100 1603 1761 +129100 1798 1885 +129100 1755 1525 +129100 1550 1761 +129100 1711 1479 +129100 1676 1439 +129100 1587 1883 +129100 1816 1823 +129100 1550 1603 +129100 1598 1711 +129100 1657 1769 +129120 1543 1673 +129120 1543 1831 +129120 1543 1676 +129120 1543 1630 +129120 1543 1439 +129120 1546 1768 +129120 1582 1667 +129120 1595 1654 +129120 1617 1857 +129120 1626 1461 +129120 1630 1831 +129120 1630 1439 +129120 1630 1676 +129120 1654 1769 +129120 1654 1657 +129120 1670 1479 +129120 1673 1676 +129120 1673 1439 +129120 1755 1890 +129120 1806 1490 +129120 1857 1441 +129120 1890 1525 +129120 1913 1499 +129120 1556 1921 +129120 1643 1704 +129120 1735 1465 +129120 1825 1874 +129120 1850 1868 +129120 1448 1451 +129120 1572 1871 +129120 1617 1441 +129120 1669 1754 +129120 1727 1845 +129120 1603 1761 +129120 1798 1885 +129120 1755 1525 +129120 1550 1761 +129120 1568 1659 +129120 1711 1479 +129120 1676 1439 +129120 1587 1883 +129120 1816 1823 +129120 1550 1603 +129120 1598 1711 +129120 1657 1769 +129140 1546 1921 +129140 1554 1427 +129140 1556 1921 +129140 1563 1717 +129140 1574 1490 +129140 1574 1703 +129140 1590 1923 +129140 1598 1479 +129140 1643 1704 +129140 1649 1772 +129140 1671 1767 +129140 1673 1448 +129140 1676 1831 +129140 1721 1816 +129140 1735 1465 +129140 1796 1816 +129140 1825 1874 +129140 1850 1520 +129140 1850 1868 +129140 1868 1520 +129140 1904 1479 +129140 1448 1451 +129140 1449 1521 +129140 1572 1871 +129140 1617 1441 +129140 1669 1754 +129140 1727 1845 +129140 1551 1269 +129140 1603 1761 +129140 1798 1885 +129140 1755 1525 +129140 1550 1761 +129140 1568 1659 +129140 1711 1479 +129140 1825 1913 +129140 1676 1439 +129140 1587 1883 +129140 1816 1823 +129140 1550 1603 +129140 1598 1711 +129140 1870 1441 +129140 1657 1769 +129160 1552 1453 +129160 1570 1698 +129160 1572 1871 +129160 1617 1441 +129160 1630 1437 +129160 1642 1492 +129160 1645 1458 +129160 1669 1754 +129160 1671 1754 +129160 1684 1490 +129160 1727 1845 +129160 1755 1890 +129160 1756 1458 +129160 1847 1521 +129160 1884 1499 +129160 1890 1525 +129160 1551 1269 +129160 1603 1761 +129160 1645 1756 +129160 1792 1798 +129160 1798 1885 +129160 1543 1439 +129160 1755 1525 +129160 1550 1761 +129160 1568 1659 +129160 1711 1479 +129160 1825 1913 +129160 1676 1439 +129160 1587 1883 +129160 1816 1823 +129160 1550 1603 +129160 1563 1578 +129160 1598 1711 +129160 1870 1441 +129160 1657 1769 +129180 1539 1570 +129180 1551 1269 +129180 1603 1761 +129180 1603 1490 +129180 1645 1756 +129180 1647 1471 +129180 1698 1471 +129180 1706 1451 +129180 1792 1798 +129180 1798 1885 +129180 1868 1487 +129180 1543 1439 +129180 1543 1831 +129180 1643 1704 +129180 1676 1831 +129180 1543 1676 +129180 1658 1427 +129180 1755 1525 +129180 1550 1761 +129180 1568 1659 +129180 1711 1479 +129180 1825 1913 +129180 1676 1439 +129180 1587 1883 +129180 1816 1823 +129180 1598 1479 +129180 1550 1603 +129180 1563 1578 +129180 1598 1711 +129180 1870 1441 +129180 1657 1769 +129200 1543 1439 +129200 1543 1831 +129200 1574 1767 +129200 1643 1704 +129200 1643 1920 +129200 1680 1840 +129200 1680 1466 +129200 1721 1816 +129200 1756 1904 +129200 1761 1493 +129200 1769 1898 +129200 1796 1816 +129200 1806 1519 +129200 1913 1519 +129200 1676 1831 +129200 1696 1798 +129200 1543 1676 +129200 1550 1630 +129200 1658 1427 +129200 1755 1525 +129200 1783 1528 +129200 1550 1761 +129200 1568 1659 +129200 1711 1479 +129200 1825 1913 +129200 1676 1439 +129200 1587 1883 +129200 1816 1823 +129200 1598 1479 +129200 1550 1603 +129200 1563 1578 +129200 1598 1711 +129200 1870 1441 +129200 1657 1769 +129220 1556 1921 +129220 1643 1731 +129220 1667 1786 +129220 1669 1680 +129220 1676 1831 +129220 1685 1492 +129220 1696 1798 +129220 1703 1892 +129220 1772 1806 +129220 1806 1825 +129220 1825 1519 +129220 1890 1525 +129220 1543 1676 +129220 1550 1630 +129220 1603 1630 +129220 1658 1427 +129220 1755 1525 +129220 1783 1528 +129220 1550 1761 +129220 1568 1659 +129220 1603 1761 +129220 1711 1479 +129220 1825 1913 +129220 1563 1717 +129220 1792 1798 +129220 1676 1439 +129220 1587 1883 +129220 1598 1670 +129220 1816 1823 +129220 1598 1479 +129220 1550 1603 +129220 1563 1578 +129220 1598 1711 +129220 1735 1465 +129220 1645 1756 +129220 1870 1441 +129220 1657 1769 +129240 1543 1676 +129240 1550 1630 +129240 1551 1437 +129240 1551 1269 +129240 1563 1904 +129240 1592 1643 +129240 1603 1630 +129240 1630 1761 +129240 1643 1704 +129240 1658 1427 +129240 1678 1772 +129240 1678 1919 +129240 1684 1703 +129240 1698 1790 +129240 1755 1525 +129240 1269 1437 +129240 1783 1528 +129240 1813 1880 +129240 1543 1451 +129240 1550 1761 +129240 1568 1659 +129240 1603 1761 +129240 1711 1479 +129240 1772 1919 +129240 1819 1825 +129240 1819 1913 +129240 1825 1913 +129240 1543 1439 +129240 1563 1717 +129240 1792 1798 +129240 1816 1881 +129240 1676 1439 +129240 1587 1883 +129240 1598 1670 +129240 1816 1823 +129240 1755 1890 +129240 1598 1479 +129240 1550 1603 +129240 1563 1578 +129240 1598 1711 +129240 1735 1465 +129240 1645 1756 +129240 1870 1441 +129240 1657 1769 +129260 1543 1451 +129260 1550 1761 +129260 1554 1880 +129260 1563 1455 +129260 1568 1659 +129260 1590 1678 +129260 1603 1761 +129260 1642 1492 +129260 1664 1898 +129260 1671 1839 +129260 1698 1761 +129260 1711 1479 +129260 1772 1919 +129260 1819 1825 +129260 1819 1913 +129260 1825 1913 +129260 1898 1923 +129260 1924 1478 +129260 1543 1439 +129260 1563 1717 +129260 1678 1761 +129260 1792 1798 +129260 1816 1881 +129260 1884 1890 +129260 1676 1439 +129260 1587 1883 +129260 1598 1670 +129260 1816 1823 +129260 1755 1890 +129260 1598 1479 +129260 1550 1603 +129260 1563 1578 +129260 1598 1711 +129260 1735 1465 +129260 1645 1756 +129260 1870 1441 +129260 1657 1769 +129280 1543 1439 +129280 1552 1658 +129280 1563 1717 +129280 1574 1913 +129280 1592 1847 +129280 1598 1847 +129280 1664 1692 +129280 1678 1761 +129280 1684 1857 +129280 1696 1798 +129280 1698 1703 +129280 1727 1845 +129280 1731 1847 +129280 1792 1798 +129280 1798 1885 +129280 1816 1881 +129280 1847 1530 +129280 1884 1890 +129280 1658 1731 +129280 1676 1439 +129280 1587 1883 +129280 1598 1670 +129280 1643 1704 +129280 1649 1908 +129280 1816 1823 +129280 1755 1890 +129280 1755 1525 +129280 1598 1479 +129280 1550 1603 +129280 1563 1578 +129280 1598 1711 +129280 1735 1465 +129280 1551 1269 +129280 1645 1756 +129280 1870 1441 +129280 1840 1913 +129280 1657 1769 +129300 1539 1455 +129300 1549 1890 +129300 1549 1755 +129300 1572 1526 +129300 1626 1441 +129300 1652 1673 +129300 1658 1731 +129300 1672 1847 +129300 1676 1706 +129300 1676 1439 +129300 1681 1471 +129300 1735 1847 +129300 1825 1905 +129300 1848 1906 +129300 1857 1441 +129300 1871 1526 +129300 1550 1831 +129300 1568 1659 +129300 1587 1883 +129300 1598 1670 +129300 1603 1831 +129300 1643 1704 +129300 1670 1711 +129300 1890 1525 +129300 1574 1840 +129300 1649 1908 +129300 1572 1871 +129300 1816 1823 +129300 1755 1890 +129300 1755 1525 +129300 1598 1479 +129300 1711 1479 +129300 1550 1603 +129300 1563 1578 +129300 1598 1711 +129300 1735 1465 +129300 1551 1269 +129300 1645 1756 +129300 1870 1441 +129300 1840 1913 +129300 1657 1769 +129320 1550 1831 +129320 1552 1731 +129320 1568 1659 +129320 1587 1883 +129320 1598 1670 +129320 1603 1831 +129320 1643 1704 +129320 1664 1692 +129320 1664 1477 +129320 1670 1711 +129320 1696 1798 +129320 1698 1703 +129320 1704 1772 +129320 1727 1471 +129320 1761 1772 +129320 1761 1461 +129320 1802 1865 +129320 1868 1471 +129320 1890 1525 +129320 1543 1439 +129320 1574 1840 +129320 1574 1913 +129320 1630 1731 +129320 1641 1847 +129320 1649 1908 +129320 1572 1871 +129320 1816 1823 +129320 1755 1890 +129320 1755 1525 +129320 1598 1479 +129320 1711 1479 +129320 1550 1603 +129320 1563 1578 +129320 1598 1711 +129320 1735 1465 +129320 1551 1269 +129320 1645 1756 +129320 1870 1441 +129320 1840 1913 +129320 1657 1769 +129340 1543 1439 +129340 1549 1825 +129340 1551 1492 +129340 1552 1530 +129340 1574 1840 +129340 1574 1913 +129340 1579 1735 +129340 1626 1684 +129340 1630 1530 +129340 1630 1731 +129340 1641 1847 +129340 1647 1868 +129340 1649 1908 +129340 1658 1786 +129340 1673 1794 +129340 1684 1857 +129340 1704 1761 +129340 1796 1816 +129340 1825 1905 +129340 1884 1905 +129340 1579 1455 +129340 1884 1890 +129340 1572 1871 +129340 1816 1823 +129340 1755 1890 +129340 1755 1525 +129340 1598 1479 +129340 1711 1479 +129340 1550 1603 +129340 1563 1578 +129340 1598 1711 +129340 1735 1465 +129340 1543 1676 +129340 1551 1269 +129340 1645 1756 +129340 1870 1441 +129340 1840 1913 +129340 1877 1908 +129340 1657 1769 +129360 1543 1706 +129360 1549 1890 +129360 1549 1884 +129360 1579 1455 +129360 1652 1673 +129360 1658 1680 +129360 1658 1437 +129360 1671 1839 +129360 1676 1439 +129360 1772 1490 +129360 1796 1823 +129360 1819 1913 +129360 1875 1458 +129360 1875 1471 +129360 1884 1890 +129360 1572 1871 +129360 1590 1530 +129360 1721 1823 +129360 1816 1823 +129360 1755 1890 +129360 1755 1525 +129360 1783 1528 +129360 1598 1479 +129360 1711 1479 +129360 1890 1525 +129360 1550 1603 +129360 1563 1578 +129360 1598 1711 +129360 1735 1465 +129360 1568 1659 +129360 1543 1676 +129360 1551 1269 +129360 1645 1756 +129360 1870 1441 +129360 1670 1479 +129360 1840 1913 +129360 1877 1908 +129360 1657 1769 +129380 1549 1755 +129380 1570 1574 +129380 1572 1871 +129380 1590 1530 +129380 1666 1530 +129380 1666 1678 +129380 1678 1713 +129380 1721 1823 +129380 1767 1840 +129380 1816 1823 +129380 1847 1875 +129380 1924 1478 +129380 1727 1845 +129380 1755 1890 +129380 1755 1525 +129380 1783 1528 +129380 1598 1479 +129380 1598 1670 +129380 1684 1892 +129380 1711 1479 +129380 1796 1816 +129380 1890 1525 +129380 1550 1603 +129380 1563 1578 +129380 1598 1711 +129380 1735 1465 +129380 1568 1659 +129380 1626 1684 +129380 1543 1676 +129380 1649 1908 +129380 1551 1269 +129380 1645 1756 +129380 1870 1441 +129380 1670 1479 +129380 1840 1913 +129380 1877 1908 +129380 1657 1769 +129400 1543 1680 +129400 1543 1550 +129400 1556 1921 +129400 1570 1455 +129400 1664 1923 +129400 1666 1752 +129400 1727 1845 +129400 1752 1530 +129400 1755 1890 +129400 1755 1525 +129400 1783 1528 +129400 1823 1881 +129400 1825 1905 +129400 1850 1908 +129400 1858 1906 +129400 1892 1898 +129400 1908 1517 +129400 1549 1890 +129400 1598 1479 +129400 1598 1670 +129400 1684 1892 +129400 1711 1479 +129400 1796 1816 +129400 1890 1525 +129400 1550 1603 +129400 1563 1578 +129400 1598 1711 +129400 1616 1906 +129400 1684 1857 +129400 1735 1465 +129400 1819 1913 +129400 1568 1659 +129400 1626 1857 +129400 1626 1684 +129400 1543 1676 +129400 1649 1908 +129400 1825 1519 +129400 1551 1269 +129400 1645 1756 +129400 1870 1441 +129400 1670 1479 +129400 1840 1913 +129400 1877 1908 +129400 1657 1769 +129420 1538 1466 +129420 1543 1678 +129420 1543 1671 +129420 1549 1890 +129420 1587 1590 +129420 1598 1479 +129420 1598 1670 +129420 1652 1790 +129420 1670 1711 +129420 1676 1493 +129420 1684 1892 +129420 1698 1808 +129420 1711 1479 +129420 1721 1816 +129420 1731 1755 +129420 1796 1816 +129420 1796 1823 +129420 1890 1525 +129420 1905 1519 +129420 1920 1479 +129420 1550 1603 +129420 1563 1578 +129420 1598 1711 +129420 1616 1906 +129420 1652 1673 +129420 1684 1857 +129420 1735 1465 +129420 1752 1766 +129420 1796 1881 +129420 1819 1913 +129420 1549 1525 +129420 1568 1659 +129420 1572 1871 +129420 1590 1728 +129420 1604 1808 +129420 1626 1857 +129420 1626 1684 +129420 1892 1477 +129420 1543 1676 +129420 1649 1908 +129420 1825 1519 +129420 1551 1269 +129420 1645 1756 +129420 1870 1441 +129420 1670 1479 +129420 1840 1913 +129420 1877 1908 +129420 1657 1769 +129440 1543 1590 +129440 1550 1603 +129440 1550 1671 +129440 1559 1887 +129440 1563 1578 +129440 1590 1673 +129440 1590 1847 +129440 1598 1711 +129440 1616 1906 +129440 1652 1673 +129440 1664 1692 +129440 1678 1847 +129440 1684 1857 +129440 1721 1796 +129440 1732 1855 +129440 1735 1465 +129440 1752 1923 +129440 1752 1766 +129440 1796 1881 +129440 1819 1913 +129440 1908 1517 +129440 1549 1525 +129440 1551 1492 +129440 1568 1659 +129440 1572 1871 +129440 1590 1728 +129440 1604 1808 +129440 1626 1857 +129440 1626 1684 +129440 1713 1530 +129440 1892 1477 +129440 1543 1676 +129440 1649 1908 +129440 1676 1526 +129440 1727 1845 +129440 1825 1519 +129440 1551 1269 +129440 1645 1756 +129440 1870 1441 +129440 1670 1479 +129440 1840 1913 +129440 1877 1908 +129440 1657 1769 +129440 1892 1898 +129460 1549 1525 +129460 1551 1492 +129460 1568 1659 +129460 1572 1871 +129460 1590 1728 +129460 1590 1752 +129460 1604 1808 +129460 1626 1857 +129460 1626 1684 +129460 1671 1678 +129460 1713 1530 +129460 1734 1491 +129460 1269 1492 +129460 1857 1441 +129460 1882 1512 +129460 1892 1477 +129460 1904 1455 +129460 1924 1525 +129460 1426 1501 +129460 1495 1501 +129460 1543 1676 +129460 1543 1526 +129460 1549 1890 +129460 1649 1908 +129460 1676 1752 +129460 1676 1526 +129460 1727 1845 +129460 1767 1913 +129460 1825 1519 +129460 1551 1269 +129460 1570 1920 +129460 1645 1756 +129460 1870 1441 +129460 1670 1479 +129460 1840 1913 +129460 1877 1908 +129460 1657 1769 +129460 1892 1898 +129480 1543 1752 +129480 1543 1676 +129480 1543 1526 +129480 1549 1890 +129480 1574 1603 +129480 1593 1501 +129480 1649 1908 +129480 1671 1727 +129480 1676 1752 +129480 1676 1526 +129480 1727 1752 +129480 1727 1845 +129480 1752 1845 +129480 1754 1913 +129480 1767 1913 +129480 1790 1493 +129480 1796 1816 +129480 1819 1913 +129480 1825 1519 +129480 1890 1513 +129480 1890 1519 +129480 1905 1519 +129480 1908 1517 +129480 1913 1455 +129480 1439 1451 +129480 1503 1526 +129480 1551 1269 +129480 1570 1920 +129480 1603 1831 +129480 1645 1756 +129480 1850 1908 +129480 1870 1441 +129480 1884 1905 +129480 1670 1479 +129480 1676 1469 +129480 1840 1913 +129480 1877 1908 +129480 1657 1769 +129480 1735 1465 +129480 1892 1898 +129500 1543 1664 +129500 1543 1455 +129500 1551 1269 +129500 1570 1920 +129500 1603 1831 +129500 1616 1821 +129500 1617 1441 +129500 1645 1756 +129500 1664 1455 +129500 1678 1269 +129500 1680 1752 +129500 1680 1493 +129500 1684 1857 +129500 1761 1792 +129500 1783 1528 +129500 1823 1881 +129500 1850 1908 +129500 1868 1471 +129500 1870 1441 +129500 1884 1905 +129500 1892 1455 +129500 1603 1507 +129500 1664 1892 +129500 1670 1479 +129500 1676 1469 +129500 1840 1913 +129500 1877 1908 +129500 1657 1769 +129500 1816 1823 +129500 1649 1517 +129500 1735 1465 +129500 1892 1898 +129520 1551 1678 +129520 1551 1503 +129520 1568 1659 +129520 1603 1507 +129520 1664 1898 +129520 1664 1892 +129520 1670 1479 +129520 1676 1469 +129520 1721 1816 +129520 1727 1845 +129520 1761 1769 +129520 1761 1798 +129520 1819 1913 +129520 1840 1913 +129520 1847 1522 +129520 1883 1497 +129520 1890 1519 +129520 1590 1923 +129520 1877 1908 +129520 1924 1478 +129520 1538 1524 +129520 1657 1769 +129520 1796 1816 +129520 1816 1823 +129520 1890 1513 +129520 1549 1513 +129520 1649 1517 +129520 1735 1465 +129520 1574 1463 +129520 1892 1898 +129540 1538 1522 +129540 1563 1578 +129540 1582 1475 +129540 1590 1923 +129540 1664 1514 +129540 1669 1754 +129540 1671 1680 +129540 1684 1913 +129540 1692 1455 +129540 1734 1491 +129540 1877 1908 +129540 1924 1478 +129540 1538 1524 +129540 1543 1479 +129540 1549 1890 +129540 1572 1871 +129540 1657 1769 +129540 1796 1816 +129540 1816 1823 +129540 1857 1441 +129540 1884 1905 +129540 1890 1513 +129540 1549 1513 +129540 1649 1517 +129540 1735 1465 +129540 1574 1463 +129540 1645 1756 +129540 1892 1898 +129560 1538 1524 +129560 1543 1479 +129560 1549 1890 +129560 1572 1871 +129560 1593 1426 +129560 1647 1752 +129560 1657 1769 +129560 1671 1455 +129560 1678 1728 +129560 1680 1455 +129560 1695 1761 +129560 1703 1904 +129560 1711 1479 +129560 1717 1752 +129560 1732 1855 +129560 1786 1455 +129560 1796 1816 +129560 1816 1881 +129560 1816 1823 +129560 1857 1441 +129560 1884 1905 +129560 1890 1513 +129560 1495 1530 +129560 1670 1711 +129560 1570 1920 +129560 1549 1513 +129560 1568 1659 +129560 1598 1479 +129560 1649 1517 +129560 1735 1465 +129560 1574 1463 +129560 1645 1756 +129560 1892 1898 +129580 1539 1579 +129580 1551 1269 +129580 1582 1443 +129580 1593 1845 +129580 1593 1727 +129580 1647 1816 +129580 1664 1913 +129580 1669 1754 +129580 1670 1711 +129580 1676 1922 +129580 1707 1765 +129580 1752 1458 +129580 1914 1427 +129580 1543 1711 +129580 1570 1920 +129580 1734 1491 +129580 1825 1884 +129580 1549 1513 +129580 1568 1659 +129580 1598 1479 +129580 1630 1676 +129580 1649 1517 +129580 1735 1465 +129580 1574 1463 +129580 1645 1756 +129580 1805 1501 +129580 1892 1898 +129580 1825 1519 +129600 1543 1711 +129600 1570 1920 +129600 1598 1667 +129600 1616 1906 +129600 1626 1913 +129600 1630 1922 +129600 1660 1692 +129600 1695 1761 +129600 1703 1904 +129600 1717 1742 +129600 1734 1491 +129600 1792 1885 +129600 1825 1884 +129600 1884 1519 +129600 1892 1913 +129600 1549 1513 +129600 1568 1659 +129600 1598 1479 +129600 1630 1676 +129600 1649 1517 +129600 1657 1769 +129600 1735 1465 +129600 1816 1881 +129600 1816 1823 +129600 1857 1441 +129600 1563 1578 +129600 1574 1463 +129600 1645 1756 +129600 1679 1816 +129600 1805 1501 +129600 1877 1908 +129600 1892 1898 +129600 1825 1519 +129620 1549 1513 +129620 1568 1659 +129620 1568 1479 +129620 1592 1667 +129620 1598 1479 +129620 1630 1676 +129620 1642 1492 +129620 1649 1517 +129620 1652 1707 +129620 1657 1769 +129620 1676 1922 +129620 1695 1427 +129620 1727 1845 +129620 1735 1465 +129620 1816 1881 +129620 1816 1823 +129620 1857 1441 +129620 1868 1458 +129620 1908 1517 +129620 1491 1504 +129620 1543 1526 +129620 1563 1578 +129620 1574 1463 +129620 1645 1756 +129620 1679 1816 +129620 1805 1501 +129620 1877 1908 +129620 1796 1816 +129620 1892 1898 +129620 1626 1840 +129620 1825 1519 +129620 1876 1440 +129640 1543 1526 +129640 1563 1578 +129640 1574 1463 +129640 1645 1756 +129640 1648 1696 +129640 1660 1692 +129640 1669 1754 +129640 1679 1816 +129640 1684 1507 +129640 1703 1904 +129640 1715 1717 +129640 1792 1885 +129640 1805 1501 +129640 1877 1908 +129640 1900 1464 +129640 1924 1478 +129640 1672 1920 +129640 1796 1816 +129640 1892 1898 +129640 1626 1840 +129640 1645 1443 +129640 1825 1519 +129640 1876 1440 +129640 1513 1525 +129640 1870 1441 +129660 1549 1850 +129660 1592 1667 +129660 1642 1857 +129660 1642 1479 +129660 1672 1920 +129660 1679 1823 +129660 1707 1865 +129660 1735 1465 +129660 1759 1427 +129660 1796 1816 +129660 1802 1923 +129660 1857 1441 +129660 1892 1898 +129660 1552 1695 +129660 1613 1876 +129660 1695 1761 +129660 1552 1759 +129660 1626 1840 +129660 1645 1443 +129660 1759 1761 +129660 1825 1884 +129660 1711 1479 +129660 1825 1519 +129660 1850 1868 +129660 1876 1440 +129660 1513 1525 +129660 1549 1513 +129660 1870 1441 +129660 1572 1871 +129660 1549 1525 +129680 1552 1695 +129680 1563 1578 +129680 1579 1692 +129680 1598 1672 +129680 1604 1269 +129680 1608 1667 +129680 1613 1876 +129680 1616 1906 +129680 1617 1857 +129680 1642 1839 +129680 1657 1769 +129680 1659 1672 +129680 1667 1706 +129680 1667 1455 +129680 1684 1507 +129680 1695 1761 +129680 1711 1439 +129680 1761 1427 +129680 1783 1528 +129680 1819 1913 +129680 1850 1908 +129680 1865 1900 +129680 1865 1495 +129680 1439 1479 +129680 1441 1479 +129680 1451 1479 +129680 1552 1759 +129680 1626 1840 +129680 1645 1443 +129680 1695 1759 +129680 1759 1761 +129680 1790 1426 +129680 1825 1884 +129680 1877 1908 +129680 1711 1479 +129680 1825 1519 +129680 1802 1495 +129680 1850 1868 +129680 1876 1440 +129680 1669 1754 +129680 1513 1525 +129680 1549 1513 +129680 1645 1756 +129680 1870 1441 +129680 1572 1871 +129680 1549 1525 +129700 1551 1572 +129700 1551 1871 +129700 1552 1759 +129700 1604 1865 +129700 1626 1840 +129700 1645 1443 +129700 1695 1759 +129700 1707 1923 +129700 1759 1761 +129700 1761 1871 +129700 1269 1871 +129700 1790 1426 +129700 1790 1530 +129700 1816 1873 +129700 1825 1884 +129700 1877 1908 +129700 1884 1519 +129700 1570 1920 +129700 1626 1684 +129700 1711 1479 +129700 1761 1865 +129700 1825 1519 +129700 1802 1495 +129700 1850 1868 +129700 1876 1440 +129700 1735 1465 +129700 1669 1754 +129700 1513 1525 +129700 1549 1513 +129700 1645 1756 +129700 1870 1441 +129700 1572 1871 +129700 1549 1525 +129720 1539 1924 +129720 1550 1629 +129720 1551 1761 +129720 1551 1269 +129720 1552 1427 +129720 1570 1920 +129720 1572 1495 +129720 1574 1463 +129720 1577 1875 +129720 1579 1659 +129720 1582 1692 +129720 1591 1495 +129720 1626 1684 +129720 1652 1495 +129720 1670 1479 +129720 1670 1711 +129720 1711 1479 +129720 1727 1790 +129720 1731 1877 +129720 1761 1865 +129720 1761 1802 +129720 1802 1865 +129720 1825 1519 +129720 1868 1884 +129720 1543 1526 +129720 1657 1769 +129720 1802 1495 +129720 1850 1868 +129720 1876 1440 +129720 1735 1465 +129720 1669 1754 +129720 1513 1525 +129720 1549 1513 +129720 1645 1756 +129720 1870 1441 +129720 1572 1871 +129720 1549 1525 +129740 1543 1526 +129740 1551 1871 +129740 1587 1887 +129740 1590 1911 +129740 1595 1654 +129740 1603 1629 +129740 1603 1701 +129740 1657 1769 +129740 1670 1684 +129740 1802 1495 +129740 1850 1868 +129740 1868 1908 +129740 1876 1440 +129740 1877 1908 +129740 1892 1898 +129740 1514 1530 +129740 1552 1695 +129740 1591 1802 +129740 1626 1664 +129740 1735 1465 +129740 1669 1754 +129740 1513 1525 +129740 1549 1513 +129740 1645 1756 +129740 1870 1441 +129740 1572 1871 +129740 1549 1525 +129760 1551 1269 +129760 1552 1695 +129760 1591 1802 +129760 1591 1495 +129760 1626 1664 +129760 1629 1919 +129760 1649 1517 +129760 1692 1458 +129760 1711 1507 +129760 1711 1877 +129760 1735 1465 +129760 1752 1443 +129760 1792 1885 +129760 1819 1913 +129760 1873 1924 +129760 1883 1505 +129760 1448 1493 +129760 1579 1659 +129760 1591 1923 +129760 1591 1911 +129760 1669 1754 +129760 1848 1504 +129760 1513 1525 +129760 1549 1513 +129760 1645 1756 +129760 1870 1441 +129760 1670 1479 +129760 1572 1871 +129760 1626 1684 +129760 1549 1525 +129780 1579 1659 +129780 1591 1923 +129780 1591 1911 +129780 1616 1906 +129780 1617 1857 +129780 1634 1491 +129780 1660 1692 +129780 1669 1754 +129780 1698 1757 +129780 1701 1528 +129780 1701 1504 +129780 1701 1732 +129780 1802 1495 +129780 1848 1504 +129780 1877 1507 +129780 1911 1923 +129780 1427 1490 +129780 1570 1920 +129780 1513 1525 +129780 1549 1513 +129780 1645 1756 +129780 1870 1441 +129780 1539 1924 +129780 1670 1908 +129780 1670 1877 +129780 1670 1479 +129780 1877 1908 +129780 1877 1479 +129780 1908 1479 +129780 1572 1871 +129780 1626 1684 +129780 1549 1525 +129800 1550 1680 +129800 1551 1269 +129800 1568 1703 +129800 1570 1920 +129800 1592 1731 +129800 1652 1495 +129800 1671 1808 +129800 1685 1464 +129800 1706 1892 +129800 1805 1501 +129800 1850 1868 +129800 1513 1525 +129800 1549 1513 +129800 1551 1572 +129800 1919 1500 +129800 1563 1578 +129800 1645 1756 +129800 1870 1441 +129800 1500 1511 +129800 1539 1924 +129800 1670 1908 +129800 1670 1877 +129800 1670 1479 +129800 1877 1908 +129800 1877 1479 +129800 1908 1479 +129800 1657 1769 +129800 1572 1871 +129800 1626 1684 +129800 1549 1525 +129800 1735 1465 +129820 1549 1513 +129820 1550 1685 +129820 1551 1572 +129820 1556 1921 +129820 1591 1629 +129820 1591 1911 +129820 1616 1906 +129820 1629 1732 +129820 1629 1798 +129820 1683 1461 +129820 1685 1880 +129820 1717 1752 +129820 1816 1881 +129820 1919 1500 +129820 1563 1578 +129820 1645 1756 +129820 1802 1495 +129820 1819 1913 +129820 1870 1441 +129820 1500 1511 +129820 1539 1924 +129820 1587 1887 +129820 1670 1908 +129820 1670 1877 +129820 1670 1479 +129820 1783 1504 +129820 1877 1908 +129820 1877 1479 +129820 1908 1479 +129820 1550 1880 +129820 1657 1769 +129820 1572 1871 +129820 1626 1684 +129820 1549 1525 +129820 1735 1465 +129840 1563 1578 +129840 1569 1703 +129840 1601 1451 +129840 1614 1500 +129840 1634 1491 +129840 1645 1756 +129840 1667 1487 +129840 1699 1752 +129840 1706 1521 +129840 1752 1458 +129840 1802 1495 +129840 1819 1913 +129840 1850 1868 +129840 1870 1441 +129840 1887 1442 +129840 1898 1529 +129840 1500 1511 +129840 1539 1924 +129840 1587 1887 +129840 1670 1908 +129840 1670 1877 +129840 1670 1479 +129840 1783 1504 +129840 1877 1908 +129840 1877 1479 +129840 1908 1479 +129840 1919 1529 +129840 1485 1529 +129840 1550 1880 +129840 1657 1769 +129840 1572 1871 +129840 1626 1684 +129840 1569 1598 +129840 1794 1880 +129840 1549 1525 +129840 1550 1794 +129840 1735 1465 +129860 1539 1924 +129860 1556 1921 +129860 1587 1887 +129860 1598 1654 +129860 1599 1882 +129860 1622 1625 +129860 1626 1908 +129860 1670 1908 +129860 1670 1877 +129860 1670 1479 +129860 1749 1873 +129860 1783 1504 +129860 1829 1886 +129860 1848 1504 +129860 1875 1458 +129860 1877 1908 +129860 1877 1479 +129860 1883 1505 +129860 1908 1479 +129860 1919 1529 +129860 1485 1529 +129860 1550 1880 +129860 1552 1695 +129860 1657 1769 +129860 1673 1466 +129860 1513 1525 +129860 1572 1871 +129860 1626 1684 +129860 1569 1598 +129860 1794 1880 +129860 1816 1881 +129860 1549 1525 +129860 1550 1794 +129860 1735 1465 +129860 1598 1742 +129860 1711 1479 +129880 1550 1880 +129880 1551 1572 +129880 1552 1695 +129880 1593 1876 +129880 1614 1511 +129880 1630 1908 +129880 1657 1769 +129880 1673 1466 +129880 1752 1840 +129880 1752 1443 +129880 1840 1908 +129880 1570 1920 +129880 1601 1451 +129880 1601 1485 +129880 1645 1756 +129880 1513 1525 +129880 1572 1871 +129880 1626 1684 +129880 1870 1441 +129880 1451 1485 +129880 1569 1598 +129880 1794 1880 +129880 1816 1881 +129880 1549 1525 +129880 1550 1794 +129880 1735 1465 +129880 1598 1742 +129880 1711 1479 +129900 1570 1920 +129900 1601 1529 +129900 1601 1451 +129900 1601 1485 +129900 1617 1479 +129900 1645 1756 +129900 1667 1462 +129900 1706 1448 +129900 1819 1913 +129900 1911 1923 +129900 1921 1462 +129900 1485 1529 +129900 1513 1525 +129900 1572 1871 +129900 1594 1475 +129900 1599 1882 +129900 1626 1684 +129900 1670 1877 +129900 1752 1924 +129900 1825 1519 +129900 1870 1441 +129900 1451 1529 +129900 1451 1485 +129900 1701 1761 +129900 1569 1598 +129900 1794 1880 +129900 1816 1881 +129900 1549 1525 +129900 1550 1794 +129900 1735 1465 +129900 1598 1742 +129900 1711 1479 +129900 1877 1908 +129920 1539 1754 +129920 1572 1871 +129920 1587 1887 +129920 1594 1475 +129920 1599 1882 +129920 1622 1731 +129920 1626 1684 +129920 1664 1875 +129920 1667 1803 +129920 1670 1877 +129920 1717 1796 +129920 1752 1924 +129920 1771 1921 +129920 1783 1528 +129920 1825 1519 +129920 1870 1441 +129920 1451 1529 +129920 1451 1485 +129920 1500 1511 +129920 1545 1731 +129920 1574 1463 +129920 1575 1908 +129920 1701 1761 +129920 1868 1921 +129920 1556 1771 +129920 1569 1598 +129920 1669 1754 +129920 1794 1880 +129920 1816 1881 +129920 1549 1525 +129920 1550 1794 +129920 1735 1465 +129920 1598 1742 +129920 1711 1479 +129920 1877 1908 +129920 1670 1908 +129940 1545 1731 +129940 1556 1850 +129940 1556 1868 +129940 1574 1463 +129940 1575 1908 +129940 1575 1679 +129940 1657 1769 +129940 1660 1692 +129940 1679 1908 +129940 1680 1850 +129940 1701 1761 +129940 1850 1868 +129940 1868 1921 +129940 1876 1521 +129940 1556 1771 +129940 1569 1598 +129940 1669 1754 +129940 1794 1880 +129940 1816 1881 +129940 1829 1510 +129940 1829 1854 +129940 1854 1886 +129940 1485 1529 +129940 1549 1525 +129940 1886 1510 +129940 1550 1880 +129940 1550 1794 +129940 1735 1465 +129940 1829 1886 +129940 1598 1742 +129940 1711 1479 +129940 1877 1908 +129940 1670 1908 +129960 1556 1579 +129960 1556 1462 +129960 1556 1771 +129960 1569 1598 +129960 1570 1920 +129960 1579 1921 +129960 1599 1882 +129960 1669 1754 +129960 1700 1790 +129960 1794 1880 +129960 1816 1881 +129960 1829 1510 +129960 1829 1854 +129960 1854 1886 +129960 1485 1529 +129960 1549 1525 +129960 1579 1462 +129960 1819 1913 +129960 1886 1510 +129960 1918 1451 +129960 1921 1462 +129960 1550 1880 +129960 1550 1794 +129960 1735 1465 +129960 1829 1886 +129960 1904 1451 +129960 1598 1742 +129960 1870 1441 +129960 1670 1877 +129960 1711 1479 +129960 1877 1908 +129960 1670 1908 +129980 1549 1525 +129980 1549 1717 +129980 1551 1269 +129980 1570 1617 +129980 1575 1752 +129980 1579 1462 +129980 1617 1842 +129980 1673 1466 +129980 1717 1455 +129980 1819 1913 +129980 1886 1510 +129980 1918 1451 +129980 1921 1462 +129980 1550 1880 +129980 1550 1794 +129980 1721 1816 +129980 1735 1465 +129980 1829 1886 +129980 1904 1451 +129980 1598 1742 +129980 1870 1441 +129980 1670 1877 +129980 1711 1479 +129980 1657 1769 +129980 1877 1908 +129980 1670 1908 +130000 1550 1880 +130000 1550 1794 +130000 1551 1572 +130000 1556 1700 +130000 1556 1829 +130000 1579 1700 +130000 1593 1868 +130000 1706 1880 +130000 1718 1518 +130000 1721 1816 +130000 1731 1526 +130000 1735 1465 +130000 1752 1908 +130000 1783 1504 +130000 1783 1528 +130000 1803 1451 +130000 1825 1519 +130000 1829 1886 +130000 1850 1448 +130000 1857 1441 +130000 1904 1451 +130000 1570 1920 +130000 1582 1526 +130000 1598 1742 +130000 1735 1752 +130000 1829 1918 +130000 1870 1441 +130000 1550 1706 +130000 1670 1877 +130000 1711 1479 +130000 1657 1769 +130000 1877 1908 +130000 1670 1908 +130020 1554 1718 +130020 1569 1598 +130020 1570 1920 +130020 1582 1526 +130020 1598 1742 +130020 1599 1882 +130020 1635 1718 +130020 1684 1717 +130020 1700 1829 +130020 1735 1752 +130020 1796 1816 +130020 1816 1823 +130020 1829 1918 +130020 1841 1901 +130020 1870 1441 +130020 1465 1471 +130020 1550 1706 +130020 1673 1880 +130020 1700 1462 +130020 1848 1504 +130020 1886 1919 +130020 1670 1877 +130020 1921 1462 +130020 1479 1507 +130020 1545 1579 +130020 1711 1479 +130020 1669 1754 +130020 1718 1889 +130020 1657 1769 +130020 1877 1908 +130020 1670 1908 +130040 1550 1706 +130040 1574 1463 +130040 1593 1790 +130040 1598 1654 +130040 1664 1735 +130040 1673 1880 +130040 1689 1918 +130040 1700 1462 +130040 1708 1790 +130040 1715 1794 +130040 1829 1919 +130040 1848 1504 +130040 1857 1441 +130040 1886 1919 +130040 1485 1502 +130040 1545 1706 +130040 1545 1556 +130040 1670 1877 +130040 1711 1507 +130040 1921 1462 +130040 1479 1507 +130040 1545 1579 +130040 1579 1706 +130040 1441 1492 +130040 1711 1479 +130040 1669 1754 +130040 1829 1886 +130040 1718 1889 +130040 1657 1769 +130040 1877 1908 +130040 1670 1908 +130060 1545 1921 +130060 1545 1706 +130060 1545 1556 +130060 1556 1889 +130060 1670 1877 +130060 1673 1889 +130060 1689 1502 +130060 1708 1731 +130060 1711 1507 +130060 1718 1918 +130060 1721 1816 +130060 1816 1823 +130060 1836 1921 +130060 1854 1510 +130060 1898 1462 +130060 1921 1462 +130060 1479 1507 +130060 1504 1528 +130060 1545 1579 +130060 1556 1706 +130060 1579 1921 +130060 1579 1706 +130060 1441 1492 +130060 1541 1437 +130060 1711 1479 +130060 1669 1754 +130060 1706 1921 +130060 1829 1886 +130060 1718 1889 +130060 1657 1769 +130060 1877 1908 +130060 1670 1908 +130080 1545 1579 +130080 1556 1706 +130080 1579 1921 +130080 1579 1706 +130080 1582 1876 +130080 1684 1717 +130080 1700 1886 +130080 1707 1428 +130080 1717 1806 +130080 1783 1504 +130080 1880 1451 +130080 1880 1918 +130080 1886 1889 +130080 1441 1492 +130080 1517 1520 +130080 1537 1689 +130080 1541 1437 +130080 1711 1479 +130080 1803 1451 +130080 1803 1918 +130080 1829 1919 +130080 1918 1451 +130080 1538 1524 +130080 1669 1754 +130080 1700 1889 +130080 1700 1718 +130080 1802 1495 +130080 1706 1921 +130080 1829 1886 +130080 1718 1889 +130080 1657 1769 +130080 1877 1908 +130080 1670 1908 +130100 1537 1689 +130100 1537 1451 +130100 1541 1437 +130100 1542 1789 +130100 1550 1707 +130100 1556 1707 +130100 1556 1428 +130100 1670 1877 +130100 1689 1451 +130100 1689 1918 +130100 1707 1462 +130100 1711 1479 +130100 1717 1767 +130100 1740 1517 +130100 1749 1920 +130100 1803 1451 +130100 1803 1918 +130100 1829 1919 +130100 1857 1441 +130100 1918 1451 +130100 1921 1428 +130100 1538 1524 +130100 1626 1715 +130100 1669 1754 +130100 1700 1889 +130100 1700 1718 +130100 1707 1889 +130100 1718 1880 +130100 1802 1495 +130100 1545 1706 +130100 1545 1462 +130100 1848 1504 +130100 1689 1803 +130100 1706 1921 +130100 1684 1463 +130100 1829 1886 +130100 1718 1889 +130100 1549 1525 +130100 1657 1769 +130100 1877 1908 +130100 1670 1908 +130120 1537 1918 +130120 1538 1524 +130120 1555 1673 +130120 1574 1463 +130120 1593 1731 +130120 1599 1882 +130120 1626 1715 +130120 1626 1502 +130120 1635 1731 +130120 1669 1754 +130120 1673 1718 +130120 1700 1889 +130120 1700 1707 +130120 1700 1428 +130120 1700 1718 +130120 1706 1462 +130120 1707 1889 +130120 1707 1919 +130120 1717 1857 +130120 1718 1836 +130120 1718 1880 +130120 1728 1428 +130120 1749 1465 +130120 1802 1495 +130120 1836 1889 +130120 1836 1428 +130120 1884 1519 +130120 1898 1523 +130120 1545 1706 +130120 1545 1462 +130120 1574 1684 +130120 1579 1462 +130120 1678 1703 +130120 1700 1829 +130120 1707 1718 +130120 1718 1728 +130120 1848 1504 +130120 1545 1579 +130120 1579 1706 +130120 1689 1803 +130120 1706 1921 +130120 1707 1886 +130120 1718 1428 +130120 1555 1502 +130120 1579 1921 +130120 1684 1463 +130120 1829 1886 +130120 1718 1889 +130120 1549 1525 +130120 1657 1769 +130120 1877 1908 +130120 1670 1908 +130140 1537 1556 +130140 1537 1502 +130140 1545 1921 +130140 1545 1706 +130140 1545 1462 +130140 1549 1825 +130140 1572 1871 +130140 1574 1684 +130140 1579 1462 +130140 1609 1688 +130140 1613 1439 +130140 1626 1718 +130140 1660 1692 +130140 1673 1676 +130140 1678 1703 +130140 1678 1479 +130140 1678 1711 +130140 1700 1829 +130140 1707 1428 +130140 1707 1718 +130140 1718 1728 +130140 1728 1433 +130140 1731 1834 +130140 1825 1884 +130140 1825 1525 +130140 1825 1519 +130140 1829 1898 +130140 1848 1504 +130140 1479 1493 +130140 1545 1579 +130140 1579 1706 +130140 1689 1803 +130140 1706 1921 +130140 1707 1886 +130140 1711 1479 +130140 1718 1428 +130140 1555 1502 +130140 1579 1921 +130140 1803 1880 +130140 1886 1898 +130140 1684 1463 +130140 1803 1918 +130140 1829 1886 +130140 1718 1889 +130140 1549 1525 +130140 1670 1877 +130140 1657 1769 +130140 1877 1908 +130140 1670 1908 +130160 1545 1579 +130160 1579 1706 +130160 1582 1593 +130160 1689 1880 +130160 1689 1803 +130160 1706 1921 +130160 1707 1886 +130160 1711 1479 +130160 1718 1428 +130160 1796 1823 +130160 1836 1502 +130160 1886 1889 +130160 1886 1428 +130160 1889 1428 +130160 1555 1502 +130160 1579 1921 +130160 1796 1816 +130160 1803 1880 +130160 1884 1519 +130160 1886 1898 +130160 1921 1462 +130160 1684 1463 +130160 1803 1918 +130160 1689 1918 +130160 1816 1823 +130160 1829 1886 +130160 1718 1889 +130160 1549 1525 +130160 1670 1877 +130160 1657 1769 +130160 1877 1908 +130160 1670 1908 +130180 1550 1569 +130180 1555 1502 +130180 1556 1834 +130180 1570 1598 +130180 1572 1871 +130180 1574 1684 +130180 1579 1921 +130180 1796 1816 +130180 1803 1880 +130180 1829 1428 +130180 1884 1519 +130180 1886 1898 +130180 1921 1462 +130180 1554 1470 +130180 1660 1692 +130180 1669 1754 +130180 1684 1463 +130180 1803 1918 +130180 1689 1918 +130180 1645 1756 +130180 1718 1836 +130180 1816 1823 +130180 1836 1889 +130180 1829 1886 +130180 1718 1889 +130180 1549 1525 +130180 1670 1877 +130180 1657 1769 +130180 1877 1908 +130180 1670 1908 +130200 1543 1727 +130200 1545 1443 +130200 1551 1572 +130200 1554 1470 +130200 1556 1502 +130200 1579 1623 +130200 1599 1882 +130200 1660 1692 +130200 1669 1754 +130200 1684 1463 +130200 1702 1901 +130200 1707 1836 +130200 1707 1829 +130200 1707 1886 +130200 1718 1880 +130200 1792 1885 +130200 1803 1918 +130200 1880 1889 +130200 1689 1918 +130200 1819 1913 +130200 1582 1593 +130200 1645 1756 +130200 1718 1836 +130200 1816 1823 +130200 1834 1880 +130200 1836 1889 +130200 1462 1518 +130200 1816 1881 +130200 1829 1886 +130200 1538 1524 +130200 1718 1889 +130200 1549 1525 +130200 1670 1877 +130200 1657 1769 +130200 1877 1908 +130200 1670 1908 +130220 1550 1688 +130220 1568 1617 +130220 1569 1742 +130220 1579 1482 +130220 1623 1715 +130220 1689 1918 +130220 1703 1717 +130220 1752 1924 +130220 1819 1913 +130220 1574 1463 +130220 1579 1921 +130220 1579 1829 +130220 1582 1593 +130220 1645 1756 +130220 1718 1836 +130220 1816 1823 +130220 1829 1921 +130220 1834 1880 +130220 1836 1889 +130220 1462 1518 +130220 1816 1881 +130220 1829 1886 +130220 1538 1524 +130220 1718 1889 +130220 1549 1525 +130220 1670 1877 +130220 1579 1886 +130220 1657 1769 +130220 1877 1908 +130220 1670 1908 +130240 1549 1563 +130240 1550 1749 +130240 1555 1502 +130240 1563 1740 +130240 1574 1463 +130240 1579 1921 +130240 1579 1829 +130240 1582 1593 +130240 1645 1756 +130240 1684 1913 +130240 1688 1749 +130240 1718 1836 +130240 1735 1898 +130240 1816 1823 +130240 1829 1921 +130240 1834 1880 +130240 1836 1889 +130240 1836 1502 +130240 1918 1451 +130240 1462 1518 +130240 1556 1836 +130240 1816 1881 +130240 1829 1462 +130240 1829 1886 +130240 1921 1462 +130240 1538 1524 +130240 1718 1889 +130240 1886 1921 +130240 1549 1525 +130240 1579 1462 +130240 1623 1688 +130240 1670 1877 +130240 1796 1816 +130240 1579 1886 +130240 1657 1769 +130240 1877 1908 +130240 1886 1462 +130240 1570 1503 +130240 1670 1908 +130260 1556 1836 +130260 1572 1871 +130260 1599 1882 +130260 1688 1502 +130260 1707 1836 +130260 1707 1462 +130260 1731 1530 +130260 1749 1502 +130260 1816 1881 +130260 1829 1462 +130260 1829 1886 +130260 1834 1451 +130260 1921 1462 +130260 1473 1530 +130260 1538 1524 +130260 1623 1749 +130260 1717 1503 +130260 1718 1889 +130260 1825 1525 +130260 1886 1921 +130260 1549 1525 +130260 1579 1462 +130260 1623 1688 +130260 1670 1877 +130260 1796 1816 +130260 1579 1886 +130260 1657 1769 +130260 1877 1908 +130260 1886 1462 +130260 1549 1740 +130260 1570 1503 +130260 1670 1908 +130280 1538 1524 +130280 1579 1921 +130280 1623 1749 +130280 1643 1518 +130280 1643 1502 +130280 1688 1749 +130280 1688 1493 +130280 1717 1503 +130280 1718 1889 +130280 1718 1428 +130280 1718 1836 +130280 1749 1493 +130280 1823 1881 +130280 1825 1525 +130280 1886 1921 +130280 1889 1433 +130280 1493 1502 +130280 1549 1525 +130280 1579 1462 +130280 1582 1593 +130280 1623 1688 +130280 1623 1493 +130280 1670 1877 +130280 1816 1823 +130280 1796 1816 +130280 1579 1886 +130280 1657 1769 +130280 1688 1886 +130280 1834 1903 +130280 1877 1908 +130280 1884 1519 +130280 1886 1462 +130280 1549 1740 +130280 1570 1503 +130280 1670 1908 +130300 1549 1525 +130300 1554 1530 +130300 1555 1579 +130300 1556 1688 +130300 1563 1717 +130300 1568 1441 +130300 1574 1463 +130300 1579 1462 +130300 1582 1593 +130300 1623 1688 +130300 1623 1880 +130300 1623 1493 +130300 1670 1877 +130300 1740 1525 +130300 1816 1881 +130300 1816 1823 +130300 1876 1521 +130300 1880 1493 +130300 1884 1525 +130300 1556 1569 +130300 1572 1871 +130300 1689 1451 +130300 1796 1816 +130300 1579 1688 +130300 1579 1886 +130300 1657 1769 +130300 1688 1886 +130300 1688 1462 +130300 1834 1903 +130300 1877 1908 +130300 1884 1519 +130300 1886 1462 +130300 1549 1740 +130300 1570 1503 +130300 1670 1908 +130320 1538 1522 +130320 1556 1569 +130320 1556 1623 +130320 1569 1742 +130320 1572 1871 +130320 1617 1441 +130320 1623 1742 +130320 1689 1451 +130320 1706 1708 +130320 1740 1825 +130320 1796 1816 +130320 1841 1901 +130320 1579 1688 +130320 1579 1886 +130320 1657 1769 +130320 1688 1886 +130320 1688 1462 +130320 1834 1903 +130320 1877 1908 +130320 1884 1519 +130320 1886 1462 +130320 1549 1740 +130320 1570 1503 +130320 1670 1908 +130320 1718 1889 +130340 1579 1688 +130340 1579 1921 +130340 1579 1886 +130340 1587 1887 +130340 1599 1622 +130340 1657 1769 +130340 1670 1877 +130340 1676 1731 +130340 1688 1886 +130340 1688 1829 +130340 1688 1462 +130340 1718 1493 +130340 1819 1913 +130340 1834 1903 +130340 1877 1908 +130340 1884 1519 +130340 1886 1921 +130340 1886 1462 +130340 1889 1493 +130340 1579 1462 +130340 1582 1593 +130340 1688 1921 +130340 1689 1834 +130340 1735 1889 +130340 1749 1479 +130340 1829 1886 +130340 1921 1462 +130340 1549 1740 +130340 1570 1503 +130340 1884 1525 +130340 1670 1908 +130340 1718 1889 +130340 1549 1525 +130360 1556 1569 +130360 1579 1462 +130360 1579 1623 +130360 1582 1593 +130360 1594 1475 +130360 1623 1462 +130360 1625 1834 +130360 1688 1880 +130360 1688 1921 +130360 1689 1834 +130360 1706 1455 +130360 1735 1889 +130360 1735 1493 +130360 1749 1479 +130360 1825 1525 +130360 1829 1886 +130360 1841 1901 +130360 1921 1462 +130360 1549 1740 +130360 1570 1503 +130360 1721 1816 +130360 1836 1479 +130360 1924 1517 +130360 1623 1886 +130360 1884 1525 +130360 1670 1908 +130360 1538 1522 +130360 1718 1889 +130360 1549 1525 +130380 1549 1740 +130380 1554 1530 +130380 1568 1808 +130380 1570 1717 +130380 1570 1503 +130380 1657 1769 +130380 1721 1816 +130380 1735 1523 +130380 1740 1825 +130380 1749 1836 +130380 1794 1880 +130380 1563 1717 +130380 1670 1877 +130380 1677 1749 +130380 1836 1479 +130380 1877 1908 +130380 1924 1517 +130380 1556 1479 +130380 1623 1886 +130380 1689 1451 +130380 1884 1525 +130380 1670 1908 +130380 1538 1522 +130380 1718 1889 +130380 1549 1525 +130400 1563 1717 +130400 1569 1742 +130400 1572 1871 +130400 1599 1882 +130400 1670 1877 +130400 1677 1749 +130400 1704 1706 +130400 1775 1835 +130400 1834 1521 +130400 1836 1479 +130400 1877 1908 +130400 1924 1458 +130400 1587 1887 +130400 1642 1913 +130400 1924 1517 +130400 1556 1479 +130400 1575 1766 +130400 1623 1886 +130400 1689 1451 +130400 1884 1525 +130400 1670 1908 +130400 1538 1522 +130400 1718 1889 +130400 1549 1525 +130420 1538 1717 +130420 1549 1740 +130420 1587 1887 +130420 1599 1512 +130420 1635 1918 +130420 1642 1913 +130420 1642 1819 +130420 1731 1455 +130420 1749 1521 +130420 1794 1880 +130420 1836 1889 +130420 1924 1517 +130420 1455 1465 +130420 1556 1479 +130420 1575 1766 +130420 1579 1829 +130420 1623 1886 +130420 1689 1451 +130420 1718 1479 +130420 1921 1462 +130420 1493 1521 +130420 1819 1913 +130420 1884 1525 +130420 1898 1437 +130420 1657 1769 +130420 1670 1908 +130420 1556 1718 +130420 1538 1522 +130420 1718 1889 +130420 1549 1525 +130440 1550 1704 +130440 1556 1479 +130440 1572 1871 +130440 1574 1740 +130440 1575 1766 +130440 1579 1635 +130440 1579 1829 +130440 1623 1886 +130440 1670 1835 +130440 1689 1451 +130440 1718 1479 +130440 1735 1521 +130440 1735 1493 +130440 1767 1913 +130440 1792 1885 +130440 1825 1525 +130440 1825 1519 +130440 1835 1908 +130440 1836 1521 +130440 1889 1479 +130440 1921 1462 +130440 1493 1521 +130440 1617 1441 +130440 1642 1441 +130440 1819 1913 +130440 1884 1525 +130440 1898 1437 +130440 1617 1642 +130440 1657 1769 +130440 1670 1908 +130440 1884 1519 +130440 1556 1889 +130440 1556 1718 +130440 1538 1522 +130440 1718 1889 +130440 1549 1525 +130460 1545 1582 +130460 1551 1269 +130460 1574 1617 +130460 1574 1819 +130460 1617 1441 +130460 1635 1479 +130460 1642 1441 +130460 1670 1877 +130460 1677 1735 +130460 1717 1842 +130460 1819 1913 +130460 1884 1525 +130460 1898 1437 +130460 1451 1479 +130460 1617 1913 +130460 1617 1642 +130460 1642 1913 +130460 1657 1769 +130460 1670 1908 +130460 1825 1884 +130460 1884 1519 +130460 1556 1889 +130460 1556 1718 +130460 1556 1749 +130460 1538 1522 +130460 1718 1889 +130460 1549 1525 +130480 1550 1451 +130480 1574 1913 +130480 1617 1913 +130480 1617 1642 +130480 1630 1740 +130480 1642 1913 +130480 1749 1433 +130480 1749 1836 +130480 1792 1885 +130480 1835 1458 +130480 1549 1825 +130480 1657 1769 +130480 1670 1908 +130480 1718 1433 +130480 1825 1884 +130480 1825 1525 +130480 1556 1433 +130480 1884 1519 +130480 1889 1433 +130480 1556 1889 +130480 1556 1718 +130480 1574 1441 +130480 1829 1886 +130480 1550 1635 +130480 1556 1749 +130480 1538 1522 +130480 1551 1572 +130480 1718 1889 +130480 1549 1525 +130500 1545 1635 +130500 1545 1550 +130500 1549 1825 +130500 1635 1886 +130500 1657 1769 +130500 1670 1908 +130500 1718 1836 +130500 1718 1749 +130500 1718 1433 +130500 1742 1886 +130500 1819 1913 +130500 1825 1884 +130500 1825 1525 +130500 1884 1525 +130500 1898 1477 +130500 1556 1433 +130500 1825 1519 +130500 1884 1519 +130500 1889 1433 +130500 1556 1889 +130500 1556 1718 +130500 1574 1441 +130500 1829 1886 +130500 1550 1635 +130500 1556 1749 +130500 1538 1522 +130500 1575 1766 +130500 1717 1842 +130500 1551 1572 +130500 1718 1889 +130500 1549 1525 +130520 1545 1451 +130520 1545 1718 +130520 1556 1433 +130520 1572 1871 +130520 1579 1886 +130520 1582 1749 +130520 1717 1752 +130520 1749 1889 +130520 1825 1913 +130520 1825 1519 +130520 1884 1519 +130520 1889 1433 +130520 1556 1889 +130520 1556 1718 +130520 1574 1441 +130520 1718 1451 +130520 1829 1886 +130520 1889 1451 +130520 1550 1635 +130520 1556 1749 +130520 1787 1428 +130520 1538 1522 +130520 1575 1766 +130520 1717 1842 +130520 1749 1836 +130520 1551 1572 +130520 1545 1735 +130520 1556 1451 +130520 1718 1889 +130520 1549 1525 +130540 1545 1556 +130540 1545 1889 +130540 1556 1889 +130540 1556 1836 +130540 1556 1718 +130540 1574 1441 +130540 1579 1922 +130540 1579 1875 +130540 1710 1847 +130540 1711 1834 +130540 1718 1451 +130540 1718 1735 +130540 1735 1451 +130540 1749 1521 +130540 1819 1913 +130540 1829 1886 +130540 1836 1521 +130540 1877 1908 +130540 1889 1451 +130540 1519 1525 +130540 1545 1582 +130540 1550 1635 +130540 1556 1749 +130540 1556 1582 +130540 1582 1735 +130540 1670 1908 +130540 1670 1877 +130540 1787 1428 +130540 1538 1522 +130540 1575 1766 +130540 1717 1842 +130540 1749 1836 +130540 1545 1433 +130540 1551 1572 +130540 1556 1735 +130540 1545 1735 +130540 1556 1451 +130540 1718 1889 +130540 1549 1525 +130560 1545 1836 +130560 1545 1582 +130560 1545 1749 +130560 1550 1635 +130560 1550 1807 +130560 1556 1749 +130560 1556 1582 +130560 1572 1871 +130560 1579 1886 +130560 1582 1433 +130560 1582 1885 +130560 1582 1735 +130560 1625 1635 +130560 1635 1875 +130560 1670 1908 +130560 1670 1877 +130560 1787 1428 +130560 1825 1525 +130560 1545 1430 +130560 1538 1522 +130560 1575 1766 +130560 1717 1842 +130560 1749 1836 +130560 1545 1433 +130560 1551 1572 +130560 1556 1735 +130560 1735 1433 +130560 1545 1735 +130560 1556 1451 +130560 1549 1519 +130560 1718 1889 +130560 1549 1525 +130560 1884 1519 +130580 1545 1430 +130580 1656 1835 +130580 1806 1458 +130580 1538 1522 +130580 1575 1766 +130580 1635 1807 +130580 1717 1842 +130580 1749 1836 +130580 1545 1433 +130580 1545 1556 +130580 1550 1775 +130580 1551 1572 +130580 1556 1735 +130580 1735 1433 +130580 1545 1735 +130580 1556 1451 +130580 1549 1519 +130580 1718 1889 +130580 1519 1525 +130580 1549 1525 +130580 1884 1519 +130600 1538 1522 +130600 1574 1656 +130600 1575 1766 +130600 1582 1713 +130600 1635 1807 +130600 1717 1842 +130600 1735 1451 +130600 1749 1836 +130600 1767 1839 +130600 1839 1444 +130600 1545 1433 +130600 1545 1556 +130600 1549 1825 +130600 1550 1775 +130600 1551 1572 +130600 1556 1735 +130600 1735 1433 +130600 1796 1816 +130600 1816 1823 +130600 1545 1735 +130600 1556 1451 +130600 1721 1816 +130600 1549 1519 +130600 1718 1889 +130600 1519 1525 +130600 1549 1525 +130600 1884 1519 +130620 1545 1433 +130620 1545 1556 +130620 1545 1430 +130620 1549 1825 +130620 1550 1775 +130620 1551 1572 +130620 1556 1735 +130620 1556 1749 +130620 1556 1433 +130620 1574 1441 +130620 1613 1790 +130620 1635 1889 +130620 1656 1441 +130620 1671 1882 +130620 1707 1742 +130620 1735 1433 +130620 1735 1836 +130620 1742 1443 +130620 1749 1451 +130620 1796 1816 +130620 1816 1823 +130620 1458 1517 +130620 1545 1735 +130620 1550 1635 +130620 1556 1521 +130620 1556 1451 +130620 1572 1871 +130620 1721 1816 +130620 1545 1582 +130620 1549 1519 +130620 1718 1889 +130620 1617 1452 +130620 1519 1525 +130620 1549 1525 +130620 1884 1519 +130640 1545 1749 +130640 1545 1735 +130640 1550 1635 +130640 1556 1521 +130640 1556 1451 +130640 1556 1582 +130640 1556 1718 +130640 1569 1908 +130640 1572 1871 +130640 1577 1521 +130640 1582 1451 +130640 1635 1718 +130640 1635 1775 +130640 1645 1889 +130640 1645 1908 +130640 1670 1471 +130640 1707 1908 +130640 1718 1521 +130640 1721 1816 +130640 1735 1521 +130640 1749 1482 +130640 1783 1528 +130640 1825 1884 +130640 1825 1519 +130640 1829 1886 +130640 1913 1458 +130640 1924 1458 +130640 1545 1521 +130640 1545 1582 +130640 1549 1519 +130640 1556 1908 +130640 1657 1769 +130640 1579 1886 +130640 1718 1889 +130640 1617 1452 +130640 1519 1525 +130640 1549 1525 +130640 1884 1519 +130660 1538 1522 +130660 1545 1521 +130660 1545 1582 +130660 1549 1519 +130660 1552 1759 +130660 1556 1908 +130660 1579 1829 +130660 1617 1458 +130660 1623 1707 +130660 1657 1769 +130660 1678 1842 +130660 1718 1908 +130660 1819 1913 +130660 1883 1505 +130660 1884 1525 +130660 1889 1908 +130660 1579 1886 +130660 1718 1889 +130660 1617 1452 +130660 1847 1479 +130660 1519 1525 +130660 1549 1525 +130660 1884 1519 +130680 1539 1880 +130680 1551 1572 +130680 1552 1677 +130680 1556 1749 +130680 1579 1886 +130680 1717 1819 +130680 1718 1889 +130680 1924 1478 +130680 1538 1524 +130680 1617 1452 +130680 1648 1885 +130680 1847 1479 +130680 1519 1525 +130680 1549 1525 +130680 1884 1519 +130700 1538 1524 +130700 1568 1524 +130700 1582 1887 +130700 1593 1694 +130700 1626 1673 +130700 1634 1734 +130700 1670 1908 +130700 1684 1441 +130700 1884 1525 +130700 1617 1452 +130700 1648 1885 +130700 1847 1479 +130700 1519 1525 +130700 1549 1525 +130700 1884 1519 +130700 1657 1769 +130720 1556 1623 +130720 1678 1517 +130720 1884 1525 +130720 1617 1452 +130720 1648 1885 +130720 1847 1479 +130720 1593 1428 +130720 1921 1462 +130720 1519 1525 +130720 1549 1525 +130720 1884 1519 +130720 1657 1769 +130740 1575 1679 +130740 1593 1787 +130740 1617 1452 +130740 1648 1885 +130740 1670 1908 +130740 1787 1428 +130740 1819 1913 +130740 1847 1479 +130740 1918 1437 +130740 1485 1529 +130740 1538 1825 +130740 1593 1428 +130740 1857 1873 +130740 1883 1505 +130740 1921 1462 +130740 1519 1525 +130740 1549 1525 +130740 1718 1889 +130740 1771 1920 +130740 1884 1519 +130740 1657 1769 +130760 1538 1825 +130760 1538 1522 +130760 1538 1630 +130760 1752 1913 +130760 1840 1520 +130760 1441 1452 +130760 1593 1428 +130760 1857 1873 +130760 1883 1505 +130760 1921 1462 +130760 1519 1525 +130760 1549 1525 +130760 1718 1889 +130760 1771 1920 +130760 1884 1519 +130760 1657 1769 +130780 1549 1825 +130780 1575 1679 +130780 1580 1664 +130780 1593 1428 +130780 1634 1734 +130780 1670 1908 +130780 1857 1873 +130780 1883 1505 +130780 1921 1462 +130780 1519 1525 +130780 1549 1525 +130780 1718 1889 +130780 1538 1524 +130780 1771 1920 +130780 1617 1857 +130780 1884 1519 +130780 1657 1769 +130800 1549 1525 +130800 1718 1889 +130800 1538 1524 +130800 1580 1628 +130800 1694 1752 +130800 1771 1920 +130800 1617 1857 +130800 1884 1519 +130800 1551 1572 +130800 1657 1769 +130820 1538 1524 +130820 1570 1582 +130820 1572 1871 +130820 1580 1628 +130820 1694 1752 +130820 1582 1437 +130820 1771 1920 +130820 1617 1857 +130820 1884 1519 +130820 1551 1572 +130820 1657 1769 +130840 1538 1522 +130840 1582 1437 +130840 1628 1463 +130840 1648 1893 +130840 1771 1920 +130840 1841 1901 +130840 1617 1857 +130840 1884 1519 +130840 1551 1572 +130840 1657 1769 +130860 1551 1269 +130860 1617 1857 +130860 1884 1519 +130860 1551 1572 +130860 1657 1769 +130880 1538 1522 +130880 1538 1524 +130880 1634 1491 +130880 1656 1840 +130880 1884 1519 +130880 1522 1524 +130880 1552 1677 +130880 1551 1572 +130880 1628 1463 +130880 1657 1769 +130900 1552 1677 +130900 1551 1572 +130900 1628 1463 +130900 1657 1769 +130920 1538 1522 +130920 1551 1572 +130920 1603 1791 +130920 1689 1858 +130920 1628 1463 +130920 1884 1519 +130920 1538 1524 +130920 1657 1769 +130940 1628 1463 +130940 1884 1519 +130940 1538 1524 +130940 1752 1766 +130940 1847 1479 +130940 1574 1684 +130940 1657 1769 +130960 1538 1524 +130960 1551 1572 +130960 1580 1752 +130960 1660 1692 +130960 1752 1766 +130960 1802 1495 +130960 1847 1479 +130960 1574 1684 +130960 1657 1769 +130960 1617 1857 +130980 1574 1684 +130980 1603 1689 +130980 1657 1769 +130980 1538 1522 +130980 1617 1857 +131000 1537 1626 +131000 1598 1754 +131000 1847 1479 +131000 1538 1522 +131000 1551 1572 +131000 1660 1692 +131000 1617 1857 +131000 1617 1507 +131000 1538 1524 +131020 1538 1522 +131020 1551 1572 +131020 1551 1871 +131020 1552 1582 +131020 1582 1490 +131020 1591 1495 +131020 1592 1752 +131020 1592 1630 +131020 1660 1692 +131020 1694 1441 +131020 1694 1786 +131020 1752 1766 +131020 1617 1857 +131020 1684 1840 +131020 1617 1507 +131020 1657 1769 +131020 1802 1495 +131020 1538 1524 +131040 1549 1786 +131040 1559 1765 +131040 1563 1678 +131040 1563 1694 +131040 1563 1574 +131040 1572 1604 +131040 1587 1887 +131040 1590 1629 +131040 1616 1474 +131040 1617 1857 +131040 1648 1885 +131040 1684 1840 +131040 1713 1871 +131040 1732 1468 +131040 1732 1855 +131040 1743 1808 +131040 1783 1528 +131040 1792 1798 +131040 1847 1479 +131040 1855 1491 +131040 1497 1511 +131040 1616 1906 +131040 1617 1507 +131040 1629 1911 +131040 1657 1769 +131040 1802 1493 +131040 1802 1495 +131040 1582 1493 +131040 1614 1713 +131040 1857 1507 +131040 1500 1511 +131040 1538 1524 +131040 1572 1871 +131060 1564 1761 +131060 1572 1614 +131060 1582 1495 +131060 1590 1596 +131060 1596 1616 +131060 1596 1906 +131060 1596 1914 +131060 1604 1713 +131060 1614 1871 +131060 1616 1906 +131060 1617 1507 +131060 1629 1911 +131060 1652 1761 +131060 1657 1769 +131060 1695 1761 +131060 1701 1761 +131060 1761 1802 +131060 1761 1495 +131060 1802 1493 +131060 1802 1495 +131060 1904 1914 +131060 1563 1522 +131060 1582 1493 +131060 1614 1713 +131060 1677 1701 +131060 1769 1887 +131060 1783 1461 +131060 1857 1507 +131060 1427 1490 +131060 1500 1511 +131060 1538 1524 +131060 1563 1524 +131060 1572 1871 +131060 1660 1692 +131060 1734 1491 +131060 1538 1563 +131080 1551 1652 +131080 1551 1495 +131080 1563 1522 +131080 1582 1802 +131080 1582 1493 +131080 1591 1648 +131080 1614 1713 +131080 1652 1495 +131080 1657 1887 +131080 1677 1701 +131080 1696 1923 +131080 1752 1766 +131080 1769 1887 +131080 1269 1495 +131080 1783 1461 +131080 1802 1862 +131080 1857 1507 +131080 1427 1490 +131080 1500 1511 +131080 1538 1524 +131080 1551 1269 +131080 1563 1524 +131080 1743 1808 +131080 1572 1871 +131080 1660 1692 +131080 1734 1491 +131080 1617 1857 +131080 1538 1563 +131100 1538 1524 +131100 1551 1269 +131100 1563 1524 +131100 1572 1604 +131100 1629 1911 +131100 1634 1734 +131100 1657 1769 +131100 1701 1848 +131100 1713 1848 +131100 1713 1871 +131100 1743 1808 +131100 1792 1885 +131100 1842 1857 +131100 1848 1871 +131100 1461 1528 +131100 1572 1871 +131100 1660 1692 +131100 1734 1491 +131100 1924 1478 +131100 1617 1857 +131100 1538 1563 +131100 1617 1842 +131120 1549 1825 +131120 1549 1563 +131120 1572 1871 +131120 1634 1491 +131120 1660 1692 +131120 1734 1491 +131120 1734 1855 +131120 1752 1766 +131120 1783 1461 +131120 1840 1441 +131120 1924 1478 +131120 1500 1511 +131120 1598 1740 +131120 1617 1857 +131120 1538 1825 +131120 1825 1524 +131120 1593 1521 +131120 1538 1563 +131120 1563 1825 +131120 1617 1842 +131140 1538 1524 +131140 1564 1923 +131140 1598 1740 +131140 1616 1906 +131140 1617 1857 +131140 1634 1734 +131140 1702 1841 +131140 1617 1441 +131140 1538 1825 +131140 1825 1524 +131140 1593 1521 +131140 1857 1441 +131140 1538 1563 +131140 1563 1825 +131140 1743 1808 +131140 1825 1522 +131140 1563 1524 +131140 1617 1842 +131160 1603 1689 +131160 1617 1441 +131160 1734 1491 +131160 1538 1825 +131160 1825 1524 +131160 1572 1871 +131160 1593 1521 +131160 1657 1769 +131160 1857 1441 +131160 1857 1507 +131160 1538 1563 +131160 1563 1825 +131160 1743 1808 +131160 1825 1522 +131160 1563 1524 +131160 1684 1840 +131160 1617 1842 +131180 1538 1825 +131180 1538 1524 +131180 1598 1664 +131180 1599 1882 +131180 1670 1908 +131180 1802 1495 +131180 1825 1524 +131180 1572 1871 +131180 1593 1521 +131180 1657 1769 +131180 1857 1441 +131180 1857 1507 +131180 1924 1478 +131180 1538 1563 +131180 1563 1825 +131180 1743 1808 +131180 1825 1522 +131180 1563 1524 +131180 1684 1840 +131180 1617 1842 +131200 1572 1871 +131200 1593 1521 +131200 1657 1769 +131200 1677 1701 +131200 1734 1491 +131200 1848 1427 +131200 1857 1441 +131200 1857 1507 +131200 1924 1478 +131200 1538 1563 +131200 1563 1825 +131200 1743 1808 +131200 1825 1522 +131200 1563 1524 +131200 1684 1840 +131200 1582 1593 +131200 1617 1842 +131200 1441 1507 +131220 1538 1563 +131220 1563 1825 +131220 1617 1857 +131220 1743 1808 +131220 1802 1495 +131220 1825 1522 +131220 1563 1524 +131220 1684 1840 +131220 1582 1593 +131220 1617 1842 +131220 1441 1507 +131240 1563 1524 +131240 1670 1908 +131240 1678 1766 +131240 1684 1840 +131240 1734 1491 +131240 1752 1766 +131240 1831 1491 +131240 1924 1478 +131240 1582 1593 +131240 1617 1842 +131240 1678 1752 +131240 1538 1524 +131240 1441 1507 +131260 1563 1786 +131260 1582 1593 +131260 1592 1786 +131260 1617 1857 +131260 1617 1842 +131260 1842 1857 +131260 1857 1441 +131260 1500 1511 +131260 1678 1752 +131260 1825 1524 +131260 1538 1825 +131260 1538 1524 +131260 1441 1507 +131280 1924 1478 +131280 1572 1871 +131280 1678 1752 +131280 1563 1592 +131280 1825 1524 +131280 1538 1825 +131280 1538 1524 +131280 1441 1507 +131300 1678 1752 +131300 1563 1592 +131300 1582 1593 +131300 1441 1617 +131300 1840 1857 +131300 1825 1524 +131300 1538 1825 +131300 1538 1524 +131300 1441 1507 +131300 1842 1617 +131320 1840 1857 +131320 1463 1754 +131320 1825 1524 +131320 1538 1825 +131320 1538 1524 +131320 1441 1507 +131320 1842 1617 +131340 1549 1525 +131340 1554 1530 +131340 1582 1593 +131340 1752 1766 +131340 1441 1617 +131340 1825 1524 +131340 1538 1825 +131340 1538 1524 +131340 1441 1507 +131340 1842 1617 +131360 1924 1478 +131360 1441 1617 +131360 1825 1524 +131360 1538 1825 +131360 1538 1524 +131360 1441 1507 +131360 1842 1617 +131380 1689 1603 +131380 1752 1766 +131380 1538 1825 +131380 1538 1524 +131380 1441 1507 +131380 1842 1617 +131400 1538 1825 +131400 1461 1783 +131400 1825 1524 +131400 1538 1524 +131400 1463 1787 +131400 1441 1507 +131400 1842 1617 +131420 1538 1524 +131420 1678 1684 +131420 1884 1825 +131420 1582 1521 +131420 1463 1787 +131420 1441 1617 +131420 1593 1521 +131420 1582 1593 +131420 1441 1507 +131420 1842 1617 +131440 1582 1521 +131440 1478 1524 +131440 1463 1787 +131440 1441 1617 +131440 1593 1521 +131440 1582 1593 +131440 1441 1507 +131440 1842 1617 +131460 1549 1825 +131460 1689 1603 +131460 1463 1787 +131460 1754 1617 +131460 1825 1522 +131460 1825 1519 +131460 1441 1617 +131460 1593 1521 +131460 1582 1593 +131460 1441 1507 +131460 1842 1617 +131480 1538 1924 +131480 1924 1478 +131480 1441 1617 +131480 1441 1842 +131480 1669 1754 +131480 1593 1521 +131480 1582 1593 +131480 1441 1507 +131480 1842 1617 +131500 1669 1754 +131500 1731 1752 +131500 1570 1752 +131500 1593 1521 +131500 1582 1593 +131500 1441 1507 +131500 1842 1617 +131520 1563 1699 +131520 1825 1884 +131520 1884 1580 +131520 1580 1628 +131520 1603 1689 +131520 1582 1593 +131520 1441 1507 +131520 1842 1617 +131540 1669 1754 +131540 1603 1689 +131540 1582 1593 +131540 1808 1743 +131540 1441 1507 +131540 1842 1617 +131560 1582 1593 +131560 1808 1743 +131560 1441 1507 +131560 1842 1617 +131580 1599 1786 +131580 1501 1680 +131580 1593 1521 +131580 1808 1743 +131580 1441 1507 +131580 1842 1617 +131600 1678 1463 +131600 1684 1825 +131600 1593 1521 +131600 1808 1743 +131600 1437 1628 +131600 1441 1507 +131600 1842 1617 +131620 1808 1743 +131620 1437 1628 +131620 1441 1507 +131620 1842 1617 +131640 1437 1628 +131640 1582 1603 +131640 1437 1463 +131640 1463 1628 +131640 1441 1507 +131640 1842 1617 +131660 1699 1592 +131660 1582 1603 +131660 1825 1884 +131660 1580 1463 +131660 1437 1463 +131660 1463 1628 +131660 1441 1507 +131660 1842 1617 +131680 1593 1521 +131680 1580 1463 +131680 1437 1463 +131680 1463 1628 +131680 1441 1507 +131680 1842 1617 +131700 1580 1463 +131700 1437 1463 +131700 1463 1628 +131700 1441 1507 +131700 1842 1617 +131720 1669 1754 +131720 1437 1463 +131720 1808 1743 +131720 1463 1628 +131720 1441 1507 +131720 1842 1617 +131740 1808 1743 +131740 1458 1530 +131740 1463 1628 +131740 1689 1603 +131740 1441 1507 +131740 1842 1617 +131760 1580 1463 +131760 1689 1603 +131760 1441 1507 +131760 1669 1754 +131760 1842 1617 +131780 1689 1603 +131780 1563 1694 +131780 1441 1507 +131780 1669 1754 +131780 1842 1617 +131800 1808 1743 +131800 1563 1694 +131800 1441 1507 +131800 1669 1754 +131800 1593 1787 +131800 1842 1617 +131820 1549 1825 +131820 1437 1628 +131820 1441 1507 +131820 1669 1754 +131820 1593 1787 +131820 1842 1617 +131840 1678 1679 +131840 1594 1475 +131840 1825 1519 +131840 1563 1592 +131840 1669 1754 +131840 1593 1787 +131840 1463 1628 +131840 1842 1617 +131860 1563 1592 +131860 1884 1531 +131860 1669 1754 +131860 1835 1658 +131860 1840 1754 +131860 1593 1787 +131860 1463 1628 +131860 1669 1840 +131860 1842 1617 +131880 1669 1754 +131880 1563 1694 +131880 1835 1658 +131880 1580 1628 +131880 1840 1754 +131880 1593 1787 +131880 1580 1463 +131880 1463 1628 +131880 1669 1840 +131880 1842 1617 +131900 1593 1787 +131900 1580 1463 +131900 1463 1628 +131900 1669 1840 +131900 1842 1617 +131920 1593 1521 +131920 1580 1463 +131920 1463 1628 +131920 1669 1840 +131920 1884 1519 +131920 1842 1617 +131940 1689 1603 +131940 1580 1463 +131940 1463 1628 +131940 1669 1840 +131940 1840 1754 +131940 1825 1884 +131940 1884 1519 +131940 1563 1592 +131940 1842 1617 +131960 1669 1840 +131960 1669 1754 +131960 1678 1593 +131960 1840 1754 +131960 1593 1521 +131960 1825 1884 +131960 1684 1507 +131960 1884 1519 +131960 1825 1519 +131960 1563 1592 +131960 1842 1617 +131980 1684 1507 +131980 1884 1519 +131980 1580 1463 +131980 1463 1825 +131980 1825 1519 +131980 1563 1592 +131980 1463 1628 +131980 1842 1617 +132000 1563 1592 +132000 1825 1884 +132000 1840 1521 +132000 1593 1521 +132000 1463 1628 +132000 1842 1617 +132020 1580 1593 +132020 1463 1521 +132020 1840 1754 +132020 1463 1593 +132020 1463 1628 +132020 1593 1628 +132020 1842 1617 +132040 1884 1519 +132040 1840 1754 +132040 1882 1512 +132040 1592 1563 +132040 1463 1593 +132040 1463 1628 +132040 1593 1628 +132040 1842 1617 +132060 1549 1519 +132060 1882 1512 +132060 1592 1563 +132060 1463 1593 +132060 1463 1628 +132060 1593 1628 +132060 1842 1617 +132080 1628 1521 +132080 1592 1563 +132080 1463 1593 +132080 1463 1628 +132080 1593 1628 +132080 1825 1519 +132080 1842 1617 +132100 1563 1617 +132100 1580 1463 +132100 1592 1563 +132100 1840 1754 +132100 1463 1593 +132100 1463 1628 +132100 1593 1628 +132100 1825 1519 +132100 1842 1617 +132120 1592 1563 +132120 1840 1754 +132120 1463 1593 +132120 1463 1628 +132120 1593 1628 +132120 1825 1519 +132120 1842 1617 +132140 1840 1754 +132140 1463 1593 +132140 1463 1628 +132140 1669 1754 +132140 1593 1628 +132140 1825 1519 +132140 1842 1617 +132160 1563 1592 +132160 1840 1754 +132160 1463 1593 +132160 1463 1628 +132160 1669 1754 +132160 1593 1628 +132160 1825 1519 +132160 1842 1617 +132180 1669 1754 +132180 1840 1857 +132180 1840 1463 +132180 1463 1754 +132180 1857 1463 +132180 1593 1628 +132180 1825 1519 +132180 1842 1617 +132200 1669 1463 +132200 1840 1593 +132200 1857 1463 +132200 1463 1507 +132200 1882 1512 +132200 1563 1592 +132200 1593 1628 +132200 1825 1519 +132200 1692 1660 +132200 1842 1617 +132220 1669 1754 +132220 1563 1592 +132220 1593 1628 +132220 1825 1519 +132220 1692 1660 +132220 1684 1857 +132220 1842 1617 +132240 1549 1525 +132240 1512 1786 +132240 1692 1660 +132240 1684 1857 +132240 1842 1617 +132260 1519 1825 +132260 1463 1628 +132260 1593 1628 +132260 1512 1882 +132260 1692 1660 +132260 1580 1593 +132260 1684 1857 +132260 1842 1617 +132280 1692 1660 +132280 1580 1593 +132280 1684 1857 +132280 1669 1754 +132280 1842 1617 +132300 1549 1600 +132300 1549 1519 +132300 1692 1660 +132300 1825 1600 +132300 1580 1593 +132300 1600 1525 +132300 1684 1857 +132300 1669 1754 +132300 1842 1617 +132320 1684 1857 +132320 1463 1593 +132320 1669 1754 +132320 1842 1617 +132340 1669 1754 +132340 1549 1519 +132340 1692 1660 +132340 1842 1617 +132360 1441 1857 +132360 1441 1524 +132360 1549 1519 +132360 1692 1660 +132360 1842 1617 +132380 1549 1519 +132380 1600 1825 +132380 1549 1600 +132380 1692 1660 +132380 1842 1617 +132400 1600 1825 +132400 1549 1600 +132400 1441 1857 +132400 1692 1660 +132400 1842 1617 +132400 1840 1507 +132420 1549 1600 +132420 1441 1857 +132420 1692 1660 +132420 1825 1531 +132420 1463 1521 +132420 1842 1617 +132420 1840 1507 +132440 1549 1531 +132440 1531 1600 +132440 1463 1521 +132440 1684 1857 +132440 1549 1519 +132440 1842 1617 +132440 1840 1507 +132460 1684 1857 +132460 1549 1519 +132460 1842 1617 +132460 1840 1507 +132480 1692 1531 +132480 1692 1660 +132480 1882 1512 +132480 1549 1519 +132480 1842 1617 +132480 1840 1507 +132500 1924 1600 +132500 1549 1519 +132500 1463 1521 +132500 1840 1522 +132500 1842 1617 +132500 1840 1507 +132520 1684 1857 +132520 1507 1522 +132520 1840 1522 +132520 1842 1617 +132520 1840 1507 +132540 1669 1754 +132540 1479 1847 +132540 1463 1521 +132540 1507 1522 +132540 1549 1519 +132540 1840 1522 +132540 1754 1524 +132540 1842 1617 +132540 1840 1507 +132560 1531 1825 +132560 1463 1787 +132560 1507 1522 +132560 1549 1519 +132560 1840 1522 +132560 1754 1524 +132560 1842 1617 +132560 1840 1507 +132580 1531 1825 +132580 1463 1787 +132580 1599 1512 +132580 1507 1522 +132580 1549 1519 +132580 1840 1522 +132580 1754 1524 +132580 1842 1617 +132580 1840 1507 +132600 1549 1519 +132600 1840 1522 +132600 1754 1524 +132600 1842 1617 +132600 1840 1507 +132620 1507 1522 +132620 1842 1617 +132620 1787 1463 +132620 1840 1507 +132640 1669 1754 +132640 1842 1617 +132640 1787 1463 +132640 1549 1519 +132640 1549 1600 +132640 1840 1507 +132660 1787 1463 +132660 1463 1599 +132660 1549 1825 +132660 1549 1519 +132660 1600 1884 +132660 1600 1519 +132660 1549 1600 +132660 1840 1507 +132680 1840 1522 +132680 1463 1599 +132680 1787 1521 +132680 1507 1522 +132680 1549 1825 +132680 1549 1519 +132680 1825 1600 +132680 1825 1884 +132680 1842 1617 +132680 1600 1884 +132680 1600 1519 +132680 1549 1600 +132680 1840 1507 +132700 1669 1754 +132700 1549 1825 +132700 1549 1519 +132700 1689 1603 +132700 1825 1600 +132700 1825 1884 +132700 1842 1617 +132700 1600 1884 +132700 1600 1519 +132700 1754 1524 +132700 1549 1600 +132700 1840 1507 +132720 1549 1600 +132720 1840 1522 +132720 1463 1786 +132720 1840 1507 +132720 1884 1519 +132720 1531 1512 +132740 1531 1463 +132740 1463 1786 +132740 1669 1754 +132740 1531 1599 +132740 1840 1507 +132740 1754 1524 +132740 1884 1519 +132740 1531 1512 +132760 1669 1754 +132760 1531 1599 +132760 1840 1507 +132760 1754 1524 +132760 1884 1519 +132760 1507 1522 +132760 1842 1617 +132760 1531 1512 +132780 1441 1694 +132780 1684 1740 +132780 1694 1507 +132780 1842 1617 +132780 1531 1512 +132800 1669 1754 +132800 1549 1519 +132800 1531 1512 +132800 1857 1617 +132820 1694 1857 +132820 1842 1617 +132840 1924 1478 +132840 1684 1694 +132840 1842 1617 +132840 1512 1531 +132840 1857 1617 +132840 1425 1557 +132860 1563 1592 +132860 1857 1617 +132860 1884 1519 +132860 1425 1774 +132860 1425 1557 +132880 1669 1754 +132880 1549 1600 +132880 1600 1519 +132880 1884 1519 +132880 1425 1774 +132880 1425 1557 +132900 1549 1525 +132900 1689 1530 +132900 1600 1884 +132900 1463 1825 +132900 1924 1478 +132900 1857 1617 +132900 1425 1774 +132900 1425 1557 +132920 1924 1478 +132920 1554 1689 +132920 1563 1592 +132920 1699 1507 +132920 1884 1519 +132920 1825 1519 +132920 1857 1617 +132920 1425 1774 +132920 1425 1557 +132940 1678 1503 +132940 1825 1519 +132940 1884 1600 +132940 1857 1617 +132940 1425 1774 +132940 1825 1600 +132940 1557 1658 +132940 1658 1425 +132940 1425 1557 +132960 1600 1519 +132960 1478 1524 +132960 1825 1884 +132960 1825 1519 +132960 1884 1600 +132960 1857 1617 +132960 1884 1519 +132960 1425 1774 +132960 1825 1600 +132960 1557 1658 +132960 1658 1425 +132960 1425 1557 +132980 1924 1524 +132980 1825 1884 +132980 1825 1519 +132980 1884 1600 +132980 1679 1575 +132980 1857 1617 +132980 1884 1519 +132980 1425 1774 +132980 1825 1600 +132980 1557 1658 +132980 1658 1425 +132980 1425 1557 +133000 1884 1600 +133000 1679 1575 +133000 1857 1617 +133000 1531 1512 +133000 1884 1519 +133000 1425 1774 +133000 1825 1600 +133000 1557 1658 +133000 1658 1425 +133000 1425 1557 +133020 1549 1825 +133020 1531 1512 +133020 1600 1519 +133020 1884 1519 +133020 1825 1525 +133020 1425 1774 +133020 1825 1600 +133020 1557 1658 +133020 1658 1425 +133020 1658 1903 +133020 1658 1703 +133020 1425 1703 +133020 1557 1703 +133020 1703 1900 +133020 1425 1557 +133020 1425 1903 +133020 1557 1903 +133040 1425 1774 +133040 1519 1825 +133040 1703 1774 +133040 1825 1600 +133040 1557 1658 +133040 1658 1425 +133040 1658 1903 +133040 1658 1900 +133040 1658 1703 +133040 1425 1703 +133040 1557 1703 +133040 1557 1900 +133040 1703 1900 +133040 1703 1903 +133040 1900 1903 +133040 1425 1900 +133040 1425 1557 +133040 1425 1903 +133040 1557 1903 +133060 1549 1825 +133060 1884 1825 +133060 1857 1617 +133060 1603 1791 +133060 1825 1525 +133060 1825 1600 +133060 1557 1658 +133060 1658 1425 +133060 1658 1903 +133060 1658 1900 +133060 1658 1703 +133060 1425 1703 +133060 1557 1703 +133060 1557 1900 +133060 1703 1900 +133060 1703 1903 +133060 1900 1903 +133060 1425 1900 +133060 1425 1557 +133060 1425 1903 +133060 1557 1903 +133080 1554 1580 +133080 1684 1740 +133080 1549 1525 +133080 1825 1600 +133080 1557 1658 +133080 1658 1425 +133080 1658 1903 +133080 1658 1900 +133080 1658 1703 +133080 1425 1703 +133080 1557 1703 +133080 1557 1900 +133080 1703 1900 +133080 1703 1903 +133080 1900 1903 +133080 1425 1900 +133080 1425 1557 +133080 1425 1903 +133080 1557 1903 +133100 1549 1825 +133100 1549 1525 +133100 1549 1463 +133100 1825 1525 +133100 1554 1463 +133100 1825 1600 +133100 1557 1658 +133100 1658 1425 +133100 1658 1903 +133100 1658 1900 +133100 1658 1703 +133100 1425 1703 +133100 1557 1703 +133100 1557 1900 +133100 1703 1900 +133100 1703 1903 +133100 1900 1903 +133100 1425 1900 +133100 1425 1557 +133100 1425 1903 +133100 1557 1903 +133120 1554 1463 +133120 1825 1463 +133120 1825 1600 +133120 1825 1519 +133120 1557 1658 +133120 1658 1425 +133120 1658 1903 +133120 1658 1900 +133120 1658 1703 +133120 1425 1703 +133120 1557 1703 +133120 1557 1900 +133120 1703 1900 +133120 1703 1903 +133120 1900 1903 +133120 1425 1900 +133120 1425 1557 +133120 1425 1903 +133120 1557 1903 +133140 1538 1524 +133140 1825 1884 +133140 1825 1600 +133140 1825 1519 +133140 1557 1658 +133140 1658 1425 +133140 1658 1903 +133140 1658 1900 +133140 1658 1703 +133140 1425 1703 +133140 1557 1703 +133140 1557 1900 +133140 1703 1900 +133140 1703 1903 +133140 1900 1903 +133140 1425 1900 +133140 1425 1557 +133140 1425 1903 +133140 1557 1903 +133160 1825 1600 +133160 1699 1441 +133160 1786 1882 +133160 1580 1463 +133160 1522 1524 +133160 1825 1519 +133160 1557 1658 +133160 1658 1425 +133160 1658 1903 +133160 1658 1900 +133160 1658 1703 +133160 1425 1703 +133160 1557 1703 +133160 1557 1900 +133160 1703 1900 +133160 1703 1903 +133160 1900 1903 +133160 1425 1900 +133160 1425 1557 +133160 1425 1903 +133160 1557 1903 +133180 1580 1463 +133180 1522 1524 +133180 1825 1519 +133180 1557 1658 +133180 1658 1425 +133180 1658 1903 +133180 1658 1900 +133180 1658 1703 +133180 1425 1703 +133180 1557 1703 +133180 1557 1900 +133180 1703 1900 +133180 1703 1903 +133180 1900 1903 +133180 1425 1900 +133180 1425 1557 +133180 1425 1903 +133180 1557 1903 +133200 1554 1592 +133200 1580 1463 +133200 1522 1524 +133200 1825 1884 +133200 1825 1519 +133200 1557 1658 +133200 1658 1425 +133200 1658 1903 +133200 1658 1900 +133200 1658 1703 +133200 1425 1703 +133200 1557 1703 +133200 1557 1900 +133200 1703 1900 +133200 1703 1903 +133200 1900 1903 +133200 1425 1900 +133200 1425 1557 +133200 1425 1903 +133200 1557 1903 +133220 1679 1575 +133220 1463 1754 +133220 1825 1884 +133220 1884 1519 +133220 1825 1519 +133220 1557 1658 +133220 1658 1425 +133220 1658 1903 +133220 1658 1900 +133220 1658 1703 +133220 1425 1703 +133220 1557 1703 +133220 1557 1900 +133220 1703 1900 +133220 1703 1903 +133220 1900 1903 +133220 1425 1900 +133220 1425 1557 +133220 1425 1903 +133220 1557 1903 +133240 1857 1617 +133240 1825 1519 +133240 1825 1600 +133240 1557 1658 +133240 1658 1425 +133240 1658 1903 +133240 1658 1900 +133240 1658 1703 +133240 1425 1703 +133240 1557 1703 +133240 1557 1900 +133240 1703 1900 +133240 1703 1903 +133240 1900 1903 +133240 1425 1900 +133240 1425 1557 +133240 1425 1903 +133240 1557 1903 +133260 1825 1600 +133260 1825 1884 +133260 1557 1658 +133260 1658 1425 +133260 1658 1903 +133260 1658 1900 +133260 1658 1703 +133260 1425 1703 +133260 1557 1703 +133260 1557 1900 +133260 1703 1900 +133260 1703 1903 +133260 1900 1903 +133260 1425 1900 +133260 1425 1557 +133260 1425 1903 +133260 1557 1903 +133280 1903 1774 +133280 1825 1463 +133280 1703 1524 +133280 1679 1575 +133280 1557 1658 +133280 1658 1425 +133280 1658 1903 +133280 1658 1900 +133280 1658 1703 +133280 1425 1703 +133280 1557 1703 +133280 1557 1900 +133280 1703 1900 +133280 1703 1903 +133280 1900 1903 +133280 1425 1900 +133280 1425 1557 +133280 1425 1903 +133280 1557 1903 +133300 1884 1600 +133300 1679 1825 +133300 1679 1575 +133300 1679 1519 +133300 1519 1575 +133300 1557 1658 +133300 1658 1425 +133300 1658 1903 +133300 1658 1900 +133300 1658 1703 +133300 1425 1703 +133300 1557 1703 +133300 1557 1900 +133300 1703 1900 +133300 1703 1903 +133300 1900 1903 +133300 1425 1900 +133300 1425 1557 +133300 1425 1903 +133300 1557 1903 +133320 1679 1575 +133320 1679 1519 +133320 1774 1903 +133320 1519 1575 +133320 1463 1628 +133320 1557 1658 +133320 1658 1425 +133320 1658 1903 +133320 1658 1900 +133320 1658 1703 +133320 1425 1703 +133320 1557 1703 +133320 1557 1900 +133320 1703 1900 +133320 1703 1903 +133320 1900 1903 +133320 1425 1900 +133320 1425 1557 +133320 1425 1903 +133320 1557 1903 +133340 1884 1600 +133340 1519 1575 +133340 1699 1463 +133340 1463 1628 +133340 1557 1658 +133340 1658 1425 +133340 1658 1903 +133340 1658 1900 +133340 1658 1703 +133340 1425 1703 +133340 1557 1703 +133340 1557 1900 +133340 1703 1900 +133340 1703 1903 +133340 1900 1903 +133340 1425 1900 +133340 1425 1557 +133340 1425 1903 +133340 1557 1903 +133360 1903 1774 +133360 1531 1512 +133360 1463 1628 +133360 1557 1658 +133360 1658 1425 +133360 1658 1903 +133360 1658 1900 +133360 1658 1703 +133360 1425 1703 +133360 1557 1703 +133360 1557 1900 +133360 1703 1900 +133360 1703 1903 +133360 1900 1903 +133360 1425 1900 +133360 1425 1557 +133360 1425 1903 +133360 1557 1903 +133380 1546 1516 +133380 1825 1524 +133380 1538 1694 +133380 1840 1857 +133380 1463 1628 +133380 1557 1658 +133380 1658 1425 +133380 1658 1903 +133380 1658 1900 +133380 1658 1703 +133380 1425 1703 +133380 1557 1703 +133380 1557 1900 +133380 1703 1900 +133380 1703 1903 +133380 1900 1903 +133380 1425 1900 +133380 1425 1557 +133380 1425 1903 +133380 1557 1903 +133400 1549 1525 +133400 1774 1903 +133400 1538 1694 +133400 1531 1512 +133400 1538 1524 +133400 1840 1857 +133400 1463 1628 +133400 1557 1658 +133400 1658 1425 +133400 1658 1903 +133400 1658 1900 +133400 1658 1703 +133400 1425 1703 +133400 1557 1703 +133400 1557 1900 +133400 1703 1900 +133400 1703 1903 +133400 1900 1903 +133400 1425 1900 +133400 1425 1557 +133400 1425 1903 +133400 1557 1903 +133420 1538 1694 +133420 1694 1524 +133420 1531 1512 +133420 1538 1524 +133420 1516 1546 +133420 1840 1857 +133420 1463 1628 +133420 1557 1658 +133420 1658 1425 +133420 1658 1903 +133420 1658 1900 +133420 1658 1703 +133420 1425 1703 +133420 1557 1703 +133420 1557 1900 +133420 1703 1900 +133420 1703 1903 +133420 1900 1903 +133420 1425 1900 +133420 1425 1557 +133420 1425 1903 +133420 1557 1903 +133440 1538 1524 +133440 1516 1546 +133440 1840 1857 +133440 1600 1884 +133440 1463 1628 +133440 1557 1658 +133440 1658 1425 +133440 1658 1903 +133440 1658 1900 +133440 1658 1703 +133440 1425 1703 +133440 1557 1703 +133440 1557 1900 +133440 1703 1900 +133440 1703 1903 +133440 1900 1903 +133440 1425 1900 +133440 1425 1557 +133440 1425 1903 +133440 1557 1903 +133460 1463 1628 +133460 1512 1531 +133460 1557 1658 +133460 1658 1425 +133460 1658 1903 +133460 1658 1900 +133460 1658 1703 +133460 1425 1703 +133460 1557 1703 +133460 1557 1900 +133460 1703 1900 +133460 1703 1903 +133460 1900 1903 +133460 1425 1900 +133460 1425 1557 +133460 1425 1903 +133460 1557 1903 +133480 1924 1525 +133480 1512 1531 +133480 1557 1658 +133480 1658 1425 +133480 1658 1903 +133480 1658 1900 +133480 1658 1703 +133480 1425 1703 +133480 1557 1703 +133480 1557 1900 +133480 1703 1900 +133480 1703 1903 +133480 1900 1903 +133480 1425 1900 +133480 1425 1557 +133480 1425 1903 +133480 1557 1903 +133480 1840 1857 +133500 1507 1522 +133500 1557 1658 +133500 1658 1425 +133500 1658 1903 +133500 1658 1900 +133500 1658 1703 +133500 1425 1703 +133500 1557 1703 +133500 1557 1900 +133500 1703 1900 +133500 1703 1903 +133500 1900 1903 +133500 1425 1900 +133500 1425 1557 +133500 1425 1903 +133500 1557 1903 +133500 1840 1857 +133520 1808 1743 +133520 1441 1598 +133520 1463 1628 +133520 1774 1903 +133520 1507 1522 +133520 1538 1524 +133520 1557 1658 +133520 1658 1425 +133520 1658 1903 +133520 1658 1900 +133520 1658 1703 +133520 1425 1703 +133520 1557 1703 +133520 1557 1900 +133520 1703 1900 +133520 1703 1903 +133520 1900 1903 +133520 1425 1900 +133520 1425 1557 +133520 1425 1903 +133520 1557 1903 +133520 1840 1857 +133540 1920 1441 +133540 1847 1479 +133540 1507 1522 +133540 1538 1524 +133540 1557 1658 +133540 1658 1425 +133540 1658 1903 +133540 1658 1900 +133540 1658 1703 +133540 1425 1703 +133540 1557 1703 +133540 1557 1900 +133540 1703 1900 +133540 1703 1903 +133540 1900 1903 +133540 1425 1900 +133540 1425 1557 +133540 1425 1903 +133540 1557 1903 +133540 1840 1857 +133560 1538 1524 +133560 1557 1658 +133560 1600 1519 +133560 1463 1628 +133560 1774 1903 +133560 1658 1425 +133560 1658 1903 +133560 1658 1900 +133560 1658 1703 +133560 1425 1703 +133560 1557 1703 +133560 1557 1900 +133560 1703 1900 +133560 1703 1903 +133560 1900 1903 +133560 1425 1900 +133560 1425 1557 +133560 1425 1903 +133560 1557 1903 +133560 1840 1857 +133580 1658 1425 +133580 1658 1903 +133580 1658 1900 +133580 1658 1703 +133580 1425 1703 +133580 1425 1774 +133580 1557 1703 +133580 1557 1900 +133580 1703 1900 +133580 1703 1903 +133580 1600 1825 +133580 1900 1903 +133580 1425 1900 +133580 1425 1557 +133580 1425 1903 +133580 1557 1903 +133580 1840 1857 +133580 1546 1516 +133580 1559 1580 +133600 1549 1825 +133600 1425 1900 +133600 1425 1557 +133600 1425 1903 +133600 1557 1903 +133600 1840 1857 +133600 1825 1519 +133600 1546 1516 +133600 1559 1580 +133620 1580 1825 +133620 1546 1516 +133620 1538 1524 +133620 1559 1580 +133640 1546 1516 +133640 1538 1524 +133640 1559 1580 +133660 1538 1524 +133660 1684 1522 +133660 1600 1825 +133660 1507 1522 +133660 1559 1580 +133660 1840 1857 +133680 1559 1580 +133680 1840 1857 +133700 1546 1516 +133700 1531 1599 +133700 1559 1580 +133700 1840 1857 +133720 1546 1516 +133720 1580 1628 +133720 1559 1628 +133720 1531 1599 +133720 1559 1580 +133720 1825 1463 +133720 1840 1857 +133740 1663 1818 +133740 1559 1628 +133740 1563 1592 +133740 1857 1825 +133740 1754 1825 +133740 1531 1599 +133740 1559 1580 +133740 1825 1463 +133740 1840 1857 +133760 1808 1743 +133760 1531 1599 +133760 1441 1617 +133760 1580 1463 +133760 1463 1628 +133760 1924 1478 +133760 1559 1580 +133760 1825 1463 +133760 1840 1857 +133780 1924 1478 +133780 1549 1600 +133780 1559 1580 +133780 1507 1522 +133780 1825 1628 +133780 1825 1463 +133780 1599 1512 +133780 1840 1857 +133800 1818 1663 +133800 1437 1603 +133800 1825 1628 +133800 1825 1463 +133800 1563 1592 +133800 1599 1531 +133800 1600 1519 +133800 1599 1512 +133800 1840 1857 +133800 1463 1628 +133820 1563 1592 +133820 1441 1617 +133820 1595 1654 +133820 1599 1531 +133820 1600 1519 +133820 1559 1580 +133820 1599 1512 +133820 1840 1857 +133820 1463 1628 +133820 1549 1825 +133840 1559 1580 +133840 1818 1525 +133840 1599 1512 +133840 1840 1857 +133840 1463 1628 +133840 1808 1743 +133840 1449 1603 +133840 1549 1825 +133840 1924 1848 +133860 1599 1512 +133860 1478 1848 +133860 1840 1857 +133860 1463 1628 +133860 1808 1743 +133860 1449 1603 +133860 1549 1825 +133860 1924 1848 +133880 1546 1431 +133880 1684 1522 +133880 1563 1592 +133880 1840 1857 +133880 1841 1901 +133880 1463 1628 +133880 1808 1743 +133880 1449 1603 +133880 1769 1657 +133880 1549 1825 +133880 1924 1848 +133900 1808 1743 +133900 1449 1603 +133900 1769 1657 +133900 1531 1512 +133900 1549 1825 +133900 1924 1848 +133920 1563 1592 +133920 1449 1603 +133920 1599 1512 +133920 1600 1519 +133920 1769 1657 +133920 1531 1512 +133920 1549 1825 +133920 1924 1848 +133940 1599 1882 +133940 1531 1512 +133940 1531 1599 +133940 1840 1617 +133940 1546 1516 +133940 1549 1825 +133940 1924 1848 +133960 1792 1885 +133960 1808 1743 +133960 1531 1512 +133960 1531 1599 +133960 1840 1617 +133960 1441 1617 +133960 1538 1524 +133960 1841 1901 +133960 1546 1516 +133960 1563 1592 +133960 1549 1825 +133960 1924 1848 +133980 1538 1524 +133980 1841 1901 +133980 1857 1617 +133980 1546 1516 +133980 1563 1592 +133980 1549 1825 +133980 1924 1848 +134000 1546 1516 +134000 1563 1592 +134000 1808 1743 +134000 1549 1825 +134000 1924 1848 +134020 1538 1524 +134020 1463 1754 +134020 1507 1522 +134020 1808 1743 +134020 1792 1885 +134020 1549 1825 +134020 1924 1478 +134020 1669 1754 +134020 1924 1848 +134020 1600 1519 +134040 1563 1592 +134040 1531 1512 +134040 1478 1848 +134040 1769 1657 +134040 1808 1743 +134040 1792 1885 +134040 1549 1825 +134040 1924 1478 +134040 1669 1754 +134040 1924 1848 +134040 1600 1519 +134060 1808 1743 +134060 1841 1901 +134060 1792 1885 +134060 1549 1825 +134060 1538 1524 +134060 1924 1478 +134060 1669 1754 +134060 1924 1848 +134060 1600 1519 +134080 1531 1512 +134080 1792 1885 +134080 1549 1825 +134080 1538 1524 +134080 1924 1478 +134080 1669 1754 +134080 1924 1848 +134080 1600 1519 +134100 1792 1885 +134100 1628 1463 +134100 1549 1825 +134100 1538 1524 +134100 1924 1478 +134100 1669 1754 +134100 1924 1848 +134100 1563 1592 +134100 1600 1519 +134100 1478 1848 +134120 1538 1524 +134120 1924 1478 +134120 1669 1754 +134120 1663 1818 +134120 1924 1848 +134120 1563 1592 +134120 1600 1519 +134120 1478 1848 +134120 1769 1657 +134140 1924 1525 +134140 1663 1818 +134140 1924 1848 +134140 1563 1592 +134140 1531 1512 +134140 1600 1519 +134140 1478 1848 +134140 1769 1657 +134160 1924 1848 +134160 1563 1592 +134160 1694 1617 +134160 1531 1512 +134160 1593 1521 +134160 1600 1519 +134160 1478 1848 +134160 1769 1657 +134160 1669 1754 +134160 1507 1522 +134160 1924 1478 +134180 1669 1754 +134180 1431 1516 +134180 1507 1522 +134180 1549 1825 +134180 1924 1478 +134200 1549 1825 +134200 1512 1531 +134200 1924 1478 +134200 1848 1600 +134200 1563 1592 +134200 1769 1657 +134220 1924 1478 +134220 1694 1617 +134220 1848 1600 +134220 1563 1592 +134220 1920 1483 +134220 1769 1657 +134240 1684 1507 +134240 1848 1600 +134240 1829 1886 +134240 1563 1592 +134240 1600 1519 +134240 1920 1483 +134240 1769 1657 +134260 1530 1608 +134260 1819 1661 +134260 1829 1886 +134260 1512 1531 +134260 1563 1592 +134260 1600 1519 +134260 1920 1483 +134260 1769 1657 +134280 1818 1663 +134280 1847 1768 +134280 1563 1592 +134280 1600 1519 +134280 1920 1483 +134280 1769 1657 +134300 1829 1886 +134300 1507 1522 +134300 1563 1592 +134300 1848 1600 +134300 1537 1443 +134300 1600 1519 +134300 1920 1483 +134300 1769 1657 +134320 1507 1522 +134320 1563 1592 +134320 1848 1600 +134320 1537 1443 +134320 1600 1519 +134320 1920 1483 +134320 1769 1657 +134340 1546 1516 +134340 1563 1592 +134340 1599 1512 +134340 1549 1600 +134340 1559 1580 +134340 1848 1600 +134340 1537 1443 +134340 1600 1519 +134340 1920 1483 +134340 1769 1657 +134360 1549 1600 +134360 1559 1580 +134360 1848 1600 +134360 1537 1443 +134360 1600 1519 +134360 1920 1483 +134360 1769 1657 +134380 1920 1531 +134380 1537 1443 +134380 1443 1580 +134380 1818 1663 +134380 1537 1580 +134380 1600 1519 +134380 1669 1818 +134380 1920 1483 +134380 1563 1592 +134380 1769 1657 +134400 1537 1598 +134400 1924 1478 +134400 1818 1663 +134400 1703 1525 +134400 1592 1786 +134400 1538 1786 +134400 1507 1522 +134400 1537 1580 +134400 1600 1519 +134400 1593 1521 +134400 1669 1818 +134400 1920 1483 +134400 1563 1592 +134400 1769 1657 +134420 1538 1786 +134420 1546 1516 +134420 1703 1603 +134420 1825 1519 +134420 1507 1522 +134420 1537 1580 +134420 1441 1617 +134420 1600 1519 +134420 1549 1825 +134420 1593 1521 +134420 1669 1818 +134420 1920 1483 +134420 1563 1592 +134420 1769 1657 +134440 1537 1580 +134440 1463 1628 +134440 1441 1617 +134440 1600 1519 +134440 1549 1825 +134440 1593 1521 +134440 1669 1818 +134440 1920 1483 +134440 1563 1592 +134440 1769 1657 +134460 1538 1786 +134460 1600 1825 +134460 1825 1519 +134460 1441 1617 +134460 1600 1519 +134460 1549 1825 +134460 1593 1521 +134460 1669 1818 +134460 1920 1483 +134460 1563 1592 +134460 1769 1657 +134480 1441 1617 +134480 1600 1519 +134480 1549 1600 +134480 1549 1825 +134480 1593 1521 +134480 1669 1818 +134480 1920 1483 +134480 1563 1592 +134480 1769 1657 +134500 1538 1699 +134500 1549 1600 +134500 1549 1825 +134500 1689 1806 +134500 1593 1521 +134500 1617 1531 +134500 1669 1818 +134500 1537 1580 +134500 1825 1519 +134500 1600 1825 +134500 1920 1483 +134500 1563 1592 +134500 1769 1657 +134520 1546 1516 +134520 1441 1617 +134520 1669 1818 +134520 1537 1580 +134520 1825 1519 +134520 1600 1825 +134520 1920 1483 +134520 1563 1592 +134520 1769 1657 +134540 1684 1441 +134540 1441 1617 +134540 1669 1818 +134540 1689 1806 +134540 1593 1521 +134540 1537 1580 +134540 1825 1519 +134540 1600 1825 +134540 1920 1483 +134540 1563 1592 +134540 1769 1657 +134560 1669 1818 +134560 1689 1806 +134560 1593 1521 +134560 1595 1654 +134560 1887 1659 +134560 1537 1580 +134560 1463 1628 +134560 1600 1519 +134560 1825 1519 +134560 1600 1825 +134560 1920 1483 +134560 1563 1592 +134560 1769 1657 +134580 1549 1600 +134580 1431 1516 +134580 1531 1443 +134580 1599 1512 +134580 1537 1580 +134580 1818 1754 +134580 1463 1628 +134580 1600 1519 +134580 1825 1519 +134580 1600 1825 +134580 1920 1483 +134580 1924 1887 +134580 1563 1592 +134580 1769 1657 +134600 1537 1580 +134600 1549 1825 +134600 1684 1659 +134600 1818 1754 +134600 1463 1628 +134600 1600 1519 +134600 1478 1887 +134600 1825 1519 +134600 1531 1599 +134600 1600 1825 +134600 1920 1483 +134600 1924 1887 +134600 1563 1592 +134600 1769 1657 +134620 1669 1754 +134620 1463 1628 +134620 1600 1519 +134620 1478 1887 +134620 1825 1519 +134620 1754 1628 +134620 1531 1599 +134620 1600 1825 +134620 1920 1483 +134620 1924 1887 +134620 1563 1592 +134620 1769 1657 +134620 1595 1654 +134640 1689 1806 +134640 1818 1663 +134640 1531 1599 +134640 1600 1825 +134640 1537 1580 +134640 1920 1483 +134640 1924 1887 +134640 1563 1592 +134640 1769 1657 +134640 1595 1654 +134660 1531 1599 +134660 1840 1857 +134660 1848 1887 +134660 1600 1825 +134660 1537 1580 +134660 1825 1519 +134660 1920 1483 +134660 1924 1887 +134660 1563 1592 +134660 1769 1657 +134660 1595 1654 +134680 1694 1441 +134680 1841 1901 +134680 1792 1885 +134680 1600 1825 +134680 1600 1519 +134680 1537 1580 +134680 1825 1519 +134680 1920 1483 +134680 1924 1887 +134680 1563 1592 +134680 1769 1657 +134680 1595 1654 +134700 1669 1754 +134700 1537 1580 +134700 1848 1887 +134700 1825 1519 +134700 1599 1531 +134700 1920 1483 +134700 1924 1887 +134700 1563 1592 +134700 1769 1657 +134700 1595 1654 +134720 1537 1580 +134720 1538 1524 +134720 1924 1478 +134720 1546 1516 +134720 1431 1516 +134720 1437 1787 +134720 1848 1887 +134720 1825 1519 +134720 1599 1531 +134720 1600 1825 +134720 1920 1483 +134720 1924 1887 +134720 1563 1592 +134720 1769 1657 +134720 1595 1654 +134740 1840 1857 +134740 1599 1531 +134740 1628 1914 +134740 1684 1659 +134740 1600 1825 +134740 1920 1483 +134740 1924 1887 +134740 1563 1592 +134740 1769 1657 +134740 1595 1654 +134760 1792 1885 +134760 1537 1580 +134760 1694 1441 +134760 1684 1659 +134760 1600 1825 +134760 1920 1483 +134760 1924 1887 +134760 1563 1592 +134760 1769 1657 +134760 1595 1654 +134780 1475 1628 +134780 1684 1659 +134780 1600 1825 +134780 1920 1483 +134780 1857 1617 +134780 1924 1887 +134780 1563 1592 +134780 1769 1657 +134780 1595 1654 +134800 1920 1483 +134800 1857 1617 +134800 1478 1887 +134800 1924 1887 +134800 1563 1592 +134800 1769 1657 +134800 1595 1654 +134820 1924 1887 +134820 1825 1600 +134820 1825 1848 +134820 1563 1592 +134820 1694 1441 +134820 1769 1657 +134820 1595 1654 +134840 1806 1598 +134840 1600 1890 +134840 1890 1519 +134840 1549 1600 +134840 1563 1592 +134840 1694 1441 +134840 1600 1519 +134840 1857 1617 +134840 1848 1887 +134840 1825 1890 +134840 1669 1754 +134840 1825 1519 +134840 1617 1769 +134840 1617 1657 +134840 1769 1657 +134840 1595 1654 +134860 1538 1524 +134860 1549 1600 +134860 1563 1592 +134860 1694 1441 +134860 1600 1519 +134860 1857 1769 +134860 1857 1657 +134860 1857 1617 +134860 1848 1887 +134860 1825 1890 +134860 1628 1475 +134860 1669 1754 +134860 1825 1519 +134860 1600 1806 +134860 1617 1769 +134860 1617 1657 +134860 1769 1657 +134860 1600 1825 +134860 1595 1654 +134860 1806 1848 +134860 1920 1483 +134880 1549 1890 +134880 1825 1887 +134880 1825 1806 +134880 1628 1475 +134880 1669 1754 +134880 1531 1512 +134880 1825 1519 +134880 1600 1806 +134880 1617 1769 +134880 1617 1657 +134880 1769 1657 +134880 1600 1825 +134880 1595 1654 +134880 1806 1848 +134880 1920 1483 +134900 1669 1754 +134900 1694 1441 +134900 1600 1519 +134900 1531 1512 +134900 1825 1519 +134900 1600 1806 +134900 1617 1769 +134900 1617 1657 +134900 1769 1657 +134900 1600 1825 +134900 1595 1654 +134900 1806 1848 +134900 1920 1483 +134920 1531 1512 +134920 1825 1519 +134920 1600 1806 +134920 1825 1890 +134920 1617 1769 +134920 1617 1657 +134920 1769 1657 +134920 1600 1825 +134920 1924 1887 +134920 1563 1592 +134920 1595 1654 +134920 1806 1848 +134920 1920 1483 +134940 1538 1524 +134940 1924 1478 +134940 1549 1600 +134940 1549 1806 +134940 1825 1848 +134940 1825 1890 +134940 1890 1600 +134940 1890 1848 +134940 1478 1887 +134940 1617 1769 +134940 1617 1657 +134940 1769 1657 +134940 1600 1825 +134940 1924 1887 +134940 1563 1592 +134940 1595 1654 +134940 1806 1848 +134940 1920 1483 +134960 1441 1694 +134960 1839 1740 +134960 1599 1882 +134960 1769 1657 +134960 1600 1825 +134960 1924 1887 +134960 1563 1592 +134960 1595 1654 +134960 1806 1848 +134960 1920 1483 +134980 1478 1887 +134980 1507 1522 +134980 1538 1524 +134980 1600 1825 +134980 1806 1890 +134980 1924 1887 +134980 1563 1592 +134980 1595 1654 +134980 1806 1848 +134980 1920 1483 +135000 1538 1524 +135000 1847 1479 +135000 1848 1890 +135000 1599 1882 +135000 1600 1825 +135000 1806 1890 +135000 1924 1887 +135000 1563 1592 +135000 1769 1657 +135000 1595 1654 +135000 1806 1848 +135000 1920 1483 +135020 1806 1890 +135020 1449 1603 +135020 1825 1519 +135020 1924 1887 +135020 1694 1441 +135020 1563 1592 +135020 1769 1657 +135020 1595 1654 +135020 1806 1848 +135020 1920 1483 +135040 1924 1887 +135040 1669 1754 +135040 1549 1525 +135040 1774 1523 +135040 1694 1441 +135040 1684 1740 +135040 1563 1592 +135040 1769 1657 +135040 1595 1654 +135040 1806 1848 +135040 1920 1483 +135060 1694 1441 +135060 1924 1478 +135060 1538 1524 +135060 1684 1740 +135060 1449 1603 +135060 1563 1592 +135060 1537 1603 +135060 1825 1600 +135060 1769 1657 +135060 1469 1523 +135060 1595 1654 +135060 1806 1848 +135060 1920 1483 +135080 1924 1478 +135080 1669 1754 +135080 1441 1657 +135080 1531 1512 +135080 1642 1643 +135080 1538 1524 +135080 1684 1740 +135080 1449 1603 +135080 1825 1519 +135080 1563 1592 +135080 1537 1603 +135080 1599 1882 +135080 1825 1600 +135080 1769 1657 +135080 1469 1523 +135080 1600 1519 +135080 1595 1654 +135080 1806 1848 +135080 1920 1483 +135100 1538 1524 +135100 1684 1740 +135100 1449 1603 +135100 1847 1768 +135100 1825 1519 +135100 1563 1592 +135100 1479 1847 +135100 1598 1663 +135100 1537 1603 +135100 1599 1882 +135100 1825 1600 +135100 1769 1657 +135100 1469 1523 +135100 1600 1519 +135100 1595 1654 +135100 1806 1848 +135100 1920 1483 +135120 1792 1885 +135120 1920 1617 +135120 1563 1592 +135120 1512 1531 +135120 1479 1847 +135120 1598 1663 +135120 1537 1603 +135120 1599 1882 +135120 1825 1600 +135120 1769 1657 +135120 1469 1523 +135120 1600 1519 +135120 1595 1654 +135120 1806 1848 +135120 1920 1483 +135140 1538 1524 +135140 1479 1847 +135140 1598 1663 +135140 1740 1914 +135140 1537 1603 +135140 1684 1740 +135140 1704 1643 +135140 1599 1882 +135140 1890 1769 +135140 1825 1600 +135140 1890 1657 +135140 1769 1657 +135140 1469 1523 +135140 1600 1519 +135140 1595 1654 +135140 1806 1848 +135140 1920 1483 +135160 1792 1885 +135160 1537 1603 +135160 1441 1617 +135160 1684 1740 +135160 1704 1643 +135160 1599 1882 +135160 1890 1769 +135160 1563 1592 +135160 1825 1600 +135160 1890 1657 +135160 1769 1657 +135160 1469 1523 +135160 1600 1519 +135160 1595 1654 +135160 1806 1848 +135160 1920 1483 +135180 1538 1524 +135180 1563 1592 +135180 1531 1512 +135180 1825 1600 +135180 1711 1479 +135180 1694 1617 +135180 1479 1847 +135180 1890 1657 +135180 1769 1657 +135180 1469 1523 +135180 1600 1519 +135180 1595 1654 +135180 1806 1848 +135180 1920 1483 +135200 1479 1847 +135200 1890 1769 +135200 1890 1657 +135200 1769 1657 +135200 1523 1882 +135200 1684 1914 +135200 1469 1882 +135200 1469 1523 +135200 1600 1519 +135200 1595 1654 +135200 1806 1848 +135200 1920 1483 +135220 1684 1914 +135220 1441 1914 +135220 1507 1524 +135220 1537 1603 +135220 1538 1522 +135220 1924 1478 +135220 1825 1600 +135220 1825 1519 +135220 1538 1524 +135220 1441 1617 +135220 1469 1882 +135220 1469 1523 +135220 1600 1519 +135220 1595 1654 +135220 1512 1531 +135220 1563 1592 +135220 1806 1848 +135220 1920 1483 +135240 1537 1603 +135240 1538 1522 +135240 1924 1478 +135240 1825 1600 +135240 1825 1519 +135240 1848 1890 +135240 1538 1524 +135240 1806 1890 +135240 1441 1617 +135240 1469 1882 +135240 1469 1523 +135240 1600 1519 +135240 1595 1654 +135240 1512 1531 +135240 1563 1592 +135240 1806 1848 +135240 1920 1483 +135260 1538 1524 +135260 1549 1890 +135260 1806 1890 +135260 1441 1617 +135260 1469 1882 +135260 1469 1523 +135260 1600 1519 +135260 1825 1890 +135260 1523 1882 +135260 1595 1654 +135260 1512 1531 +135260 1914 1684 +135260 1563 1592 +135260 1806 1848 +135260 1920 1483 +135280 1549 1825 +135280 1431 1516 +135280 1441 1694 +135280 1848 1890 +135280 1595 1654 +135280 1599 1882 +135280 1512 1531 +135280 1537 1603 +135280 1914 1684 +135280 1563 1592 +135280 1806 1848 +135280 1920 1483 +135300 1920 1625 +135300 1920 1598 +135300 1924 1478 +135300 1818 1663 +135300 1825 1890 +135300 1890 1519 +135300 1512 1531 +135300 1537 1603 +135300 1914 1684 +135300 1563 1592 +135300 1806 1848 +135300 1920 1483 +135320 1538 1522 +135320 1848 1890 +135320 1825 1519 +135320 1806 1890 +135320 1598 1663 +135320 1890 1811 +135320 1593 1521 +135320 1537 1603 +135320 1914 1684 +135320 1563 1592 +135320 1806 1848 +135320 1920 1483 +135320 1806 1811 +135320 1811 1848 +135340 1538 1507 +135340 1806 1890 +135340 1818 1598 +135340 1699 1443 +135340 1598 1663 +135340 1890 1811 +135340 1593 1521 +135340 1537 1603 +135340 1914 1684 +135340 1563 1592 +135340 1806 1848 +135340 1920 1483 +135340 1806 1811 +135340 1811 1848 +135360 1811 1825 +135360 1841 1901 +135360 1593 1521 +135360 1549 1519 +135360 1537 1603 +135360 1538 1524 +135360 1914 1684 +135360 1563 1592 +135360 1806 1848 +135360 1920 1483 +135360 1806 1811 +135360 1811 1848 +135380 1549 1519 +135380 1818 1663 +135380 1598 1663 +135380 1537 1603 +135380 1538 1524 +135380 1914 1684 +135380 1563 1592 +135380 1806 1848 +135380 1920 1483 +135380 1806 1811 +135380 1811 1848 +135400 1537 1603 +135400 1538 1524 +135400 1914 1684 +135400 1608 1530 +135400 1563 1592 +135400 1538 1507 +135400 1507 1524 +135400 1449 1582 +135400 1806 1848 +135400 1920 1483 +135400 1806 1811 +135400 1811 1848 +135420 1549 1519 +135420 1806 1825 +135420 1811 1825 +135420 1825 1848 +135420 1563 1592 +135420 1704 1643 +135420 1538 1507 +135420 1507 1524 +135420 1449 1582 +135420 1806 1848 +135420 1920 1483 +135420 1806 1811 +135420 1811 1848 +135440 1689 1525 +135440 1818 1663 +135440 1563 1592 +135440 1704 1643 +135440 1825 1525 +135440 1538 1507 +135440 1507 1524 +135440 1449 1582 +135440 1806 1848 +135440 1920 1483 +135440 1806 1811 +135440 1811 1848 +135460 1825 1848 +135460 1608 1530 +135460 1538 1507 +135460 1549 1519 +135460 1507 1524 +135460 1449 1582 +135460 1806 1848 +135460 1920 1483 +135460 1806 1811 +135460 1811 1848 +135480 1538 1507 +135480 1549 1519 +135480 1592 1563 +135480 1531 1512 +135480 1818 1663 +135480 1593 1521 +135480 1507 1524 +135480 1449 1582 +135480 1549 1825 +135480 1806 1848 +135480 1920 1483 +135480 1825 1519 +135480 1806 1811 +135480 1811 1848 +135500 1689 1600 +135500 1818 1663 +135500 1593 1521 +135500 1507 1524 +135500 1538 1524 +135500 1449 1582 +135500 1549 1825 +135500 1806 1848 +135500 1920 1483 +135500 1825 1519 +135500 1806 1811 +135500 1811 1848 +135520 1538 1507 +135520 1538 1524 +135520 1449 1582 +135520 1549 1825 +135520 1806 1848 +135520 1531 1512 +135520 1920 1483 +135520 1825 1519 +135520 1563 1592 +135520 1806 1811 +135520 1811 1848 +135540 1835 1598 +135540 1507 1522 +135540 1549 1825 +135540 1806 1848 +135540 1531 1512 +135540 1920 1483 +135540 1825 1519 +135540 1563 1592 +135540 1806 1811 +135540 1811 1848 +135560 1739 1603 +135560 1546 1516 +135560 1818 1663 +135560 1437 1603 +135560 1507 1522 +135560 1752 1766 +135560 1549 1825 +135560 1806 1848 +135560 1808 1848 +135560 1531 1512 +135560 1538 1507 +135560 1689 1835 +135560 1920 1483 +135560 1825 1519 +135560 1563 1592 +135560 1806 1811 +135560 1811 1848 +135580 1546 1431 +135580 1549 1808 +135580 1549 1825 +135580 1549 1806 +135580 1806 1848 +135580 1806 1825 +135580 1808 1848 +135580 1848 1825 +135580 1825 1811 +135580 1531 1512 +135580 1538 1507 +135580 1689 1835 +135580 1920 1483 +135580 1549 1848 +135580 1549 1811 +135580 1825 1519 +135580 1563 1592 +135580 1806 1811 +135580 1811 1848 +135600 1920 1441 +135600 1538 1507 +135600 1538 1524 +135600 1530 1608 +135600 1689 1835 +135600 1443 1603 +135600 1441 1890 +135600 1507 1524 +135600 1510 1919 +135600 1920 1483 +135600 1549 1848 +135600 1549 1811 +135600 1825 1519 +135600 1848 1519 +135600 1563 1592 +135600 1806 1811 +135600 1811 1848 +135620 1920 1483 +135620 1549 1848 +135620 1549 1811 +135620 1549 1806 +135620 1825 1519 +135620 1825 1848 +135620 1848 1519 +135620 1519 1811 +135620 1563 1592 +135620 1806 1811 +135620 1811 1848 +135640 1546 1516 +135640 1549 1559 +135640 1684 1791 +135640 1825 1848 +135640 1598 1628 +135640 1848 1519 +135640 1519 1811 +135640 1663 1818 +135640 1563 1592 +135640 1806 1811 +135640 1811 1848 +135660 1563 1699 +135660 1563 1443 +135660 1663 1818 +135660 1702 1901 +135660 1538 1507 +135660 1563 1592 +135660 1920 1483 +135660 1806 1811 +135660 1811 1848 +135680 1663 1818 +135680 1689 1835 +135680 1702 1901 +135680 1866 1901 +135680 1538 1507 +135680 1563 1592 +135680 1593 1521 +135680 1811 1825 +135680 1825 1848 +135680 1920 1483 +135680 1806 1811 +135680 1811 1848 +135700 1538 1507 +135700 1563 1592 +135700 1848 1890 +135700 1593 1521 +135700 1811 1825 +135700 1825 1848 +135700 1600 1825 +135700 1825 1890 +135700 1920 1483 +135700 1806 1811 +135700 1811 1848 +135720 1563 1592 +135720 1573 1600 +135720 1573 1825 +135720 1573 1684 +135720 1663 1818 +135720 1811 1890 +135720 1821 1841 +135720 1821 1901 +135720 1848 1890 +135720 1593 1521 +135720 1811 1825 +135720 1825 1848 +135720 1600 1825 +135720 1825 1890 +135720 1507 1524 +135720 1920 1483 +135720 1806 1811 +135720 1811 1848 +135740 1546 1516 +135740 1563 1699 +135740 1593 1521 +135740 1600 1848 +135740 1600 1811 +135740 1664 1821 +135740 1806 1825 +135740 1811 1825 +135740 1825 1848 +135740 1600 1825 +135740 1603 1669 +135740 1847 1479 +135740 1825 1890 +135740 1507 1524 +135740 1538 1507 +135740 1628 1740 +135740 1920 1483 +135740 1806 1848 +135740 1806 1811 +135740 1811 1848 +135760 1563 1592 +135760 1600 1825 +135760 1603 1669 +135760 1847 1479 +135760 1848 1890 +135760 1431 1516 +135760 1825 1890 +135760 1507 1524 +135760 1538 1507 +135760 1628 1740 +135760 1920 1483 +135760 1806 1848 +135760 1806 1811 +135760 1811 1848 +135780 1538 1522 +135780 1625 1920 +135780 1825 1890 +135780 1890 1525 +135780 1507 1524 +135780 1512 1531 +135780 1538 1507 +135780 1628 1740 +135780 1920 1483 +135780 1603 1463 +135780 1806 1848 +135780 1806 1811 +135780 1811 1848 +135800 1563 1920 +135800 1664 1698 +135800 1664 1821 +135800 1848 1890 +135800 1507 1524 +135800 1512 1531 +135800 1538 1507 +135800 1628 1740 +135800 1582 1593 +135800 1920 1483 +135800 1603 1463 +135800 1806 1848 +135800 1806 1811 +135800 1811 1848 +135820 1590 1786 +135820 1593 1521 +135820 1669 1437 +135820 1698 1821 +135820 1702 1901 +135820 1920 1441 +135820 1431 1516 +135820 1698 1707 +135820 1538 1507 +135820 1628 1740 +135820 1582 1593 +135820 1920 1483 +135820 1603 1463 +135820 1806 1848 +135820 1806 1811 +135820 1811 1848 +135840 1538 1524 +135840 1698 1707 +135840 1512 1531 +135840 1538 1507 +135840 1507 1524 +135840 1628 1740 +135840 1582 1593 +135840 1920 1483 +135840 1603 1463 +135840 1806 1848 +135840 1806 1811 +135840 1811 1848 +135860 1538 1507 +135860 1507 1524 +135860 1628 1740 +135860 1816 1823 +135860 1848 1890 +135860 1582 1593 +135860 1920 1483 +135860 1603 1463 +135860 1806 1848 +135860 1806 1811 +135860 1811 1848 +135880 1551 1562 +135880 1628 1740 +135880 1663 1818 +135880 1816 1823 +135880 1664 1821 +135880 1806 1890 +135880 1848 1890 +135880 1443 1487 +135880 1582 1593 +135880 1546 1516 +135880 1920 1483 +135880 1603 1463 +135880 1698 1707 +135880 1806 1848 +135880 1806 1811 +135880 1811 1848 +135900 1664 1821 +135900 1806 1890 +135900 1836 1847 +135900 1848 1890 +135900 1443 1487 +135900 1582 1593 +135900 1546 1516 +135900 1570 1731 +135900 1920 1483 +135900 1603 1463 +135900 1698 1707 +135900 1806 1848 +135900 1806 1811 +135900 1811 1848 +135920 1546 1431 +135920 1582 1593 +135920 1593 1521 +135920 1485 1529 +135920 1546 1468 +135920 1663 1818 +135920 1546 1516 +135920 1468 1516 +135920 1570 1731 +135920 1920 1483 +135920 1603 1463 +135920 1698 1707 +135920 1806 1848 +135920 1806 1811 +135920 1811 1848 +135940 1546 1468 +135940 1645 1756 +135940 1663 1818 +135940 1431 1516 +135940 1546 1516 +135940 1562 1443 +135940 1580 1463 +135940 1599 1512 +135940 1628 1740 +135940 1468 1516 +135940 1570 1731 +135940 1920 1483 +135940 1603 1463 +135940 1698 1707 +135940 1806 1848 +135940 1806 1811 +135940 1811 1848 +135960 1546 1516 +135960 1562 1443 +135960 1580 1463 +135960 1599 1512 +135960 1628 1740 +135960 1689 1503 +135960 1752 1766 +135960 1754 1487 +135960 1792 1885 +135960 1468 1516 +135960 1507 1522 +135960 1522 1524 +135960 1541 1699 +135960 1570 1731 +135960 1920 1483 +135960 1603 1463 +135960 1698 1707 +135960 1806 1848 +135960 1806 1811 +135960 1811 1848 +135980 1541 1699 +135980 1570 1731 +135980 1582 1593 +135980 1680 1698 +135980 1816 1882 +135980 1431 1516 +135980 1920 1483 +135980 1603 1463 +135980 1698 1707 +135980 1806 1848 +135980 1806 1811 +135980 1811 1848 +135980 1645 1756 +136000 1580 1740 +136000 1599 1531 +136000 1645 1877 +136000 1663 1818 +136000 1734 1491 +136000 1920 1483 +136000 1603 1463 +136000 1698 1707 +136000 1806 1848 +136000 1806 1811 +136000 1811 1848 +136000 1645 1756 +136020 1563 1673 +136020 1570 1731 +136020 1580 1437 +136020 1663 1818 +136020 1734 1491 +136020 1798 1901 +136020 1920 1483 +136020 1791 1825 +136020 1798 1831 +136020 1603 1463 +136020 1825 1519 +136020 1698 1707 +136020 1600 1756 +136020 1806 1848 +136020 1806 1811 +136020 1811 1848 +136020 1645 1756 +136040 1538 1507 +136040 1560 1924 +136040 1562 1580 +136040 1591 1858 +136040 1599 1882 +136040 1600 1645 +136040 1791 1825 +136040 1798 1831 +136040 1841 1901 +136040 1874 1532 +136040 1431 1516 +136040 1603 1463 +136040 1702 1841 +136040 1562 1443 +136040 1825 1519 +136040 1698 1707 +136040 1600 1756 +136040 1806 1848 +136040 1806 1811 +136040 1811 1848 +136040 1645 1756 +136060 1563 1908 +136060 1580 1684 +136060 1603 1463 +136060 1617 1908 +136060 1702 1841 +136060 1562 1443 +136060 1645 1825 +136060 1756 1825 +136060 1798 1913 +136060 1600 1825 +136060 1825 1519 +136060 1698 1707 +136060 1920 1483 +136060 1600 1756 +136060 1806 1848 +136060 1806 1811 +136060 1811 1848 +136060 1645 1756 +136080 1560 1754 +136080 1560 1443 +136080 1562 1443 +136080 1563 1648 +136080 1645 1825 +136080 1756 1825 +136080 1798 1913 +136080 1560 1580 +136080 1562 1740 +136080 1600 1825 +136080 1740 1443 +136080 1825 1519 +136080 1698 1707 +136080 1600 1645 +136080 1920 1483 +136080 1600 1756 +136080 1806 1848 +136080 1806 1811 +136080 1811 1848 +136080 1645 1756 +136100 1546 1516 +136100 1546 1431 +136100 1560 1580 +136100 1562 1740 +136100 1562 1839 +136100 1580 1831 +136100 1600 1825 +136100 1740 1443 +136100 1754 1840 +136100 1791 1825 +136100 1825 1519 +136100 1593 1521 +136100 1670 1908 +136100 1570 1731 +136100 1522 1524 +136100 1698 1707 +136100 1600 1645 +136100 1920 1483 +136100 1600 1756 +136100 1806 1848 +136100 1806 1811 +136100 1811 1848 +136100 1645 1756 +136120 1580 1913 +136120 1587 1491 +136120 1593 1521 +136120 1670 1908 +136120 1708 1460 +136120 1831 1443 +136120 1570 1731 +136120 1522 1524 +136120 1669 1754 +136120 1698 1707 +136120 1600 1645 +136120 1740 1831 +136120 1920 1483 +136120 1600 1756 +136120 1806 1848 +136120 1806 1811 +136120 1811 1848 +136120 1645 1756 +136140 1538 1522 +136140 1538 1524 +136140 1551 1914 +136140 1551 1591 +136140 1570 1731 +136140 1600 1825 +136140 1707 1491 +136140 1806 1890 +136140 1522 1524 +136140 1591 1818 +136140 1669 1754 +136140 1698 1707 +136140 1600 1645 +136140 1791 1825 +136140 1734 1491 +136140 1740 1831 +136140 1825 1519 +136140 1840 1463 +136140 1920 1483 +136140 1562 1470 +136140 1798 1913 +136140 1600 1756 +136140 1806 1848 +136140 1806 1811 +136140 1811 1848 +136140 1645 1756 +136160 1591 1818 +136160 1645 1825 +136160 1667 1767 +136160 1669 1754 +136160 1698 1707 +136160 1593 1521 +136160 1600 1645 +136160 1756 1825 +136160 1791 1825 +136160 1818 1858 +136160 1512 1531 +136160 1734 1491 +136160 1740 1831 +136160 1825 1519 +136160 1840 1463 +136160 1920 1483 +136160 1562 1470 +136160 1798 1913 +136160 1600 1756 +136160 1806 1848 +136160 1806 1811 +136160 1811 1848 +136160 1645 1756 +136180 1593 1521 +136180 1600 1645 +136180 1603 1913 +136180 1663 1858 +136180 1689 1503 +136180 1702 1901 +136180 1756 1825 +136180 1791 1825 +136180 1818 1858 +136180 1841 1901 +136180 1914 1448 +136180 1512 1531 +136180 1734 1491 +136180 1740 1831 +136180 1825 1519 +136180 1840 1463 +136180 1538 1524 +136180 1920 1483 +136180 1549 1890 +136180 1562 1470 +136180 1798 1913 +136180 1600 1756 +136180 1806 1848 +136180 1806 1811 +136180 1811 1848 +136180 1645 1756 +136200 1546 1468 +136200 1591 1858 +136200 1670 1908 +136200 1707 1911 +136200 1734 1491 +136200 1740 1831 +136200 1792 1885 +136200 1825 1519 +136200 1840 1463 +136200 1507 1522 +136200 1538 1524 +136200 1920 1483 +136200 1549 1890 +136200 1562 1470 +136200 1798 1913 +136200 1600 1756 +136200 1806 1848 +136200 1806 1811 +136200 1811 1848 +136200 1645 1756 +136220 1538 1524 +136220 1603 1463 +136220 1767 1463 +136220 1825 1524 +136220 1920 1483 +136220 1538 1825 +136220 1593 1521 +136220 1694 1857 +136220 1549 1890 +136220 1562 1470 +136220 1507 1524 +136220 1600 1645 +136220 1798 1913 +136220 1600 1756 +136220 1806 1848 +136220 1806 1811 +136220 1811 1848 +136220 1645 1756 +136240 1538 1825 +136240 1538 1522 +136240 1593 1521 +136240 1670 1908 +136240 1694 1857 +136240 1707 1491 +136240 1708 1887 +136240 1914 1448 +136240 1522 1524 +136240 1549 1890 +136240 1562 1470 +136240 1570 1731 +136240 1857 1463 +136240 1507 1522 +136240 1507 1524 +136240 1562 1463 +136240 1600 1645 +136240 1798 1913 +136240 1600 1756 +136240 1806 1848 +136240 1806 1811 +136240 1811 1848 +136240 1645 1756 +136260 1538 1507 +136260 1549 1890 +136260 1562 1470 +136260 1570 1731 +136260 1708 1911 +136260 1857 1913 +136260 1857 1463 +136260 1507 1522 +136260 1507 1524 +136260 1538 1524 +136260 1562 1463 +136260 1582 1863 +136260 1512 1531 +136260 1600 1645 +136260 1798 1913 +136260 1791 1908 +136260 1600 1756 +136260 1806 1848 +136260 1806 1811 +136260 1811 1848 +136260 1645 1756 +136280 1538 1524 +136280 1562 1463 +136280 1582 1863 +136280 1591 1858 +136280 1512 1531 +136280 1600 1645 +136280 1798 1913 +136280 1791 1908 +136280 1670 1908 +136280 1600 1756 +136280 1806 1848 +136280 1806 1811 +136280 1811 1848 +136280 1645 1756 +136300 1551 1448 +136300 1600 1645 +136300 1695 1518 +136300 1798 1913 +136300 1791 1908 +136300 1549 1890 +136300 1857 1441 +136300 1670 1908 +136300 1600 1756 +136300 1806 1848 +136300 1806 1811 +136300 1811 1848 +136300 1645 1756 +136320 1582 1863 +136320 1792 1885 +136320 1798 1913 +136320 1898 1477 +136320 1562 1463 +136320 1791 1908 +136320 1549 1890 +136320 1857 1441 +136320 1670 1908 +136320 1923 1517 +136320 1600 1756 +136320 1806 1848 +136320 1806 1811 +136320 1811 1848 +136320 1645 1756 +136340 1562 1470 +136340 1562 1463 +136340 1642 1874 +136340 1707 1487 +136340 1767 1913 +136340 1767 1798 +136340 1835 1924 +136340 1840 1913 +136340 1791 1908 +136340 1549 1890 +136340 1857 1441 +136340 1670 1908 +136340 1923 1517 +136340 1600 1756 +136340 1806 1848 +136340 1806 1811 +136340 1811 1848 +136340 1645 1756 +136360 1570 1731 +136360 1600 1645 +136360 1628 1835 +136360 1791 1908 +136360 1877 1913 +136360 1792 1885 +136360 1798 1877 +136360 1549 1890 +136360 1582 1863 +136360 1857 1441 +136360 1670 1908 +136360 1923 1517 +136360 1798 1913 +136360 1600 1756 +136360 1806 1848 +136360 1806 1811 +136360 1811 1848 +136360 1645 1756 +136380 1792 1885 +136380 1798 1877 +136380 1911 1487 +136380 1538 1524 +136380 1549 1890 +136380 1582 1863 +136380 1857 1441 +136380 1670 1908 +136380 1923 1517 +136380 1798 1913 +136380 1600 1756 +136380 1689 1825 +136380 1806 1848 +136380 1806 1811 +136380 1811 1848 +136380 1645 1756 +136400 1538 1524 +136400 1549 1890 +136400 1582 1863 +136400 1600 1519 +136400 1695 1518 +136400 1789 1803 +136400 1847 1455 +136400 1570 1731 +136400 1628 1463 +136400 1669 1754 +136400 1857 1441 +136400 1670 1908 +136400 1601 1911 +136400 1923 1517 +136400 1798 1913 +136400 1600 1756 +136400 1689 1825 +136400 1806 1848 +136400 1806 1811 +136400 1811 1848 +136400 1645 1756 +136420 1570 1731 +136420 1628 1463 +136420 1669 1754 +136420 1710 1768 +136420 1857 1441 +136420 1670 1908 +136420 1792 1885 +136420 1601 1911 +136420 1923 1517 +136420 1798 1913 +136420 1600 1756 +136420 1689 1825 +136420 1806 1848 +136420 1806 1811 +136420 1811 1848 +136420 1645 1756 +136440 1582 1863 +136440 1670 1908 +136440 1695 1759 +136440 1768 1847 +136440 1792 1885 +136440 1818 1858 +136440 1600 1645 +136440 1601 1911 +136440 1923 1517 +136440 1798 1913 +136440 1600 1756 +136440 1689 1825 +136440 1562 1759 +136440 1562 1695 +136440 1806 1848 +136440 1806 1811 +136440 1811 1848 +136440 1645 1756 +136460 1628 1840 +136460 1669 1754 +136460 1835 1847 +136460 1890 1525 +136460 1600 1645 +136460 1601 1911 +136460 1570 1731 +136460 1923 1517 +136460 1798 1913 +136460 1600 1756 +136460 1685 1740 +136460 1689 1825 +136460 1562 1759 +136460 1562 1695 +136460 1806 1848 +136460 1806 1811 +136460 1811 1848 +136460 1645 1756 +136480 1538 1524 +136480 1600 1645 +136480 1601 1911 +136480 1617 1441 +136480 1617 1767 +136480 1628 1463 +136480 1684 1840 +136480 1711 1479 +136480 1740 1847 +136480 1765 1487 +136480 1798 1840 +136480 1570 1731 +136480 1771 1923 +136480 1771 1517 +136480 1923 1517 +136480 1798 1913 +136480 1840 1913 +136480 1600 1756 +136480 1685 1740 +136480 1689 1825 +136480 1873 1887 +136480 1562 1759 +136480 1562 1695 +136480 1806 1848 +136480 1806 1811 +136480 1811 1848 +136480 1645 1756 +136500 1570 1731 +136500 1582 1863 +136500 1645 1519 +136500 1669 1754 +136500 1684 1463 +136500 1767 1840 +136500 1771 1923 +136500 1771 1517 +136500 1923 1517 +136500 1798 1913 +136500 1840 1913 +136500 1600 1756 +136500 1600 1519 +136500 1685 1740 +136500 1689 1825 +136500 1873 1887 +136500 1670 1877 +136500 1562 1759 +136500 1562 1695 +136500 1806 1848 +136500 1806 1811 +136500 1811 1848 +136500 1645 1756 +136520 1634 1491 +136520 1711 1740 +136520 1798 1913 +136520 1840 1913 +136520 1876 1882 +136520 1459 1516 +136520 1460 1499 +136520 1600 1756 +136520 1600 1519 +136520 1617 1857 +136520 1685 1740 +136520 1689 1825 +136520 1873 1887 +136520 1877 1908 +136520 1670 1877 +136520 1789 1803 +136520 1562 1759 +136520 1562 1695 +136520 1806 1848 +136520 1806 1811 +136520 1811 1848 +136520 1645 1756 +136540 1570 1731 +136540 1600 1756 +136540 1600 1645 +136540 1600 1519 +136540 1617 1857 +136540 1617 1441 +136540 1628 1684 +136540 1670 1908 +136540 1685 1740 +136540 1689 1825 +136540 1767 1840 +136540 1818 1858 +136540 1873 1887 +136540 1877 1908 +136540 1670 1877 +136540 1789 1803 +136540 1562 1759 +136540 1562 1695 +136540 1601 1911 +136540 1806 1848 +136540 1806 1811 +136540 1811 1848 +136540 1645 1756 +136560 1670 1877 +136560 1684 1767 +136560 1740 1847 +136560 1789 1803 +136560 1831 1460 +136560 1549 1890 +136560 1562 1759 +136560 1628 1908 +136560 1538 1501 +136560 1562 1695 +136560 1601 1911 +136560 1831 1499 +136560 1806 1848 +136560 1806 1811 +136560 1811 1848 +136560 1798 1913 +136560 1645 1756 +136580 1549 1890 +136580 1562 1759 +136580 1617 1767 +136580 1628 1908 +136580 1645 1519 +136580 1685 1740 +136580 1857 1441 +136580 1538 1501 +136580 1600 1756 +136580 1628 1877 +136580 1689 1825 +136580 1549 1825 +136580 1873 1887 +136580 1562 1695 +136580 1601 1911 +136580 1831 1499 +136580 1806 1848 +136580 1806 1811 +136580 1811 1848 +136580 1877 1908 +136580 1798 1913 +136580 1645 1756 +136600 1538 1501 +136600 1546 1516 +136600 1546 1431 +136600 1600 1756 +136600 1625 1920 +136600 1628 1877 +136600 1684 1913 +136600 1689 1825 +136600 1789 1803 +136600 1792 1872 +136600 1549 1825 +136600 1873 1887 +136600 1562 1695 +136600 1601 1911 +136600 1831 1499 +136600 1831 1460 +136600 1806 1848 +136600 1806 1811 +136600 1811 1848 +136600 1877 1908 +136600 1603 1628 +136600 1798 1913 +136600 1645 1756 +136620 1549 1689 +136620 1549 1825 +136620 1603 1908 +136620 1617 1441 +136620 1685 1740 +136620 1767 1857 +136620 1840 1441 +136620 1873 1887 +136620 1877 1463 +136620 1913 1441 +136620 1512 1531 +136620 1562 1695 +136620 1601 1911 +136620 1767 1441 +136620 1831 1499 +136620 1831 1460 +136620 1460 1499 +136620 1603 1463 +136620 1617 1857 +136620 1806 1848 +136620 1806 1811 +136620 1857 1441 +136620 1811 1848 +136620 1877 1908 +136620 1645 1519 +136620 1603 1628 +136620 1798 1913 +136620 1645 1756 +136640 1543 1676 +136640 1562 1695 +136640 1599 1531 +136640 1601 1911 +136640 1617 1913 +136640 1669 1754 +136640 1676 1434 +136640 1767 1840 +136640 1767 1441 +136640 1768 1847 +136640 1831 1499 +136640 1831 1460 +136640 1887 1477 +136640 1894 1513 +136640 1460 1499 +136640 1549 1890 +136640 1603 1463 +136640 1617 1857 +136640 1628 1463 +136640 1670 1908 +136640 1670 1877 +136640 1789 1803 +136640 1806 1848 +136640 1806 1811 +136640 1854 1513 +136640 1857 1441 +136640 1811 1848 +136640 1600 1756 +136640 1877 1908 +136640 1645 1519 +136640 1603 1628 +136640 1798 1913 +136640 1645 1756 +136660 1542 1907 +136660 1549 1890 +136660 1563 1908 +136660 1570 1731 +136660 1603 1463 +136660 1617 1857 +136660 1628 1463 +136660 1670 1908 +136660 1670 1877 +136660 1708 1501 +136660 1789 1803 +136660 1806 1848 +136660 1806 1811 +136660 1854 1513 +136660 1857 1441 +136660 1873 1887 +136660 1431 1516 +136660 1459 1516 +136660 1538 1524 +136660 1600 1519 +136660 1617 1441 +136660 1811 1848 +136660 1600 1756 +136660 1756 1519 +136660 1877 1908 +136660 1645 1519 +136660 1603 1628 +136660 1798 1913 +136660 1645 1756 +136680 1538 1524 +136680 1600 1519 +136680 1601 1894 +136680 1617 1441 +136680 1634 1491 +136680 1676 1434 +136680 1684 1798 +136680 1689 1825 +136680 1768 1521 +136680 1811 1848 +136680 1600 1756 +136680 1601 1911 +136680 1755 1850 +136680 1755 1868 +136680 1850 1868 +136680 1756 1519 +136680 1877 1908 +136680 1645 1519 +136680 1603 1628 +136680 1798 1913 +136680 1645 1756 +136700 1543 1440 +136700 1543 1513 +136700 1600 1756 +136700 1601 1911 +136700 1603 1463 +136700 1613 1835 +136700 1613 1887 +136700 1617 1767 +136700 1698 1707 +136700 1698 1764 +136700 1755 1850 +136700 1755 1868 +136700 1767 1913 +136700 1840 1463 +136700 1850 1868 +136700 1868 1882 +136700 1898 1477 +136700 1449 1531 +136700 1460 1499 +136700 1562 1695 +136700 1669 1754 +136700 1755 1882 +136700 1756 1519 +136700 1789 1803 +136700 1767 1441 +136700 1877 1908 +136700 1645 1519 +136700 1603 1628 +136700 1798 1913 +136700 1538 1501 +136700 1645 1756 +136720 1562 1759 +136720 1562 1695 +136720 1600 1519 +136720 1642 1835 +136720 1645 1890 +136720 1669 1754 +136720 1684 1463 +136720 1755 1882 +136720 1756 1519 +136720 1789 1803 +136720 1894 1516 +136720 1501 1524 +136720 1767 1441 +136720 1767 1840 +136720 1877 1908 +136720 1645 1519 +136720 1890 1519 +136720 1603 1628 +136720 1798 1913 +136720 1538 1501 +136720 1645 1756 +136740 1538 1524 +136740 1570 1731 +136740 1603 1463 +136740 1617 1857 +136740 1628 1463 +136740 1676 1440 +136740 1727 1434 +136740 1767 1441 +136740 1790 1498 +136740 1840 1913 +136740 1840 1857 +136740 1767 1840 +136740 1840 1441 +136740 1877 1908 +136740 1645 1519 +136740 1698 1707 +136740 1890 1519 +136740 1908 1479 +136740 1603 1628 +136740 1798 1913 +136740 1538 1501 +136740 1645 1756 +136760 1562 1759 +136760 1600 1890 +136760 1600 1756 +136760 1601 1911 +136760 1645 1890 +136760 1669 1754 +136760 1676 1740 +136760 1689 1924 +136760 1711 1908 +136760 1756 1890 +136760 1767 1840 +136760 1840 1441 +136760 1877 1908 +136760 1501 1524 +136760 1645 1519 +136760 1698 1707 +136760 1877 1479 +136760 1890 1519 +136760 1600 1519 +136760 1711 1877 +136760 1752 1766 +136760 1756 1519 +136760 1667 1487 +136760 1908 1479 +136760 1603 1628 +136760 1798 1913 +136760 1711 1479 +136760 1538 1501 +136760 1645 1756 +136780 1617 1924 +136780 1645 1519 +136780 1689 1825 +136780 1698 1707 +136780 1711 1920 +136780 1857 1441 +136780 1877 1479 +136780 1890 1519 +136780 1543 1513 +136780 1570 1731 +136780 1600 1519 +136780 1711 1877 +136780 1752 1766 +136780 1756 1519 +136780 1789 1803 +136780 1667 1487 +136780 1908 1479 +136780 1603 1628 +136780 1798 1913 +136780 1711 1479 +136780 1538 1501 +136780 1549 1890 +136780 1645 1756 +136800 1543 1513 +136800 1570 1731 +136800 1600 1825 +136800 1600 1519 +136800 1711 1877 +136800 1752 1766 +136800 1756 1519 +136800 1767 1924 +136800 1789 1803 +136800 1924 1441 +136800 1825 1519 +136800 1667 1505 +136800 1667 1487 +136800 1667 1893 +136800 1487 1505 +136800 1711 1908 +136800 1877 1908 +136800 1908 1479 +136800 1603 1628 +136800 1798 1913 +136800 1711 1479 +136800 1538 1501 +136800 1549 1890 +136800 1645 1756 +136820 1617 1857 +136820 1684 1840 +136820 1684 1767 +136820 1756 1825 +136820 1767 1857 +136820 1825 1519 +136820 1617 1767 +136820 1877 1479 +136820 1887 1477 +136820 1578 1497 +136820 1578 1667 +136820 1667 1505 +136820 1667 1487 +136820 1893 1497 +136820 1487 1497 +136820 1497 1505 +136820 1578 1505 +136820 1667 1893 +136820 1893 1505 +136820 1487 1505 +136820 1578 1893 +136820 1578 1487 +136820 1711 1908 +136820 1877 1908 +136820 1893 1487 +136820 1908 1479 +136820 1603 1628 +136820 1798 1913 +136820 1711 1479 +136820 1538 1501 +136820 1562 1695 +136820 1549 1890 +136820 1645 1756 +136840 1538 1524 +136840 1600 1825 +136840 1617 1441 +136840 1625 1887 +136840 1634 1734 +136840 1667 1512 +136840 1711 1877 +136840 1727 1845 +136840 1767 1441 +136840 1767 1857 +136840 1768 1772 +136840 1825 1519 +136840 1840 1441 +136840 1907 1438 +136840 1505 1512 +136840 1601 1911 +136840 1617 1767 +136840 1877 1479 +136840 1887 1477 +136840 1578 1497 +136840 1578 1667 +136840 1667 1505 +136840 1667 1487 +136840 1893 1497 +136840 1487 1497 +136840 1497 1505 +136840 1578 1505 +136840 1667 1893 +136840 1893 1512 +136840 1893 1505 +136840 1487 1505 +136840 1578 1893 +136840 1578 1487 +136840 1711 1908 +136840 1877 1908 +136840 1893 1487 +136840 1908 1479 +136840 1603 1628 +136840 1798 1913 +136840 1711 1479 +136840 1538 1501 +136840 1562 1695 +136840 1549 1890 +136840 1645 1756 +136860 1578 1446 +136860 1600 1525 +136860 1601 1911 +136860 1617 1767 +136860 1667 1446 +136860 1767 1798 +136860 1767 1913 +136860 1877 1479 +136860 1887 1477 +136860 1446 1505 +136860 1446 1512 +136860 1446 1487 +136860 1446 1497 +136860 1578 1497 +136860 1578 1667 +136860 1667 1505 +136860 1667 1487 +136860 1789 1803 +136860 1893 1497 +136860 1487 1497 +136860 1497 1505 +136860 1578 1505 +136860 1667 1893 +136860 1893 1512 +136860 1893 1505 +136860 1487 1505 +136860 1578 1893 +136860 1578 1487 +136860 1711 1908 +136860 1877 1908 +136860 1893 1487 +136860 1908 1479 +136860 1603 1628 +136860 1798 1913 +136860 1562 1759 +136860 1680 1772 +136860 1711 1479 +136860 1538 1501 +136860 1562 1695 +136860 1549 1890 +136860 1645 1756 +136880 1549 1525 +136880 1563 1696 +136880 1578 1497 +136880 1578 1667 +136880 1667 1505 +136880 1667 1487 +136880 1684 1840 +136880 1789 1803 +136880 1893 1497 +136880 1487 1512 +136880 1487 1497 +136880 1497 1505 +136880 1578 1505 +136880 1667 1893 +136880 1893 1512 +136880 1893 1505 +136880 1487 1505 +136880 1578 1893 +136880 1578 1487 +136880 1711 1908 +136880 1877 1908 +136880 1893 1487 +136880 1908 1479 +136880 1538 1524 +136880 1603 1628 +136880 1798 1913 +136880 1562 1759 +136880 1680 1772 +136880 1711 1877 +136880 1711 1479 +136880 1538 1501 +136880 1562 1695 +136880 1549 1890 +136880 1645 1756 +136900 1563 1648 +136900 1578 1505 +136900 1601 1911 +136900 1667 1893 +136900 1676 1439 +136900 1774 1444 +136900 1857 1441 +136900 1893 1512 +136900 1893 1505 +136900 1487 1505 +136900 1501 1524 +136900 1505 1512 +136900 1578 1893 +136900 1578 1487 +136900 1711 1908 +136900 1877 1908 +136900 1893 1487 +136900 1908 1479 +136900 1617 1857 +136900 1538 1524 +136900 1603 1628 +136900 1798 1913 +136900 1562 1759 +136900 1680 1772 +136900 1669 1754 +136900 1711 1877 +136900 1711 1479 +136900 1538 1501 +136900 1562 1695 +136900 1877 1479 +136900 1549 1890 +136900 1645 1756 +136920 1578 1512 +136920 1578 1893 +136920 1578 1487 +136920 1642 1427 +136920 1684 1840 +136920 1688 1531 +136920 1711 1908 +136920 1877 1908 +136920 1887 1492 +136920 1893 1487 +136920 1907 1438 +136920 1908 1479 +136920 1549 1525 +136920 1617 1857 +136920 1890 1525 +136920 1538 1524 +136920 1603 1628 +136920 1798 1913 +136920 1562 1759 +136920 1680 1772 +136920 1669 1754 +136920 1711 1877 +136920 1711 1479 +136920 1538 1501 +136920 1570 1731 +136920 1908 1920 +136920 1562 1695 +136920 1877 1479 +136920 1549 1890 +136920 1645 1756 +136940 1549 1525 +136940 1617 1857 +136940 1688 1717 +136940 1727 1845 +136940 1890 1525 +136940 1538 1524 +136940 1603 1628 +136940 1684 1857 +136940 1798 1913 +136940 1767 1840 +136940 1501 1524 +136940 1562 1759 +136940 1680 1772 +136940 1669 1754 +136940 1711 1877 +136940 1711 1479 +136940 1538 1501 +136940 1570 1731 +136940 1908 1920 +136940 1562 1695 +136940 1877 1479 +136940 1549 1890 +136940 1645 1756 +136960 1538 1524 +136960 1603 1628 +136960 1617 1441 +136960 1677 1701 +136960 1684 1857 +136960 1688 1877 +136960 1688 1711 +136960 1798 1913 +136960 1887 1427 +136960 1767 1840 +136960 1789 1803 +136960 1501 1524 +136960 1562 1759 +136960 1680 1772 +136960 1669 1754 +136960 1711 1877 +136960 1711 1479 +136960 1538 1501 +136960 1570 1731 +136960 1908 1920 +136960 1562 1695 +136960 1877 1479 +136960 1549 1890 +136960 1645 1756 +136980 1569 1742 +136980 1676 1439 +136980 1689 1805 +136980 1727 1434 +136980 1767 1840 +136980 1617 1857 +136980 1789 1803 +136980 1887 1440 +136980 1501 1524 +136980 1562 1759 +136980 1680 1772 +136980 1669 1754 +136980 1711 1877 +136980 1711 1479 +136980 1538 1501 +136980 1570 1731 +136980 1908 1920 +136980 1562 1695 +136980 1572 1647 +136980 1877 1479 +136980 1549 1890 +136980 1645 1756 +137000 1549 1525 +137000 1617 1857 +137000 1617 1684 +137000 1628 1463 +137000 1659 1717 +137000 1789 1803 +137000 1882 1503 +137000 1887 1440 +137000 1890 1525 +137000 1501 1524 +137000 1562 1759 +137000 1617 1441 +137000 1680 1772 +137000 1664 1821 +137000 1669 1754 +137000 1711 1877 +137000 1711 1479 +137000 1538 1501 +137000 1570 1731 +137000 1908 1920 +137000 1562 1695 +137000 1572 1647 +137000 1877 1479 +137000 1549 1890 +137000 1645 1756 +137020 1562 1752 +137020 1562 1759 +137020 1569 1512 +137020 1569 1626 +137020 1569 1742 +137020 1616 1518 +137020 1617 1441 +137020 1626 1774 +137020 1630 1761 +137020 1680 1772 +137020 1742 1512 +137020 1767 1857 +137020 1664 1821 +137020 1669 1754 +137020 1711 1877 +137020 1711 1479 +137020 1440 1477 +137020 1538 1501 +137020 1570 1731 +137020 1603 1628 +137020 1908 1920 +137020 1798 1913 +137020 1562 1695 +137020 1572 1647 +137020 1877 1479 +137020 1549 1890 +137020 1645 1756 +137040 1543 1550 +137040 1617 1798 +137040 1664 1821 +137040 1669 1754 +137040 1549 1525 +137040 1711 1877 +137040 1711 1479 +137040 1718 1889 +137040 1440 1477 +137040 1538 1501 +137040 1570 1731 +137040 1603 1628 +137040 1501 1524 +137040 1887 1440 +137040 1908 1920 +137040 1798 1913 +137040 1562 1695 +137040 1572 1647 +137040 1877 1479 +137040 1549 1890 +137040 1645 1756 +137060 1540 1542 +137060 1549 1525 +137060 1579 1708 +137060 1642 1790 +137060 1664 1490 +137060 1711 1877 +137060 1711 1479 +137060 1718 1889 +137060 1727 1434 +137060 1731 1874 +137060 1767 1840 +137060 1440 1477 +137060 1538 1501 +137060 1570 1731 +137060 1603 1628 +137060 1684 1840 +137060 1752 1767 +137060 1501 1524 +137060 1887 1440 +137060 1908 1920 +137060 1798 1913 +137060 1680 1772 +137060 1562 1695 +137060 1572 1647 +137060 1877 1479 +137060 1549 1890 +137060 1645 1756 +137080 1538 1524 +137080 1538 1501 +137080 1570 1731 +137080 1603 1628 +137080 1664 1761 +137080 1684 1840 +137080 1695 1759 +137080 1752 1767 +137080 1915 1473 +137080 1562 1759 +137080 1664 1821 +137080 1501 1524 +137080 1887 1440 +137080 1908 1920 +137080 1798 1913 +137080 1680 1772 +137080 1562 1695 +137080 1670 1479 +137080 1572 1647 +137080 1877 1479 +137080 1549 1890 +137080 1645 1756 +137100 1550 1727 +137100 1562 1759 +137100 1664 1821 +137100 1669 1754 +137100 1684 1857 +137100 1756 1825 +137100 1825 1519 +137100 1600 1519 +137100 1708 1760 +137100 1440 1477 +137100 1501 1524 +137100 1670 1877 +137100 1887 1440 +137100 1908 1920 +137100 1727 1434 +137100 1798 1913 +137100 1680 1772 +137100 1562 1695 +137100 1670 1479 +137100 1598 1514 +137100 1572 1647 +137100 1877 1479 +137100 1549 1890 +137100 1645 1756 +137120 1549 1525 +137120 1600 1519 +137120 1617 1441 +137120 1630 1761 +137120 1630 1708 +137120 1706 1708 +137120 1708 1760 +137120 1708 1761 +137120 1752 1913 +137120 1440 1477 +137120 1501 1524 +137120 1603 1628 +137120 1670 1877 +137120 1887 1440 +137120 1890 1525 +137120 1908 1920 +137120 1563 1717 +137120 1727 1434 +137120 1798 1913 +137120 1680 1772 +137120 1600 1825 +137120 1562 1695 +137120 1670 1479 +137120 1598 1514 +137120 1572 1647 +137120 1877 1479 +137120 1549 1890 +137120 1645 1756 +137140 1603 1628 +137140 1617 1752 +137140 1630 1706 +137140 1648 1696 +137140 1670 1877 +137140 1752 1798 +137140 1761 1493 +137140 1789 1803 +137140 1887 1440 +137140 1890 1525 +137140 1908 1920 +137140 1563 1717 +137140 1727 1434 +137140 1798 1913 +137140 1669 1754 +137140 1680 1772 +137140 1600 1825 +137140 1538 1501 +137140 1562 1695 +137140 1670 1479 +137140 1598 1514 +137140 1572 1647 +137140 1877 1479 +137140 1549 1890 +137140 1645 1756 +137160 1562 1759 +137160 1563 1717 +137160 1570 1731 +137160 1727 1434 +137160 1760 1761 +137160 1767 1840 +137160 1798 1913 +137160 1669 1754 +137160 1680 1772 +137160 1802 1495 +137160 1600 1825 +137160 1513 1518 +137160 1538 1501 +137160 1562 1695 +137160 1670 1479 +137160 1598 1514 +137160 1572 1647 +137160 1877 1479 +137160 1549 1890 +137160 1645 1756 +137180 1555 1572 +137180 1603 1628 +137180 1669 1754 +137180 1680 1772 +137180 1802 1495 +137180 1501 1524 +137180 1600 1825 +137180 1670 1877 +137180 1708 1760 +137180 1908 1920 +137180 1513 1518 +137180 1538 1501 +137180 1562 1695 +137180 1670 1479 +137180 1907 1438 +137180 1598 1514 +137180 1761 1493 +137180 1572 1647 +137180 1877 1479 +137180 1549 1890 +137180 1645 1756 +137200 1562 1759 +137200 1600 1825 +137200 1617 1752 +137200 1628 1754 +137200 1634 1734 +137200 1670 1877 +137200 1676 1526 +137200 1708 1760 +137200 1789 1803 +137200 1908 1920 +137200 1513 1518 +137200 1538 1501 +137200 1562 1695 +137200 1600 1519 +137200 1670 1479 +137200 1907 1438 +137200 1598 1514 +137200 1761 1493 +137200 1572 1647 +137200 1877 1479 +137200 1711 1908 +137200 1549 1890 +137200 1645 1756 +137200 1727 1434 +137220 1538 1501 +137220 1562 1695 +137220 1579 1887 +137220 1600 1519 +137220 1664 1821 +137220 1670 1479 +137220 1711 1920 +137220 1749 1807 +137220 1752 1767 +137220 1756 1519 +137220 1821 1455 +137220 1907 1438 +137220 1915 1473 +137220 1598 1514 +137220 1645 1519 +137220 1752 1840 +137220 1752 1766 +137220 1761 1493 +137220 1572 1647 +137220 1798 1913 +137220 1877 1479 +137220 1603 1628 +137220 1711 1908 +137220 1501 1524 +137220 1549 1890 +137220 1645 1756 +137220 1727 1434 +137240 1568 1840 +137240 1568 1441 +137240 1568 1767 +137240 1572 1882 +137240 1598 1514 +137240 1645 1519 +137240 1647 1700 +137240 1647 1882 +137240 1708 1760 +137240 1752 1840 +137240 1752 1766 +137240 1761 1493 +137240 1767 1840 +137240 1789 1803 +137240 1563 1618 +137240 1570 1731 +137240 1572 1647 +137240 1711 1877 +137240 1572 1700 +137240 1700 1882 +137240 1798 1913 +137240 1877 1479 +137240 1600 1645 +137240 1600 1756 +137240 1603 1628 +137240 1711 1908 +137240 1711 1479 +137240 1877 1908 +137240 1501 1524 +137240 1549 1890 +137240 1645 1756 +137240 1908 1479 +137240 1727 1434 +137260 1538 1524 +137260 1562 1759 +137260 1563 1618 +137260 1568 1470 +137260 1570 1731 +137260 1572 1604 +137260 1572 1647 +137260 1604 1700 +137260 1613 1435 +137260 1670 1711 +137260 1711 1877 +137260 1513 1518 +137260 1538 1501 +137260 1572 1700 +137260 1700 1882 +137260 1749 1490 +137260 1798 1913 +137260 1840 1857 +137260 1877 1479 +137260 1887 1440 +137260 1600 1645 +137260 1617 1441 +137260 1670 1908 +137260 1600 1756 +137260 1603 1628 +137260 1680 1772 +137260 1670 1479 +137260 1711 1908 +137260 1711 1479 +137260 1877 1908 +137260 1501 1524 +137260 1549 1890 +137260 1645 1756 +137260 1908 1479 +137260 1727 1434 +137260 1500 1511 +137280 1538 1501 +137280 1572 1700 +137280 1630 1761 +137280 1700 1882 +137280 1749 1490 +137280 1752 1840 +137280 1798 1913 +137280 1840 1857 +137280 1877 1479 +137280 1887 1440 +137280 1600 1645 +137280 1617 1441 +137280 1670 1908 +137280 1600 1756 +137280 1603 1628 +137280 1680 1772 +137280 1598 1514 +137280 1670 1479 +137280 1711 1908 +137280 1711 1479 +137280 1877 1908 +137280 1501 1524 +137280 1562 1470 +137280 1549 1890 +137280 1645 1756 +137280 1908 1479 +137280 1727 1434 +137280 1500 1511 +137300 1570 1731 +137300 1600 1645 +137300 1617 1441 +137300 1670 1908 +137300 1752 1798 +137300 1600 1756 +137300 1603 1628 +137300 1680 1772 +137300 1767 1840 +137300 1598 1514 +137300 1670 1479 +137300 1711 1908 +137300 1711 1479 +137300 1877 1908 +137300 1921 1462 +137300 1501 1524 +137300 1562 1470 +137300 1549 1890 +137300 1645 1756 +137300 1908 1479 +137300 1727 1434 +137300 1500 1511 +137320 1546 1431 +137320 1552 1490 +137320 1562 1798 +137320 1600 1756 +137320 1603 1628 +137320 1617 1766 +137320 1630 1438 +137320 1669 1754 +137320 1670 1711 +137320 1680 1772 +137320 1718 1889 +137320 1718 1847 +137320 1752 1840 +137320 1767 1840 +137320 1538 1501 +137320 1598 1514 +137320 1613 1435 +137320 1670 1479 +137320 1711 1908 +137320 1711 1479 +137320 1752 1766 +137320 1798 1913 +137320 1877 1908 +137320 1921 1462 +137320 1501 1524 +137320 1562 1470 +137320 1549 1890 +137320 1645 1756 +137320 1908 1479 +137320 1727 1434 +137320 1500 1511 +137340 1538 1524 +137340 1538 1501 +137340 1598 1514 +137340 1613 1435 +137340 1617 1840 +137340 1617 1767 +137340 1642 1761 +137340 1670 1908 +137340 1670 1479 +137340 1711 1908 +137340 1711 1479 +137340 1752 1766 +137340 1798 1913 +137340 1877 1908 +137340 1890 1525 +137340 1921 1462 +137340 1501 1524 +137340 1562 1470 +137340 1761 1493 +137340 1430 1531 +137340 1549 1890 +137340 1603 1794 +137340 1617 1684 +137340 1645 1756 +137340 1603 1525 +137340 1908 1479 +137340 1727 1434 +137340 1500 1511 +137360 1562 1470 +137360 1628 1463 +137360 1680 1772 +137360 1761 1493 +137360 1789 1803 +137360 1908 1434 +137360 1430 1531 +137360 1549 1890 +137360 1603 1794 +137360 1617 1857 +137360 1684 1857 +137360 1617 1684 +137360 1645 1756 +137360 1603 1525 +137360 1908 1479 +137360 1600 1756 +137360 1727 1434 +137360 1500 1511 +137360 1917 1500 +137360 1917 1511 +137380 1549 1890 +137380 1574 1471 +137380 1600 1645 +137380 1603 1794 +137380 1603 1756 +137380 1617 1857 +137380 1670 1877 +137380 1684 1857 +137380 1847 1490 +137380 1898 1477 +137380 1907 1438 +137380 1538 1501 +137380 1549 1645 +137380 1617 1684 +137380 1645 1756 +137380 1921 1462 +137380 1574 1791 +137380 1656 1825 +137380 1677 1701 +137380 1603 1525 +137380 1908 1479 +137380 1570 1731 +137380 1598 1514 +137380 1549 1600 +137380 1549 1756 +137380 1600 1756 +137380 1727 1434 +137380 1500 1511 +137380 1917 1500 +137380 1917 1511 +137400 1538 1524 +137400 1538 1501 +137400 1549 1645 +137400 1617 1684 +137400 1645 1756 +137400 1921 1462 +137400 1501 1524 +137400 1545 1531 +137400 1574 1791 +137400 1628 1857 +137400 1656 1825 +137400 1677 1701 +137400 1603 1525 +137400 1628 1684 +137400 1430 1531 +137400 1449 1531 +137400 1669 1754 +137400 1689 1458 +137400 1789 1803 +137400 1798 1913 +137400 1908 1479 +137400 1680 1772 +137400 1570 1731 +137400 1598 1514 +137400 1549 1600 +137400 1549 1756 +137400 1600 1756 +137400 1727 1434 +137400 1500 1511 +137400 1917 1500 +137400 1917 1511 +137420 1545 1531 +137420 1574 1713 +137420 1574 1791 +137420 1603 1825 +137420 1628 1857 +137420 1656 1825 +137420 1677 1701 +137420 1684 1857 +137420 1774 1471 +137420 1887 1440 +137420 1563 1592 +137420 1603 1525 +137420 1628 1684 +137420 1430 1531 +137420 1449 1531 +137420 1669 1754 +137420 1689 1458 +137420 1718 1889 +137420 1789 1803 +137420 1630 1761 +137420 1798 1913 +137420 1908 1479 +137420 1680 1772 +137420 1570 1731 +137420 1598 1514 +137420 1549 1600 +137420 1549 1756 +137420 1600 1756 +137420 1727 1434 +137420 1911 1500 +137420 1500 1511 +137420 1911 1511 +137420 1917 1500 +137420 1917 1511 +137420 1911 1917 +137440 1546 1461 +137440 1563 1592 +137440 1603 1525 +137440 1628 1684 +137440 1695 1759 +137440 1708 1760 +137440 1752 1766 +137440 1430 1531 +137440 1449 1531 +137440 1669 1754 +137440 1670 1877 +137440 1689 1458 +137440 1718 1889 +137440 1789 1803 +137440 1825 1830 +137440 1630 1761 +137440 1798 1913 +137440 1908 1479 +137440 1921 1462 +137440 1680 1772 +137440 1570 1731 +137440 1598 1514 +137440 1756 1890 +137440 1549 1600 +137440 1549 1756 +137440 1600 1756 +137440 1727 1434 +137440 1911 1500 +137440 1500 1511 +137440 1911 1511 +137440 1917 1500 +137440 1917 1511 +137440 1649 1917 +137440 1911 1917 +137460 1669 1754 +137460 1670 1877 +137460 1677 1462 +137460 1689 1458 +137460 1718 1889 +137460 1789 1803 +137460 1825 1830 +137460 1907 1438 +137460 1630 1761 +137460 1798 1913 +137460 1908 1479 +137460 1921 1462 +137460 1680 1772 +137460 1570 1731 +137460 1598 1514 +137460 1600 1890 +137460 1549 1890 +137460 1756 1890 +137460 1549 1600 +137460 1549 1756 +137460 1600 1756 +137460 1727 1434 +137460 1649 1500 +137460 1911 1500 +137460 1500 1511 +137460 1649 1511 +137460 1911 1511 +137460 1917 1500 +137460 1917 1511 +137460 1649 1917 +137460 1649 1911 +137460 1911 1917 +137480 1539 1434 +137480 1600 1645 +137480 1617 1752 +137480 1630 1761 +137480 1684 1913 +137480 1713 1512 +137480 1713 1471 +137480 1718 1768 +137480 1798 1913 +137480 1908 1479 +137480 1921 1462 +137480 1430 1531 +137480 1449 1521 +137480 1501 1524 +137480 1680 1772 +137480 1752 1766 +137480 1562 1449 +137480 1563 1592 +137480 1562 1521 +137480 1570 1731 +137480 1598 1514 +137480 1645 1756 +137480 1600 1890 +137480 1549 1890 +137480 1550 1794 +137480 1756 1890 +137480 1549 1600 +137480 1549 1756 +137480 1600 1756 +137480 1727 1434 +137480 1649 1500 +137480 1911 1500 +137480 1500 1511 +137480 1649 1511 +137480 1911 1511 +137480 1917 1500 +137480 1917 1511 +137480 1649 1917 +137480 1649 1911 +137480 1911 1917 +137500 1617 1913 +137500 1680 1772 +137500 1695 1759 +137500 1752 1766 +137500 1887 1440 +137500 1562 1449 +137500 1563 1592 +137500 1562 1521 +137500 1570 1731 +137500 1598 1514 +137500 1645 1756 +137500 1789 1803 +137500 1600 1890 +137500 1689 1458 +137500 1549 1890 +137500 1550 1794 +137500 1756 1890 +137500 1549 1600 +137500 1549 1756 +137500 1600 1756 +137500 1727 1434 +137500 1649 1500 +137500 1911 1500 +137500 1500 1511 +137500 1649 1511 +137500 1911 1511 +137500 1917 1500 +137500 1917 1511 +137500 1649 1917 +137500 1649 1911 +137500 1911 1917 +137520 1562 1449 +137520 1563 1592 +137520 1600 1645 +137520 1630 1493 +137520 1670 1527 +137520 1805 1512 +137520 1921 1462 +137520 1449 1521 +137520 1562 1521 +137520 1570 1731 +137520 1598 1514 +137520 1645 1756 +137520 1789 1803 +137520 1550 1603 +137520 1600 1890 +137520 1617 1857 +137520 1689 1458 +137520 1908 1479 +137520 1617 1441 +137520 1430 1531 +137520 1549 1890 +137520 1550 1794 +137520 1756 1890 +137520 1549 1600 +137520 1549 1756 +137520 1600 1756 +137520 1727 1434 +137520 1649 1500 +137520 1911 1500 +137520 1500 1511 +137520 1649 1511 +137520 1911 1511 +137520 1917 1500 +137520 1917 1511 +137520 1649 1917 +137520 1649 1911 +137520 1911 1917 +137540 1550 1527 +137540 1562 1521 +137540 1570 1731 +137540 1574 1531 +137540 1598 1514 +137540 1645 1756 +137540 1756 1525 +137540 1789 1803 +137540 1825 1830 +137540 1550 1603 +137540 1600 1890 +137540 1603 1695 +137540 1798 1913 +137540 1617 1857 +137540 1689 1458 +137540 1908 1479 +137540 1550 1695 +137540 1617 1441 +137540 1430 1531 +137540 1549 1890 +137540 1550 1794 +137540 1756 1890 +137540 1545 1531 +137540 1549 1600 +137540 1549 1756 +137540 1600 1756 +137540 1857 1441 +137540 1727 1434 +137540 1649 1500 +137540 1911 1500 +137540 1500 1511 +137540 1649 1511 +137540 1911 1511 +137540 1917 1500 +137540 1917 1511 +137540 1649 1917 +137540 1649 1911 +137540 1911 1917 +137560 1546 1459 +137560 1550 1603 +137560 1600 1890 +137560 1603 1794 +137560 1603 1695 +137560 1670 1434 +137560 1798 1913 +137560 1915 1473 +137560 1617 1857 +137560 1670 1825 +137560 1670 1711 +137560 1689 1458 +137560 1908 1479 +137560 1550 1695 +137560 1600 1645 +137560 1603 1752 +137560 1603 1766 +137560 1617 1441 +137560 1430 1531 +137560 1549 1890 +137560 1550 1794 +137560 1711 1825 +137560 1756 1890 +137560 1545 1531 +137560 1549 1600 +137560 1549 1756 +137560 1600 1756 +137560 1857 1441 +137560 1680 1772 +137560 1727 1434 +137560 1649 1500 +137560 1911 1500 +137560 1500 1511 +137560 1649 1511 +137560 1911 1511 +137560 1917 1500 +137560 1917 1511 +137560 1649 1917 +137560 1649 1911 +137560 1911 1917 +137580 1550 1527 +137580 1598 1514 +137580 1617 1857 +137580 1669 1754 +137580 1670 1825 +137580 1670 1711 +137580 1689 1458 +137580 1825 1434 +137580 1908 1479 +137580 1550 1695 +137580 1600 1645 +137580 1603 1752 +137580 1603 1766 +137580 1617 1441 +137580 1645 1756 +137580 1907 1438 +137580 1430 1531 +137580 1549 1890 +137580 1550 1794 +137580 1562 1449 +137580 1562 1521 +137580 1711 1825 +137580 1752 1766 +137580 1756 1890 +137580 1545 1531 +137580 1549 1600 +137580 1549 1756 +137580 1600 1756 +137580 1562 1574 +137580 1857 1441 +137580 1680 1772 +137580 1727 1434 +137580 1649 1500 +137580 1911 1500 +137580 1500 1511 +137580 1649 1511 +137580 1911 1511 +137580 1917 1500 +137580 1917 1511 +137580 1649 1917 +137580 1649 1911 +137580 1911 1917 +137600 1550 1695 +137600 1600 1645 +137600 1603 1752 +137600 1603 1766 +137600 1617 1441 +137600 1645 1756 +137600 1752 1514 +137600 1890 1525 +137600 1894 1491 +137600 1894 1516 +137600 1907 1438 +137600 1915 1473 +137600 1430 1531 +137600 1549 1890 +137600 1550 1794 +137600 1562 1449 +137600 1562 1521 +137600 1574 1449 +137600 1574 1521 +137600 1711 1825 +137600 1630 1493 +137600 1752 1766 +137600 1756 1890 +137600 1570 1731 +137600 1798 1913 +137600 1545 1531 +137600 1549 1600 +137600 1549 1756 +137600 1600 1756 +137600 1630 1761 +137600 1562 1574 +137600 1857 1441 +137600 1680 1772 +137600 1727 1434 +137600 1649 1500 +137600 1911 1500 +137600 1500 1511 +137600 1649 1511 +137600 1911 1511 +137600 1917 1500 +137600 1917 1511 +137600 1649 1917 +137600 1649 1911 +137600 1911 1917 +137620 1549 1890 +137620 1550 1794 +137620 1562 1449 +137620 1562 1521 +137620 1574 1449 +137620 1574 1521 +137620 1689 1458 +137620 1711 1825 +137620 1756 1825 +137620 1630 1493 +137620 1711 1890 +137620 1752 1766 +137620 1756 1890 +137620 1550 1527 +137620 1570 1731 +137620 1798 1913 +137620 1545 1531 +137620 1549 1600 +137620 1549 1756 +137620 1600 1756 +137620 1630 1761 +137620 1825 1890 +137620 1562 1574 +137620 1857 1441 +137620 1680 1772 +137620 1727 1434 +137620 1649 1500 +137620 1911 1500 +137620 1500 1511 +137620 1649 1511 +137620 1911 1511 +137620 1917 1500 +137620 1917 1511 +137620 1649 1917 +137620 1649 1911 +137620 1911 1917 +137640 1546 1434 +137640 1563 1592 +137640 1630 1493 +137640 1645 1756 +137640 1711 1890 +137640 1752 1766 +137640 1756 1890 +137640 1756 1525 +137640 1825 1434 +137640 1890 1525 +137640 1920 1434 +137640 1538 1501 +137640 1545 1430 +137640 1550 1527 +137640 1570 1731 +137640 1593 1441 +137640 1789 1803 +137640 1798 1913 +137640 1545 1531 +137640 1549 1600 +137640 1549 1756 +137640 1549 1645 +137640 1593 1617 +137640 1600 1756 +137640 1600 1645 +137640 1630 1761 +137640 1688 1854 +137640 1825 1890 +137640 1430 1531 +137640 1562 1574 +137640 1857 1441 +137640 1680 1772 +137640 1727 1434 +137640 1649 1500 +137640 1911 1500 +137640 1500 1511 +137640 1649 1511 +137640 1911 1511 +137640 1917 1500 +137640 1917 1511 +137640 1649 1917 +137640 1649 1911 +137640 1911 1917 +137640 1550 1603 +137660 1538 1501 +137660 1545 1430 +137660 1546 1890 +137660 1550 1527 +137660 1570 1731 +137660 1574 1521 +137660 1593 1441 +137660 1603 1794 +137660 1754 1840 +137660 1789 1803 +137660 1798 1913 +137660 1501 1524 +137660 1545 1531 +137660 1549 1600 +137660 1549 1756 +137660 1549 1645 +137660 1593 1617 +137660 1600 1756 +137660 1600 1645 +137660 1630 1761 +137660 1688 1854 +137660 1825 1890 +137660 1689 1458 +137660 1727 1890 +137660 1430 1531 +137660 1562 1574 +137660 1857 1441 +137660 1550 1794 +137660 1680 1772 +137660 1727 1434 +137660 1649 1500 +137660 1911 1500 +137660 1500 1511 +137660 1649 1511 +137660 1911 1511 +137660 1917 1500 +137660 1917 1511 +137660 1649 1917 +137660 1649 1911 +137660 1911 1917 +137660 1550 1603 +137680 1545 1531 +137680 1549 1600 +137680 1549 1756 +137680 1549 1645 +137680 1593 1617 +137680 1600 1756 +137680 1600 1645 +137680 1630 1761 +137680 1688 1854 +137680 1752 1766 +137680 1756 1525 +137680 1825 1890 +137680 1825 1525 +137680 1550 1695 +137680 1591 1858 +137680 1603 1695 +137680 1645 1756 +137680 1689 1458 +137680 1727 1890 +137680 1890 1525 +137680 1430 1531 +137680 1562 1574 +137680 1857 1441 +137680 1550 1794 +137680 1680 1772 +137680 1727 1434 +137680 1649 1500 +137680 1911 1500 +137680 1500 1511 +137680 1649 1511 +137680 1911 1511 +137680 1917 1500 +137680 1917 1511 +137680 1649 1917 +137680 1649 1911 +137680 1911 1917 +137680 1550 1603 +137700 1538 1501 +137700 1550 1695 +137700 1591 1858 +137700 1593 1441 +137700 1600 1825 +137700 1603 1695 +137700 1645 1756 +137700 1689 1458 +137700 1727 1890 +137700 1789 1803 +137700 1890 1434 +137700 1890 1525 +137700 1913 1441 +137700 1920 1525 +137700 1430 1531 +137700 1562 1574 +137700 1857 1441 +137700 1550 1794 +137700 1562 1521 +137700 1680 1772 +137700 1718 1889 +137700 1727 1434 +137700 1798 1913 +137700 1649 1500 +137700 1911 1500 +137700 1500 1511 +137700 1649 1511 +137700 1911 1511 +137700 1917 1500 +137700 1917 1511 +137700 1649 1917 +137700 1649 1911 +137700 1911 1917 +137700 1549 1525 +137700 1550 1603 +137720 1546 1459 +137720 1550 1527 +137720 1562 1574 +137720 1574 1521 +137720 1727 1825 +137720 1857 1441 +137720 1550 1794 +137720 1562 1521 +137720 1603 1794 +137720 1688 1854 +137720 1924 1478 +137720 1630 1493 +137720 1684 1470 +137720 1630 1761 +137720 1680 1772 +137720 1718 1889 +137720 1825 1890 +137720 1727 1434 +137720 1570 1731 +137720 1798 1913 +137720 1649 1500 +137720 1911 1500 +137720 1500 1511 +137720 1649 1511 +137720 1911 1511 +137720 1917 1500 +137720 1917 1511 +137720 1649 1917 +137720 1649 1911 +137720 1908 1479 +137720 1911 1917 +137720 1549 1525 +137720 1550 1603 +137740 1550 1794 +137740 1562 1521 +137740 1591 1858 +137740 1603 1794 +137740 1634 1734 +137740 1688 1854 +137740 1732 1471 +137740 1752 1766 +137740 1792 1885 +137740 1907 1438 +137740 1924 1458 +137740 1924 1478 +137740 1630 1493 +137740 1684 1470 +137740 1630 1761 +137740 1680 1772 +137740 1684 1857 +137740 1718 1889 +137740 1825 1890 +137740 1727 1434 +137740 1570 1731 +137740 1798 1913 +137740 1857 1470 +137740 1649 1500 +137740 1911 1500 +137740 1500 1511 +137740 1649 1511 +137740 1911 1511 +137740 1917 1500 +137740 1917 1511 +137740 1649 1917 +137740 1649 1911 +137740 1908 1479 +137740 1911 1917 +137740 1549 1525 +137740 1550 1603 +137760 1600 1890 +137760 1628 1857 +137760 1630 1493 +137760 1684 1470 +137760 1825 1830 +137760 1894 1516 +137760 1630 1761 +137760 1680 1772 +137760 1684 1857 +137760 1718 1889 +137760 1727 1882 +137760 1789 1803 +137760 1825 1890 +137760 1915 1473 +137760 1727 1434 +137760 1882 1434 +137760 1570 1731 +137760 1798 1913 +137760 1857 1470 +137760 1649 1500 +137760 1911 1500 +137760 1500 1511 +137760 1649 1511 +137760 1911 1511 +137760 1917 1500 +137760 1917 1511 +137760 1649 1917 +137760 1649 1911 +137760 1908 1479 +137760 1911 1917 +137760 1549 1525 +137760 1550 1603 +137780 1630 1761 +137780 1680 1772 +137780 1684 1857 +137780 1718 1889 +137780 1727 1882 +137780 1789 1803 +137780 1825 1890 +137780 1913 1441 +137780 1915 1473 +137780 1727 1434 +137780 1882 1434 +137780 1570 1731 +137780 1798 1913 +137780 1857 1470 +137780 1649 1500 +137780 1911 1500 +137780 1500 1511 +137780 1649 1511 +137780 1890 1525 +137780 1911 1511 +137780 1917 1500 +137780 1917 1511 +137780 1649 1917 +137780 1649 1911 +137780 1908 1479 +137780 1911 1917 +137780 1550 1794 +137780 1549 1525 +137780 1550 1603 +137800 1599 1428 +137800 1599 1732 +137800 1628 1857 +137800 1684 1470 +137800 1727 1434 +137800 1732 1428 +137800 1882 1434 +137800 1570 1731 +137800 1798 1913 +137800 1857 1470 +137800 1649 1500 +137800 1911 1500 +137800 1500 1511 +137800 1549 1890 +137800 1649 1511 +137800 1890 1525 +137800 1911 1511 +137800 1917 1500 +137800 1917 1511 +137800 1649 1917 +137800 1649 1911 +137800 1908 1479 +137800 1911 1917 +137800 1550 1794 +137800 1549 1525 +137800 1550 1603 +137800 1645 1756 +137820 1538 1524 +137820 1538 1501 +137820 1546 1459 +137820 1570 1731 +137820 1628 1684 +137820 1684 1857 +137820 1688 1854 +137820 1689 1458 +137820 1798 1913 +137820 1857 1470 +137820 1649 1500 +137820 1680 1772 +137820 1911 1500 +137820 1500 1511 +137820 1549 1890 +137820 1649 1511 +137820 1669 1754 +137820 1890 1525 +137820 1911 1511 +137820 1917 1500 +137820 1917 1511 +137820 1924 1478 +137820 1562 1521 +137820 1649 1917 +137820 1649 1911 +137820 1908 1479 +137820 1911 1917 +137820 1550 1794 +137820 1549 1525 +137820 1550 1603 +137820 1645 1756 +137840 1599 1649 +137840 1599 1511 +137840 1599 1500 +137840 1599 1911 +137840 1649 1500 +137840 1680 1772 +137840 1752 1766 +137840 1911 1500 +137840 1500 1511 +137840 1501 1524 +137840 1549 1890 +137840 1649 1511 +137840 1669 1754 +137840 1683 1908 +137840 1727 1434 +137840 1890 1525 +137840 1911 1511 +137840 1917 1500 +137840 1917 1511 +137840 1924 1478 +137840 1562 1521 +137840 1599 1917 +137840 1649 1917 +137840 1649 1911 +137840 1908 1479 +137840 1911 1917 +137840 1593 1767 +137840 1603 1794 +137840 1617 1441 +137840 1550 1794 +137840 1915 1473 +137840 1549 1525 +137840 1550 1603 +137840 1645 1756 +137860 1549 1825 +137860 1549 1890 +137860 1574 1495 +137860 1630 1761 +137860 1630 1493 +137860 1649 1511 +137860 1669 1754 +137860 1683 1908 +137860 1727 1434 +137860 1798 1913 +137860 1825 1525 +137860 1890 1525 +137860 1911 1511 +137860 1917 1500 +137860 1917 1511 +137860 1924 1478 +137860 1546 1459 +137860 1562 1521 +137860 1599 1917 +137860 1600 1825 +137860 1649 1917 +137860 1649 1911 +137860 1802 1495 +137860 1908 1479 +137860 1911 1917 +137860 1593 1767 +137860 1603 1794 +137860 1617 1441 +137860 1550 1794 +137860 1915 1473 +137860 1549 1525 +137860 1825 1890 +137860 1550 1603 +137860 1645 1756 +137880 1546 1459 +137880 1562 1521 +137880 1599 1649 +137880 1599 1917 +137880 1600 1825 +137880 1600 1890 +137880 1649 1917 +137880 1649 1911 +137880 1688 1854 +137880 1717 1752 +137880 1754 1767 +137880 1798 1857 +137880 1802 1495 +137880 1898 1477 +137880 1908 1479 +137880 1911 1917 +137880 1593 1767 +137880 1603 1794 +137880 1617 1441 +137880 1684 1470 +137880 1550 1794 +137880 1501 1524 +137880 1915 1473 +137880 1549 1525 +137880 1825 1890 +137880 1550 1603 +137880 1645 1756 +137880 1538 1501 +137900 1574 1599 +137900 1593 1767 +137900 1599 1512 +137900 1599 1802 +137900 1599 1495 +137900 1603 1794 +137900 1617 1441 +137900 1669 1754 +137900 1684 1470 +137900 1718 1889 +137900 1766 1479 +137900 1924 1478 +137900 1550 1794 +137900 1798 1913 +137900 1495 1512 +137900 1501 1524 +137900 1630 1761 +137900 1915 1473 +137900 1549 1525 +137900 1825 1890 +137900 1550 1603 +137900 1645 1756 +137900 1680 1772 +137900 1538 1501 +137920 1550 1794 +137920 1599 1865 +137920 1798 1913 +137920 1865 1512 +137920 1495 1512 +137920 1501 1524 +137920 1600 1519 +137920 1630 1761 +137920 1908 1479 +137920 1915 1473 +137920 1549 1525 +137920 1600 1890 +137920 1825 1890 +137920 1752 1766 +137920 1550 1603 +137920 1570 1731 +137920 1645 1756 +137920 1680 1772 +137920 1538 1501 +137940 1599 1512 +137940 1600 1519 +137940 1630 1761 +137940 1683 1766 +137940 1689 1458 +137940 1759 1857 +137940 1825 1519 +137940 1908 1479 +137940 1915 1473 +137940 1549 1525 +137940 1600 1890 +137940 1825 1890 +137940 1593 1767 +137940 1752 1766 +137940 1717 1479 +137940 1550 1603 +137940 1570 1731 +137940 1645 1756 +137940 1680 1772 +137940 1538 1501 +137940 1688 1854 +137960 1549 1525 +137960 1562 1678 +137960 1599 1882 +137960 1600 1890 +137960 1669 1754 +137960 1718 1889 +137960 1825 1890 +137960 1593 1767 +137960 1717 1908 +137960 1752 1766 +137960 1717 1479 +137960 1550 1603 +137960 1570 1731 +137960 1645 1756 +137960 1680 1772 +137960 1538 1501 +137960 1688 1854 +137980 1562 1441 +137980 1562 1470 +137980 1600 1519 +137980 1501 1524 +137980 1593 1767 +137980 1617 1441 +137980 1717 1908 +137980 1752 1766 +137980 1717 1479 +137980 1598 1920 +137980 1600 1825 +137980 1550 1603 +137980 1570 1731 +137980 1645 1756 +137980 1680 1772 +137980 1538 1501 +137980 1688 1854 +138000 1550 1877 +138000 1562 1767 +138000 1593 1767 +138000 1603 1794 +138000 1617 1441 +138000 1717 1908 +138000 1752 1766 +138000 1562 1628 +138000 1600 1890 +138000 1717 1479 +138000 1825 1890 +138000 1825 1525 +138000 1890 1525 +138000 1908 1479 +138000 1598 1920 +138000 1600 1825 +138000 1550 1603 +138000 1570 1731 +138000 1645 1756 +138000 1562 1593 +138000 1680 1772 +138000 1538 1501 +138000 1630 1761 +138000 1688 1854 +138020 1562 1628 +138020 1600 1890 +138020 1669 1754 +138020 1717 1479 +138020 1825 1890 +138020 1825 1525 +138020 1890 1525 +138020 1908 1479 +138020 1598 1920 +138020 1600 1825 +138020 1550 1603 +138020 1570 1731 +138020 1645 1756 +138020 1562 1593 +138020 1680 1772 +138020 1538 1501 +138020 1630 1761 +138020 1688 1854 +138040 1598 1920 +138040 1617 1857 +138040 1549 1890 +138040 1562 1617 +138040 1600 1825 +138040 1877 1479 +138040 1550 1603 +138040 1570 1731 +138040 1645 1756 +138040 1562 1593 +138040 1680 1772 +138040 1538 1501 +138040 1630 1761 +138040 1688 1854 +138060 1549 1890 +138060 1752 1766 +138060 1825 1525 +138060 1562 1617 +138060 1600 1825 +138060 1877 1479 +138060 1550 1603 +138060 1570 1731 +138060 1645 1756 +138060 1648 1683 +138060 1789 1803 +138060 1562 1593 +138060 1890 1525 +138060 1680 1772 +138060 1538 1501 +138060 1877 1908 +138060 1630 1761 +138060 1688 1854 +138080 1562 1617 +138080 1600 1825 +138080 1617 1857 +138080 1877 1479 +138080 1887 1440 +138080 1550 1603 +138080 1570 1731 +138080 1645 1756 +138080 1648 1683 +138080 1598 1920 +138080 1789 1803 +138080 1562 1593 +138080 1890 1525 +138080 1680 1772 +138080 1538 1501 +138080 1877 1908 +138080 1908 1479 +138080 1630 1761 +138080 1688 1854 +138100 1550 1603 +138100 1570 1731 +138100 1617 1441 +138100 1645 1756 +138100 1648 1683 +138100 1752 1766 +138100 1924 1478 +138100 1598 1920 +138100 1648 1696 +138100 1789 1803 +138100 1562 1593 +138100 1890 1525 +138100 1825 1877 +138100 1680 1772 +138100 1538 1501 +138100 1603 1794 +138100 1877 1908 +138100 1908 1479 +138100 1630 1761 +138100 1688 1854 +138120 1598 1920 +138120 1599 1689 +138120 1648 1696 +138120 1789 1803 +138120 1562 1593 +138120 1825 1908 +138120 1825 1479 +138120 1890 1525 +138120 1825 1877 +138120 1680 1772 +138120 1600 1519 +138120 1538 1501 +138120 1603 1794 +138120 1877 1479 +138120 1877 1908 +138120 1908 1479 +138120 1630 1761 +138120 1688 1854 +138140 1562 1593 +138140 1563 1592 +138140 1570 1731 +138140 1599 1531 +138140 1825 1890 +138140 1825 1908 +138140 1825 1525 +138140 1825 1479 +138140 1890 1525 +138140 1924 1478 +138140 1752 1766 +138140 1825 1877 +138140 1669 1754 +138140 1680 1772 +138140 1600 1519 +138140 1538 1501 +138140 1603 1794 +138140 1617 1441 +138140 1877 1479 +138140 1877 1908 +138140 1908 1479 +138140 1630 1761 +138140 1688 1854 +138160 1549 1525 +138160 1599 1512 +138160 1659 1514 +138160 1752 1766 +138160 1825 1877 +138160 1669 1754 +138160 1680 1772 +138160 1600 1519 +138160 1598 1920 +138160 1538 1501 +138160 1603 1794 +138160 1617 1441 +138160 1877 1479 +138160 1877 1908 +138160 1908 1479 +138160 1630 1761 +138160 1688 1854 +138180 1628 1463 +138180 1669 1754 +138180 1680 1772 +138180 1787 1531 +138180 1600 1519 +138180 1562 1593 +138180 1598 1920 +138180 1538 1501 +138180 1789 1803 +138180 1603 1794 +138180 1617 1441 +138180 1877 1479 +138180 1877 1908 +138180 1908 1479 +138180 1630 1761 +138180 1688 1854 +138200 1549 1825 +138200 1549 1525 +138200 1570 1731 +138200 1628 1754 +138200 1767 1840 +138200 1907 1438 +138200 1600 1519 +138200 1562 1593 +138200 1598 1920 +138200 1538 1501 +138200 1789 1803 +138200 1603 1794 +138200 1617 1441 +138200 1877 1479 +138200 1877 1908 +138200 1908 1479 +138200 1630 1761 +138200 1688 1854 +138220 1659 1514 +138220 1669 1754 +138220 1757 1907 +138220 1792 1885 +138220 1600 1519 +138220 1562 1593 +138220 1598 1920 +138220 1538 1501 +138220 1789 1803 +138220 1603 1794 +138220 1617 1441 +138220 1877 1479 +138220 1877 1908 +138220 1908 1479 +138220 1630 1761 +138220 1688 1854 +138240 1549 1525 +138240 1600 1519 +138240 1684 1441 +138240 1562 1593 +138240 1570 1731 +138240 1598 1920 +138240 1645 1756 +138240 1538 1501 +138240 1684 1470 +138240 1789 1803 +138240 1550 1603 +138240 1603 1794 +138240 1617 1441 +138240 1431 1458 +138240 1877 1479 +138240 1877 1908 +138240 1908 1479 +138240 1630 1761 +138240 1688 1854 +138260 1562 1593 +138260 1570 1731 +138260 1598 1920 +138260 1645 1756 +138260 1538 1501 +138260 1550 1794 +138260 1684 1470 +138260 1757 1907 +138260 1789 1803 +138260 1440 1477 +138260 1550 1603 +138260 1603 1794 +138260 1825 1525 +138260 1617 1441 +138260 1431 1458 +138260 1877 1479 +138260 1877 1908 +138260 1908 1479 +138260 1630 1761 +138260 1688 1854 +138280 1538 1501 +138280 1550 1794 +138280 1684 1470 +138280 1757 1907 +138280 1789 1803 +138280 1440 1477 +138280 1600 1519 +138280 1669 1754 +138280 1550 1603 +138280 1603 1794 +138280 1825 1525 +138280 1617 1441 +138280 1431 1458 +138280 1877 1479 +138280 1877 1908 +138280 1908 1479 +138280 1630 1761 +138280 1688 1854 +138300 1591 1858 +138300 1600 1519 +138300 1603 1920 +138300 1669 1754 +138300 1550 1603 +138300 1562 1593 +138300 1603 1794 +138300 1825 1525 +138300 1570 1731 +138300 1598 1920 +138300 1617 1441 +138300 1431 1458 +138300 1877 1479 +138300 1877 1908 +138300 1908 1479 +138300 1630 1761 +138300 1688 1854 +138320 1538 1501 +138320 1550 1603 +138320 1562 1593 +138320 1603 1794 +138320 1645 1756 +138320 1789 1803 +138320 1825 1525 +138320 1550 1527 +138320 1767 1840 +138320 1798 1913 +138320 1549 1825 +138320 1915 1473 +138320 1570 1731 +138320 1598 1920 +138320 1617 1441 +138320 1431 1458 +138320 1877 1479 +138320 1877 1908 +138320 1908 1479 +138320 1630 1761 +138320 1688 1854 +138340 1538 1772 +138340 1550 1527 +138340 1767 1840 +138340 1798 1913 +138340 1549 1825 +138340 1915 1473 +138340 1570 1731 +138340 1598 1920 +138340 1600 1519 +138340 1617 1441 +138340 1431 1458 +138340 1669 1754 +138340 1877 1479 +138340 1877 1908 +138340 1908 1479 +138340 1630 1761 +138340 1688 1854 +138360 1549 1825 +138360 1645 1756 +138360 1695 1519 +138360 1759 1877 +138360 1789 1803 +138360 1915 1473 +138360 1570 1731 +138360 1598 1920 +138360 1600 1519 +138360 1617 1441 +138360 1680 1772 +138360 1765 1458 +138360 1765 1431 +138360 1431 1458 +138360 1669 1754 +138360 1877 1479 +138360 1877 1908 +138360 1908 1479 +138360 1562 1593 +138360 1538 1501 +138360 1630 1761 +138360 1688 1854 +138380 1549 1525 +138380 1570 1731 +138380 1598 1920 +138380 1695 1877 +138380 1591 1858 +138380 1600 1519 +138380 1617 1441 +138380 1680 1772 +138380 1765 1458 +138380 1765 1431 +138380 1431 1458 +138380 1669 1754 +138380 1877 1479 +138380 1877 1908 +138380 1908 1479 +138380 1562 1593 +138380 1538 1501 +138380 1630 1761 +138380 1688 1854 +138400 1550 1854 +138400 1591 1858 +138400 1600 1519 +138400 1617 1441 +138400 1628 1463 +138400 1708 1760 +138400 1617 1767 +138400 1680 1772 +138400 1752 1766 +138400 1765 1458 +138400 1765 1431 +138400 1431 1458 +138400 1669 1754 +138400 1877 1479 +138400 1877 1908 +138400 1908 1479 +138400 1767 1441 +138400 1563 1717 +138400 1562 1593 +138400 1538 1501 +138400 1630 1761 +138400 1688 1854 +138420 1550 1527 +138420 1562 1603 +138420 1617 1767 +138420 1680 1772 +138420 1695 1908 +138420 1695 1877 +138420 1752 1766 +138420 1549 1825 +138420 1601 1458 +138420 1765 1458 +138420 1765 1431 +138420 1431 1458 +138420 1549 1525 +138420 1601 1765 +138420 1601 1431 +138420 1669 1754 +138420 1877 1479 +138420 1570 1731 +138420 1593 1603 +138420 1598 1920 +138420 1877 1908 +138420 1908 1479 +138420 1767 1441 +138420 1563 1717 +138420 1562 1593 +138420 1538 1501 +138420 1630 1761 +138420 1688 1854 +138440 1549 1825 +138440 1562 1794 +138440 1593 1794 +138440 1601 1458 +138440 1628 1754 +138440 1687 1699 +138440 1765 1458 +138440 1765 1882 +138440 1765 1431 +138440 1882 1458 +138440 1915 1473 +138440 1431 1458 +138440 1549 1525 +138440 1601 1765 +138440 1601 1431 +138440 1669 1754 +138440 1877 1479 +138440 1570 1731 +138440 1593 1603 +138440 1598 1920 +138440 1600 1519 +138440 1877 1908 +138440 1908 1479 +138440 1767 1441 +138440 1563 1717 +138440 1825 1479 +138440 1562 1593 +138440 1538 1501 +138440 1617 1441 +138440 1630 1761 +138440 1688 1854 +138460 1549 1525 +138460 1601 1765 +138460 1601 1774 +138460 1601 1431 +138460 1669 1754 +138460 1752 1766 +138460 1789 1803 +138460 1825 1877 +138460 1877 1479 +138460 1458 1502 +138460 1570 1731 +138460 1593 1603 +138460 1598 1920 +138460 1600 1519 +138460 1695 1908 +138460 1695 1479 +138460 1877 1908 +138460 1908 1479 +138460 1562 1603 +138460 1591 1858 +138460 1695 1825 +138460 1767 1441 +138460 1563 1717 +138460 1825 1479 +138460 1562 1593 +138460 1825 1908 +138460 1538 1501 +138460 1680 1772 +138460 1617 1441 +138460 1630 1761 +138460 1688 1854 +138480 1570 1731 +138480 1593 1603 +138480 1598 1920 +138480 1600 1519 +138480 1630 1493 +138480 1695 1908 +138480 1695 1479 +138480 1765 1431 +138480 1877 1908 +138480 1908 1479 +138480 1562 1603 +138480 1591 1858 +138480 1600 1825 +138480 1617 1767 +138480 1695 1825 +138480 1767 1441 +138480 1907 1438 +138480 1563 1717 +138480 1599 1825 +138480 1825 1479 +138480 1562 1593 +138480 1825 1908 +138480 1538 1501 +138480 1680 1772 +138480 1617 1441 +138480 1630 1761 +138480 1688 1854 +138500 1549 1525 +138500 1562 1603 +138500 1591 1858 +138500 1600 1825 +138500 1617 1767 +138500 1695 1825 +138500 1695 1759 +138500 1767 1441 +138500 1825 1519 +138500 1907 1438 +138500 1563 1717 +138500 1599 1825 +138500 1613 1920 +138500 1669 1754 +138500 1825 1479 +138500 1915 1473 +138500 1562 1593 +138500 1825 1908 +138500 1538 1501 +138500 1680 1772 +138500 1617 1441 +138500 1630 1761 +138500 1688 1854 +138520 1550 1527 +138520 1562 1857 +138520 1563 1717 +138520 1599 1825 +138520 1600 1519 +138520 1613 1920 +138520 1669 1754 +138520 1791 1825 +138520 1825 1479 +138520 1915 1473 +138520 1562 1593 +138520 1825 1908 +138520 1538 1501 +138520 1680 1772 +138520 1789 1803 +138520 1617 1441 +138520 1630 1761 +138520 1688 1854 +138540 1562 1593 +138540 1562 1603 +138540 1591 1858 +138540 1593 1603 +138540 1603 1441 +138540 1825 1908 +138540 1887 1440 +138540 1538 1501 +138540 1617 1767 +138540 1680 1772 +138540 1789 1803 +138540 1767 1441 +138540 1617 1441 +138540 1630 1761 +138540 1688 1854 +138560 1538 1501 +138560 1549 1825 +138560 1549 1525 +138560 1579 1804 +138560 1617 1767 +138560 1680 1772 +138560 1789 1803 +138560 1825 1463 +138560 1600 1519 +138560 1603 1684 +138560 1669 1754 +138560 1550 1527 +138560 1767 1441 +138560 1617 1441 +138560 1630 1761 +138560 1688 1854 +138580 1562 1593 +138580 1645 1756 +138580 1695 1825 +138580 1924 1463 +138580 1600 1519 +138580 1603 1684 +138580 1669 1754 +138580 1550 1527 +138580 1767 1441 +138580 1617 1441 +138580 1630 1761 +138580 1688 1854 +138600 1562 1684 +138600 1563 1618 +138600 1591 1858 +138600 1600 1519 +138600 1603 1794 +138600 1603 1684 +138600 1613 1756 +138600 1669 1754 +138600 1550 1527 +138600 1593 1603 +138600 1684 1767 +138600 1767 1441 +138600 1592 1717 +138600 1680 1772 +138600 1617 1441 +138600 1630 1761 +138600 1688 1854 +138620 1538 1836 +138620 1550 1527 +138620 1562 1794 +138620 1593 1603 +138620 1599 1791 +138620 1684 1767 +138620 1562 1603 +138620 1767 1441 +138620 1825 1479 +138620 1592 1717 +138620 1603 1441 +138620 1562 1593 +138620 1680 1772 +138620 1617 1441 +138620 1630 1761 +138620 1688 1854 +138640 1549 1525 +138640 1552 1564 +138640 1562 1603 +138640 1613 1699 +138640 1684 1441 +138640 1767 1441 +138640 1825 1463 +138640 1825 1479 +138640 1924 1478 +138640 1549 1825 +138640 1592 1717 +138640 1603 1441 +138640 1562 1441 +138640 1562 1593 +138640 1680 1772 +138640 1617 1441 +138640 1630 1761 +138640 1688 1854 +138660 1549 1825 +138660 1591 1858 +138660 1592 1717 +138660 1599 1791 +138660 1600 1519 +138660 1603 1441 +138660 1603 1767 +138660 1907 1438 +138660 1562 1441 +138660 1669 1754 +138660 1550 1527 +138660 1617 1857 +138660 1562 1593 +138660 1680 1772 +138660 1617 1441 +138660 1645 1756 +138660 1630 1761 +138660 1688 1854 +138680 1562 1441 +138680 1563 1613 +138680 1593 1603 +138680 1613 1699 +138680 1630 1493 +138680 1669 1754 +138680 1678 1717 +138680 1550 1527 +138680 1562 1603 +138680 1603 1684 +138680 1617 1857 +138680 1643 1704 +138680 1857 1441 +138680 1549 1525 +138680 1562 1593 +138680 1680 1772 +138680 1617 1441 +138680 1645 1756 +138680 1630 1761 +138680 1688 1854 +138700 1550 1527 +138700 1562 1603 +138700 1591 1858 +138700 1603 1684 +138700 1617 1857 +138700 1643 1704 +138700 1718 1889 +138700 1857 1441 +138700 1549 1525 +138700 1562 1593 +138700 1563 1592 +138700 1603 1767 +138700 1680 1772 +138700 1617 1441 +138700 1628 1767 +138700 1645 1756 +138700 1630 1761 +138700 1688 1854 +138720 1549 1525 +138720 1562 1593 +138720 1562 1684 +138720 1563 1592 +138720 1570 1731 +138720 1603 1767 +138720 1628 1684 +138720 1680 1772 +138720 1684 1441 +138720 1874 1529 +138720 1617 1441 +138720 1628 1767 +138720 1645 1756 +138720 1669 1754 +138720 1630 1761 +138720 1688 1854 +138740 1562 1603 +138740 1603 1617 +138740 1603 1794 +138740 1617 1441 +138740 1617 1857 +138740 1628 1767 +138740 1708 1760 +138740 1708 1883 +138740 1757 1907 +138740 1924 1463 +138740 1630 1493 +138740 1645 1756 +138740 1669 1754 +138740 1630 1761 +138740 1603 1684 +138740 1538 1501 +138740 1688 1854 +138760 1563 1613 +138760 1593 1684 +138760 1599 1791 +138760 1630 1493 +138760 1642 1761 +138760 1645 1756 +138760 1669 1754 +138760 1761 1493 +138760 1883 1438 +138760 1549 1525 +138760 1630 1761 +138760 1767 1857 +138760 1857 1441 +138760 1603 1684 +138760 1538 1501 +138760 1550 1527 +138760 1688 1854 +138780 1549 1525 +138780 1603 1617 +138780 1630 1761 +138780 1708 1433 +138780 1767 1857 +138780 1857 1441 +138780 1718 1889 +138780 1603 1684 +138780 1617 1441 +138780 1538 1501 +138780 1550 1527 +138780 1600 1825 +138780 1546 1924 +138780 1680 1772 +138780 1688 1854 +138800 1570 1760 +138800 1617 1443 +138800 1617 1857 +138800 1630 1493 +138800 1669 1754 +138800 1718 1889 +138800 1731 1529 +138800 1731 1433 +138800 1570 1731 +138800 1603 1684 +138800 1617 1441 +138800 1538 1501 +138800 1550 1527 +138800 1600 1825 +138800 1789 1803 +138800 1546 1924 +138800 1680 1772 +138800 1688 1854 +138820 1570 1731 +138820 1600 1519 +138820 1603 1684 +138820 1617 1441 +138820 1628 1857 +138820 1628 1443 +138820 1708 1731 +138820 1731 1907 +138820 1756 1920 +138820 1760 1761 +138820 1761 1790 +138820 1767 1857 +138820 1767 1441 +138820 1883 1438 +138820 1550 1854 +138820 1562 1593 +138820 1570 1907 +138820 1684 1441 +138820 1538 1501 +138820 1550 1527 +138820 1600 1825 +138820 1630 1761 +138820 1789 1803 +138820 1546 1924 +138820 1680 1772 +138820 1549 1525 +138820 1688 1854 +138840 1550 1854 +138840 1562 1593 +138840 1570 1907 +138840 1669 1754 +138840 1684 1441 +138840 1684 1767 +138840 1731 1847 +138840 1857 1441 +138840 1924 1478 +138840 1924 1463 +138840 1538 1501 +138840 1550 1527 +138840 1600 1825 +138840 1630 1761 +138840 1789 1803 +138840 1546 1924 +138840 1603 1441 +138840 1643 1704 +138840 1645 1756 +138840 1680 1772 +138840 1549 1525 +138840 1688 1854 +138860 1538 1501 +138860 1546 1478 +138860 1550 1527 +138860 1600 1825 +138860 1617 1441 +138860 1630 1761 +138860 1754 1463 +138860 1789 1803 +138860 1546 1924 +138860 1603 1441 +138860 1643 1704 +138860 1562 1684 +138860 1645 1756 +138860 1680 1772 +138860 1549 1525 +138860 1688 1854 +138880 1546 1924 +138880 1603 1441 +138880 1630 1760 +138880 1669 1754 +138880 1767 1441 +138880 1841 1901 +138880 1579 1761 +138880 1628 1443 +138880 1643 1704 +138880 1924 1478 +138880 1562 1684 +138880 1563 1592 +138880 1825 1525 +138880 1857 1441 +138880 1549 1825 +138880 1915 1473 +138880 1570 1731 +138880 1645 1756 +138880 1680 1772 +138880 1549 1525 +138880 1688 1854 +138900 1579 1761 +138900 1628 1443 +138900 1630 1761 +138900 1643 1704 +138900 1882 1531 +138900 1924 1478 +138900 1562 1684 +138900 1563 1592 +138900 1825 1525 +138900 1857 1441 +138900 1549 1825 +138900 1915 1473 +138900 1538 1501 +138900 1570 1731 +138900 1645 1756 +138900 1680 1772 +138900 1549 1525 +138900 1688 1854 +138920 1538 1524 +138920 1546 1924 +138920 1562 1684 +138920 1563 1592 +138920 1579 1630 +138920 1600 1519 +138920 1669 1754 +138920 1718 1889 +138920 1825 1525 +138920 1857 1441 +138920 1546 1459 +138920 1549 1825 +138920 1915 1473 +138920 1538 1501 +138920 1570 1731 +138920 1645 1756 +138920 1680 1772 +138920 1549 1525 +138920 1688 1854 +138940 1546 1459 +138940 1546 1478 +138940 1550 1688 +138940 1550 1527 +138940 1560 1701 +138940 1708 1760 +138940 1767 1441 +138940 1459 1478 +138940 1549 1825 +138940 1600 1825 +138940 1915 1473 +138940 1538 1501 +138940 1570 1731 +138940 1645 1756 +138940 1680 1772 +138940 1562 1603 +138940 1549 1525 +138940 1688 1854 +138960 1549 1825 +138960 1599 1845 +138960 1630 1761 +138960 1825 1463 +138960 1600 1825 +138960 1669 1754 +138960 1695 1759 +138960 1915 1473 +138960 1538 1501 +138960 1570 1731 +138960 1645 1756 +138960 1680 1772 +138960 1562 1603 +138960 1563 1592 +138960 1549 1525 +138960 1688 1854 +138980 1600 1825 +138980 1669 1754 +138980 1695 1759 +138980 1915 1473 +138980 1501 1524 +138980 1538 1501 +138980 1570 1731 +138980 1645 1756 +138980 1680 1772 +138980 1546 1924 +138980 1562 1603 +138980 1563 1592 +138980 1549 1525 +138980 1688 1854 +139000 1538 1501 +139000 1570 1731 +139000 1599 1791 +139000 1645 1756 +139000 1680 1772 +139000 1767 1857 +139000 1789 1803 +139000 1825 1479 +139000 1546 1924 +139000 1603 1684 +139000 1767 1441 +139000 1857 1441 +139000 1562 1603 +139000 1563 1592 +139000 1600 1519 +139000 1549 1525 +139000 1688 1854 +139020 1546 1924 +139020 1550 1527 +139020 1562 1684 +139020 1603 1684 +139020 1708 1760 +139020 1767 1441 +139020 1857 1441 +139020 1924 1463 +139020 1562 1603 +139020 1563 1592 +139020 1600 1519 +139020 1512 1531 +139020 1600 1825 +139020 1549 1525 +139020 1688 1854 +139040 1562 1603 +139040 1563 1592 +139040 1603 1441 +139040 1645 1756 +139040 1684 1441 +139040 1501 1524 +139040 1600 1519 +139040 1754 1463 +139040 1512 1531 +139040 1600 1825 +139040 1680 1772 +139040 1549 1525 +139040 1538 1501 +139040 1688 1854 +139060 1600 1519 +139060 1857 1441 +139060 1546 1924 +139060 1754 1463 +139060 1512 1531 +139060 1789 1803 +139060 1921 1462 +139060 1600 1825 +139060 1680 1772 +139060 1549 1525 +139060 1538 1501 +139060 1688 1854 +139080 1546 1924 +139080 1570 1731 +139080 1754 1463 +139080 1825 1519 +139080 1451 1529 +139080 1512 1531 +139080 1562 1603 +139080 1617 1441 +139080 1767 1857 +139080 1789 1803 +139080 1921 1462 +139080 1600 1825 +139080 1680 1772 +139080 1549 1525 +139080 1538 1501 +139080 1731 1768 +139080 1915 1473 +139080 1688 1854 +139100 1558 1468 +139100 1562 1603 +139100 1579 1919 +139100 1617 1441 +139100 1643 1704 +139100 1718 1889 +139100 1767 1857 +139100 1789 1803 +139100 1921 1462 +139100 1669 1754 +139100 1857 1441 +139100 1600 1825 +139100 1680 1772 +139100 1549 1525 +139100 1538 1501 +139100 1731 1768 +139100 1915 1473 +139100 1688 1854 +139120 1600 1519 +139120 1669 1754 +139120 1684 1857 +139120 1698 1707 +139120 1707 1764 +139120 1857 1441 +139120 1924 1463 +139120 1512 1531 +139120 1546 1924 +139120 1600 1825 +139120 1680 1772 +139120 1549 1525 +139120 1538 1501 +139120 1731 1768 +139120 1915 1473 +139120 1688 1854 +139140 1546 1924 +139140 1563 1592 +139140 1600 1825 +139140 1643 1704 +139140 1643 1921 +139140 1704 1921 +139140 1767 1441 +139140 1789 1803 +139140 1825 1519 +139140 1921 1462 +139140 1451 1529 +139140 1680 1772 +139140 1549 1525 +139140 1538 1501 +139140 1731 1768 +139140 1915 1473 +139140 1688 1854 +139160 1680 1772 +139160 1546 1519 +139160 1549 1525 +139160 1538 1501 +139160 1546 1459 +139160 1698 1707 +139160 1731 1768 +139160 1915 1473 +139160 1688 1854 +139160 1857 1441 +139180 1546 1519 +139180 1549 1525 +139180 1600 1525 +139180 1678 1698 +139180 1678 1707 +139180 1600 1825 +139180 1924 1463 +139180 1538 1501 +139180 1546 1459 +139180 1767 1441 +139180 1698 1707 +139180 1825 1519 +139180 1731 1768 +139180 1915 1473 +139180 1688 1854 +139180 1857 1441 +139200 1546 1924 +139200 1549 1600 +139200 1562 1449 +139200 1562 1603 +139200 1562 1531 +139200 1599 1791 +139200 1600 1825 +139200 1603 1531 +139200 1749 1757 +139200 1774 1791 +139200 1921 1462 +139200 1924 1463 +139200 1538 1501 +139200 1546 1459 +139200 1563 1592 +139200 1678 1764 +139200 1767 1857 +139200 1767 1441 +139200 1698 1707 +139200 1698 1764 +139200 1825 1519 +139200 1707 1764 +139200 1731 1768 +139200 1825 1525 +139200 1915 1473 +139200 1688 1854 +139200 1857 1441 +139200 1669 1754 +139220 1538 1501 +139220 1546 1459 +139220 1546 1613 +139220 1549 1825 +139220 1550 1527 +139220 1563 1592 +139220 1678 1764 +139220 1757 1847 +139220 1767 1857 +139220 1767 1441 +139220 1549 1525 +139220 1512 1531 +139220 1698 1707 +139220 1698 1764 +139220 1825 1519 +139220 1707 1764 +139220 1731 1768 +139220 1825 1525 +139220 1915 1473 +139220 1688 1854 +139220 1857 1441 +139220 1669 1754 +139240 1546 1761 +139240 1549 1525 +139240 1613 1754 +139240 1718 1757 +139240 1749 1757 +139240 1512 1531 +139240 1698 1707 +139240 1698 1764 +139240 1825 1519 +139240 1599 1791 +139240 1628 1684 +139240 1707 1764 +139240 1731 1768 +139240 1825 1525 +139240 1915 1473 +139240 1688 1854 +139240 1857 1441 +139240 1669 1754 +139260 1549 1600 +139260 1600 1519 +139260 1630 1704 +139260 1643 1704 +139260 1678 1707 +139260 1698 1707 +139260 1698 1764 +139260 1825 1519 +139260 1550 1527 +139260 1600 1825 +139260 1599 1791 +139260 1628 1684 +139260 1707 1764 +139260 1731 1768 +139260 1628 1761 +139260 1825 1525 +139260 1915 1473 +139260 1688 1854 +139260 1857 1441 +139260 1669 1754 +139280 1550 1527 +139280 1600 1825 +139280 1684 1761 +139280 1924 1463 +139280 1599 1791 +139280 1628 1684 +139280 1707 1764 +139280 1731 1768 +139280 1538 1501 +139280 1628 1761 +139280 1825 1525 +139280 1915 1473 +139280 1688 1854 +139280 1857 1441 +139280 1678 1698 +139280 1669 1754 +139300 1563 1592 +139300 1599 1791 +139300 1628 1684 +139300 1707 1764 +139300 1749 1462 +139300 1731 1768 +139300 1538 1501 +139300 1628 1761 +139300 1825 1525 +139300 1915 1473 +139300 1688 1854 +139300 1857 1441 +139300 1549 1525 +139300 1678 1698 +139300 1669 1754 +139320 1825 1519 +139320 1731 1768 +139320 1924 1478 +139320 1538 1501 +139320 1550 1527 +139320 1628 1761 +139320 1749 1757 +139320 1825 1525 +139320 1915 1473 +139320 1688 1854 +139320 1857 1441 +139320 1643 1704 +139320 1549 1525 +139320 1678 1698 +139320 1669 1754 +139340 1563 1592 +139340 1731 1768 +139340 1924 1478 +139340 1538 1501 +139340 1550 1527 +139340 1628 1761 +139340 1749 1757 +139340 1825 1525 +139340 1915 1473 +139340 1688 1854 +139340 1857 1441 +139340 1643 1704 +139340 1549 1525 +139340 1707 1764 +139340 1678 1698 +139340 1669 1754 +139360 1538 1501 +139360 1550 1527 +139360 1628 1761 +139360 1749 1757 +139360 1825 1525 +139360 1915 1473 +139360 1688 1854 +139360 1825 1519 +139360 1857 1441 +139360 1643 1704 +139360 1549 1525 +139360 1707 1764 +139360 1678 1698 +139360 1669 1754 +139380 1628 1684 +139380 1684 1761 +139380 1688 1854 +139380 1825 1519 +139380 1708 1760 +139380 1519 1525 +139380 1857 1441 +139380 1643 1704 +139380 1549 1525 +139380 1707 1764 +139380 1678 1698 +139380 1669 1754 +139400 1570 1731 +139400 1630 1438 +139400 1708 1760 +139400 1519 1525 +139400 1857 1441 +139400 1789 1803 +139400 1501 1524 +139400 1643 1704 +139400 1915 1473 +139400 1549 1525 +139400 1707 1764 +139400 1538 1501 +139400 1550 1527 +139400 1678 1698 +139400 1669 1754 +139420 1600 1519 +139420 1845 1433 +139420 1857 1441 +139420 1789 1803 +139420 1921 1462 +139420 1501 1524 +139420 1643 1704 +139420 1915 1473 +139420 1549 1525 +139420 1707 1764 +139420 1538 1501 +139420 1550 1527 +139420 1678 1698 +139420 1669 1754 +139440 1628 1684 +139440 1684 1761 +139440 1789 1803 +139440 1921 1462 +139440 1501 1524 +139440 1825 1525 +139440 1549 1825 +139440 1643 1704 +139440 1915 1473 +139440 1549 1525 +139440 1707 1764 +139440 1538 1501 +139440 1550 1527 +139440 1678 1698 +139440 1669 1754 +139460 1549 1600 +139460 1825 1525 +139460 1599 1791 +139460 1549 1825 +139460 1600 1825 +139460 1600 1525 +139460 1600 1519 +139460 1563 1592 +139460 1628 1761 +139460 1643 1704 +139460 1915 1473 +139460 1549 1525 +139460 1707 1764 +139460 1538 1501 +139460 1550 1527 +139460 1678 1698 +139460 1669 1754 +139480 1599 1791 +139480 1684 1761 +139480 1731 1789 +139480 1549 1825 +139480 1600 1825 +139480 1600 1525 +139480 1600 1519 +139480 1563 1592 +139480 1628 1761 +139480 1643 1704 +139480 1915 1473 +139480 1549 1525 +139480 1707 1764 +139480 1538 1501 +139480 1550 1527 +139480 1678 1698 +139480 1669 1754 +139500 1549 1825 +139500 1600 1825 +139500 1600 1525 +139500 1600 1519 +139500 1761 1441 +139500 1790 1501 +139500 1921 1462 +139500 1563 1592 +139500 1628 1761 +139500 1688 1854 +139500 1519 1525 +139500 1643 1704 +139500 1915 1473 +139500 1549 1525 +139500 1707 1764 +139500 1538 1501 +139500 1550 1527 +139500 1678 1698 +139500 1669 1754 +139520 1549 1600 +139520 1563 1592 +139520 1628 1761 +139520 1688 1854 +139520 1718 1889 +139520 1519 1525 +139520 1643 1704 +139520 1915 1473 +139520 1549 1525 +139520 1707 1764 +139520 1538 1501 +139520 1550 1527 +139520 1678 1698 +139520 1669 1754 +139540 1549 1825 +139540 1643 1704 +139540 1708 1760 +139540 1564 1768 +139540 1599 1791 +139540 1790 1501 +139540 1684 1883 +139540 1915 1473 +139540 1549 1525 +139540 1707 1764 +139540 1538 1501 +139540 1550 1527 +139540 1678 1698 +139540 1669 1754 +139560 1564 1768 +139560 1599 1791 +139560 1628 1883 +139560 1628 1684 +139560 1630 1438 +139560 1680 1772 +139560 1684 1761 +139560 1761 1883 +139560 1790 1501 +139560 1642 1704 +139560 1648 1696 +139560 1731 1443 +139560 1921 1462 +139560 1684 1883 +139560 1688 1854 +139560 1915 1473 +139560 1549 1525 +139560 1707 1764 +139560 1538 1501 +139560 1550 1527 +139560 1678 1698 +139560 1669 1754 +139580 1577 1791 +139580 1617 1857 +139580 1642 1704 +139580 1648 1696 +139580 1731 1443 +139580 1761 1441 +139580 1825 1519 +139580 1921 1462 +139580 1684 1883 +139580 1643 1704 +139580 1519 1525 +139580 1825 1525 +139580 1688 1854 +139580 1915 1473 +139580 1549 1525 +139580 1707 1764 +139580 1538 1501 +139580 1550 1527 +139580 1678 1698 +139580 1669 1754 +139600 1564 1768 +139600 1600 1825 +139600 1684 1883 +139600 1708 1760 +139600 1501 1524 +139600 1643 1704 +139600 1519 1525 +139600 1600 1525 +139600 1825 1525 +139600 1688 1854 +139600 1915 1473 +139600 1549 1525 +139600 1707 1764 +139600 1538 1501 +139600 1550 1527 +139600 1678 1698 +139600 1669 1754 +139620 1549 1600 +139620 1550 1857 +139620 1628 1882 +139620 1630 1438 +139620 1643 1704 +139620 1683 1836 +139620 1924 1478 +139620 1519 1525 +139620 1600 1525 +139620 1825 1525 +139620 1688 1854 +139620 1921 1462 +139620 1915 1473 +139620 1549 1525 +139620 1707 1764 +139620 1538 1501 +139620 1550 1527 +139620 1678 1698 +139620 1669 1754 +139640 1563 1592 +139640 1598 1527 +139640 1707 1761 +139640 1731 1443 +139640 1761 1764 +139640 1600 1825 +139640 1600 1525 +139640 1825 1525 +139640 1688 1854 +139640 1921 1462 +139640 1915 1473 +139640 1549 1525 +139640 1707 1764 +139640 1538 1501 +139640 1550 1527 +139640 1708 1847 +139640 1678 1698 +139640 1708 1760 +139640 1669 1754 +139660 1549 1825 +139660 1599 1791 +139660 1789 1490 +139660 1600 1825 +139660 1600 1525 +139660 1630 1438 +139660 1683 1836 +139660 1825 1525 +139660 1688 1854 +139660 1787 1847 +139660 1921 1462 +139660 1915 1473 +139660 1549 1525 +139660 1707 1764 +139660 1538 1501 +139660 1550 1527 +139660 1708 1847 +139660 1678 1698 +139660 1708 1760 +139660 1760 1847 +139660 1669 1754 +139680 1600 1825 +139680 1600 1525 +139680 1600 1519 +139680 1630 1438 +139680 1683 1836 +139680 1789 1803 +139680 1825 1525 +139680 1825 1519 +139680 1519 1525 +139680 1688 1854 +139680 1787 1847 +139680 1921 1462 +139680 1915 1473 +139680 1549 1525 +139680 1707 1764 +139680 1538 1501 +139680 1550 1527 +139680 1708 1847 +139680 1678 1698 +139680 1708 1760 +139680 1760 1847 +139680 1680 1772 +139680 1669 1754 +139700 1598 1527 +139700 1688 1854 +139700 1787 1847 +139700 1887 1440 +139700 1921 1462 +139700 1915 1473 +139700 1549 1525 +139700 1707 1764 +139700 1538 1501 +139700 1550 1527 +139700 1708 1847 +139700 1678 1698 +139700 1708 1760 +139700 1760 1847 +139700 1680 1772 +139700 1669 1754 +139720 1546 1678 +139720 1549 1825 +139720 1688 1527 +139720 1921 1462 +139720 1915 1473 +139720 1549 1525 +139720 1761 1825 +139720 1707 1764 +139720 1538 1501 +139720 1550 1527 +139720 1708 1847 +139720 1678 1698 +139720 1708 1760 +139720 1760 1847 +139720 1680 1772 +139720 1669 1754 +139740 1598 1527 +139740 1630 1643 +139740 1642 1921 +139740 1643 1921 +139740 1688 1854 +139740 1915 1473 +139740 1519 1525 +139740 1549 1600 +139740 1549 1525 +139740 1642 1643 +139740 1718 1889 +139740 1761 1825 +139740 1707 1764 +139740 1538 1501 +139740 1550 1527 +139740 1708 1847 +139740 1678 1698 +139740 1708 1760 +139740 1760 1847 +139740 1680 1772 +139740 1669 1754 +139760 1549 1600 +139760 1549 1525 +139760 1600 1525 +139760 1642 1643 +139760 1761 1525 +139760 1921 1462 +139760 1546 1459 +139760 1718 1889 +139760 1761 1825 +139760 1600 1519 +139760 1707 1764 +139760 1825 1525 +139760 1538 1501 +139760 1550 1527 +139760 1708 1847 +139760 1678 1698 +139760 1708 1760 +139760 1760 1847 +139760 1680 1772 +139760 1669 1754 +139780 1546 1459 +139780 1678 1728 +139780 1684 1728 +139780 1718 1889 +139780 1761 1825 +139780 1600 1519 +139780 1643 1704 +139780 1707 1764 +139780 1825 1525 +139780 1599 1791 +139780 1538 1501 +139780 1550 1527 +139780 1688 1854 +139780 1708 1847 +139780 1678 1698 +139780 1708 1760 +139780 1760 1847 +139780 1680 1772 +139780 1669 1754 +139800 1549 1600 +139800 1600 1519 +139800 1642 1643 +139800 1643 1704 +139800 1696 1920 +139800 1707 1764 +139800 1825 1525 +139800 1600 1525 +139800 1857 1441 +139800 1921 1462 +139800 1599 1791 +139800 1623 1532 +139800 1642 1704 +139800 1538 1501 +139800 1550 1527 +139800 1688 1854 +139800 1708 1847 +139800 1678 1698 +139800 1708 1760 +139800 1760 1847 +139800 1680 1772 +139800 1549 1525 +139800 1669 1754 +139820 1546 1459 +139820 1549 1825 +139820 1600 1525 +139820 1857 1441 +139820 1921 1462 +139820 1501 1524 +139820 1599 1791 +139820 1623 1532 +139820 1642 1704 +139820 1825 1519 +139820 1538 1501 +139820 1550 1527 +139820 1688 1854 +139820 1708 1847 +139820 1678 1698 +139820 1708 1760 +139820 1760 1847 +139820 1680 1772 +139820 1549 1525 +139820 1669 1754 +139840 1599 1791 +139840 1606 1532 +139840 1623 1532 +139840 1642 1704 +139840 1825 1525 +139840 1825 1519 +139840 1538 1501 +139840 1550 1527 +139840 1688 1854 +139840 1708 1847 +139840 1678 1698 +139840 1708 1760 +139840 1760 1847 +139840 1680 1772 +139840 1549 1525 +139840 1669 1754 +139860 1606 1532 +139860 1623 1532 +139860 1718 1889 +139860 1501 1524 +139860 1642 1704 +139860 1825 1525 +139860 1825 1519 +139860 1538 1501 +139860 1550 1527 +139860 1688 1854 +139860 1708 1847 +139860 1678 1698 +139860 1708 1760 +139860 1760 1847 +139860 1707 1764 +139860 1680 1772 +139860 1549 1525 +139860 1669 1754 +139880 1600 1525 +139880 1642 1704 +139880 1825 1525 +139880 1825 1519 +139880 1538 1501 +139880 1550 1527 +139880 1688 1854 +139880 1708 1847 +139880 1678 1698 +139880 1708 1760 +139880 1760 1847 +139880 1707 1764 +139880 1680 1772 +139880 1549 1525 +139880 1669 1754 +139900 1546 1606 +139900 1623 1503 +139900 1857 1441 +139900 1600 1519 +139900 1642 1704 +139900 1712 1894 +139900 1825 1525 +139900 1825 1519 +139900 1538 1501 +139900 1550 1527 +139900 1688 1854 +139900 1708 1847 +139900 1678 1698 +139900 1708 1760 +139900 1760 1847 +139900 1707 1764 +139900 1680 1772 +139900 1599 1791 +139900 1549 1525 +139900 1669 1754 +139920 1549 1600 +139920 1600 1525 +139920 1600 1519 +139920 1642 1704 +139920 1712 1894 +139920 1825 1525 +139920 1825 1519 +139920 1887 1516 +139920 1538 1501 +139920 1550 1527 +139920 1825 1831 +139920 1440 1477 +139920 1688 1854 +139920 1708 1847 +139920 1598 1684 +139920 1678 1698 +139920 1708 1760 +139920 1760 1847 +139920 1707 1764 +139920 1680 1772 +139920 1599 1791 +139920 1549 1525 +139920 1669 1754 +139940 1538 1501 +139940 1550 1527 +139940 1617 1532 +139940 1643 1704 +139940 1734 1894 +139940 1792 1885 +139940 1825 1831 +139940 1898 1440 +139940 1440 1477 +139940 1623 1532 +139940 1519 1525 +139940 1688 1854 +139940 1708 1847 +139940 1598 1684 +139940 1678 1698 +139940 1708 1760 +139940 1760 1847 +139940 1707 1764 +139940 1680 1772 +139940 1599 1791 +139940 1549 1525 +139940 1669 1754 +139960 1546 1606 +139960 1591 1858 +139960 1623 1532 +139960 1702 1901 +139960 1898 1477 +139960 1519 1525 +139960 1688 1854 +139960 1708 1847 +139960 1598 1684 +139960 1678 1698 +139960 1708 1760 +139960 1760 1847 +139960 1707 1764 +139960 1680 1772 +139960 1599 1791 +139960 1549 1525 +139960 1669 1754 +139980 1546 1459 +139980 1558 1468 +139980 1825 1831 +139980 1688 1854 +139980 1915 1473 +139980 1600 1525 +139980 1708 1847 +139980 1598 1684 +139980 1678 1698 +139980 1708 1760 +139980 1760 1847 +139980 1707 1764 +139980 1680 1772 +139980 1599 1791 +139980 1549 1525 +139980 1669 1754 +140000 1600 1519 +140000 1688 1854 +140000 1915 1473 +140000 1546 1606 +140000 1549 1600 +140000 1600 1525 +140000 1609 1883 +140000 1708 1847 +140000 1598 1684 +140000 1678 1698 +140000 1708 1760 +140000 1760 1847 +140000 1707 1764 +140000 1680 1772 +140000 1599 1791 +140000 1549 1525 +140000 1669 1754 +140020 1538 1524 +140020 1546 1606 +140020 1549 1600 +140020 1600 1525 +140020 1609 1883 +140020 1642 1704 +140020 1708 1787 +140020 1708 1847 +140020 1598 1684 +140020 1678 1698 +140020 1708 1760 +140020 1789 1519 +140020 1831 1519 +140020 1760 1787 +140020 1760 1847 +140020 1803 1519 +140020 1803 1831 +140020 1707 1764 +140020 1538 1501 +140020 1680 1772 +140020 1599 1791 +140020 1549 1525 +140020 1669 1754 +140040 1598 1684 +140040 1606 1459 +140040 1678 1698 +140040 1708 1760 +140040 1757 1493 +140040 1789 1519 +140040 1831 1519 +140040 1760 1787 +140040 1760 1847 +140040 1803 1519 +140040 1803 1831 +140040 1857 1441 +140040 1707 1764 +140040 1538 1501 +140040 1680 1772 +140040 1599 1791 +140040 1549 1525 +140040 1924 1532 +140040 1669 1754 +140060 1549 1600 +140060 1555 1592 +140060 1600 1831 +140060 1708 1787 +140060 1749 1757 +140060 1760 1787 +140060 1760 1847 +140060 1787 1847 +140060 1803 1519 +140060 1803 1525 +140060 1803 1831 +140060 1857 1441 +140060 1609 1767 +140060 1546 1606 +140060 1707 1764 +140060 1538 1501 +140060 1519 1525 +140060 1680 1772 +140060 1599 1791 +140060 1549 1525 +140060 1617 1441 +140060 1924 1532 +140060 1669 1754 +140080 1550 1527 +140080 1609 1767 +140080 1630 1438 +140080 1546 1606 +140080 1678 1698 +140080 1707 1764 +140080 1538 1501 +140080 1519 1525 +140080 1680 1772 +140080 1599 1791 +140080 1549 1525 +140080 1623 1532 +140080 1617 1441 +140080 1924 1532 +140080 1669 1754 +140100 1546 1606 +140100 1549 1519 +140100 1552 1582 +140100 1592 1717 +140100 1678 1698 +140100 1688 1854 +140100 1707 1764 +140100 1538 1501 +140100 1519 1525 +140100 1680 1772 +140100 1599 1791 +140100 1549 1525 +140100 1623 1924 +140100 1623 1532 +140100 1617 1441 +140100 1924 1532 +140100 1669 1754 +140120 1538 1501 +140120 1549 1757 +140120 1642 1704 +140120 1519 1525 +140120 1680 1772 +140120 1757 1825 +140120 1825 1519 +140120 1599 1791 +140120 1549 1525 +140120 1550 1527 +140120 1623 1924 +140120 1623 1532 +140120 1617 1441 +140120 1924 1532 +140120 1669 1754 +140140 1680 1772 +140140 1707 1764 +140140 1749 1825 +140140 1757 1825 +140140 1757 1519 +140140 1825 1519 +140140 1599 1791 +140140 1549 1525 +140140 1550 1527 +140140 1623 1924 +140140 1623 1532 +140140 1617 1441 +140140 1924 1532 +140140 1669 1754 +140160 1549 1600 +140160 1606 1924 +140160 1857 1441 +140160 1898 1477 +140160 1599 1791 +140160 1549 1525 +140160 1550 1527 +140160 1623 1924 +140160 1623 1532 +140160 1698 1707 +140160 1617 1441 +140160 1924 1532 +140160 1698 1764 +140160 1669 1754 +140180 1599 1791 +140180 1825 1512 +140180 1549 1525 +140180 1549 1519 +140180 1550 1527 +140180 1623 1924 +140180 1623 1532 +140180 1698 1707 +140180 1546 1685 +140180 1617 1441 +140180 1924 1532 +140180 1698 1764 +140180 1519 1525 +140180 1669 1754 +140200 1549 1525 +140200 1549 1519 +140200 1630 1438 +140200 1550 1527 +140200 1582 1524 +140200 1623 1924 +140200 1623 1532 +140200 1698 1707 +140200 1546 1685 +140200 1617 1441 +140200 1924 1532 +140200 1924 1478 +140200 1698 1764 +140200 1600 1525 +140200 1680 1772 +140200 1519 1525 +140200 1582 1501 +140200 1669 1754 +140220 1550 1527 +140220 1582 1524 +140220 1599 1791 +140220 1606 1459 +140220 1606 1532 +140220 1617 1857 +140220 1623 1924 +140220 1623 1532 +140220 1634 1734 +140220 1698 1707 +140220 1734 1491 +140220 1825 1512 +140220 1546 1685 +140220 1606 1924 +140220 1617 1441 +140220 1924 1532 +140220 1924 1478 +140220 1698 1764 +140220 1600 1525 +140220 1680 1772 +140220 1519 1525 +140220 1582 1501 +140220 1669 1754 +140240 1546 1685 +140240 1600 1519 +140240 1606 1924 +140240 1617 1441 +140240 1789 1532 +140240 1898 1477 +140240 1924 1532 +140240 1924 1478 +140240 1478 1532 +140240 1698 1764 +140240 1600 1525 +140240 1688 1854 +140240 1680 1772 +140240 1519 1525 +140240 1582 1501 +140240 1669 1754 +140260 1582 1524 +140260 1698 1707 +140260 1702 1901 +140260 1734 1491 +140260 1924 1532 +140260 1924 1478 +140260 1478 1532 +140260 1592 1717 +140260 1634 1734 +140260 1698 1764 +140260 1600 1525 +140260 1684 1898 +140260 1688 1854 +140260 1599 1791 +140260 1680 1772 +140260 1519 1525 +140260 1582 1501 +140260 1825 1525 +140260 1669 1754 +140280 1541 1734 +140280 1563 1592 +140280 1563 1717 +140280 1592 1717 +140280 1617 1857 +140280 1630 1485 +140280 1634 1734 +140280 1698 1764 +140280 1600 1525 +140280 1684 1898 +140280 1688 1854 +140280 1599 1791 +140280 1680 1772 +140280 1519 1525 +140280 1582 1501 +140280 1606 1924 +140280 1825 1525 +140280 1669 1754 +140300 1563 1598 +140300 1582 1524 +140300 1600 1525 +140300 1617 1441 +140300 1684 1898 +140300 1688 1854 +140300 1707 1764 +140300 1825 1519 +140300 1924 1478 +140300 1599 1791 +140300 1680 1772 +140300 1789 1924 +140300 1642 1704 +140300 1519 1525 +140300 1582 1501 +140300 1606 1924 +140300 1825 1525 +140300 1698 1707 +140300 1669 1754 +140320 1592 1717 +140320 1599 1791 +140320 1606 1532 +140320 1680 1772 +140320 1789 1924 +140320 1642 1704 +140320 1789 1532 +140320 1924 1532 +140320 1684 1477 +140320 1519 1525 +140320 1582 1501 +140320 1606 1924 +140320 1825 1525 +140320 1698 1707 +140320 1669 1754 +140340 1582 1524 +140340 1600 1519 +140340 1606 1789 +140340 1642 1704 +140340 1789 1532 +140340 1825 1519 +140340 1924 1532 +140340 1924 1478 +140340 1684 1477 +140340 1519 1525 +140340 1582 1501 +140340 1606 1924 +140340 1825 1525 +140340 1707 1764 +140340 1698 1707 +140340 1669 1754 +140360 1684 1477 +140360 1734 1887 +140360 1643 1704 +140360 1519 1525 +140360 1582 1501 +140360 1617 1441 +140360 1680 1772 +140360 1606 1924 +140360 1688 1854 +140360 1825 1525 +140360 1707 1764 +140360 1698 1707 +140360 1669 1754 +140380 1582 1524 +140380 1600 1519 +140380 1643 1704 +140380 1519 1525 +140380 1582 1501 +140380 1599 1791 +140380 1600 1825 +140380 1617 1441 +140380 1680 1772 +140380 1550 1527 +140380 1648 1696 +140380 1648 1465 +140380 1648 1735 +140380 1696 1465 +140380 1735 1465 +140380 1606 1924 +140380 1688 1854 +140380 1825 1525 +140380 1707 1764 +140380 1825 1519 +140380 1698 1707 +140380 1669 1754 +140400 1582 1501 +140400 1599 1791 +140400 1600 1825 +140400 1617 1441 +140400 1680 1772 +140400 1702 1901 +140400 1550 1527 +140400 1648 1696 +140400 1648 1465 +140400 1648 1735 +140400 1696 1465 +140400 1696 1735 +140400 1735 1465 +140400 1501 1524 +140400 1606 1924 +140400 1688 1854 +140400 1825 1525 +140400 1707 1764 +140400 1825 1519 +140400 1698 1707 +140400 1669 1754 +140420 1550 1527 +140420 1617 1857 +140420 1648 1696 +140420 1648 1465 +140420 1648 1735 +140420 1696 1465 +140420 1696 1735 +140420 1698 1764 +140420 1735 1465 +140420 1898 1477 +140420 1924 1478 +140420 1519 1525 +140420 1706 1775 +140420 1501 1524 +140420 1606 1924 +140420 1688 1854 +140420 1825 1525 +140420 1707 1764 +140420 1825 1519 +140420 1698 1707 +140420 1669 1754 +140440 1592 1717 +140440 1683 1731 +140440 1706 1775 +140440 1775 1882 +140440 1915 1473 +140440 1501 1524 +140440 1606 1924 +140440 1688 1854 +140440 1825 1525 +140440 1707 1764 +140440 1825 1519 +140440 1698 1707 +140440 1669 1754 +140460 1617 1857 +140460 1698 1764 +140460 1599 1791 +140460 1731 1459 +140460 1606 1924 +140460 1688 1854 +140460 1825 1525 +140460 1707 1764 +140460 1825 1519 +140460 1698 1707 +140460 1669 1754 +140480 1599 1791 +140480 1687 1734 +140480 1731 1459 +140480 1841 1901 +140480 1854 1459 +140480 1600 1825 +140480 1606 1924 +140480 1688 1854 +140480 1731 1854 +140480 1825 1525 +140480 1707 1764 +140480 1825 1519 +140480 1857 1441 +140480 1698 1707 +140480 1669 1754 +140500 1600 1825 +140500 1606 1924 +140500 1688 1731 +140500 1688 1854 +140500 1702 1841 +140500 1731 1854 +140500 1825 1525 +140500 1698 1764 +140500 1702 1901 +140500 1707 1764 +140500 1825 1519 +140500 1857 1441 +140500 1698 1707 +140500 1669 1754 +140520 1599 1791 +140520 1680 1772 +140520 1687 1901 +140520 1687 1702 +140520 1698 1764 +140520 1702 1901 +140520 1707 1764 +140520 1712 1866 +140520 1825 1519 +140520 1857 1441 +140520 1698 1707 +140520 1841 1901 +140520 1669 1754 +140540 1698 1707 +140540 1712 1435 +140540 1825 1525 +140540 1441 1459 +140540 1606 1924 +140540 1841 1901 +140540 1688 1854 +140540 1669 1754 +140560 1556 1452 +140560 1563 1698 +140560 1606 1924 +140560 1617 1857 +140560 1687 1841 +140560 1694 1707 +140560 1702 1841 +140560 1835 1452 +140560 1841 1901 +140560 1440 1448 +140560 1688 1854 +140560 1857 1441 +140560 1617 1441 +140560 1669 1754 +140580 1591 1858 +140580 1687 1702 +140580 1688 1854 +140580 1707 1764 +140580 1712 1448 +140580 1718 1492 +140580 1857 1441 +140580 1880 1464 +140580 1617 1441 +140580 1698 1764 +140580 1451 1529 +140580 1600 1525 +140580 1669 1754 +140600 1551 1835 +140600 1556 1448 +140600 1556 1915 +140600 1563 1694 +140600 1592 1694 +140600 1606 1924 +140600 1617 1441 +140600 1698 1764 +140600 1702 1448 +140600 1451 1529 +140600 1541 1555 +140600 1698 1707 +140600 1552 1768 +140600 1600 1525 +140600 1563 1592 +140600 1669 1754 +140620 1541 1555 +140620 1551 1792 +140620 1551 1427 +140620 1551 1452 +140620 1698 1707 +140620 1707 1764 +140620 1792 1452 +140620 1792 1885 +140620 1841 1901 +140620 1924 1478 +140620 1468 1516 +140620 1552 1768 +140620 1600 1525 +140620 1617 1857 +140620 1857 1441 +140620 1563 1592 +140620 1669 1754 +140640 1552 1768 +140640 1556 1448 +140640 1563 1618 +140640 1591 1440 +140640 1600 1525 +140640 1606 1924 +140640 1921 1462 +140640 1556 1587 +140640 1580 1501 +140640 1617 1857 +140640 1617 1441 +140640 1591 1858 +140640 1857 1441 +140640 1563 1592 +140640 1669 1754 +140660 1551 1663 +140660 1556 1587 +140660 1580 1680 +140660 1580 1501 +140660 1617 1857 +140660 1617 1441 +140660 1858 1440 +140660 1427 1485 +140660 1541 1555 +140660 1591 1858 +140660 1857 1441 +140660 1563 1592 +140660 1669 1754 +140680 1541 1555 +140680 1558 1516 +140680 1580 1772 +140680 1591 1872 +140680 1591 1858 +140680 1680 1772 +140680 1687 1901 +140680 1269 1452 +140680 1468 1516 +140680 1501 1503 +140680 1551 1440 +140680 1825 1888 +140680 1525 1519 +140680 1698 1764 +140680 1857 1441 +140680 1563 1592 +140680 1698 1707 +140680 1707 1764 +140680 1669 1754 +140700 1551 1440 +140700 1501 1659 +140700 1501 1598 +140700 1473 1485 +140700 1825 1888 +140700 1525 1519 +140700 1563 1717 +140700 1698 1764 +140700 1717 1592 +140700 1600 1519 +140700 1857 1441 +140700 1836 1563 +140700 1563 1592 +140700 1698 1707 +140700 1707 1764 +140700 1669 1754 +140720 1525 1519 +140720 1563 1717 +140720 1564 1825 +140720 1541 1555 +140720 1698 1764 +140720 1617 1441 +140720 1717 1592 +140720 1600 1519 +140720 1857 1441 +140720 1836 1563 +140720 1563 1592 +140720 1580 1772 +140720 1698 1707 +140720 1845 1857 +140720 1707 1764 +140720 1669 1754 +140740 1836 1563 +140740 1698 1845 +140740 1591 1872 +140740 1591 1858 +140740 1825 1888 +140740 1563 1592 +140740 1580 1772 +140740 1698 1707 +140740 1698 1617 +140740 1845 1857 +140740 1707 1857 +140740 1707 1764 +140740 1707 1617 +140740 1857 1617 +140740 1669 1754 +140760 1580 1680 +140760 1591 1858 +140760 1825 1888 +140760 1764 1845 +140760 1841 1901 +140760 1541 1555 +140760 1680 1772 +140760 1702 1901 +140760 1519 1525 +140760 1563 1592 +140760 1580 1772 +140760 1698 1764 +140760 1698 1707 +140760 1698 1617 +140760 1845 1857 +140760 1845 1617 +140760 1698 1857 +140760 1707 1857 +140760 1707 1764 +140760 1707 1617 +140760 1857 1764 +140760 1857 1617 +140760 1617 1764 +140760 1669 1754 +140780 1707 1845 +140780 1841 1901 +140780 1541 1555 +140780 1680 1772 +140780 1702 1901 +140780 1825 1519 +140780 1924 1501 +140780 1519 1525 +140780 1825 1525 +140780 1451 1529 +140780 1563 1592 +140780 1580 1772 +140780 1698 1764 +140780 1698 1707 +140780 1698 1617 +140780 1845 1857 +140780 1845 1617 +140780 1698 1857 +140780 1707 1857 +140780 1707 1764 +140780 1707 1617 +140780 1857 1764 +140780 1857 1617 +140780 1617 1764 +140780 1669 1754 +140800 1541 1555 +140800 1680 1772 +140800 1702 1901 +140800 1825 1519 +140800 1924 1501 +140800 1441 1457 +140800 1468 1516 +140800 1519 1525 +140800 1825 1525 +140800 1460 1499 +140800 1451 1529 +140800 1563 1592 +140800 1580 1772 +140800 1698 1764 +140800 1698 1707 +140800 1698 1617 +140800 1845 1857 +140800 1845 1617 +140800 1698 1857 +140800 1707 1857 +140800 1707 1764 +140800 1707 1617 +140800 1857 1764 +140800 1857 1617 +140800 1617 1764 +140800 1669 1754 +140820 1825 1525 +140820 1460 1499 +140820 1451 1529 +140820 1764 1845 +140820 1792 1885 +140820 1924 1478 +140820 1563 1592 +140820 1580 1772 +140820 1698 1764 +140820 1698 1707 +140820 1698 1617 +140820 1845 1857 +140820 1845 1617 +140820 1698 1857 +140820 1707 1857 +140820 1707 1764 +140820 1707 1617 +140820 1857 1764 +140820 1857 1617 +140820 1617 1764 +140820 1669 1754 +140840 1699 1888 +140840 1764 1845 +140840 1792 1501 +140840 1898 1477 +140840 1924 1501 +140840 1478 1501 +140840 1792 1885 +140840 1924 1478 +140840 1563 1592 +140840 1580 1772 +140840 1698 1764 +140840 1698 1707 +140840 1698 1617 +140840 1845 1857 +140840 1845 1617 +140840 1698 1857 +140840 1707 1857 +140840 1707 1764 +140840 1707 1617 +140840 1857 1764 +140840 1857 1617 +140840 1617 1764 +140840 1669 1754 +140860 1792 1885 +140860 1924 1478 +140860 1440 1269 +140860 1448 1507 +140860 1835 1606 +140860 1680 1580 +140860 1680 1772 +140860 1818 1663 +140860 1519 1525 +140860 1563 1592 +140860 1580 1772 +140860 1698 1764 +140860 1698 1707 +140860 1698 1617 +140860 1845 1857 +140860 1845 1617 +140860 1698 1857 +140860 1707 1857 +140860 1707 1764 +140860 1707 1617 +140860 1857 1764 +140860 1857 1617 +140860 1617 1764 +140860 1669 1754 +140880 1835 1606 +140880 1924 1501 +140880 1680 1580 +140880 1680 1772 +140880 1818 1663 +140880 1791 1577 +140880 1845 1764 +140880 1555 1541 +140880 1460 1499 +140880 1519 1525 +140880 1563 1592 +140880 1580 1772 +140880 1477 1898 +140880 1698 1764 +140880 1698 1707 +140880 1698 1617 +140880 1845 1857 +140880 1845 1617 +140880 1698 1857 +140880 1707 1857 +140880 1707 1764 +140880 1707 1617 +140880 1857 1764 +140880 1857 1617 +140880 1617 1764 +140880 1669 1754 +140900 1555 1541 +140900 1460 1499 +140900 1519 1525 +140900 1563 1592 +140900 1882 1512 +140900 1580 1772 +140900 1477 1898 +140900 1698 1764 +140900 1698 1707 +140900 1698 1617 +140900 1845 1857 +140900 1845 1617 +140900 1698 1857 +140900 1707 1857 +140900 1707 1764 +140900 1707 1617 +140900 1857 1764 +140900 1857 1617 +140900 1617 1764 +140900 1669 1754 +140920 1924 1478 +140920 1563 1839 +140920 1600 1825 +140920 1563 1592 +140920 1882 1512 +140920 1680 1580 +140920 1694 1888 +140920 1580 1772 +140920 1503 1659 +140920 1845 1764 +140920 1477 1898 +140920 1698 1764 +140920 1698 1707 +140920 1698 1617 +140920 1845 1857 +140920 1845 1617 +140920 1698 1857 +140920 1707 1857 +140920 1707 1764 +140920 1707 1617 +140920 1857 1764 +140920 1857 1617 +140920 1617 1764 +140920 1669 1754 +140940 1563 1592 +140940 1882 1512 +140940 1712 1661 +140940 1718 1889 +140940 1680 1580 +140940 1694 1888 +140940 1580 1772 +140940 1503 1659 +140940 1845 1764 +140940 1710 1898 +140940 1477 1898 +140940 1710 1477 +140940 1698 1764 +140940 1698 1707 +140940 1698 1617 +140940 1845 1857 +140940 1845 1617 +140940 1698 1857 +140940 1707 1857 +140940 1707 1764 +140940 1707 1617 +140940 1857 1764 +140940 1857 1617 +140940 1617 1764 +140940 1669 1754 +140960 1551 1269 +140960 1680 1580 +140960 1694 1888 +140960 1702 1901 +140960 1580 1772 +140960 1503 1659 +140960 1845 1764 +140960 1710 1898 +140960 1477 1898 +140960 1710 1477 +140960 1698 1764 +140960 1698 1707 +140960 1698 1617 +140960 1845 1857 +140960 1845 1617 +140960 1698 1857 +140960 1707 1857 +140960 1707 1764 +140960 1707 1617 +140960 1857 1764 +140960 1857 1617 +140960 1617 1764 +140960 1669 1754 +140980 1580 1503 +140980 1845 1764 +140980 1710 1898 +140980 1477 1898 +140980 1710 1477 +140980 1698 1764 +140980 1698 1707 +140980 1698 1617 +140980 1845 1857 +140980 1845 1617 +140980 1698 1857 +140980 1707 1857 +140980 1707 1764 +140980 1707 1617 +140980 1857 1764 +140980 1857 1617 +140980 1617 1764 +140980 1669 1754 +141000 1794 1699 +141000 1707 1845 +141000 1845 1764 +141000 1600 1598 +141000 1598 1525 +141000 1551 1440 +141000 1563 1592 +141000 1710 1898 +141000 1477 1898 +141000 1710 1477 +141000 1698 1764 +141000 1698 1707 +141000 1698 1617 +141000 1845 1857 +141000 1845 1617 +141000 1698 1857 +141000 1707 1857 +141000 1707 1764 +141000 1707 1617 +141000 1857 1764 +141000 1857 1617 +141000 1617 1764 +141000 1669 1754 +141020 1551 1440 +141020 1551 1269 +141020 1563 1592 +141020 1564 1898 +141020 1600 1825 +141020 1694 1888 +141020 1710 1898 +141020 1477 1898 +141020 1564 1477 +141020 1564 1710 +141020 1710 1477 +141020 1698 1764 +141020 1698 1707 +141020 1698 1617 +141020 1845 1857 +141020 1845 1617 +141020 1698 1857 +141020 1707 1857 +141020 1707 1764 +141020 1707 1617 +141020 1857 1764 +141020 1857 1617 +141020 1617 1764 +141020 1718 1889 +141020 1669 1754 +141040 1920 1659 +141040 1707 1845 +141040 1503 1659 +141040 1600 1825 +141040 1598 1525 +141040 1694 1888 +141040 1710 1898 +141040 1477 1898 +141040 1564 1477 +141040 1564 1710 +141040 1710 1477 +141040 1718 1492 +141040 1492 1889 +141040 1698 1764 +141040 1698 1707 +141040 1698 1617 +141040 1845 1857 +141040 1845 1617 +141040 1698 1857 +141040 1707 1857 +141040 1707 1764 +141040 1707 1617 +141040 1857 1764 +141040 1857 1617 +141040 1617 1764 +141040 1718 1889 +141040 1669 1754 +141060 1841 1901 +141060 1600 1825 +141060 1702 1901 +141060 1598 1525 +141060 1551 1269 +141060 1694 1888 +141060 1710 1898 +141060 1845 1764 +141060 1477 1898 +141060 1564 1477 +141060 1564 1710 +141060 1710 1477 +141060 1519 1525 +141060 1718 1492 +141060 1492 1889 +141060 1698 1764 +141060 1698 1707 +141060 1698 1617 +141060 1845 1857 +141060 1845 1617 +141060 1698 1857 +141060 1707 1857 +141060 1707 1764 +141060 1707 1617 +141060 1857 1764 +141060 1857 1617 +141060 1617 1764 +141060 1718 1889 +141060 1598 1519 +141060 1669 1754 +141080 1702 1841 +141080 1702 1901 +141080 1707 1845 +141080 1598 1525 +141080 1551 1269 +141080 1694 1888 +141080 1710 1898 +141080 1845 1764 +141080 1477 1898 +141080 1564 1477 +141080 1564 1710 +141080 1710 1477 +141080 1519 1525 +141080 1718 1492 +141080 1492 1889 +141080 1698 1764 +141080 1698 1707 +141080 1698 1617 +141080 1845 1857 +141080 1845 1617 +141080 1698 1857 +141080 1707 1857 +141080 1707 1764 +141080 1707 1617 +141080 1857 1764 +141080 1857 1617 +141080 1617 1764 +141080 1718 1889 +141080 1598 1519 +141080 1669 1754 +141100 1551 1269 +141100 1694 1888 +141100 1710 1898 +141100 1845 1764 +141100 1477 1898 +141100 1564 1477 +141100 1564 1710 +141100 1710 1477 +141100 1519 1525 +141100 1718 1492 +141100 1492 1889 +141100 1698 1764 +141100 1698 1707 +141100 1698 1617 +141100 1845 1857 +141100 1845 1617 +141100 1698 1857 +141100 1707 1857 +141100 1707 1764 +141100 1707 1617 +141100 1857 1764 +141100 1857 1617 +141100 1617 1764 +141100 1718 1889 +141100 1598 1519 +141100 1669 1754 +141120 1707 1845 +141120 1580 1503 +141120 1564 1898 +141120 1710 1898 +141120 1845 1764 +141120 1477 1898 +141120 1882 1898 +141120 1564 1477 +141120 1564 1710 +141120 1710 1477 +141120 1519 1525 +141120 1825 1525 +141120 1718 1492 +141120 1598 1525 +141120 1492 1889 +141120 1698 1764 +141120 1698 1707 +141120 1698 1617 +141120 1845 1857 +141120 1845 1617 +141120 1698 1857 +141120 1707 1857 +141120 1707 1764 +141120 1707 1617 +141120 1857 1764 +141120 1857 1617 +141120 1617 1764 +141120 1718 1889 +141120 1598 1519 +141120 1669 1754 +141140 1564 1477 +141140 1564 1710 +141140 1441 1501 +141140 1710 1477 +141140 1519 1525 +141140 1825 1525 +141140 1718 1492 +141140 1598 1525 +141140 1492 1889 +141140 1452 1512 +141140 1698 1764 +141140 1698 1707 +141140 1698 1617 +141140 1845 1857 +141140 1845 1617 +141140 1698 1857 +141140 1707 1857 +141140 1707 1764 +141140 1707 1617 +141140 1857 1764 +141140 1857 1617 +141140 1617 1764 +141140 1718 1889 +141140 1598 1519 +141140 1669 1754 +141160 1555 1541 +141160 1825 1525 +141160 1718 1492 +141160 1598 1525 +141160 1492 1889 +141160 1452 1512 +141160 1845 1764 +141160 1698 1764 +141160 1698 1707 +141160 1698 1617 +141160 1845 1857 +141160 1845 1617 +141160 1698 1857 +141160 1707 1857 +141160 1707 1764 +141160 1707 1617 +141160 1857 1764 +141160 1857 1617 +141160 1617 1764 +141160 1792 1885 +141160 1718 1889 +141160 1598 1519 +141160 1669 1754 +141180 1452 1512 +141180 1845 1764 +141180 1698 1764 +141180 1698 1707 +141180 1698 1617 +141180 1845 1857 +141180 1845 1617 +141180 1698 1857 +141180 1707 1857 +141180 1707 1764 +141180 1707 1617 +141180 1857 1764 +141180 1857 1617 +141180 1617 1764 +141180 1792 1885 +141180 1718 1889 +141180 1598 1519 +141180 1669 1754 +141200 1579 1717 +141200 1712 1661 +141200 1845 1764 +141200 1598 1525 +141200 1698 1764 +141200 1698 1707 +141200 1698 1617 +141200 1845 1857 +141200 1845 1617 +141200 1698 1857 +141200 1707 1857 +141200 1707 1764 +141200 1707 1617 +141200 1857 1764 +141200 1857 1617 +141200 1617 1764 +141200 1792 1885 +141200 1718 1889 +141200 1598 1519 +141200 1669 1754 +141220 1551 1269 +141220 1531 1599 +141220 1598 1525 +141220 1604 1663 +141220 1519 1525 +141220 1698 1764 +141220 1698 1707 +141220 1698 1617 +141220 1845 1857 +141220 1845 1617 +141220 1698 1857 +141220 1707 1857 +141220 1707 1764 +141220 1707 1617 +141220 1857 1764 +141220 1857 1617 +141220 1617 1764 +141220 1792 1885 +141220 1718 1889 +141220 1598 1519 +141220 1669 1754 +141240 1924 1478 +141240 1501 1694 +141240 1845 1764 +141240 1698 1764 +141240 1698 1707 +141240 1698 1617 +141240 1845 1857 +141240 1845 1617 +141240 1698 1857 +141240 1707 1857 +141240 1707 1764 +141240 1707 1617 +141240 1857 1764 +141240 1857 1617 +141240 1617 1764 +141240 1792 1885 +141240 1718 1889 +141240 1598 1519 +141240 1669 1754 +141260 1707 1845 +141260 1683 1503 +141260 1541 1555 +141260 1825 1600 +141260 1825 1598 +141260 1845 1764 +141260 1841 1901 +141260 1698 1764 +141260 1698 1707 +141260 1698 1617 +141260 1845 1857 +141260 1845 1617 +141260 1698 1857 +141260 1707 1857 +141260 1707 1764 +141260 1707 1617 +141260 1857 1764 +141260 1857 1617 +141260 1617 1764 +141260 1792 1885 +141260 1718 1889 +141260 1598 1519 +141260 1669 1754 +141280 1551 1269 +141280 1841 1901 +141280 1924 1478 +141280 1437 1845 +141280 1598 1600 +141280 1600 1519 +141280 1698 1764 +141280 1698 1707 +141280 1698 1617 +141280 1702 1841 +141280 1845 1857 +141280 1845 1617 +141280 1437 1764 +141280 1437 1617 +141280 1698 1857 +141280 1698 1599 +141280 1707 1857 +141280 1707 1764 +141280 1707 1617 +141280 1857 1764 +141280 1857 1617 +141280 1617 1764 +141280 1792 1885 +141280 1718 1889 +141280 1598 1519 +141280 1669 1754 +141300 1707 1599 +141300 1924 1478 +141300 1669 1531 +141300 1684 1501 +141300 1437 1845 +141300 1457 1599 +141300 1598 1600 +141300 1600 1519 +141300 1698 1764 +141300 1698 1707 +141300 1698 1617 +141300 1698 1845 +141300 1702 1841 +141300 1845 1857 +141300 1845 1764 +141300 1845 1707 +141300 1845 1617 +141300 1437 1857 +141300 1437 1698 +141300 1437 1764 +141300 1437 1707 +141300 1437 1617 +141300 1437 1599 +141300 1698 1857 +141300 1698 1599 +141300 1707 1857 +141300 1707 1764 +141300 1707 1617 +141300 1599 1857 +141300 1599 1617 +141300 1857 1764 +141300 1857 1617 +141300 1617 1764 +141300 1792 1885 +141300 1541 1555 +141300 1599 1764 +141300 1580 1531 +141300 1718 1889 +141300 1598 1519 +141300 1669 1754 +141320 1825 1598 +141320 1698 1764 +141320 1698 1707 +141320 1698 1617 +141320 1698 1845 +141320 1702 1841 +141320 1845 1857 +141320 1845 1764 +141320 1845 1707 +141320 1845 1617 +141320 1845 1599 +141320 1437 1857 +141320 1437 1698 +141320 1437 1764 +141320 1437 1707 +141320 1437 1617 +141320 1437 1599 +141320 1698 1857 +141320 1698 1599 +141320 1707 1857 +141320 1707 1764 +141320 1707 1617 +141320 1599 1857 +141320 1599 1617 +141320 1857 1764 +141320 1857 1617 +141320 1617 1764 +141320 1792 1885 +141320 1551 1269 +141320 1541 1555 +141320 1599 1764 +141320 1580 1531 +141320 1718 1889 +141320 1598 1519 +141320 1669 1754 +141340 1687 1901 +141340 1437 1857 +141340 1437 1698 +141340 1437 1764 +141340 1437 1707 +141340 1437 1617 +141340 1437 1599 +141340 1698 1857 +141340 1698 1599 +141340 1707 1857 +141340 1707 1764 +141340 1707 1617 +141340 1707 1599 +141340 1599 1857 +141340 1599 1617 +141340 1857 1764 +141340 1857 1617 +141340 1617 1764 +141340 1889 1579 +141340 1792 1885 +141340 1551 1269 +141340 1541 1555 +141340 1599 1764 +141340 1580 1531 +141340 1718 1889 +141340 1598 1519 +141340 1669 1754 +141360 1792 1885 +141360 1551 1269 +141360 1541 1555 +141360 1599 1764 +141360 1702 1841 +141360 1580 1531 +141360 1794 1825 +141360 1718 1889 +141360 1598 1600 +141360 1598 1519 +141360 1669 1754 +141380 1702 1841 +141380 1580 1531 +141380 1600 1519 +141380 1794 1825 +141380 1718 1889 +141380 1598 1600 +141380 1598 1519 +141380 1669 1754 +141400 1794 1825 +141400 1718 1889 +141400 1598 1600 +141400 1598 1519 +141400 1600 1525 +141400 1924 1478 +141400 1551 1269 +141400 1541 1659 +141400 1525 1519 +141400 1712 1661 +141400 1669 1754 +141420 1924 1478 +141420 1551 1269 +141420 1555 1541 +141420 1541 1659 +141420 1702 1901 +141420 1525 1519 +141420 1712 1661 +141420 1702 1841 +141420 1555 1659 +141420 1669 1754 +141440 1882 1599 +141440 1712 1661 +141440 1684 1598 +141440 1702 1841 +141440 1580 1463 +141440 1841 1901 +141440 1718 1889 +141440 1555 1659 +141440 1669 1754 +141460 1678 1889 +141460 1678 1718 +141460 1684 1598 +141460 1687 1901 +141460 1541 1659 +141460 1702 1841 +141460 1702 1901 +141460 1580 1463 +141460 1718 1503 +141460 1555 1541 +141460 1841 1901 +141460 1718 1889 +141460 1555 1659 +141460 1669 1754 +141480 1555 1541 +141480 1841 1901 +141480 1718 1889 +141480 1555 1659 +141480 1669 1754 +141500 1825 1525 +141500 1702 1841 +141500 1841 1901 +141500 1718 1889 +141500 1555 1659 +141500 1541 1659 +141500 1702 1901 +141500 1678 1888 +141500 1669 1754 +141520 1541 1555 +141520 1680 1740 +141520 1694 1525 +141520 1718 1889 +141520 1555 1659 +141520 1541 1659 +141520 1702 1901 +141520 1678 1888 +141520 1551 1269 +141520 1669 1754 +141540 1752 1766 +141540 1718 1889 +141540 1555 1659 +141540 1541 1659 +141540 1702 1901 +141540 1678 1888 +141540 1551 1269 +141540 1669 1754 +141560 1555 1659 +141560 1694 1525 +141560 1541 1659 +141560 1702 1901 +141560 1752 1683 +141560 1678 1888 +141560 1551 1269 +141560 1489 1767 +141560 1669 1754 +141580 1541 1555 +141580 1678 1888 +141580 1699 1772 +141580 1551 1269 +141580 1718 1889 +141580 1441 1489 +141580 1441 1767 +141580 1489 1767 +141580 1669 1754 +141600 1541 1659 +141600 1580 1463 +141600 1894 1766 +141600 1699 1772 +141600 1555 1659 +141600 1551 1269 +141600 1464 1683 +141600 1718 1889 +141600 1441 1489 +141600 1441 1767 +141600 1489 1767 +141600 1669 1754 +141620 1924 1478 +141620 1699 1772 +141620 1457 1918 +141620 1704 1643 +141620 1591 1889 +141620 1555 1659 +141620 1594 1475 +141620 1551 1269 +141620 1541 1555 +141620 1718 1591 +141620 1464 1683 +141620 1718 1889 +141620 1752 1712 +141620 1712 1767 +141620 1441 1489 +141620 1441 1767 +141620 1489 1767 +141620 1752 1767 +141620 1441 1712 +141620 1441 1752 +141620 1712 1489 +141620 1489 1752 +141620 1669 1754 +141640 1551 1440 +141640 1680 1684 +141640 1594 1475 +141640 1551 1269 +141640 1541 1555 +141640 1718 1591 +141640 1464 1683 +141640 1718 1889 +141640 1752 1712 +141640 1712 1767 +141640 1441 1489 +141640 1441 1767 +141640 1489 1767 +141640 1752 1767 +141640 1441 1712 +141640 1441 1752 +141640 1712 1489 +141640 1489 1752 +141640 1669 1754 +141660 1551 1269 +141660 1541 1555 +141660 1699 1772 +141660 1718 1591 +141660 1464 1683 +141660 1718 1889 +141660 1752 1712 +141660 1712 1767 +141660 1441 1489 +141660 1441 1767 +141660 1489 1767 +141660 1752 1767 +141660 1441 1712 +141660 1441 1752 +141660 1712 1489 +141660 1489 1752 +141660 1489 1766 +141660 1766 1767 +141660 1669 1754 +141680 1694 1835 +141680 1825 1600 +141680 1464 1683 +141680 1718 1889 +141680 1752 1712 +141680 1712 1767 +141680 1441 1489 +141680 1441 1767 +141680 1489 1767 +141680 1752 1767 +141680 1441 1712 +141680 1441 1766 +141680 1441 1752 +141680 1712 1766 +141680 1712 1489 +141680 1489 1752 +141680 1489 1766 +141680 1752 1766 +141680 1766 1767 +141680 1669 1754 +141700 1825 1531 +141700 1551 1269 +141700 1718 1889 +141700 1752 1712 +141700 1712 1767 +141700 1441 1489 +141700 1441 1767 +141700 1489 1767 +141700 1752 1767 +141700 1441 1712 +141700 1441 1766 +141700 1441 1752 +141700 1712 1766 +141700 1712 1489 +141700 1489 1752 +141700 1489 1766 +141700 1752 1766 +141700 1766 1767 +141700 1669 1754 +141720 1551 1269 +141720 1718 1889 +141720 1591 1889 +141720 1600 1531 +141720 1702 1901 +141720 1752 1712 +141720 1712 1767 +141720 1441 1489 +141720 1441 1767 +141720 1489 1767 +141720 1752 1767 +141720 1441 1712 +141720 1441 1766 +141720 1441 1752 +141720 1712 1766 +141720 1712 1489 +141720 1489 1752 +141720 1489 1766 +141720 1752 1766 +141720 1766 1767 +141720 1669 1754 +141740 1555 1541 +141740 1687 1841 +141740 1702 1901 +141740 1752 1712 +141740 1712 1767 +141740 1441 1489 +141740 1441 1767 +141740 1489 1767 +141740 1752 1767 +141740 1441 1712 +141740 1441 1766 +141740 1441 1752 +141740 1712 1766 +141740 1712 1489 +141740 1489 1752 +141740 1489 1766 +141740 1752 1766 +141740 1766 1767 +141740 1669 1754 +141760 1551 1269 +141760 1694 1599 +141760 1835 1531 +141760 1752 1712 +141760 1712 1767 +141760 1441 1489 +141760 1441 1767 +141760 1489 1767 +141760 1752 1767 +141760 1441 1712 +141760 1441 1766 +141760 1441 1752 +141760 1712 1766 +141760 1712 1489 +141760 1489 1752 +141760 1489 1766 +141760 1752 1766 +141760 1766 1767 +141760 1718 1889 +141760 1669 1754 +141780 1702 1835 +141780 1835 1531 +141780 1835 1901 +141780 1591 1889 +141780 1600 1531 +141780 1752 1712 +141780 1712 1767 +141780 1440 1269 +141780 1441 1489 +141780 1441 1767 +141780 1489 1767 +141780 1752 1767 +141780 1551 1440 +141780 1441 1712 +141780 1441 1766 +141780 1441 1752 +141780 1712 1766 +141780 1712 1489 +141780 1489 1752 +141780 1489 1766 +141780 1752 1766 +141780 1766 1767 +141780 1718 1889 +141780 1669 1754 +141800 1684 1901 +141800 1702 1901 +141800 1752 1712 +141800 1712 1767 +141800 1680 1767 +141800 1440 1269 +141800 1441 1489 +141800 1441 1767 +141800 1489 1767 +141800 1752 1767 +141800 1551 1440 +141800 1680 1441 +141800 1680 1766 +141800 1680 1712 +141800 1680 1489 +141800 1680 1752 +141800 1441 1712 +141800 1441 1766 +141800 1441 1752 +141800 1712 1766 +141800 1712 1489 +141800 1489 1752 +141800 1489 1766 +141800 1752 1766 +141800 1766 1767 +141800 1718 1889 +141800 1669 1754 +141820 1551 1269 +141820 1752 1712 +141820 1712 1767 +141820 1680 1767 +141820 1440 1269 +141820 1441 1489 +141820 1441 1767 +141820 1489 1767 +141820 1752 1767 +141820 1551 1440 +141820 1680 1441 +141820 1680 1766 +141820 1680 1712 +141820 1680 1489 +141820 1680 1752 +141820 1441 1712 +141820 1441 1766 +141820 1441 1752 +141820 1712 1766 +141820 1712 1489 +141820 1489 1752 +141820 1489 1766 +141820 1752 1766 +141820 1766 1767 +141820 1718 1889 +141820 1669 1754 +141840 1752 1712 +141840 1712 1767 +141840 1767 1882 +141840 1680 1767 +141840 1440 1269 +141840 1441 1489 +141840 1441 1767 +141840 1585 1767 +141840 1489 1767 +141840 1752 1767 +141840 1551 1440 +141840 1680 1441 +141840 1680 1766 +141840 1680 1585 +141840 1680 1712 +141840 1680 1489 +141840 1680 1752 +141840 1441 1712 +141840 1441 1766 +141840 1441 1585 +141840 1441 1752 +141840 1712 1766 +141840 1712 1585 +141840 1712 1489 +141840 1489 1752 +141840 1489 1766 +141840 1752 1766 +141840 1766 1767 +141840 1664 1821 +141840 1718 1889 +141840 1702 1901 +141840 1669 1754 +141860 1680 1767 +141860 1680 1882 +141860 1440 1269 +141860 1441 1489 +141860 1441 1767 +141860 1585 1767 +141860 1598 1503 +141860 1489 1767 +141860 1752 1767 +141860 1551 1440 +141860 1680 1441 +141860 1680 1766 +141860 1680 1585 +141860 1680 1712 +141860 1680 1489 +141860 1680 1752 +141860 1441 1712 +141860 1441 1766 +141860 1441 1585 +141860 1441 1752 +141860 1441 1882 +141860 1712 1766 +141860 1712 1585 +141860 1712 1489 +141860 1712 1882 +141860 1585 1489 +141860 1585 1752 +141860 1489 1752 +141860 1489 1766 +141860 1752 1766 +141860 1766 1767 +141860 1664 1821 +141860 1684 1591 +141860 1718 1889 +141860 1702 1901 +141860 1669 1754 +141880 1551 1440 +141880 1680 1441 +141880 1680 1766 +141880 1680 1585 +141880 1680 1712 +141880 1680 1489 +141880 1680 1752 +141880 1680 1599 +141880 1441 1712 +141880 1441 1766 +141880 1441 1585 +141880 1441 1752 +141880 1441 1882 +141880 1829 1835 +141880 1712 1766 +141880 1712 1585 +141880 1712 1489 +141880 1712 1752 +141880 1712 1882 +141880 1585 1766 +141880 1585 1489 +141880 1585 1752 +141880 1489 1752 +141880 1489 1766 +141880 1752 1766 +141880 1752 1882 +141880 1766 1767 +141880 1766 1882 +141880 1767 1882 +141880 1664 1821 +141880 1684 1591 +141880 1835 1486 +141880 1718 1889 +141880 1702 1901 +141880 1669 1754 +141900 1664 1821 +141900 1924 1478 +141900 1541 1555 +141900 1684 1591 +141900 1835 1486 +141900 1718 1889 +141900 1702 1901 +141900 1669 1754 +141920 1555 1466 +141920 1829 1486 +141920 1718 1889 +141920 1702 1901 +141920 1669 1754 +141940 1664 1821 +141940 1835 1531 +141940 1718 1599 +141940 1599 1889 +141940 1486 1531 +141940 1835 1486 +141940 1718 1889 +141940 1702 1901 +141940 1669 1754 +141960 1551 1440 +141960 1551 1269 +141960 1440 1269 +141960 1825 1463 +141960 1835 1512 +141960 1835 1486 +141960 1924 1478 +141960 1718 1889 +141960 1702 1901 +141960 1669 1754 +141980 1580 1463 +141980 1924 1478 +141980 1718 1889 +141980 1702 1901 +141980 1669 1754 +142000 1924 1478 +142000 1718 1889 +142000 1839 1901 +142000 1551 1269 +142000 1551 1598 +142000 1702 1901 +142000 1669 1754 +142020 1924 1580 +142020 1834 1630 +142020 1839 1901 +142020 1460 1499 +142020 1598 1269 +142020 1551 1269 +142020 1551 1598 +142020 1702 1901 +142020 1669 1754 +142040 1598 1269 +142040 1551 1269 +142040 1551 1598 +142040 1702 1901 +142040 1669 1754 +142060 1829 1512 +142060 1551 1269 +142060 1718 1889 +142060 1551 1598 +142060 1702 1901 +142060 1669 1754 +142080 1924 1478 +142080 1551 1269 +142080 1718 1889 +142080 1551 1598 +142080 1702 1901 +142080 1669 1754 +142100 1551 1269 +142100 1718 1889 +142100 1551 1598 +142100 1702 1901 +142100 1669 1754 +142120 1551 1269 +142120 1598 1269 +142120 1718 1889 +142120 1551 1598 +142120 1702 1901 +142120 1669 1754 +142140 1551 1269 +142140 1687 1841 +142140 1598 1269 +142140 1718 1889 +142140 1551 1598 +142140 1702 1901 +142140 1669 1754 +142160 1555 1880 +142160 1829 1599 +142160 1702 1839 +142160 1598 1269 +142160 1599 1512 +142160 1718 1889 +142160 1551 1598 +142160 1702 1901 +142160 1669 1754 +142180 1678 1718 +142180 1440 1889 +142180 1440 1718 +142180 1599 1512 +142180 1718 1889 +142180 1551 1598 +142180 1702 1901 +142180 1669 1754 +142200 1516 1468 +142200 1599 1512 +142200 1702 1839 +142200 1718 1889 +142200 1551 1598 +142200 1702 1901 +142200 1669 1754 +142220 1551 1269 +142220 1825 1789 +142220 1829 1512 +142220 1702 1839 +142220 1718 1889 +142220 1674 1819 +142220 1551 1598 +142220 1702 1901 +142220 1669 1754 +142240 1674 1819 +142240 1551 1598 +142240 1598 1269 +142240 1702 1901 +142240 1669 1754 +142260 1674 1819 +142260 1551 1269 +142260 1551 1598 +142260 1702 1839 +142260 1718 1889 +142260 1598 1269 +142260 1924 1478 +142260 1702 1901 +142260 1669 1754 +142280 1924 1478 +142280 1598 1463 +142280 1702 1901 +142280 1669 1754 +142300 1702 1839 +142300 1702 1901 +142300 1669 1754 +142320 1664 1821 +142320 1702 1901 +142320 1669 1754 +142340 1664 1821 +142340 1551 1269 +142340 1839 1901 +142340 1702 1901 +142340 1669 1754 +142360 1924 1478 +142360 1825 1880 +142360 1702 1901 +142360 1591 1807 +142360 1674 1819 +142360 1807 1624 +142360 1669 1754 +142380 1674 1819 +142380 1807 1624 +142380 1669 1754 +142400 1664 1821 +142400 1924 1551 +142400 1702 1839 +142400 1839 1901 +142400 1551 1269 +142400 1924 1478 +142400 1702 1901 +142400 1674 1819 +142400 1807 1624 +142400 1669 1754 +142420 1924 1478 +142420 1675 1855 +142420 1702 1901 +142420 1674 1819 +142420 1807 1624 +142420 1669 1754 +142440 1687 1841 +142440 1674 1819 +142440 1807 1624 +142440 1669 1754 +142460 1687 1841 +142460 1702 1901 +142460 1674 1819 +142460 1807 1624 +142460 1669 1754 +142480 1674 1819 +142480 1807 1624 +142480 1669 1754 +142500 1839 1901 +142500 1674 1819 +142500 1702 1901 +142500 1807 1624 +142500 1669 1754 +142520 1924 1478 +142520 1687 1841 +142520 1551 1269 +142520 1674 1819 +142520 1702 1901 +142520 1807 1624 +142520 1669 1754 +142540 1473 1630 +142540 1674 1819 +142540 1551 1880 +142540 1702 1901 +142540 1807 1624 +142540 1834 1624 +142540 1834 1807 +142540 1669 1754 +142560 1674 1819 +142560 1606 1516 +142560 1551 1880 +142560 1702 1901 +142560 1807 1624 +142560 1834 1624 +142560 1834 1807 +142560 1669 1754 +142580 1551 1880 +142580 1460 1499 +142580 1550 1630 +142580 1874 1630 +142580 1702 1901 +142580 1858 1872 +142580 1807 1624 +142580 1834 1624 +142580 1834 1807 +142580 1669 1754 +142600 1674 1819 +142600 1551 1269 +142600 1702 1901 +142600 1858 1872 +142600 1807 1624 +142600 1834 1624 +142600 1834 1807 +142600 1669 1754 +142620 1924 1478 +142620 1694 1880 +142620 1594 1475 +142620 1606 1516 +142620 1555 1882 +142620 1858 1872 +142620 1807 1624 +142620 1834 1624 +142620 1834 1807 +142620 1669 1754 +142640 1666 1462 +142640 1550 1630 +142640 1555 1882 +142640 1460 1499 +142640 1858 1872 +142640 1674 1819 +142640 1807 1624 +142640 1834 1624 +142640 1834 1807 +142640 1669 1754 +142660 1880 1699 +142660 1555 1872 +142660 1555 1858 +142660 1555 1882 +142660 1555 1558 +142660 1558 1872 +142660 1558 1858 +142660 1558 1468 +142660 1882 1872 +142660 1460 1499 +142660 1858 1872 +142660 1674 1819 +142660 1807 1624 +142660 1834 1624 +142660 1834 1807 +142660 1669 1754 +142680 1674 1819 +142680 1606 1516 +142680 1616 1518 +142680 1924 1478 +142680 1807 1624 +142680 1834 1624 +142680 1834 1807 +142680 1669 1754 +142700 1924 1478 +142700 1558 1858 +142700 1482 1642 +142700 1550 1630 +142700 1807 1624 +142700 1834 1624 +142700 1834 1807 +142700 1669 1754 +142720 1492 1754 +142720 1606 1516 +142720 1807 1624 +142720 1834 1624 +142720 1834 1807 +142720 1669 1754 +142740 1734 1634 +142740 1520 1918 +142740 1580 1463 +142740 1606 1516 +142740 1674 1819 +142740 1807 1624 +142740 1834 1624 +142740 1834 1807 +142740 1669 1754 +142760 1796 1721 +142760 1550 1630 +142760 1551 1269 +142760 1580 1463 +142760 1471 1606 +142760 1606 1516 +142760 1471 1516 +142760 1674 1819 +142760 1807 1624 +142760 1834 1624 +142760 1834 1807 +142760 1669 1754 +142780 1538 1524 +142780 1580 1924 +142780 1734 1491 +142780 1756 1645 +142780 1580 1463 +142780 1471 1606 +142780 1606 1516 +142780 1471 1516 +142780 1674 1819 +142780 1807 1624 +142780 1834 1624 +142780 1834 1807 +142780 1669 1754 +142800 1687 1841 +142800 1839 1841 +142800 1841 1901 +142800 1580 1463 +142800 1551 1269 +142800 1471 1606 +142800 1606 1516 +142800 1471 1516 +142800 1674 1819 +142800 1807 1624 +142800 1834 1624 +142800 1834 1807 +142800 1669 1754 +142820 1580 1463 +142820 1594 1475 +142820 1734 1491 +142820 1551 1269 +142820 1471 1606 +142820 1606 1516 +142820 1471 1516 +142820 1674 1819 +142820 1807 1624 +142820 1834 1624 +142820 1834 1807 +142820 1669 1754 +142840 1734 1491 +142840 1609 1524 +142840 1551 1269 +142840 1687 1841 +142840 1924 1478 +142840 1471 1606 +142840 1606 1516 +142840 1471 1516 +142840 1674 1819 +142840 1807 1624 +142840 1834 1624 +142840 1834 1807 +142840 1669 1754 +142860 1538 1609 +142860 1538 1524 +142860 1568 1463 +142860 1734 1491 +142860 1609 1524 +142860 1551 1269 +142860 1687 1841 +142860 1924 1478 +142860 1471 1606 +142860 1606 1516 +142860 1471 1516 +142860 1674 1819 +142860 1807 1624 +142860 1834 1624 +142860 1834 1807 +142860 1901 1841 +142860 1669 1754 +142880 1551 1269 +142880 1593 1471 +142880 1901 1687 +142880 1687 1841 +142880 1924 1478 +142880 1471 1606 +142880 1606 1516 +142880 1471 1516 +142880 1674 1819 +142880 1807 1624 +142880 1834 1624 +142880 1834 1807 +142880 1901 1841 +142880 1669 1754 +142900 1901 1687 +142900 1687 1841 +142900 1924 1478 +142900 1471 1606 +142900 1606 1516 +142900 1471 1516 +142900 1674 1819 +142900 1807 1624 +142900 1834 1624 +142900 1834 1807 +142900 1901 1841 +142900 1669 1754 +142920 1580 1503 +142920 1550 1630 +142920 1471 1606 +142920 1606 1516 +142920 1471 1516 +142920 1609 1524 +142920 1538 1524 +142920 1674 1819 +142920 1580 1463 +142920 1734 1491 +142920 1807 1624 +142920 1834 1624 +142920 1834 1807 +142920 1901 1841 +142920 1669 1754 +142940 1734 1482 +142940 1471 1606 +142940 1606 1882 +142940 1538 1609 +142940 1606 1516 +142940 1471 1516 +142940 1609 1524 +142940 1616 1518 +142940 1538 1524 +142940 1684 1874 +142940 1674 1819 +142940 1580 1463 +142940 1734 1491 +142940 1807 1624 +142940 1834 1624 +142940 1834 1807 +142940 1901 1841 +142940 1669 1754 +142960 1924 1478 +142960 1674 1609 +142960 1538 1609 +142960 1819 1609 +142960 1606 1516 +142960 1471 1516 +142960 1609 1524 +142960 1616 1518 +142960 1734 1666 +142960 1674 1538 +142960 1674 1524 +142960 1538 1524 +142960 1684 1874 +142960 1674 1819 +142960 1580 1463 +142960 1734 1491 +142960 1807 1624 +142960 1834 1624 +142960 1451 1498 +142960 1451 1591 +142960 1591 1498 +142960 1834 1807 +142960 1901 1841 +142960 1669 1754 +142980 1674 1538 +142980 1674 1524 +142980 1538 1524 +142980 1684 1874 +142980 1580 1598 +142980 1674 1819 +142980 1463 1598 +142980 1580 1463 +142980 1734 1491 +142980 1807 1624 +142980 1834 1624 +142980 1451 1498 +142980 1451 1591 +142980 1591 1498 +142980 1834 1807 +142980 1901 1841 +142980 1669 1754 +143000 1674 1819 +143000 1734 1874 +143000 1463 1598 +143000 1498 1807 +143000 1551 1269 +143000 1580 1463 +143000 1734 1491 +143000 1616 1873 +143000 1807 1624 +143000 1834 1624 +143000 1451 1498 +143000 1451 1591 +143000 1591 1498 +143000 1834 1807 +143000 1901 1841 +143000 1669 1754 +143020 1880 1568 +143020 1591 1624 +143020 1440 1914 +143020 1440 1491 +143020 1834 1591 +143020 1551 1269 +143020 1834 1498 +143020 1580 1463 +143020 1734 1491 +143020 1616 1873 +143020 1807 1624 +143020 1834 1624 +143020 1451 1498 +143020 1451 1591 +143020 1591 1498 +143020 1834 1807 +143020 1901 1841 +143020 1669 1754 +143040 1699 1616 +143040 1699 1503 +143040 1834 1591 +143040 1491 1520 +143040 1734 1520 +143040 1551 1269 +143040 1834 1498 +143040 1580 1463 +143040 1734 1491 +143040 1616 1873 +143040 1807 1624 +143040 1834 1624 +143040 1451 1498 +143040 1451 1591 +143040 1591 1498 +143040 1834 1807 +143040 1901 1841 +143040 1669 1754 +143060 1440 1914 +143060 1440 1874 +143060 1551 1269 +143060 1834 1498 +143060 1580 1598 +143060 1580 1463 +143060 1734 1491 +143060 1616 1873 +143060 1537 1825 +143060 1807 1624 +143060 1834 1624 +143060 1451 1498 +143060 1451 1591 +143060 1591 1498 +143060 1834 1807 +143060 1901 1841 +143060 1669 1754 +143080 1924 1478 +143080 1839 1901 +143080 1834 1498 +143080 1580 1598 +143080 1580 1463 +143080 1734 1491 +143080 1616 1873 +143080 1537 1825 +143080 1807 1624 +143080 1834 1624 +143080 1451 1498 +143080 1451 1591 +143080 1591 1498 +143080 1834 1807 +143080 1901 1841 +143080 1669 1754 +143100 1834 1498 +143100 1580 1598 +143100 1580 1463 +143100 1734 1491 +143100 1616 1873 +143100 1537 1825 +143100 1451 1593 +143100 1593 1498 +143100 1591 1593 +143100 1598 1463 +143100 1807 1624 +143100 1834 1624 +143100 1451 1498 +143100 1451 1591 +143100 1591 1498 +143100 1834 1807 +143100 1901 1841 +143100 1669 1754 +143120 1537 1825 +143120 1684 1520 +143120 1451 1593 +143120 1593 1624 +143120 1593 1498 +143120 1689 1527 +143120 1591 1593 +143120 1598 1463 +143120 1807 1624 +143120 1834 1624 +143120 1834 1591 +143120 1451 1498 +143120 1451 1591 +143120 1591 1498 +143120 1834 1807 +143120 1901 1841 +143120 1669 1754 +143140 1689 1527 +143140 1591 1593 +143140 1616 1518 +143140 1498 1834 +143140 1598 1463 +143140 1807 1624 +143140 1834 1624 +143140 1834 1591 +143140 1451 1498 +143140 1451 1591 +143140 1591 1498 +143140 1834 1807 +143140 1901 1841 +143140 1669 1754 +143160 1684 1520 +143160 1689 1863 +143160 1498 1834 +143160 1498 1699 +143160 1699 1591 +143160 1598 1463 +143160 1440 1914 +143160 1863 1527 +143160 1537 1825 +143160 1807 1624 +143160 1699 1624 +143160 1834 1624 +143160 1834 1591 +143160 1451 1498 +143160 1451 1591 +143160 1591 1498 +143160 1825 1651 +143160 1834 1807 +143160 1901 1841 +143160 1540 1542 +143160 1669 1754 +143180 1537 1825 +143180 1807 1624 +143180 1807 1451 +143180 1807 1498 +143180 1699 1624 +143180 1834 1624 +143180 1834 1591 +143180 1834 1451 +143180 1451 1624 +143180 1451 1498 +143180 1451 1591 +143180 1591 1624 +143180 1591 1498 +143180 1624 1498 +143180 1689 1527 +143180 1825 1651 +143180 1834 1807 +143180 1901 1841 +143180 1540 1542 +143180 1669 1754 +143200 1689 1527 +143200 1825 1651 +143200 1834 1807 +143200 1551 1463 +143200 1901 1841 +143200 1440 1914 +143200 1540 1542 +143200 1669 1754 +143220 1463 1269 +143220 1463 1478 +143220 1551 1598 +143220 1551 1463 +143220 1901 1841 +143220 1440 1914 +143220 1540 1542 +143220 1669 1754 +143240 1551 1269 +143240 1551 1598 +143240 1463 1598 +143240 1551 1463 +143240 1901 1841 +143240 1440 1914 +143240 1540 1542 +143240 1669 1754 +143260 1551 1463 +143260 1687 1841 +143260 1687 1901 +143260 1901 1841 +143260 1440 1914 +143260 1540 1542 +143260 1669 1754 +143280 1687 1841 +143280 1687 1901 +143280 1689 1874 +143280 1463 1598 +143280 1901 1841 +143280 1440 1914 +143280 1540 1542 +143280 1669 1754 +143300 1924 1478 +143300 1551 1269 +143300 1463 1598 +143300 1901 1841 +143300 1440 1914 +143300 1540 1542 +143300 1669 1754 +143320 1901 1841 +143320 1689 1874 +143320 1440 1914 +143320 1540 1542 +143320 1669 1754 +143340 1568 1520 +143340 1540 1542 +143340 1463 1598 +143340 1669 1754 +143360 1540 1542 +143360 1568 1825 +143360 1689 1874 +143360 1463 1598 +143360 1669 1754 +143380 1924 1463 +143380 1689 1874 +143380 1440 1914 +143380 1551 1269 +143380 1687 1841 +143380 1463 1598 +143380 1669 1754 +143400 1551 1269 +143400 1687 1841 +143400 1463 1598 +143400 1669 1754 +143420 1924 1478 +143420 1463 1598 +143420 1669 1754 +143440 1922 1901 +143440 1463 1598 +143440 1669 1754 +143460 1684 1520 +143460 1463 1598 +143460 1669 1754 +143480 1666 1269 +143480 1463 1598 +143480 1669 1754 +143500 1678 1520 +143500 1678 1503 +143500 1684 1901 +143500 1924 1478 +143500 1463 1598 +143500 1669 1754 +143520 1678 1503 +143520 1684 1901 +143520 1924 1478 +143520 1593 1521 +143520 1463 1598 +143520 1669 1754 +143540 1551 1269 +143540 1825 1598 +143540 1924 1478 +143540 1924 1463 +143540 1593 1521 +143540 1463 1598 +143540 1669 1754 +143560 1924 1478 +143560 1924 1463 +143560 1684 1901 +143560 1593 1521 +143560 1678 1503 +143560 1463 1598 +143560 1669 1754 +143580 1678 1503 +143580 1551 1269 +143580 1702 1874 +143580 1540 1542 +143580 1641 1520 +143580 1463 1598 +143580 1669 1754 +143600 1702 1874 +143600 1540 1542 +143600 1666 1520 +143600 1666 1641 +143600 1641 1520 +143600 1463 1598 +143600 1669 1754 +143620 1540 1542 +143620 1593 1521 +143620 1666 1520 +143620 1666 1641 +143620 1641 1520 +143620 1463 1598 +143620 1669 1754 +143640 1666 1520 +143640 1666 1641 +143640 1641 1520 +143640 1463 1598 +143640 1669 1754 +143660 1666 1520 +143660 1666 1641 +143660 1641 1520 +143660 1542 1540 +143660 1463 1598 +143660 1669 1754 +143680 1666 1520 +143680 1551 1269 +143680 1666 1641 +143680 1702 1901 +143680 1641 1520 +143680 1542 1540 +143680 1463 1598 +143680 1669 1754 +143700 1593 1874 +143700 1666 1520 +143700 1551 1269 +143700 1666 1641 +143700 1702 1901 +143700 1924 1478 +143700 1641 1520 +143700 1542 1540 +143700 1463 1598 +143700 1669 1754 +143720 1666 1520 +143720 1551 1269 +143720 1666 1641 +143720 1702 1901 +143720 1924 1478 +143720 1641 1520 +143720 1542 1540 +143720 1463 1598 +143720 1669 1754 +143740 1666 1641 +143740 1702 1901 +143740 1924 1478 +143740 1641 1520 +143740 1542 1540 +143740 1463 1598 +143740 1669 1754 +143760 1551 1269 +143760 1542 1540 +143760 1463 1598 +143760 1669 1754 +143780 1825 1924 +143780 1702 1901 +143780 1841 1901 +143780 1463 1526 +143780 1551 1514 +143780 1542 1540 +143780 1463 1598 +143780 1669 1754 +143800 1551 1269 +143800 1841 1875 +143800 1551 1514 +143800 1542 1540 +143800 1463 1598 +143800 1669 1754 +143820 1551 1514 +143820 1542 1540 +143820 1463 1598 +143820 1669 1754 +143840 1551 1514 +143840 1542 1540 +143840 1924 1478 +143840 1463 1598 +143840 1669 1754 +143860 1542 1540 +143860 1924 1478 +143860 1463 1598 +143860 1669 1754 +143880 1924 1478 +143880 1702 1901 +143880 1841 1901 +143880 1463 1598 +143880 1669 1754 +143900 1540 1542 +143900 1463 1598 +143900 1669 1754 +143920 1540 1542 +143920 1463 1598 +143920 1669 1754 +143940 1921 1462 +143940 1463 1598 +143940 1669 1754 +143960 1921 1462 +143960 1463 1598 +143960 1669 1754 +143980 1678 1503 +143980 1463 1598 +143980 1669 1754 +144000 1921 1678 +144000 1678 1462 +144000 1921 1462 +144000 1463 1598 +144000 1669 1754 +144020 1540 1542 +144020 1921 1825 +144020 1921 1462 +144020 1463 1598 +144020 1669 1754 +144040 1924 1478 +144040 1825 1462 +144040 1921 1825 +144040 1921 1462 +144040 1463 1598 +144040 1669 1754 +144060 1540 1542 +144060 1825 1462 +144060 1921 1825 +144060 1921 1462 +144060 1463 1598 +144060 1669 1754 +144080 1825 1462 +144080 1921 1825 +144080 1921 1462 +144080 1463 1598 +144080 1669 1754 +144100 1921 1825 +144100 1678 1503 +144100 1463 1924 +144100 1921 1462 +144100 1463 1598 +144100 1669 1754 +144120 1540 1542 +144120 1678 1503 +144120 1463 1924 +144120 1921 1462 +144120 1463 1598 +144120 1669 1754 +144140 1921 1462 +144140 1463 1598 +144140 1669 1754 +144160 1540 1542 +144160 1921 1462 +144160 1463 1598 +144160 1669 1754 +144180 1924 1478 +144180 1921 1462 +144180 1463 1598 +144180 1669 1754 +144200 1924 1463 +144200 1921 1462 +144200 1463 1598 +144200 1669 1754 +144220 1921 1462 +144220 1463 1598 +144220 1669 1754 +144240 1540 1875 +144240 1542 1875 +144240 1921 1462 +144240 1463 1598 +144240 1669 1754 +144260 1676 1526 +144260 1921 1462 +144260 1463 1598 +144260 1669 1754 +144280 1540 1542 +144280 1463 1924 +144280 1921 1462 +144280 1463 1598 +144280 1669 1754 +144300 1921 1462 +144300 1463 1598 +144300 1669 1754 +144320 1921 1462 +144320 1463 1598 +144320 1669 1754 +144340 1921 1462 +144340 1463 1598 +144340 1669 1754 +144360 1921 1462 +144360 1463 1598 +144360 1669 1754 +144380 1463 1598 +144380 1669 1754 +144400 1542 1875 +144400 1924 1463 +144400 1463 1598 +144400 1669 1754 +144420 1924 1463 +144420 1463 1598 +144420 1669 1754 +144440 1463 1598 +144440 1669 1754 +144460 1543 1504 +144460 1540 1542 +144460 1463 1598 +144460 1669 1754 +144480 1463 1478 +144480 1924 1478 +144480 1540 1542 +144480 1463 1598 +144480 1669 1754 +144500 1798 1913 +144500 1924 1478 +144500 1540 1542 +144500 1463 1598 +144500 1669 1754 +144520 1540 1875 +144520 1542 1875 +144520 1676 1694 +144520 1463 1924 +144520 1540 1542 +144520 1463 1598 +144520 1669 1754 +144540 1676 1528 +144540 1540 1542 +144540 1924 1478 +144540 1463 1598 +144540 1669 1754 +144560 1540 1542 +144560 1463 1924 +144560 1924 1478 +144560 1463 1598 +144560 1669 1754 +144580 1924 1598 +144580 1540 1542 +144580 1463 1924 +144580 1463 1478 +144580 1924 1478 +144580 1463 1598 +144580 1669 1754 +144600 1540 1875 +144600 1540 1542 +144600 1542 1875 +144600 1463 1924 +144600 1463 1478 +144600 1924 1478 +144600 1463 1598 +144600 1669 1754 +144620 1924 1598 +144620 1924 1478 +144620 1463 1598 +144620 1669 1754 +144640 1924 1478 +144640 1540 1542 +144640 1463 1598 +144640 1669 1754 +144660 1924 1478 +144660 1540 1542 +144660 1542 1875 +144660 1829 1655 +144660 1463 1598 +144660 1669 1754 +144680 1540 1542 +144680 1542 1875 +144680 1540 1875 +144680 1829 1655 +144680 1463 1598 +144680 1669 1754 +144700 1540 1875 +144700 1924 1463 +144700 1829 1655 +144700 1463 1598 +144700 1669 1754 +144720 1463 1598 +144720 1669 1754 +144740 1463 1598 +144740 1669 1754 +144760 1463 1598 +144760 1669 1754 +144780 1924 1463 +144780 1478 1463 +144780 1463 1598 +144780 1669 1754 +144800 1793 1526 +144800 1463 1598 +144800 1669 1754 +144820 1924 1478 +144820 1793 1526 +144820 1463 1598 +144820 1669 1754 +144840 1793 1526 +144840 1463 1598 +144840 1669 1754 +144860 1793 1526 +144860 1463 1598 +144860 1669 1754 +144880 1793 1526 +144880 1463 1598 +144880 1669 1754 +144900 1793 1526 +144900 1463 1598 +144900 1669 1754 +144920 1793 1526 +144920 1463 1598 +144920 1669 1754 +144940 1793 1526 +144940 1463 1598 +144940 1669 1754 +144960 1793 1526 +144960 1463 1598 +144960 1669 1754 +144980 1793 1526 +144980 1463 1598 +144980 1669 1754 +145000 1455 1442 +145000 1793 1526 +145000 1463 1598 +145000 1669 1754 +145020 1924 1478 +145020 1793 1526 +145020 1463 1598 +145020 1669 1754 +145040 1924 1478 +145040 1793 1526 +145040 1463 1598 +145040 1669 1754 +145060 1793 1526 +145060 1463 1598 +145060 1669 1754 +145080 1793 1526 +145080 1463 1598 +145080 1669 1754 +145100 1924 1478 +145100 1793 1526 +145100 1463 1598 +145100 1669 1754 +145120 1924 1478 +145120 1924 1463 +145120 1793 1526 +145120 1463 1598 +145120 1669 1754 +145140 1924 1463 +145140 1793 1526 +145140 1463 1598 +145140 1669 1754 +145160 1793 1526 +145160 1463 1598 +145160 1669 1754 +145180 1793 1526 +145180 1463 1598 +145180 1669 1754 +145200 1924 1478 +145200 1793 1526 +145200 1463 1598 +145200 1669 1754 +145220 1924 1598 +145220 1924 1463 +145220 1793 1526 +145220 1463 1598 +145220 1669 1754 +145240 1793 1526 +145240 1463 1598 +145240 1669 1754 +145260 1924 1478 +145260 1793 1526 +145260 1463 1598 +145260 1669 1754 +145280 1924 1478 +145280 1825 1463 +145280 1825 1526 +145280 1793 1526 +145280 1924 1463 +145280 1463 1598 +145280 1669 1754 +145300 1825 1526 +145300 1793 1526 +145300 1924 1463 +145300 1463 1598 +145300 1669 1754 +145320 1793 1526 +145320 1924 1463 +145320 1463 1598 +145320 1669 1754 +145340 1793 1526 +145340 1924 1478 +145340 1924 1463 +145340 1825 1526 +145340 1463 1598 +145340 1669 1754 +145360 1825 1526 +145360 1463 1598 +145360 1669 1754 +145380 1825 1526 +145380 1463 1598 +145380 1669 1754 +145400 1825 1526 +145400 1463 1598 +145400 1669 1754 +145420 1825 1526 +145420 1924 1478 +145420 1463 1598 +145420 1669 1754 +145440 1924 1478 +145440 1676 1528 +145440 1463 1598 +145440 1669 1754 +145460 1924 1478 +145460 1676 1528 +145460 1463 1598 +145460 1669 1754 +145480 1676 1528 +145480 1463 1598 +145480 1669 1754 +145500 1463 1598 +145500 1669 1754 +145520 1924 1478 +145520 1463 1598 +145520 1669 1754 +145540 1825 1526 +145540 1463 1598 +145540 1669 1754 +145560 1463 1598 +145560 1669 1754 +145580 1463 1598 +145580 1669 1754 +145600 1825 1526 +145600 1924 1478 +145600 1924 1598 +145600 1924 1463 +145600 1669 1463 +145600 1463 1598 +145600 1669 1754 +145620 1825 1655 +145620 1526 1655 +145620 1463 1598 +145620 1669 1754 +145640 1825 1655 +145640 1526 1655 +145640 1655 1598 +145640 1655 1463 +145640 1463 1598 +145640 1669 1754 +145660 1463 1526 +145660 1526 1598 +145660 1526 1655 +145660 1655 1598 +145660 1655 1463 +145660 1463 1598 +145660 1669 1754 +145680 1463 1526 +145680 1526 1598 +145680 1526 1655 +145680 1655 1598 +145680 1655 1463 +145680 1463 1598 +145680 1669 1754 +145700 1655 1598 +145700 1655 1463 +145700 1463 1598 +145700 1669 1754 +145720 1655 1598 +145720 1655 1463 +145720 1526 1598 +145720 1463 1598 +145720 1463 1526 +145720 1526 1655 +145720 1669 1754 +145740 1463 1598 +145740 1463 1526 +145740 1526 1655 +145740 1669 1754 +145760 1669 1754 +145780 1669 1754 +145800 1669 1754 +145820 1669 1754 +145840 1669 1754 +145860 1513 1655 +145860 1669 1754 +145880 1669 1754 +145900 1669 1754 +145920 1669 1754 +145940 1669 1754 +145960 1669 1754 +145980 1669 1754 +146000 1924 1478 +146000 1669 1754 +146020 1924 1478 +146020 1669 1754 +146040 1669 1754 +146060 1669 1754 +146080 1669 1754 +146100 1669 1754 +146120 1754 1694 +146120 1669 1754 +146140 1563 1839 +146140 1669 1754 +146160 1669 1754 +146180 1669 1754 +146200 1475 1594 +146200 1669 1754 +146220 1669 1754 +146240 1669 1754 +146260 1669 1754 +146280 1669 1754 +146300 1669 1754 +146320 1669 1754 +146340 1669 1754 +146360 1669 1754 +146380 1655 1694 +146380 1669 1754 +146400 1669 1754 +146420 1669 1754 +146440 1813 1655 +146440 1669 1754 +146460 1669 1754 +146480 1669 1754 +146500 1669 1754 +146520 1669 1754 +146540 1669 1754 +146560 1669 1754 +146580 1669 1754 +146600 1669 1754 +146620 1669 1754 +146640 1655 1882 +146640 1655 1599 +146640 1669 1754 +146660 1655 1599 +146660 1669 1754 +146680 1669 1754 +146700 1669 1754 +146720 1655 1599 +146720 1669 1754 +146740 1512 1599 +146740 1669 1754 +146760 1512 1599 +146760 1669 1754 +146760 1518 1616 +146780 1669 1754 +146780 1518 1616 +146800 1577 1655 +146800 1616 1655 +146800 1669 1754 +146800 1577 1616 +146800 1577 1518 +146800 1518 1616 +146800 1518 1655 +146820 1669 1754 +146820 1577 1616 +146820 1577 1518 +146820 1518 1616 +146820 1518 1655 diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 313d62ce6afb..048bed11fc8f 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -5,21 +5,34 @@ //! cargo run -p node_link_graph -- --connect //! ``` -use rerun::external::re_log; +use rerun::external::{log, re_log}; +use strum::IntoEnumIterator; -use rerun::{Color, GraphEdgesDirected, GraphEdgesUndirected, GraphNodes}; +mod examples; + +#[derive(Copy, Clone, Debug, clap::ValueEnum, strum_macros::EnumIter)] +enum Example { + Simple, + Social, +} + +impl Example { + fn run(&self, args: &Args) -> anyhow::Result<()> { + match self { + Example::Simple => examples::simple::run(args), + Example::Social => examples::social::run(args), + } + } +} #[derive(Debug, clap::Parser)] #[clap(author, version, about)] -struct Args { +pub struct Args { #[command(flatten)] rerun: rerun::clap::RerunArgs, - #[clap(long, default_value = "10")] - num_points_per_axis: usize, - - #[clap(long, default_value = "10.0")] - radius: f32, + #[arg(short, long)] + example: Option } fn main() -> anyhow::Result<()> { @@ -28,58 +41,17 @@ fn main() -> anyhow::Result<()> { use clap::Parser as _; let args = Args::parse(); - let (rec, _serve_guard) = args.rerun.init("rerun_example_node_link_graph")?; - run(&rec, &args) -} - -fn run(rec: &rerun::RecordingStream, _args: &Args) -> anyhow::Result<()> { - rec.set_time_sequence("frame", 0); - rec.log( - "kitchen/objects", - &GraphNodes::new(["sink", "fridge"]) - .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), - )?; - - rec.log("kitchen/nodes", &GraphNodes::new(["area0", "area1"]))?; - rec.log( - "kitchen/edges", - &GraphEdgesDirected::new([("kitchen/nodes", "area0", "area1")]), - )?; - - rec.set_time_sequence("frame", 1); - rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; - - rec.set_time_sequence("frame", 2); - rec.log("living/objects", &GraphNodes::new(["table"]))?; - rec.log( - "living/nodes", - &GraphNodes::new(["area0", "area1", "area2"]), - )?; - rec.log( - "living/edges", - &GraphEdgesDirected::new([ - ("living/nodes", "area0", "area1"), - ("living/nodes", "area0", "area2"), - ("living/nodes", "area1", "area2"), - ]), - )?; - - rec.log( - "doors/edges", - &GraphEdgesDirected::new([ - (("kitchen/nodes", "area0"), ("hallway/nodes", "area0")), - (("hallway/nodes", "area0"), ("living/nodes", "area2")), - ]), - )?; - - rec.log( - "edges", - &GraphEdgesUndirected::new([ - (("kitchen/nodes", "area0"), ("kitchen/objects", "sink")), - (("kitchen/nodes", "area1"), ("kitchen/objects", "fridge")), - (("living/nodes", "area1"), ("living/objects", "table")), - ]), - )?; + if let Some(example) = args.example { + log::info!("Running example: {:?}", example); + example.run(&args)?; + return Ok(()); + } + + // By default we log all examples. + for example in Example::iter() { + log::info!("Running example: {:?}", example); + example.run(&args)?; + } Ok(()) } From 8fd9263be31e22522bf2f5a1cba9ffdee19c7fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 08:32:33 +0200 Subject: [PATCH 061/159] WIP: use unreleased version of `fdg` --- Cargo.lock | 84 +++++++++++++++++++ examples/rust/graph_view/Cargo.toml | 5 +- .../rust/graph_view/src/layout/fruchterman.rs | 62 ++++++++++++++ examples/rust/graph_view/src/layout/mod.rs | 8 ++ examples/rust/graph_view/src/ui/state.rs | 3 +- examples/rust/graph_view/src/view.rs | 5 +- 6 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 examples/rust/graph_view/src/layout/fruchterman.rs diff --git a/Cargo.lock b/Cargo.lock index c53b8f2b17da..0eda51a98585 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -259,6 +259,15 @@ version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "arboard" version = "3.4.0" @@ -2327,6 +2336,18 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fdg" +version = "1.0.0" +source = "git+https://github.com/grantshandy/fdg?rev=50755f1dea20249d753600e7e7e51ca33e87b5a1#50755f1dea20249d753600e7e7e51ca33e87b5a1" +dependencies = [ + "nalgebra", + "num-traits", + "petgraph", + "rand", + "rustc-hash", +] + [[package]] name = "fdg-sim" version = "0.9.1" @@ -2748,10 +2769,12 @@ name = "graph_view" version = "0.0.0" dependencies = [ "bytemuck", + "fdg", "fdg-sim", "layout-rs", "mimalloc", "petgraph", + "rand", "re_crash_handler", "re_format", "re_log_types", @@ -3623,6 +3646,35 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "rand", + "rand_distr", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "nasm-rs" version = "0.3.0" @@ -6783,6 +6835,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "safe_arch" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +dependencies = [ + "bytemuck", +] + [[package]] name = "same-file" version = "1.0.6" @@ -6960,6 +7021,19 @@ dependencies = [ "libc", ] +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.5" @@ -8242,6 +8316,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wide" +version = "0.7.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "widestring" version = "1.0.2" diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index fb1344cd7765..3cadfe519acd 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -30,5 +30,8 @@ bytemuck = "1.18" thiserror = "1.0" # Experiment with different layout algorithms. -fdg-sim = "0.9" layout-rs = "0.1" +fdg-sim = "0.9" +# `fdg` supersedes `fdg-sim` and is more featureful but not released to crates.io yet. +fdg = { git = "https://github.com/grantshandy/fdg", rev = "50755f1dea20249d753600e7e7e51ca33e87b5a1", default-features = false } +rand = "0.8" diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs new file mode 100644 index 000000000000..857c7e45fa61 --- /dev/null +++ b/examples/rust/graph_view/src/layout/fruchterman.rs @@ -0,0 +1,62 @@ +use std::collections::HashMap; + +use rand::distributions::Distribution as _; +use fdg::{nalgebra::Point2, Force as _}; +use re_viewer::external::egui; + +use crate::{error::Error, types::NodeIndex}; + +use super::Layout; + +#[derive(Debug, Default, PartialEq, Eq)] +pub struct FruchtermanReingoldLayout; + +impl Layout for FruchtermanReingoldLayout { + type NodeIx = NodeIndex; + + fn compute( + &self, + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { + let mut node_to_index = HashMap::new(); + let mut graph: fdg::ForceGraph = + fdg::ForceGraph::default(); + + for (node_id, size) in nodes { + + let dist = fdg::rand_distributions::Uniform::new(-10.0, 10.0); + + let ix = graph.add_node(((node_id.clone(), size), Point2::new(dist.sample(&mut rand::thread_rng()), dist.sample(&mut rand::thread_rng())))); + node_to_index.insert(node_id, ix); + } + + for (source, target) in directed.into_iter().chain(undirected) { + let source_ix = node_to_index + .get(&source) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + let target_ix = node_to_index + .get(&target) + .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + graph.add_edge(*source_ix, *target_ix, ()); + } + + // create a simulation from the graph + fdg::fruchterman_reingold::FruchtermanReingold::default().apply_many(&mut graph, 100); + // Center the graph's average around (0,0). + fdg::simple::Center::default().apply(&mut graph); + + let res = graph + .node_weights() + .map(|(data, pos)| { + let (ix, size) = data; + let center = egui::Pos2::new(pos.x, pos.y); + let rect = egui::Rect::from_center_size(center, *size); + (ix.clone(), rect) + }) + .collect(); + + Ok(res) + } +} diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index ba5dbfcf4e3c..024e9f21fa36 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -8,6 +8,8 @@ mod dot; pub(crate) use dot::DotLayout; mod force_directed; pub(crate) use force_directed::ForceBasedLayout; +mod fruchterman; +pub(crate) use fruchterman::FruchtermanReingoldLayout; pub(crate) trait Layout { type NodeIx: Clone + Eq + std::hash::Hash; @@ -24,6 +26,7 @@ pub(crate) trait Layout { pub(crate) enum LayoutProvider { Dot(DotLayout), ForceDirected(ForceBasedLayout), + FruchtermanReingold(FruchtermanReingoldLayout), } impl LayoutProvider { @@ -34,6 +37,10 @@ impl LayoutProvider { pub(crate) fn new_force_directed() -> Self { LayoutProvider::ForceDirected(Default::default()) } + + pub(crate) fn new_fruchterman_reingold() -> Self { + LayoutProvider::FruchtermanReingold(Default::default()) + } } impl LayoutProvider { @@ -46,6 +53,7 @@ impl LayoutProvider { match self { LayoutProvider::Dot(layout) => layout.compute(nodes, directed, undirected), LayoutProvider::ForceDirected(layout) => layout.compute(nodes, directed, undirected), + LayoutProvider::FruchtermanReingold(layout) => layout.compute(nodes, directed, undirected), } } } diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 19420813ce9f..027aeb11c983 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -33,7 +33,7 @@ impl Default for GraphSpaceViewState { clip_rect_window: egui::Rect::NOTHING, show_debug: Default::default(), layout: Default::default(), - layout_provider: LayoutProvider::new_force_directed(), + layout_provider: LayoutProvider::new_fruchterman_reingold(), } } } @@ -95,6 +95,7 @@ impl GraphSpaceViewState { let layout_options = [ (LayoutProvider::new_dot(), "Dot"), (LayoutProvider::new_force_directed(), "Force Directed"), + (LayoutProvider::new_fruchterman_reingold(), "Fruchterman-Reingold"), ]; for (l, t) in layout_options { diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index f61d12f09551..f03376d13fbf 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -164,7 +164,10 @@ impl SpaceViewClass for GraphSpaceView { return Ok(()); }; - if graph.all_nodes().any(|n| !layout.contains_key(&NodeIndex::from(&n))) { + if graph + .all_nodes() + .any(|n| !layout.contains_key(&NodeIndex::from(&n))) + { state.layout = None; return Ok(()); } From 6fddce8c84bea9290d0e12585455512200b334e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 09:31:45 +0200 Subject: [PATCH 062/159] feat: implement `From` for `bool` --- crates/store/re_types/src/components/show_labels_ext.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/store/re_types/src/components/show_labels_ext.rs b/crates/store/re_types/src/components/show_labels_ext.rs index ce3b5ff9cd84..8914bba71ea0 100644 --- a/crates/store/re_types/src/components/show_labels_ext.rs +++ b/crates/store/re_types/src/components/show_labels_ext.rs @@ -8,3 +8,10 @@ impl Default for ShowLabels { Self(true.into()) } } + +impl From for bool { + #[inline] + fn from(value: ShowLabels) -> Self { + value.0.into() + } +} From c64678e86599d35b8e5cde3b06afccc80924d2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 09:39:37 +0200 Subject: [PATCH 063/159] WIP: better force-directed layouts and nodes as circles --- examples/rust/graph_view/src/error.rs | 2 +- .../graph_view/src/layout/force_directed.rs | 1 + .../rust/graph_view/src/layout/fruchterman.rs | 13 +++-- examples/rust/graph_view/src/layout/mod.rs | 4 +- examples/rust/graph_view/src/types.rs | 1 + examples/rust/graph_view/src/ui/mod.rs | 48 ++--------------- examples/rust/graph_view/src/ui/node.rs | 54 +++++++++++++++++++ examples/rust/graph_view/src/ui/state.rs | 5 +- examples/rust/graph_view/src/view.rs | 2 +- .../rust/graph_view/src/visualizers/nodes.rs | 9 +--- .../src/examples/social/mod.rs | 7 ++- examples/rust/node_link_graph/src/main.rs | 2 +- 12 files changed, 86 insertions(+), 62 deletions(-) create mode 100644 examples/rust/graph_view/src/ui/node.rs diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 31713cc228bb..04951746a307 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -6,7 +6,7 @@ pub enum Error { #[error("edge has unknown node: {0}")] EdgeUnknownNode(String), #[error("missing layout information for node `{1}` in entity `{0}`")] - MissingLayoutInformation(EntityPath, datatypes::GraphNodeId) + MissingLayoutInformation(EntityPath, datatypes::GraphNodeId), } impl From for SpaceViewSystemExecutionError { diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs index 2d1d68f7525a..6d38a09b228a 100644 --- a/examples/rust/graph_view/src/layout/force_directed.rs +++ b/examples/rust/graph_view/src/layout/force_directed.rs @@ -7,6 +7,7 @@ use crate::{error::Error, types::NodeIndex}; use super::Layout; +#[deprecated] #[derive(Debug, Default, PartialEq, Eq)] pub struct ForceBasedLayout; diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs index 857c7e45fa61..d8b25cde96f0 100644 --- a/examples/rust/graph_view/src/layout/fruchterman.rs +++ b/examples/rust/graph_view/src/layout/fruchterman.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; -use rand::distributions::Distribution as _; use fdg::{nalgebra::Point2, Force as _}; +use rand::distributions::Distribution as _; use re_viewer::external::egui; use crate::{error::Error, types::NodeIndex}; @@ -25,10 +25,15 @@ impl Layout for FruchtermanReingoldLayout { fdg::ForceGraph::default(); for (node_id, size) in nodes { - let dist = fdg::rand_distributions::Uniform::new(-10.0, 10.0); - let ix = graph.add_node(((node_id.clone(), size), Point2::new(dist.sample(&mut rand::thread_rng()), dist.sample(&mut rand::thread_rng())))); + let ix = graph.add_node(( + (node_id.clone(), size), + Point2::new( + dist.sample(&mut rand::thread_rng()), + dist.sample(&mut rand::thread_rng()), + ), + )); node_to_index.insert(node_id, ix); } @@ -43,7 +48,7 @@ impl Layout for FruchtermanReingoldLayout { } // create a simulation from the graph - fdg::fruchterman_reingold::FruchtermanReingold::default().apply_many(&mut graph, 100); + fdg::fruchterman_reingold::FruchtermanReingold::default().apply_many(&mut graph, 1000); // Center the graph's average around (0,0). fdg::simple::Center::default().apply(&mut graph); diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index 024e9f21fa36..73c0f4c6629b 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -53,7 +53,9 @@ impl LayoutProvider { match self { LayoutProvider::Dot(layout) => layout.compute(nodes, directed, undirected), LayoutProvider::ForceDirected(layout) => layout.compute(nodes, directed, undirected), - LayoutProvider::FruchtermanReingold(layout) => layout.compute(nodes, directed, undirected), + LayoutProvider::FruchtermanReingold(layout) => { + layout.compute(nodes, directed, undirected) + } } } } diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs index 14084f5baaf7..a1e1d62269c8 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/types.rs @@ -62,6 +62,7 @@ pub(crate) struct NodeInstance<'a> { pub node_id: &'a datatypes::GraphNodeId, pub entity_path: &'a EntityPath, pub instance: Instance, + pub show_labels: bool, pub label: Option<&'a ArrowString>, pub color: Option, } diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 8e61c83caceb..51336d525efd 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use re_format::format_f32; use re_log_types::EntityPath; use re_viewer::external::{ - egui::{self, emath, TextWrapMode}, + egui::{self, emath, Pos2, TextWrapMode}, re_ui::UiExt, re_viewer_context::{ HoverHighlight, InteractionHighlight, SelectionHighlight, SpaceViewHighlights, @@ -13,6 +13,8 @@ use re_viewer::external::{ mod edge; pub(crate) use edge::draw_edge; +mod node; +pub(crate) use node::draw_node; mod state; pub(crate) use state::GraphSpaceViewState; @@ -22,48 +24,6 @@ use crate::{ types::{NodeIndex, NodeInstance, UnknownNodeInstance}, }; -pub fn draw_node( - ui: &mut egui::Ui, - instance: &NodeInstance, - highlight: InteractionHighlight, -) -> egui::Response { - let hcolor = match ( - highlight.hover, - highlight.selection != SelectionHighlight::None, - ) { - (HoverHighlight::None, false) => ui.style().visuals.text_color(), - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, - }; - - let bg = match highlight.hover { - HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, - HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, - }; - // ui.style().visuals.faint_bg_color - - let text = instance - .label - .map_or(egui::RichText::new(instance.node_id.to_string()), |label| { - egui::RichText::new(label.to_string()) - }); - - egui::Frame::default() - .rounding(egui::Rounding::same(4.0)) - .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) - .inner_margin(egui::Vec2::new(6.0, 4.0)) - .fill(bg) - .show(ui, |ui| { - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); - if let Some(color) = instance.color { - ui.add(egui::Button::new(text.color(color))); - } else { - ui.add(egui::Button::new(text)); - } - }) - .response -} - pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { let text = egui::RichText::new(format!( "{} @ {}", @@ -121,7 +81,7 @@ pub fn measure_node_sizes<'a>( for node in nodes { match node { Node::Regular(instance) => { - let r = draw_node(ui, &instance, InteractionHighlight::default()); + let r = draw_node(ui, &instance, Pos2::ZERO, InteractionHighlight::default()); sizes.insert((&instance).into(), r.rect.size()); } Node::Unknown(instance) => { diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs new file mode 100644 index 000000000000..30117f5276e0 --- /dev/null +++ b/examples/rust/graph_view/src/ui/node.rs @@ -0,0 +1,54 @@ +use re_viewer::external::{ + egui, + re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}, +}; + +use crate::types::NodeInstance; + +pub fn draw_node( + ui: &mut egui::Ui, + instance: &NodeInstance, + pos: egui::Pos2, + highlight: InteractionHighlight, +) -> egui::Response { + let hcolor = match ( + highlight.hover, + highlight.selection != SelectionHighlight::None, + ) { + (HoverHighlight::None, false) => ui.style().visuals.text_color(), + (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, + (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + }; + + let bg = match highlight.hover { + HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, + HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, + }; + // ui.style().visuals.faint_bg_color + + if let (true, Some(label)) = (instance.show_labels, instance.label) { + let text = egui::RichText::new(label.to_string()); + + egui::Frame::default() + .rounding(egui::Rounding::same(4.0)) + .stroke(egui::Stroke::new(1.0, ui.style().visuals.text_color())) + .inner_margin(egui::Vec2::new(6.0, 4.0)) + .fill(bg) + .show(ui, |ui| { + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); + if let Some(color) = instance.color { + ui.add(egui::Button::new(text.color(color))); + } else { + ui.add(egui::Button::new(text)); + } + }) + .response + } else { + egui::Frame::default() + .show(ui, |ui| { + let painter = ui.painter(); + painter.circle(pos, 3.0, hcolor, egui::Stroke::new(1.0, hcolor)); + }) + .response + } +} diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 027aeb11c983..e9c7b557fb44 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -95,7 +95,10 @@ impl GraphSpaceViewState { let layout_options = [ (LayoutProvider::new_dot(), "Dot"), (LayoutProvider::new_force_directed(), "Force Directed"), - (LayoutProvider::new_fruchterman_reingold(), "Fruchterman-Reingold"), + ( + LayoutProvider::new_fruchterman_reingold(), + "Fruchterman-Reingold", + ), ]; for (l, t) in layout_options { diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index f03376d13fbf..87a3c6965274 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -266,7 +266,7 @@ impl SpaceViewClass for GraphSpaceView { .show(ui.ctx(), |ui| { let highlight = ent_highlight.index_highlight(node.instance); ui.set_clip_rect(clip_rect_world); - ui::draw_node(ui, &node, highlight) + ui::draw_node(ui, &node, current_extent.min, highlight) }) .response; diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 452d07afb83a..83a434e03d94 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -45,13 +45,7 @@ impl NodeVisualizerData { (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, - self.labels.iter().map(|l| { - if self.show_labels.is_some() { - Some(l) - } else { - None - } - }), + self.labels.iter().map(Option::Some), Option::<&ArrowString>::default, ) .map(move |(node_id, instance, color, label)| NodeInstance { @@ -59,6 +53,7 @@ impl NodeVisualizerData { node_id, instance, color: color.map(|c| Color32::from(c.0)), + show_labels: self.show_labels.map_or(false, bool::from), label, }) } diff --git a/examples/rust/node_link_graph/src/examples/social/mod.rs b/examples/rust/node_link_graph/src/examples/social/mod.rs index 29e31849fb67..848131a341ee 100644 --- a/examples/rust/node_link_graph/src/examples/social/mod.rs +++ b/examples/rust/node_link_graph/src/examples/social/mod.rs @@ -52,7 +52,6 @@ pub fn run(args: &Args) -> anyhow::Result<()> { let entries = parse_data_file()?; for (timestamp, chunk) in &entries.into_iter().chunk_by(|t| t.timestamp) { - let interactions = chunk.collect::>(); let mut nodes = HashSet::new(); @@ -78,7 +77,11 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.log( "/interactions", - &GraphEdgesUndirected::new(interactions.into_iter().map(|i| ("/persons", i.person_a, i.person_b))), + &GraphEdgesUndirected::new( + interactions + .into_iter() + .map(|i| ("/persons", i.person_a, i.person_b)), + ), )?; } Ok(()) diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 048bed11fc8f..879ad28f13eb 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -32,7 +32,7 @@ pub struct Args { rerun: rerun::clap::RerunArgs, #[arg(short, long)] - example: Option + example: Option, } fn main() -> anyhow::Result<()> { From 933a712359e1eb118ddbf7c364f7ab741a6bd9a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 09:40:49 +0200 Subject: [PATCH 064/159] WIP: fmt --- examples/rust/graph_view/src/error.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 04951746a307..4b277ef94065 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -5,6 +5,7 @@ use re_viewer::external::{re_types::datatypes, re_viewer_context::SpaceViewSyste pub enum Error { #[error("edge has unknown node: {0}")] EdgeUnknownNode(String), + #[error("missing layout information for node `{1}` in entity `{0}`")] MissingLayoutInformation(EntityPath, datatypes::GraphNodeId), } From 25022b71d8260753a530b88964e99d5251aa18b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 09:54:50 +0200 Subject: [PATCH 065/159] WIP: improve node rendering --- examples/rust/graph_view/src/ui/node.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs index 30117f5276e0..13b40a687e76 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/examples/rust/graph_view/src/ui/node.rs @@ -15,9 +15,9 @@ pub fn draw_node( highlight.hover, highlight.selection != SelectionHighlight::None, ) { - (HoverHighlight::None, false) => ui.style().visuals.text_color(), - (HoverHighlight::None, true) => ui.style().visuals.selection.bg_fill, - (HoverHighlight::Hovered, ..) => ui.style().visuals.widgets.hovered.bg_fill, + (HoverHighlight::None, false) => None, + (HoverHighlight::None, true) => Some(ui.style().visuals.selection.bg_fill), + (HoverHighlight::Hovered, ..) => Some(ui.style().visuals.widgets.hovered.bg_fill), }; let bg = match highlight.hover { @@ -47,7 +47,12 @@ pub fn draw_node( egui::Frame::default() .show(ui, |ui| { let painter = ui.painter(); - painter.circle(pos, 3.0, hcolor, egui::Stroke::new(1.0, hcolor)); + painter.circle( + pos, + 3.0, + instance.color.unwrap_or(ui.style().visuals.text_color()), + hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), + ); }) .response } From 760d8d4f746d53803f4f5e26c8fbf6abc5159859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 13:37:35 +0200 Subject: [PATCH 066/159] WIP: make circles draggable --- examples/rust/graph_view/src/select.rs | 23 +++++++++++++++++++++++ examples/rust/graph_view/src/ui/node.rs | 9 +++++---- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 examples/rust/graph_view/src/select.rs diff --git a/examples/rust/graph_view/src/select.rs b/examples/rust/graph_view/src/select.rs new file mode 100644 index 000000000000..84631fc7a8e7 --- /dev/null +++ b/examples/rust/graph_view/src/select.rs @@ -0,0 +1,23 @@ +struct Layout { + nodes: HashMap, +} + +trait Drawable { + // Decorations don't influence the extent of an object an are not considered during a measurement path. + type Decoration; + + fn draw(&self, ui: &mut egui::Ui, decorations: Self::Decoration) -> egui::Response; +} + +impl Layout { + fn update(&mut self, nodes: impl Iterator) { + todo!(); + // check if nodes have changed + // * added node indexes + // * removed node indexes + // * current nodes -> need to remeasure first. + + } + + fn extent(&self, NodeIndex) +} diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs index 13b40a687e76..5cd583be0c56 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/examples/rust/graph_view/src/ui/node.rs @@ -46,10 +46,11 @@ pub fn draw_node( } else { egui::Frame::default() .show(ui, |ui| { - let painter = ui.painter(); - painter.circle( - pos, - 3.0, + let r = 4.0; + ui.set_min_size(egui::Vec2::new(2.0 * r, 2.0 * r)); // Frame size + ui.painter().circle( + pos + egui::Vec2::new(r, r), + r, instance.color.unwrap_or(ui.style().visuals.text_color()), hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), ); From f32e299183a08a57aeca9f72dd5dc6c04dbc934d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 14:16:47 +0200 Subject: [PATCH 067/159] WIP: make circle logic position independent --- examples/rust/graph_view/src/ui/mod.rs | 2 +- examples/rust/graph_view/src/ui/node.rs | 21 +++++++++++++-------- examples/rust/graph_view/src/view.rs | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 51336d525efd..926baf714832 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -81,7 +81,7 @@ pub fn measure_node_sizes<'a>( for node in nodes { match node { Node::Regular(instance) => { - let r = draw_node(ui, &instance, Pos2::ZERO, InteractionHighlight::default()); + let r = draw_node(ui, &instance, InteractionHighlight::default()); sizes.insert((&instance).into(), r.rect.size()); } Node::Unknown(instance) => { diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs index 5cd583be0c56..af5c11a55f57 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/examples/rust/graph_view/src/ui/node.rs @@ -8,7 +8,6 @@ use crate::types::NodeInstance; pub fn draw_node( ui: &mut egui::Ui, instance: &NodeInstance, - pos: egui::Pos2, highlight: InteractionHighlight, ) -> egui::Response { let hcolor = match ( @@ -47,13 +46,19 @@ pub fn draw_node( egui::Frame::default() .show(ui, |ui| { let r = 4.0; - ui.set_min_size(egui::Vec2::new(2.0 * r, 2.0 * r)); // Frame size - ui.painter().circle( - pos + egui::Vec2::new(r, r), - r, - instance.color.unwrap_or(ui.style().visuals.text_color()), - hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), - ); + ui.add(|ui: &mut egui::Ui| { + let (rect, response) = ui.allocate_at_least(egui::Vec2::new(2.0 * r, 2.0 * r), egui::Sense::drag()); // Frame size + ui.painter().circle( + rect.center(), + // pos + egui::Vec2::new(r, r), + r, + instance.color.unwrap_or(ui.style().visuals.text_color()), + hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), + + ); + response + }) + }) .response } diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 87a3c6965274..f03376d13fbf 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -266,7 +266,7 @@ impl SpaceViewClass for GraphSpaceView { .show(ui.ctx(), |ui| { let highlight = ent_highlight.index_highlight(node.instance); ui.set_clip_rect(clip_rect_world); - ui::draw_node(ui, &node, current_extent.min, highlight) + ui::draw_node(ui, &node, highlight) }) .response; From 69e55fcd082d2c316265dea49cd19511c3e174e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 11 Oct 2024 16:51:33 +0200 Subject: [PATCH 068/159] WIP: prepare refactor --- examples/rust/graph_view/src/main.rs | 1 + examples/rust/graph_view/src/select.rs | 47 +++++++++++++++++++++----- examples/rust/graph_view/src/ui/mod.rs | 22 ++++-------- 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 086b54fb9306..3bf3b383d2fb 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -5,6 +5,7 @@ use re_viewer::external::{re_log, re_memory}; mod error; mod graph; mod layout; +mod select; mod types; mod ui; mod view; diff --git a/examples/rust/graph_view/src/select.rs b/examples/rust/graph_view/src/select.rs index 84631fc7a8e7..0125efbbe5b1 100644 --- a/examples/rust/graph_view/src/select.rs +++ b/examples/rust/graph_view/src/select.rs @@ -1,7 +1,36 @@ -struct Layout { +use re_viewer::external::egui::{self, ahash::HashMap}; + +use crate::types::NodeIndex; + +pub struct Layout { nodes: HashMap, } +// TODO(grtlr): For now we use enumerate to get slight disturbances, in the future we should use a proper random distribution. +#[deprecated] +fn rect_from_index(i: usize) -> egui::Rect { + egui::Rect::from_center_size(egui::Pos2::new(0.0*i as f32, 0.0*i as f32), egui::Vec2::ZERO) +} + +impl Layout { + pub fn select(&mut self, nodes: impl IntoIterator) { + self.nodes = nodes.into_iter().enumerate().map(|(i,incoming)| { + match self.nodes.get_mut(&incoming) { + Some(rect) => (incoming, *rect), + None => (incoming, rect_from_index(i)), + } + }).collect(); + } + + pub fn extent(&self, ix: &NodeIndex) -> Option<&egui::Rect> { + self.nodes.get(ix) + } + + pub fn update(&mut self, ix: NodeIndex, extent: egui::Rect) -> Option { + self.nodes.insert(ix, extent) + } +} + trait Drawable { // Decorations don't influence the extent of an object an are not considered during a measurement path. type Decoration; @@ -10,14 +39,14 @@ trait Drawable { } impl Layout { - fn update(&mut self, nodes: impl Iterator) { - todo!(); - // check if nodes have changed - // * added node indexes - // * removed node indexes - // * current nodes -> need to remeasure first. + // fn update(&mut self, nodes: impl Iterator) { + // todo!(); + // // check if nodes have changed + // // * added node indexes + // // * removed node indexes + // // * current nodes -> need to remeasure first. + + // } - } - fn extent(&self, NodeIndex) } diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 926baf714832..a5f667c0962f 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -1,14 +1,9 @@ use std::collections::HashMap; -use re_format::format_f32; use re_log_types::EntityPath; use re_viewer::external::{ - egui::{self, emath, Pos2, TextWrapMode}, - re_ui::UiExt, - re_viewer_context::{ - HoverHighlight, InteractionHighlight, SelectionHighlight, SpaceViewHighlights, - SpaceViewState, - }, + egui, + re_viewer_context::{InteractionHighlight, SpaceViewHighlights}, }; mod edge; @@ -20,18 +15,13 @@ pub(crate) use state::GraphSpaceViewState; use crate::{ graph::Node, - layout::LayoutProvider, - types::{NodeIndex, NodeInstance, UnknownNodeInstance}, + types::{NodeIndex, UnknownNodeInstance}, }; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { - let text = egui::RichText::new(format!( - "{} @ {}", - instance.node_id, - instance.entity_path.to_string() - )) - .color(ui.style().visuals.widgets.noninteractive.text_color()); - ui.style_mut().wrap_mode = Some(TextWrapMode::Extend); + let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) + .color(ui.style().visuals.widgets.noninteractive.text_color()); + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); ui.add(egui::Button::new(text)) } From db1dc1d7b63d173cc637167ee78533406ba0c25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 10:57:40 +0200 Subject: [PATCH 069/159] WIP: remove `Layout` trait --- examples/rust/graph_view/src/layout/dot.rs | 16 ++++++--------- .../graph_view/src/layout/force_directed.rs | 18 +++++++---------- .../rust/graph_view/src/layout/fruchterman.rs | 20 ++++++++----------- examples/rust/graph_view/src/layout/mod.rs | 11 ---------- examples/rust/graph_view/src/select.rs | 17 +++++++++------- examples/rust/graph_view/src/ui/node.rs | 5 ++--- 6 files changed, 33 insertions(+), 54 deletions(-) diff --git a/examples/rust/graph_view/src/layout/dot.rs b/examples/rust/graph_view/src/layout/dot.rs index c284997d06e5..f3f659fe3620 100644 --- a/examples/rust/graph_view/src/layout/dot.rs +++ b/examples/rust/graph_view/src/layout/dot.rs @@ -14,20 +14,16 @@ use re_viewer::external::egui; use crate::{error::Error, types::NodeIndex}; -use super::Layout; - #[derive(Debug, Default, PartialEq, Eq)] pub struct DotLayout; -impl Layout for DotLayout { - type NodeIx = NodeIndex; - - fn compute( +impl DotLayout { + pub fn compute( &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { let mut handle_to_ix = HashMap::new(); let mut ix_to_handle = HashMap::new(); diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs index 6d38a09b228a..d5b38a16d3d0 100644 --- a/examples/rust/graph_view/src/layout/force_directed.rs +++ b/examples/rust/graph_view/src/layout/force_directed.rs @@ -5,23 +5,19 @@ use re_viewer::external::egui; use crate::{error::Error, types::NodeIndex}; -use super::Layout; - #[deprecated] #[derive(Debug, Default, PartialEq, Eq)] pub struct ForceBasedLayout; -impl Layout for ForceBasedLayout { - type NodeIx = NodeIndex; - - fn compute( +impl ForceBasedLayout { + pub fn compute( &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { let mut node_to_index = HashMap::new(); - let mut graph: fdg::ForceGraph<(Self::NodeIx, egui::Vec2), ()> = fdg::ForceGraph::default(); + let mut graph: fdg::ForceGraph<(NodeIndex, egui::Vec2), ()> = fdg::ForceGraph::default(); for (node_id, size) in nodes { let ix = graph.add_force_node(node_id.to_string(), (node_id.clone(), size)); diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs index d8b25cde96f0..d7c06a2b861c 100644 --- a/examples/rust/graph_view/src/layout/fruchterman.rs +++ b/examples/rust/graph_view/src/layout/fruchterman.rs @@ -6,22 +6,18 @@ use re_viewer::external::egui; use crate::{error::Error, types::NodeIndex}; -use super::Layout; - #[derive(Debug, Default, PartialEq, Eq)] pub struct FruchtermanReingoldLayout; -impl Layout for FruchtermanReingoldLayout { - type NodeIx = NodeIndex; - - fn compute( +impl FruchtermanReingoldLayout { + pub fn compute( &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { + nodes: impl IntoIterator, + directed: impl IntoIterator, + undirected: impl IntoIterator, + ) -> Result, Error> { let mut node_to_index = HashMap::new(); - let mut graph: fdg::ForceGraph = + let mut graph: fdg::ForceGraph = fdg::ForceGraph::default(); for (node_id, size) in nodes { @@ -50,7 +46,7 @@ impl Layout for FruchtermanReingoldLayout { // create a simulation from the graph fdg::fruchterman_reingold::FruchtermanReingold::default().apply_many(&mut graph, 1000); // Center the graph's average around (0,0). - fdg::simple::Center::default().apply(&mut graph); + fdg::simple::Center::default().apply_many(&mut graph, 100); let res = graph .node_weights() diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index 73c0f4c6629b..13c9b3da7e4b 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -11,17 +11,6 @@ pub(crate) use force_directed::ForceBasedLayout; mod fruchterman; pub(crate) use fruchterman::FruchtermanReingoldLayout; -pub(crate) trait Layout { - type NodeIx: Clone + Eq + std::hash::Hash; - - fn compute( - &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error>; -} - #[derive(Debug, PartialEq, Eq)] pub(crate) enum LayoutProvider { Dot(DotLayout), diff --git a/examples/rust/graph_view/src/select.rs b/examples/rust/graph_view/src/select.rs index 0125efbbe5b1..1693458b50f0 100644 --- a/examples/rust/graph_view/src/select.rs +++ b/examples/rust/graph_view/src/select.rs @@ -9,17 +9,22 @@ pub struct Layout { // TODO(grtlr): For now we use enumerate to get slight disturbances, in the future we should use a proper random distribution. #[deprecated] fn rect_from_index(i: usize) -> egui::Rect { - egui::Rect::from_center_size(egui::Pos2::new(0.0*i as f32, 0.0*i as f32), egui::Vec2::ZERO) + egui::Rect::from_center_size( + egui::Pos2::new(0.0 * i as f32, 0.0 * i as f32), + egui::Vec2::ZERO, + ) } impl Layout { pub fn select(&mut self, nodes: impl IntoIterator) { - self.nodes = nodes.into_iter().enumerate().map(|(i,incoming)| { - match self.nodes.get_mut(&incoming) { + self.nodes = nodes + .into_iter() + .enumerate() + .map(|(i, incoming)| match self.nodes.get_mut(&incoming) { Some(rect) => (incoming, *rect), None => (incoming, rect_from_index(i)), - } - }).collect(); + }) + .collect(); } pub fn extent(&self, ix: &NodeIndex) -> Option<&egui::Rect> { @@ -47,6 +52,4 @@ impl Layout { // // * current nodes -> need to remeasure first. // } - - } diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs index af5c11a55f57..13af359331a8 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/examples/rust/graph_view/src/ui/node.rs @@ -47,18 +47,17 @@ pub fn draw_node( .show(ui, |ui| { let r = 4.0; ui.add(|ui: &mut egui::Ui| { - let (rect, response) = ui.allocate_at_least(egui::Vec2::new(2.0 * r, 2.0 * r), egui::Sense::drag()); // Frame size + let (rect, response) = ui + .allocate_at_least(egui::Vec2::new(2.0 * r, 2.0 * r), egui::Sense::drag()); // Frame size ui.painter().circle( rect.center(), // pos + egui::Vec2::new(r, r), r, instance.color.unwrap_or(ui.style().visuals.text_color()), hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), - ); response }) - }) .response } From c96ac2e431d4f2e1263eec7b7c37085dcb4f4170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 12:57:31 +0200 Subject: [PATCH 070/159] WIP: add tooltips --- examples/rust/graph_view/src/ui/node.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/rust/graph_view/src/ui/node.rs b/examples/rust/graph_view/src/ui/node.rs index 13af359331a8..672d28677cba 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/examples/rust/graph_view/src/ui/node.rs @@ -61,4 +61,8 @@ pub fn draw_node( }) .response } + .on_hover_text(format!( + "Node ID: `{}` in `{}`", + instance.node_id, instance.entity_path + )) } From da1c85aa77cf530879e419372aeedebf6629e83a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 15:25:00 +0200 Subject: [PATCH 071/159] WIP: static graphs --- examples/rust/node_link_graph/README.md | 5 +++ .../src/examples/social/mod.rs | 34 ++++++++----------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/examples/rust/node_link_graph/README.md b/examples/rust/node_link_graph/README.md index 9c5ecd46ad9f..472f2692cb95 100644 --- a/examples/rust/node_link_graph/README.md +++ b/examples/rust/node_link_graph/README.md @@ -1 +1,6 @@ # node_link_graph + +Comes with the following graph types: + +* **simple**: Directed and undirected edges, hierarchical information. +* **social**: Static nodes and dynamic edges. diff --git a/examples/rust/node_link_graph/src/examples/social/mod.rs b/examples/rust/node_link_graph/src/examples/social/mod.rs index 848131a341ee..0c1fb5357421 100644 --- a/examples/rust/node_link_graph/src/examples/social/mod.rs +++ b/examples/rust/node_link_graph/src/examples/social/mod.rs @@ -51,30 +51,24 @@ pub fn run(args: &Args) -> anyhow::Result<()> { // rec.set_time_sequence("frame", 0); let entries = parse_data_file()?; + let nodes = entries + .iter() + .flat_map(|i| [i.person_a.clone(), i.person_b.clone()]) + .collect::>(); + + rec.log_static( + "/persons", + &GraphNodes::new( + nodes.iter().map(|n| { + components::GraphNodeId::from(datatypes::GraphNodeId(n.to_string().into())) + }), + ), + )?; + for (timestamp, chunk) in &entries.into_iter().chunk_by(|t| t.timestamp) { let interactions = chunk.collect::>(); - let mut nodes = HashSet::new(); - for i in interactions.iter() { - nodes.insert(i.person_a.clone()); - nodes.insert(i.person_b.clone()); - } - - if nodes.is_empty() { - continue; - } - - log::info!("Logging nodes for timestamp `{timestamp}`: {:?}", nodes); - rec.set_time_sequence("frame", timestamp); - - rec.log( - "/persons", - &GraphNodes::new(nodes.iter().map(|n| { - components::GraphNodeId::from(datatypes::GraphNodeId(n.to_string().into())) - })), - )?; - rec.log( "/interactions", &GraphEdgesUndirected::new( From c73f2e5d5a95f9d61b40137948db93176d08f746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 16:34:39 +0200 Subject: [PATCH 072/159] WIP: improve hash --- .../src/datatypes/graph_node_id_ext.rs | 8 ++-- examples/rust/graph_view/src/error.rs | 6 ++- examples/rust/graph_view/src/graph/hash.rs | 39 +++++++++++++++++ examples/rust/graph_view/src/graph/index.rs | 34 +++++++++++++++ .../graph_view/src/{graph.rs => graph/mod.rs} | 10 +++-- examples/rust/graph_view/src/layout/dot.rs | 18 +++----- .../graph_view/src/layout/force_directed.rs | 12 ++---- .../rust/graph_view/src/layout/fruchterman.rs | 10 ++--- examples/rust/graph_view/src/layout/mod.rs | 2 +- examples/rust/graph_view/src/select.rs | 2 +- examples/rust/graph_view/src/types.rs | 42 ++++--------------- examples/rust/graph_view/src/ui/mod.rs | 5 +-- examples/rust/graph_view/src/ui/state.rs | 2 +- examples/rust/graph_view/src/view.rs | 19 +++------ 14 files changed, 117 insertions(+), 92 deletions(-) create mode 100644 examples/rust/graph_view/src/graph/hash.rs create mode 100644 examples/rust/graph_view/src/graph/index.rs rename examples/rust/graph_view/src/{graph.rs => graph/mod.rs} (95%) diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs index 573deeec9c19..4b1d0612c51d 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs @@ -1,16 +1,18 @@ -impl std::convert::From<&str> for super::GraphNodeId { +use super::GraphNodeId; + +impl std::convert::From<&str> for GraphNodeId { fn from(s: &str) -> Self { Self(s.into()) } } -impl std::convert::From for super::GraphNodeId { +impl std::convert::From for GraphNodeId { fn from(s: String) -> Self { Self(s.into()) } } -impl std::fmt::Display for super::GraphNodeId { +impl std::fmt::Display for GraphNodeId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 4b277ef94065..39b3d257ce39 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -1,10 +1,12 @@ use re_log_types::EntityPath; use re_viewer::external::{re_types::datatypes, re_viewer_context::SpaceViewSystemExecutionError}; +use crate::graph::NodeIndex; + #[derive(thiserror::Error, Debug)] pub enum Error { - #[error("edge has unknown node: {0}")] - EdgeUnknownNode(String), + #[error("edge has unknown node")] + EdgeUnknownNode, #[error("missing layout information for node `{1}` in entity `{0}`")] MissingLayoutInformation(EntityPath, datatypes::GraphNodeId), diff --git a/examples/rust/graph_view/src/graph/hash.rs b/examples/rust/graph_view/src/graph/hash.rs new file mode 100644 index 000000000000..5c3cf7d49824 --- /dev/null +++ b/examples/rust/graph_view/src/graph/hash.rs @@ -0,0 +1,39 @@ +use re_log_types::hash::Hash64; +use re_viewer::external::re_types::datatypes; + +/// A 64 bit hash of [`GraphNodeId`] with very small risk of collision. +#[derive(Copy, Clone, Eq, PartialOrd, Ord)] +pub(crate) struct NodeIdHash(Hash64); + +impl NodeIdHash { + #[inline] + pub fn hash64(&self) -> u64 { + self.0.hash64() + } +} + +impl std::hash::Hash for NodeIdHash { + #[inline] + fn hash(&self, state: &mut H) { + self.0.hash(state); + } +} + +impl std::fmt::Debug for NodeIdHash { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "NodeIdHash({:016X})", self.hash64()) + } +} + +impl From<&datatypes::GraphNodeId> for NodeIdHash { + fn from(node_id: &datatypes::GraphNodeId) -> Self { + Self(Hash64::hash(&node_id)) + } +} + +impl std::cmp::PartialEq for NodeIdHash { + #[inline] + fn eq(&self, other: &Self) -> bool { + self.0.eq(&other.0) + } +} diff --git a/examples/rust/graph_view/src/graph/index.rs b/examples/rust/graph_view/src/graph/index.rs new file mode 100644 index 000000000000..0b243a7e5dfd --- /dev/null +++ b/examples/rust/graph_view/src/graph/index.rs @@ -0,0 +1,34 @@ +use re_log_types::{EntityPath, EntityPathHash}; +use re_viewer::external::re_types::datatypes; + +use super::NodeIdHash; + +#[derive(Clone, PartialEq, Eq, Hash)] +pub(crate) struct NodeIndex { + pub entity_hash: EntityPathHash, + pub node_id: NodeIdHash, +} + +impl From for NodeIndex { + fn from(location: datatypes::GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path).hash(), + node_id: NodeIdHash::from(&location.node_id), + } + } +} + +impl From<&datatypes::GraphLocation> for NodeIndex { + fn from(location: &datatypes::GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path.clone()).hash(), + node_id: NodeIdHash::from(&location.node_id), + } + } +} + +impl std::fmt::Debug for NodeIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "NodeIndex({:?}@{:?})", self.node_id, self.entity_hash) + } +} diff --git a/examples/rust/graph_view/src/graph.rs b/examples/rust/graph_view/src/graph/mod.rs similarity index 95% rename from examples/rust/graph_view/src/graph.rs rename to examples/rust/graph_view/src/graph/mod.rs index 9333fcd6514f..2b1bb270896b 100644 --- a/examples/rust/graph_view/src/graph.rs +++ b/examples/rust/graph_view/src/graph/mod.rs @@ -1,15 +1,19 @@ -use std::{collections::HashSet, hash::Hash}; +use std::{collections::HashSet}; -use petgraph::graphmap::EdgesDirected; use re_log_types::EntityPath; use re_viewer::external::re_types::datatypes; use crate::{ error::Error, - types::{EdgeInstance, NodeIndex, NodeInstance, UnknownNodeInstance}, + types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, visualizers::{EdgesDirectedData, EdgesUndirectedData, NodeVisualizerData}, }; +mod hash; +pub(crate) use hash::NodeIdHash; +mod index; +pub(crate) use index::NodeIndex; + pub(crate) enum Node<'a> { Regular(NodeInstance<'a>), Unknown(UnknownNodeInstance<'a>), diff --git a/examples/rust/graph_view/src/layout/dot.rs b/examples/rust/graph_view/src/layout/dot.rs index f3f659fe3620..baff40d8fd09 100644 --- a/examples/rust/graph_view/src/layout/dot.rs +++ b/examples/rust/graph_view/src/layout/dot.rs @@ -12,7 +12,7 @@ use layout::{ }; use re_viewer::external::egui; -use crate::{error::Error, types::NodeIndex}; +use crate::{error::Error, graph::NodeIndex}; #[derive(Debug, Default, PartialEq, Eq)] pub struct DotLayout; @@ -42,22 +42,14 @@ impl DotLayout { } for (source_ix, target_ix) in directed { - let source = ix_to_handle - .get(&source_ix) - .ok_or_else(|| Error::EdgeUnknownNode(source_ix.to_string()))?; - let target = ix_to_handle - .get(&target_ix) - .ok_or_else(|| Error::EdgeUnknownNode(target_ix.to_string()))?; + let source = ix_to_handle.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + let target = ix_to_handle.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; graph.add_edge(Arrow::simple("test"), *source, *target); } for (source_ix, target_ix) in undirected { - let source = ix_to_handle - .get(&source_ix) - .ok_or_else(|| Error::EdgeUnknownNode(source_ix.to_string()))?; - let target = ix_to_handle - .get(&target_ix) - .ok_or_else(|| Error::EdgeUnknownNode(target_ix.to_string()))?; + let source = ix_to_handle.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + let target = ix_to_handle.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; // TODO(grtlr): find a better way other than adding duplicate edges. graph.add_edge(Arrow::simple("test"), *source, *target); diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs index d5b38a16d3d0..df18813b3b8b 100644 --- a/examples/rust/graph_view/src/layout/force_directed.rs +++ b/examples/rust/graph_view/src/layout/force_directed.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use fdg_sim::{self as fdg, ForceGraphHelper}; use re_viewer::external::egui; -use crate::{error::Error, types::NodeIndex}; +use crate::{error::Error, graph::NodeIndex}; #[deprecated] #[derive(Debug, Default, PartialEq, Eq)] @@ -20,17 +20,13 @@ impl ForceBasedLayout { let mut graph: fdg::ForceGraph<(NodeIndex, egui::Vec2), ()> = fdg::ForceGraph::default(); for (node_id, size) in nodes { - let ix = graph.add_force_node(node_id.to_string(), (node_id.clone(), size)); + let ix = graph.add_force_node(format!("{node_id:?}"), (node_id.clone(), size)); node_to_index.insert(node_id, ix); } for (source, target) in directed.into_iter().chain(undirected) { - let source_ix = node_to_index - .get(&source) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; - let target_ix = node_to_index - .get(&target) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + let source_ix = node_to_index.get(&source).ok_or(Error::EdgeUnknownNode)?; + let target_ix = node_to_index.get(&target).ok_or(Error::EdgeUnknownNode)?; graph.add_edge(*source_ix, *target_ix, ()); } diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs index d7c06a2b861c..9dd4555ac860 100644 --- a/examples/rust/graph_view/src/layout/fruchterman.rs +++ b/examples/rust/graph_view/src/layout/fruchterman.rs @@ -4,7 +4,7 @@ use fdg::{nalgebra::Point2, Force as _}; use rand::distributions::Distribution as _; use re_viewer::external::egui; -use crate::{error::Error, types::NodeIndex}; +use crate::{error::Error, graph::NodeIndex}; #[derive(Debug, Default, PartialEq, Eq)] pub struct FruchtermanReingoldLayout; @@ -34,12 +34,8 @@ impl FruchtermanReingoldLayout { } for (source, target) in directed.into_iter().chain(undirected) { - let source_ix = node_to_index - .get(&source) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; - let target_ix = node_to_index - .get(&target) - .ok_or_else(|| Error::EdgeUnknownNode(source.to_string()))?; + let source_ix = node_to_index.get(&source).ok_or(Error::EdgeUnknownNode)?; + let target_ix = node_to_index.get(&target).ok_or(Error::EdgeUnknownNode)?; graph.add_edge(*source_ix, *target_ix, ()); } diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index 13c9b3da7e4b..49fa23f05e75 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use re_viewer::external::egui; -use crate::{error::Error, types::NodeIndex}; +use crate::{error::Error, graph::NodeIndex}; mod dot; pub(crate) use dot::DotLayout; diff --git a/examples/rust/graph_view/src/select.rs b/examples/rust/graph_view/src/select.rs index 1693458b50f0..4a1a9ea469c3 100644 --- a/examples/rust/graph_view/src/select.rs +++ b/examples/rust/graph_view/src/select.rs @@ -1,6 +1,6 @@ use re_viewer::external::egui::{self, ahash::HashMap}; -use crate::types::NodeIndex; +use crate::graph::NodeIndex; pub struct Layout { nodes: HashMap, diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs index a1e1d62269c8..e2337db22da0 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/types.rs @@ -1,50 +1,22 @@ -use re_log_types::{EntityPath, EntityPathHash, Instance}; +use re_log_types::{EntityPath, Instance}; use re_viewer::external::{ egui, re_types::{datatypes, ArrowString}, }; +use crate::graph::NodeIndex; + impl<'a> EdgeInstance<'a> { pub fn nodes(&'a self) -> impl Iterator { [self.source.clone(), self.target.clone()].into_iter() } } -#[derive(Clone, PartialEq, Eq, Hash)] -pub(crate) struct NodeIndex { - pub entity_hash: EntityPathHash, - pub node_id: datatypes::GraphNodeId, -} - -impl From for NodeIndex { - fn from(location: datatypes::GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path).hash(), - node_id: location.node_id, - } - } -} - -impl From<&datatypes::GraphLocation> for NodeIndex { - fn from(location: &datatypes::GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path.clone()).hash(), - node_id: location.node_id.clone(), - } - } -} - -impl std::fmt::Display for NodeIndex { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_hash) - } -} - impl<'a> From<&NodeInstance<'a>> for NodeIndex { fn from(node: &NodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), + node_id: node.node_id.into(), } } } @@ -53,7 +25,7 @@ impl<'a> From> for NodeIndex { fn from(node: NodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), + node_id: node.node_id.into(), } } } @@ -84,7 +56,7 @@ impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { fn from(node: &UnknownNodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), + node_id: node.node_id.into(), } } } @@ -93,7 +65,7 @@ impl<'a> From> for NodeIndex { fn from(node: UnknownNodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.clone(), + node_id: node.node_id.into(), } } } diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index a5f667c0962f..8680d06530b2 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -13,10 +13,7 @@ pub(crate) use node::draw_node; mod state; pub(crate) use state::GraphSpaceViewState; -use crate::{ - graph::Node, - types::{NodeIndex, UnknownNodeInstance}, -}; +use crate::{graph::{Node, NodeIndex}, types::UnknownNodeInstance}; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index e9c7b557fb44..30a272dc1f23 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -7,7 +7,7 @@ use re_viewer::external::{ re_viewer_context::SpaceViewState, }; -use crate::{layout::LayoutProvider, types::NodeIndex}; +use crate::{layout::LayoutProvider, graph::NodeIndex}; use super::bounding_rect_from_iter; diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index f03376d13fbf..a3a29410b7ae 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -15,8 +15,7 @@ use re_viewer::external::{ use crate::{ error::Error, - graph::Graph, - types::NodeIndex, + graph::{Graph, NodeIndex}, ui::{self, GraphSpaceViewState}, visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, }; @@ -332,12 +331,8 @@ impl SpaceViewClass for GraphSpaceView { for edge in data.edges() { let source_ix = NodeIndex::from(edge.source); let target_ix = NodeIndex::from(edge.target); - let source_pos = layout - .get(&source_ix) - .ok_or_else(|| Error::EdgeUnknownNode(edge.source.to_string()))?; - let target_pos = layout - .get(&target_ix) - .ok_or_else(|| Error::EdgeUnknownNode(edge.target.to_string()))?; + let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) .current_pos(source_pos.center()) @@ -369,12 +364,8 @@ impl SpaceViewClass for GraphSpaceView { for edge in data.edges() { let source_ix = NodeIndex::from(edge.source); let target_ix = NodeIndex::from(edge.target); - let source_pos = layout - .get(&source_ix) - .ok_or_else(|| Error::EdgeUnknownNode(edge.source.to_string()))?; - let target_pos = layout - .get(&target_ix) - .ok_or_else(|| Error::EdgeUnknownNode(edge.target.to_string()))?; + let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) .current_pos(source_pos.center()) From 009482c4410c637e33de6e115527817716f4f8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 16:57:22 +0200 Subject: [PATCH 073/159] WIP: cleanup --- examples/rust/graph_view/src/error.rs | 2 -- examples/rust/graph_view/src/graph/hash.rs | 2 +- examples/rust/graph_view/src/graph/mod.rs | 1 - examples/rust/graph_view/src/visualizers/nodes.rs | 2 +- examples/rust/node_link_graph/src/examples/simple.rs | 6 +++++- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/rust/graph_view/src/error.rs b/examples/rust/graph_view/src/error.rs index 39b3d257ce39..94cff13e58fd 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/examples/rust/graph_view/src/error.rs @@ -1,8 +1,6 @@ use re_log_types::EntityPath; use re_viewer::external::{re_types::datatypes, re_viewer_context::SpaceViewSystemExecutionError}; -use crate::graph::NodeIndex; - #[derive(thiserror::Error, Debug)] pub enum Error { #[error("edge has unknown node")] diff --git a/examples/rust/graph_view/src/graph/hash.rs b/examples/rust/graph_view/src/graph/hash.rs index 5c3cf7d49824..5b27dfd29c79 100644 --- a/examples/rust/graph_view/src/graph/hash.rs +++ b/examples/rust/graph_view/src/graph/hash.rs @@ -27,7 +27,7 @@ impl std::fmt::Debug for NodeIdHash { impl From<&datatypes::GraphNodeId> for NodeIdHash { fn from(node_id: &datatypes::GraphNodeId) -> Self { - Self(Hash64::hash(&node_id)) + Self(Hash64::hash(node_id)) } } diff --git a/examples/rust/graph_view/src/graph/mod.rs b/examples/rust/graph_view/src/graph/mod.rs index 2b1bb270896b..bb1abdaa962f 100644 --- a/examples/rust/graph_view/src/graph/mod.rs +++ b/examples/rust/graph_view/src/graph/mod.rs @@ -4,7 +4,6 @@ use re_log_types::EntityPath; use re_viewer::external::re_types::datatypes; use crate::{ - error::Error, types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, visualizers::{EdgesDirectedData, EdgesUndirectedData, NodeVisualizerData}, }; diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/examples/rust/graph_view/src/visualizers/nodes.rs index 83a434e03d94..85980118760d 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/examples/rust/graph_view/src/visualizers/nodes.rs @@ -53,7 +53,7 @@ impl NodeVisualizerData { node_id, instance, color: color.map(|c| Color32::from(c.0)), - show_labels: self.show_labels.map_or(false, bool::from), + show_labels: self.show_labels.map_or(true, bool::from), label, }) } diff --git a/examples/rust/node_link_graph/src/examples/simple.rs b/examples/rust/node_link_graph/src/examples/simple.rs index 8e7b1ec77a44..d08fca76b94f 100644 --- a/examples/rust/node_link_graph/src/examples/simple.rs +++ b/examples/rust/node_link_graph/src/examples/simple.rs @@ -9,6 +9,7 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.log( "kitchen/objects", &GraphNodes::new(["sink", "fridge"]) + .with_labels(["Sink", "Fridge"]) .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), )?; @@ -22,7 +23,10 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; rec.set_time_sequence("frame", 2); - rec.log("living/objects", &GraphNodes::new(["table"]))?; + rec.log( + "living/objects", + &GraphNodes::new(["table"]).with_labels(["Table"]), + )?; rec.log( "living/nodes", &GraphNodes::new(["area0", "area1", "area2"]), From adad111a02d1e7dc5f6dbd86b680615b8e9b574e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 16:58:42 +0200 Subject: [PATCH 074/159] WIP: fmt --- examples/rust/graph_view/src/graph/mod.rs | 2 +- examples/rust/graph_view/src/ui/mod.rs | 5 ++++- examples/rust/graph_view/src/ui/state.rs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/rust/graph_view/src/graph/mod.rs b/examples/rust/graph_view/src/graph/mod.rs index bb1abdaa962f..ff91197bc469 100644 --- a/examples/rust/graph_view/src/graph/mod.rs +++ b/examples/rust/graph_view/src/graph/mod.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet}; +use std::collections::HashSet; use re_log_types::EntityPath; use re_viewer::external::re_types::datatypes; diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 8680d06530b2..a539adacdd4a 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -13,7 +13,10 @@ pub(crate) use node::draw_node; mod state; pub(crate) use state::GraphSpaceViewState; -use crate::{graph::{Node, NodeIndex}, types::UnknownNodeInstance}; +use crate::{ + graph::{Node, NodeIndex}, + types::UnknownNodeInstance, +}; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 30a272dc1f23..b0936b39ffd2 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -7,7 +7,7 @@ use re_viewer::external::{ re_viewer_context::SpaceViewState, }; -use crate::{layout::LayoutProvider, graph::NodeIndex}; +use crate::{graph::NodeIndex, layout::LayoutProvider}; use super::bounding_rect_from_iter; From 37562a3fd85309352cb9ac0e3668a49788822ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 14 Oct 2024 20:46:41 +0200 Subject: [PATCH 075/159] WIP: Basic scene refactor working --- examples/rust/graph_view/src/graph/index.rs | 2 +- examples/rust/graph_view/src/layout/mod.rs | 6 + examples/rust/graph_view/src/ui/mod.rs | 2 + examples/rust/graph_view/src/ui/scene.rs | 200 +++++++++++ examples/rust/graph_view/src/ui/state.rs | 38 +-- examples/rust/graph_view/src/view.rs | 353 ++++++++------------ 6 files changed, 345 insertions(+), 256 deletions(-) create mode 100644 examples/rust/graph_view/src/ui/scene.rs diff --git a/examples/rust/graph_view/src/graph/index.rs b/examples/rust/graph_view/src/graph/index.rs index 0b243a7e5dfd..550746642187 100644 --- a/examples/rust/graph_view/src/graph/index.rs +++ b/examples/rust/graph_view/src/graph/index.rs @@ -3,7 +3,7 @@ use re_viewer::external::re_types::datatypes; use super::NodeIdHash; -#[derive(Clone, PartialEq, Eq, Hash)] +#[derive(Clone, Copy, PartialEq, Eq, Hash)] pub(crate) struct NodeIndex { pub entity_hash: EntityPathHash, pub node_id: NodeIdHash, diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index 49fa23f05e75..b1c9329f991e 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -48,3 +48,9 @@ impl LayoutProvider { } } } + +impl Default for LayoutProvider { + fn default() -> Self { + LayoutProvider::new_fruchterman_reingold() + } +} diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index a539adacdd4a..64994b6c179a 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -13,6 +13,8 @@ pub(crate) use node::draw_node; mod state; pub(crate) use state::GraphSpaceViewState; +pub(crate) mod scene; + use crate::{ graph::{Node, NodeIndex}, types::UnknownNodeInstance, diff --git a/examples/rust/graph_view/src/ui/scene.rs b/examples/rust/graph_view/src/ui/scene.rs new file mode 100644 index 000000000000..b9197646b791 --- /dev/null +++ b/examples/rust/graph_view/src/ui/scene.rs @@ -0,0 +1,200 @@ +use std::ops::RangeFrom; + +use re_viewer::external::egui::{ + emath::TSTransform, Area, Id, LayerId, Order, Pos2, Rect, Response, Sense, Ui, +}; + +pub struct ViewBuilder { + world_to_view: TSTransform, + clip_rect_window: Rect, +} + +impl Default for ViewBuilder { + fn default() -> Self { + Self { + world_to_view: Default::default(), + clip_rect_window: Rect::NOTHING, + } + } +} + +impl ViewBuilder { + pub fn fit_to_screen(&mut self, bounding_rect: Rect) { + let available_size = self.clip_rect_window.size(); + + // Compute the scale factor to fit the bounding rectangle into the available screen size. + let scale_x = available_size.x / bounding_rect.width(); + let scale_y = available_size.y / bounding_rect.height(); + + // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. + let scale = scale_x.min(scale_y).min(1.0); + + // Compute the translation to center the bounding rect in the screen. + let center_screen = Pos2::new(available_size.x / 2.0, available_size.y / 2.0); + let center_world = bounding_rect.center().to_vec2(); + + // Set the transformation to scale and then translate to center. + self.world_to_view = + TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) + * TSTransform::from_scaling(scale); + } + + /// Return the clip rect of the scene in window coordinates. + pub fn scene(&mut self, ui: &mut Ui, add_scene_contents: F) -> Rect + where + F: for<'b> FnOnce(Scene<'b>), + { + let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); + self.clip_rect_window = clip_rect_window; + + let response = ui.interact(clip_rect_window, id, Sense::click_and_drag()); + + if response.dragged() { + self.world_to_view.translation += response.drag_delta(); + } + + let view_to_window = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()); + let world_to_window = view_to_window * self.world_to_view; + + #[cfg(debug_assertions)] + if response.double_clicked() { + if let Some(window) = response.interact_pointer_pos() { + // log::debug!( + // "Click event! Window: {:?}, View: {:?} World: {:?}", + // window, + // view_to_window.inverse() * window, + // world_to_window.inverse() * window, + // ); + } + } + + if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { + // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. + if response.hovered() { + let pointer_in_world = world_to_window.inverse() * pointer; + let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); + let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); + + // Zoom in on pointer: + self.world_to_view = self.world_to_view + * TSTransform::from_translation(pointer_in_world.to_vec2()) + * TSTransform::from_scaling(zoom_delta) + * TSTransform::from_translation(-pointer_in_world.to_vec2()); + + // Pan: + self.world_to_view = TSTransform::from_translation(pan_delta) * self.world_to_view; + } + } + + let clip_rect_world = world_to_window.inverse() * clip_rect_window; + + let window_layer = ui.layer_id(); + + // if state.show_debug { + // let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); + // ui.ctx().set_transform_layer(debug_id, world_to_window); + + // // Paint the coordinate system. + // let painter = egui::Painter::new(ui.ctx().clone(), debug_id, clip_rect_world); + + // // paint coordinate system at the world origin + // let origin = egui::Pos2::new(0.0, 0.0); + // let x_axis = egui::Pos2::new(100.0, 0.0); + // let y_axis = egui::Pos2::new(0.0, 100.0); + + // painter.line_segment([origin, x_axis], egui::Stroke::new(1.0, egui::Color32::RED)); + // painter.line_segment( + // [origin, y_axis], + // egui::Stroke::new(2.0, egui::Color32::GREEN), + // ); + + // if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { + // painter.rect( + // bounding_box, + // 0.0, + // egui::Color32::from_rgba_unmultiplied(255, 0, 255, 8), + // egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), + // ); + // } + // } + + add_scene_contents(Scene { + ui, + id, + window_layer, + clip_rect_world, + world_to_window, + counter: 0u64.., + }); + clip_rect_window + } +} + +pub struct Scene<'a> { + ui: &'a mut Ui, + id: Id, + window_layer: LayerId, + clip_rect_world: Rect, + world_to_window: TSTransform, + counter: RangeFrom, +} + +impl<'a> Scene<'a> { + /// `pos` is the top-left position of the node in world coordinates. + pub fn node(&mut self, pos: Pos2, add_node_contents: F) -> Response + where + F: for<'b> FnOnce(&'b mut Ui) -> Response, + { + let response = Area::new(self.id.with(("node", self.counter.next().unwrap()))) + .current_pos(pos) + .order(Order::Foreground) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_node_contents(ui) + }) + .response; + + let id = response.layer_id; + self.ui.ctx().set_transform_layer(id, self.world_to_window); + self.ui.ctx().set_sublayer(self.window_layer, id); + + response + } + + pub fn entity(&mut self, pos: Pos2, add_entity_contents: F) + where + F: for<'b> FnOnce(&'b mut Ui), + { + let response = Area::new(self.id.with(("entity", self.counter.next().unwrap()))) + .order(Order::Background) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_entity_contents(ui) + }) + .response; + + let id = response.layer_id; + self.ui.ctx().set_transform_layer(id, self.world_to_window); + self.ui.ctx().set_sublayer(self.window_layer, id); + } + + pub fn edge(&mut self, add_edge_contents: F) + where + F: for<'b> FnOnce(&'b mut Ui), + { + let response = Area::new(self.id.with(("edge", self.counter.next().unwrap()))) + .order(Order::Middle) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_edge_contents(ui) + }) + .response; + + let id = response.layer_id; + self.ui.ctx().set_transform_layer(id, self.world_to_window); + self.ui.ctx().set_sublayer(self.window_layer, id); + } +} diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index b0936b39ffd2..4afb2a73f607 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -9,14 +9,14 @@ use re_viewer::external::{ use crate::{graph::NodeIndex, layout::LayoutProvider}; -use super::bounding_rect_from_iter; +use super::{bounding_rect_from_iter, scene::ViewBuilder}; /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. +#[derive(Default)] pub(crate) struct GraphSpaceViewState { - pub world_to_view: emath::TSTransform, - pub clip_rect_window: egui::Rect, + pub viewer: ViewBuilder, // Debug information pub show_debug: bool, @@ -26,37 +26,7 @@ pub(crate) struct GraphSpaceViewState { pub layout_provider: LayoutProvider, } -impl Default for GraphSpaceViewState { - fn default() -> Self { - Self { - world_to_view: Default::default(), - clip_rect_window: egui::Rect::NOTHING, - show_debug: Default::default(), - layout: Default::default(), - layout_provider: LayoutProvider::new_fruchterman_reingold(), - } - } -} - impl GraphSpaceViewState { - pub fn fit_to_screen(&mut self, bounding_rect: egui::Rect, available_size: egui::Vec2) { - // Compute the scale factor to fit the bounding rectangle into the available screen size. - let scale_x = available_size.x / bounding_rect.width(); - let scale_y = available_size.y / bounding_rect.height(); - - // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. - let scale = scale_x.min(scale_y).min(1.0); - - // Compute the translation to center the bounding rect in the screen. - let center_screen = egui::Pos2::new(available_size.x / 2.0, available_size.y / 2.0); - let center_world = bounding_rect.center().to_vec2(); - - // Set the transformation to scale and then translate to center. - self.world_to_view = - emath::TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) - * emath::TSTransform::from_scaling(scale); - } - pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { if let Some(layout) = &self.layout { ui.grid_left_hand_label("Bounding box") @@ -75,7 +45,7 @@ impl GraphSpaceViewState { .clicked() { if let Some(bounding_rect) = bounding_rect_from_iter(layout.values()) { - self.fit_to_screen(bounding_rect, self.clip_rect_window.size()); + self.viewer.fit_to_screen(bounding_rect); } } ui.end_row(); diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index a3a29410b7ae..80e90dc9744b 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -130,9 +130,6 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; - let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); - state.clip_rect_window = clip_rect_window; - let Some(layout) = &mut state.layout else { let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); @@ -151,12 +148,11 @@ impl SpaceViewClass for GraphSpaceView { .layout_provider .compute(node_sizes.into_iter(), undirected, directed)?; - if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { - state.fit_to_screen( - bounding_box.scale_from_center(1.05), - clip_rect_window.size(), - ); - } + // if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { + // state + // .viewer + // .fit_to_screen(bounding_box.scale_from_center(1.05)); + // } state.layout = Some(layout); @@ -171,225 +167,140 @@ impl SpaceViewClass for GraphSpaceView { return Ok(()); } - let response = ui.interact(clip_rect_window, id, egui::Sense::click_and_drag()); - - // Allow dragging the background as well. - if response.dragged() { - state.world_to_view.translation += response.drag_delta(); - } - - let view_to_window = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()); - let world_to_window = view_to_window * state.world_to_view; - - #[cfg(debug_assertions)] - if response.double_clicked() { - if let Some(window) = response.interact_pointer_pos() { - log::debug!( - "Click event! Window: {:?}, View: {:?} World: {:?}", - window, - view_to_window.inverse() * window, - world_to_window.inverse() * window, - ); - } - } - - if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { - // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. - if response.hovered() { - let pointer_in_world = world_to_window.inverse() * pointer; - let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); - let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); - - // Zoom in on pointer: - state.world_to_view = state.world_to_view - * TSTransform::from_translation(pointer_in_world.to_vec2()) - * TSTransform::from_scaling(zoom_delta) - * TSTransform::from_translation(-pointer_in_world.to_vec2()); - - // Pan: - state.world_to_view = - TSTransform::from_translation(pan_delta) * state.world_to_view; - } - } - - let clip_rect_world = world_to_window.inverse() * clip_rect_window; - - let window_layer = ui.layer_id(); - - if state.show_debug { - let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); - ui.ctx().set_transform_layer(debug_id, world_to_window); + state.viewer.scene(ui, |mut scene| { + for data in node_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - // Paint the coordinate system. - let painter = egui::Painter::new(ui.ctx().clone(), debug_id, clip_rect_world); + // We keep track of the size of the current entity. + // TODO: let mut entity_rect: Option = None; - // paint coordinate system at the world origin - let origin = egui::Pos2::new(0.0, 0.0); - let x_axis = egui::Pos2::new(100.0, 0.0); - let y_axis = egui::Pos2::new(0.0, 100.0); + for node in data.nodes() { + let index = NodeIndex::from(&node); + let current = layout.get(&index).unwrap(); - painter.line_segment([origin, x_axis], egui::Stroke::new(1.0, egui::Color32::RED)); - painter.line_segment( - [origin, y_axis], - egui::Stroke::new(2.0, egui::Color32::GREEN), - ); + let response = scene.node(current.min, |ui| { + ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) + }); - if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { - painter.rect( - bounding_box, - 0.0, - egui::Color32::from_rgba_unmultiplied(255, 0, 255, 8), - egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), - ); - } - } - - for data in node_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - // We keep track of the size of the current entity. - let mut entity_rect: Option = None; - - for node in data.nodes() { - let index = NodeIndex::from(&node); - let Some(current_extent) = layout.get(&index) else { - return Err(Error::MissingLayoutInformation( - data.entity_path.clone(), - node.node_id.clone(), - ) - .into()); - }; - let response = egui::Area::new(id.with(&index)) - .current_pos(current_extent.min) - .order(egui::Order::Middle) - .constrain(false) - .show(ui.ctx(), |ui| { - let highlight = ent_highlight.index_highlight(node.instance); - ui.set_clip_rect(clip_rect_world); - ui::draw_node(ui, &node, highlight) - }) - .response; - - let instance = InstancePath::instance(data.entity_path.clone(), node.instance); - ctx.select_hovered_on_click( - &response, - Item::DataResult(query.space_view_id, instance), - ); - - layout.insert(index, response.rect); - entity_rect = - entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); - - let id = response.layer_id; - ui.ctx().set_transform_layer(id, world_to_window); - ui.ctx().set_sublayer(window_layer, id); - } + let instance = InstancePath::instance(data.entity_path.clone(), node.instance); + ctx.select_hovered_on_click( + &response, + Item::DataResult(query.space_view_id, instance), + ); - let entity_path = data.entity_path.clone(); - - if let Some(entity_rect) = entity_rect { - let entity_id = egui::LayerId::new( - egui::Order::Background, - id.with(("debug", entity_path.hash())), - ); - ui.ctx().set_transform_layer(entity_id, world_to_window); - ui::draw_entity( - ui, - clip_rect_world, - entity_id, - entity_rect, - &entity_path, - &query.highlights, - ); + layout.insert(index, response.rect); + // entity_rect = + // entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); + } } - } - - for dummy in graph.unknown_nodes() { - let index = NodeIndex::from(&dummy); - let current_extent = layout - .get(&index) - .expect("missing layout information for dummy node"); - let response = egui::Area::new(id.with(&index)) - .current_pos(current_extent.min) - .order(egui::Order::Middle) - .constrain(false) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(clip_rect_world); - ui::draw_dummy(ui, &dummy) - }) - .response; - - layout.insert(index, response.rect); - - let id = response.layer_id; - ui.ctx().set_transform_layer(id, world_to_window); - ui.ctx().set_sublayer(window_layer, id); - } - - for data in undirected_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - for edge in data.edges() { - let source_ix = NodeIndex::from(edge.source); - let target_ix = NodeIndex::from(edge.target); - let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - - let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) - .current_pos(source_pos.center()) - .order(egui::Order::Background) - .constrain(false) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); - ui::draw_edge( - ui, - edge.color, - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - false, - ); - }) - .response; - - let id = response.layer_id; - - ui.ctx().set_transform_layer(id, world_to_window); - ui.ctx().set_sublayer(window_layer, id); - } - } + }); - for data in directed_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - for edge in data.edges() { - let source_ix = NodeIndex::from(edge.source); - let target_ix = NodeIndex::from(edge.target); - let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - - let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) - .current_pos(source_pos.center()) - .order(egui::Order::Background) - .constrain(false) - .show(ui.ctx(), |ui| { - ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); - ui::draw_edge( - ui, - edge.color, - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - true, - ); - }) - .response; - - let id = response.layer_id; - - ui.ctx().set_transform_layer(id, world_to_window); - ui.ctx().set_sublayer(window_layer, id); - } - } + // let entity_path = data.entity_path.clone(); + + // if let Some(entity_rect) = entity_rect { + // let entity_id = egui::LayerId::new( + // egui::Order::Background, + // id.with(("debug", entity_path.hash())), + // ); + // ui.ctx().set_transform_layer(entity_id, world_to_window); + // ui::draw_entity( + // ui, + // clip_rect_world, + // entity_id, + // entity_rect, + // &entity_path, + // &query.highlights, + // ); + // } + // } + + // for dummy in graph.unknown_nodes() { + // let index = NodeIndex::from(&dummy); + // let current_extent = layout + // .get(&index) + // .expect("missing layout information for dummy node"); + // let response = egui::Area::new(id.with(&index)) + // .current_pos(current_extent.min) + // .order(egui::Order::Middle) + // .constrain(false) + // .show(ui.ctx(), |ui| { + // ui.set_clip_rect(clip_rect_world); + // ui::draw_dummy(ui, &dummy) + // }) + // .response; + + // layout.insert(index, response.rect); + + // let id = response.layer_id; + // ui.ctx().set_transform_layer(id, world_to_window); + // ui.ctx().set_sublayer(window_layer, id); + // } + + // for data in undirected_system.data.iter() { + // let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + // for edge in data.edges() { + // let source_ix = NodeIndex::from(edge.source); + // let target_ix = NodeIndex::from(edge.target); + // let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + // let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; + + // let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) + // .current_pos(source_pos.center()) + // .order(egui::Order::Background) + // .constrain(false) + // .show(ui.ctx(), |ui| { + // ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); + // ui::draw_edge( + // ui, + // edge.color, + // source_pos, + // target_pos, + // ent_highlight.index_highlight(edge.instance), + // false, + // ); + // }) + // .response; + + // let id = response.layer_id; + + // ui.ctx().set_transform_layer(id, world_to_window); + // ui.ctx().set_sublayer(window_layer, id); + // } + // } + + // for data in directed_system.data.iter() { + // let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + // for edge in data.edges() { + // let source_ix = NodeIndex::from(edge.source); + // let target_ix = NodeIndex::from(edge.target); + // let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; + // let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; + + // let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) + // .current_pos(source_pos.center()) + // .order(egui::Order::Background) + // .constrain(false) + // .show(ui.ctx(), |ui| { + // ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); + // ui::draw_edge( + // ui, + // edge.color, + // source_pos, + // target_pos, + // ent_highlight.index_highlight(edge.instance), + // true, + // ); + // }) + // .response; + + // let id = response.layer_id; + + // ui.ctx().set_transform_layer(id, world_to_window); + // ui.ctx().set_sublayer(window_layer, id); + // } + // } Ok(()) } From 85ccfed03aedbbc554ccc3659ce63fce568408f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 15 Oct 2024 10:13:21 +0200 Subject: [PATCH 076/159] WIP: finish scene abstraction --- examples/rust/graph_view/src/types.rs | 2 +- examples/rust/graph_view/src/ui/mod.rs | 12 +- examples/rust/graph_view/src/ui/scene.rs | 105 +++++---- examples/rust/graph_view/src/ui/state.rs | 18 +- examples/rust/graph_view/src/view.rs | 201 ++++++++---------- .../src/visualizers/edges_directed.rs | 2 +- .../src/visualizers/edges_undirected.rs | 2 +- 7 files changed, 161 insertions(+), 181 deletions(-) diff --git a/examples/rust/graph_view/src/types.rs b/examples/rust/graph_view/src/types.rs index e2337db22da0..94dbf9a24e3c 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/examples/rust/graph_view/src/types.rs @@ -42,7 +42,7 @@ pub(crate) struct NodeInstance<'a> { pub struct EdgeInstance<'a> { pub source: &'a datatypes::GraphLocation, pub target: &'a datatypes::GraphLocation, - pub entity_path: &'a re_log_types::EntityPath, + pub _entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, } diff --git a/examples/rust/graph_view/src/ui/mod.rs b/examples/rust/graph_view/src/ui/mod.rs index 64994b6c179a..951b0ba30354 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/examples/rust/graph_view/src/ui/mod.rs @@ -29,17 +29,15 @@ pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Re pub fn draw_entity( ui: &mut egui::Ui, - clip_rect: egui::Rect, - layer_id: egui::LayerId, rect: egui::Rect, entity_path: &EntityPath, highlights: &SpaceViewHighlights, -) { - let painter = egui::Painter::new(ui.ctx().clone(), layer_id, clip_rect); +) -> egui::Response { + let (rect, response) = ui.allocate_at_least(rect.size(), egui::Sense::hover()); let padded = rect.expand(10.0); let tc = ui.ctx().style().visuals.text_color(); - painter.rect( + ui.painter().rect( padded, ui.style().visuals.window_rounding, egui::Color32::from_rgba_unmultiplied(tc.r(), tc.g(), tc.b(), 4), @@ -52,7 +50,7 @@ pub fn draw_entity( .is_some() { // TODO(grtlr): text should be presented in window space. - painter.text( + ui.painter().text( padded.left_top(), egui::Align2::LEFT_BOTTOM, entity_path.to_string(), @@ -60,6 +58,8 @@ pub fn draw_entity( ui.ctx().style().visuals.text_color(), ); } + + response } pub fn measure_node_sizes<'a>( diff --git a/examples/rust/graph_view/src/ui/scene.rs b/examples/rust/graph_view/src/ui/scene.rs index b9197646b791..799ed7ec576e 100644 --- a/examples/rust/graph_view/src/ui/scene.rs +++ b/examples/rust/graph_view/src/ui/scene.rs @@ -1,12 +1,19 @@ use std::ops::RangeFrom; -use re_viewer::external::egui::{ - emath::TSTransform, Area, Id, LayerId, Order, Pos2, Rect, Response, Sense, Ui, +use re_viewer::external::{ + egui::{ + emath::TSTransform, Area, Color32, Id, LayerId, Order, Painter, Pos2, Rect, Response, + Sense, Stroke, Ui, + }, + re_log::external::log, }; pub struct ViewBuilder { world_to_view: TSTransform, clip_rect_window: Rect, + // TODO(grtlr): separate state from builder + pub show_debug: bool, + bounding_rect: Rect, } impl Default for ViewBuilder { @@ -14,12 +21,14 @@ impl Default for ViewBuilder { Self { world_to_view: Default::default(), clip_rect_window: Rect::NOTHING, + show_debug: false, + bounding_rect: Rect::NOTHING, } } } impl ViewBuilder { - pub fn fit_to_screen(&mut self, bounding_rect: Rect) { + fn fit_to_rect(&mut self, bounding_rect: Rect) { let available_size = self.clip_rect_window.size(); // Compute the scale factor to fit the bounding rectangle into the available screen size. @@ -39,6 +48,10 @@ impl ViewBuilder { * TSTransform::from_scaling(scale); } + pub fn fit_to_screen(&mut self) { + self.fit_to_rect(self.bounding_rect); + } + /// Return the clip rect of the scene in window coordinates. pub fn scene(&mut self, ui: &mut Ui, add_scene_contents: F) -> Rect where @@ -59,12 +72,12 @@ impl ViewBuilder { #[cfg(debug_assertions)] if response.double_clicked() { if let Some(window) = response.interact_pointer_pos() { - // log::debug!( - // "Click event! Window: {:?}, View: {:?} World: {:?}", - // window, - // view_to_window.inverse() * window, - // world_to_window.inverse() * window, - // ); + log::debug!( + "Click event! Window: {:?}, View: {:?} World: {:?}", + window, + view_to_window.inverse() * window, + world_to_window.inverse() * window, + ); } } @@ -90,34 +103,6 @@ impl ViewBuilder { let window_layer = ui.layer_id(); - // if state.show_debug { - // let debug_id = egui::LayerId::new(egui::Order::Debug, id.with("debug_layer")); - // ui.ctx().set_transform_layer(debug_id, world_to_window); - - // // Paint the coordinate system. - // let painter = egui::Painter::new(ui.ctx().clone(), debug_id, clip_rect_world); - - // // paint coordinate system at the world origin - // let origin = egui::Pos2::new(0.0, 0.0); - // let x_axis = egui::Pos2::new(100.0, 0.0); - // let y_axis = egui::Pos2::new(0.0, 100.0); - - // painter.line_segment([origin, x_axis], egui::Stroke::new(1.0, egui::Color32::RED)); - // painter.line_segment( - // [origin, y_axis], - // egui::Stroke::new(2.0, egui::Color32::GREEN), - // ); - - // if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { - // painter.rect( - // bounding_box, - // 0.0, - // egui::Color32::from_rgba_unmultiplied(255, 0, 255, 8), - // egui::Stroke::new(1.0, egui::Color32::from_rgb(255, 0, 255)), - // ); - // } - // } - add_scene_contents(Scene { ui, id, @@ -125,7 +110,35 @@ impl ViewBuilder { clip_rect_world, world_to_window, counter: 0u64.., + bounding_rect: &mut self.bounding_rect, }); + + // We need to draw the debug information after the rest to ensure that we have the correct bounding box. + if self.show_debug { + let debug_id = LayerId::new(Order::Debug, id.with("debug_layer")); + ui.ctx().set_transform_layer(debug_id, world_to_window); + + // Paint the coordinate system. + let painter = Painter::new(ui.ctx().clone(), debug_id, clip_rect_world); + + // paint coordinate system at the world origin + let origin = Pos2::new(0.0, 0.0); + let x_axis = Pos2::new(100.0, 0.0); + let y_axis = Pos2::new(0.0, 100.0); + + painter.line_segment([origin, x_axis], Stroke::new(1.0, Color32::RED)); + painter.line_segment([origin, y_axis], Stroke::new(2.0, Color32::GREEN)); + + if self.bounding_rect.is_positive() { + painter.rect( + self.bounding_rect, + 0.0, + Color32::from_rgba_unmultiplied(255, 0, 255, 8), + Stroke::new(1.0, Color32::from_rgb(255, 0, 255)), + ); + } + } + clip_rect_window } } @@ -137,6 +150,7 @@ pub struct Scene<'a> { clip_rect_world: Rect, world_to_window: TSTransform, counter: RangeFrom, + bounding_rect: &'a mut Rect, } impl<'a> Scene<'a> { @@ -145,7 +159,7 @@ impl<'a> Scene<'a> { where F: for<'b> FnOnce(&'b mut Ui) -> Response, { - let response = Area::new(self.id.with(("node", self.counter.next().unwrap()))) + let response = Area::new(self.id.with(("__node", self.counter.next().unwrap()))) .current_pos(pos) .order(Order::Foreground) .constrain(false) @@ -159,14 +173,17 @@ impl<'a> Scene<'a> { self.ui.ctx().set_transform_layer(id, self.world_to_window); self.ui.ctx().set_sublayer(self.window_layer, id); + *self.bounding_rect = self.bounding_rect.union(response.rect); + response } - pub fn entity(&mut self, pos: Pos2, add_entity_contents: F) + pub fn entity(&mut self, pos: Pos2, add_entity_contents: F) -> Response where - F: for<'b> FnOnce(&'b mut Ui), + F: for<'b> FnOnce(&'b mut Ui) -> Response, { - let response = Area::new(self.id.with(("entity", self.counter.next().unwrap()))) + let response = Area::new(self.id.with(("__entity", self.counter.next().unwrap()))) + .fixed_pos(pos) .order(Order::Background) .constrain(false) .show(self.ui.ctx(), |ui| { @@ -178,9 +195,11 @@ impl<'a> Scene<'a> { let id = response.layer_id; self.ui.ctx().set_transform_layer(id, self.world_to_window); self.ui.ctx().set_sublayer(self.window_layer, id); + + response } - pub fn edge(&mut self, add_edge_contents: F) + pub fn edge(&mut self, add_edge_contents: F) -> Response where F: for<'b> FnOnce(&'b mut Ui), { @@ -196,5 +215,7 @@ impl<'a> Scene<'a> { let id = response.layer_id; self.ui.ctx().set_transform_layer(id, self.world_to_window); self.ui.ctx().set_sublayer(self.window_layer, id); + + response } } diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 4afb2a73f607..105665d987d8 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -1,11 +1,7 @@ use std::collections::HashMap; use re_format::format_f32; -use re_viewer::external::{ - egui::{self, emath}, - re_ui::UiExt, - re_viewer_context::SpaceViewState, -}; +use re_viewer::external::{egui, re_ui::UiExt, re_viewer_context::SpaceViewState}; use crate::{graph::NodeIndex, layout::LayoutProvider}; @@ -18,8 +14,8 @@ use super::{bounding_rect_from_iter, scene::ViewBuilder}; pub(crate) struct GraphSpaceViewState { pub viewer: ViewBuilder, - // Debug information - pub show_debug: bool, + /// Indicates if the viewer should fit to the screen the next time it is rendered. + pub should_fit_to_screen: bool, /// Positions of the nodes in world space. pub layout: Option>, @@ -39,21 +35,19 @@ impl GraphSpaceViewState { } }); ui.end_row(); + if ui .button("Fit to screen") .on_hover_text("Fit the bounding box to the screen") .clicked() { - if let Some(bounding_rect) = bounding_rect_from_iter(layout.values()) { - self.viewer.fit_to_screen(bounding_rect); - } + self.should_fit_to_screen = true; } - ui.end_row(); } } pub fn debug_ui(&mut self, ui: &mut egui::Ui) { - ui.re_checkbox(&mut self.show_debug, "Show debug information") + ui.re_checkbox(&mut self.viewer.show_debug, "Show debug information") .on_hover_text("Shows debug information for the current graph"); ui.end_row(); } diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 80e90dc9744b..e426e0ae333a 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -1,5 +1,5 @@ use re_viewer::external::{ - egui::{self, emath::TSTransform}, + egui, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, @@ -14,7 +14,6 @@ use re_viewer::external::{ }; use crate::{ - error::Error, graph::{Graph, NodeIndex}, ui::{self, GraphSpaceViewState}, visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, @@ -148,14 +147,10 @@ impl SpaceViewClass for GraphSpaceView { .layout_provider .compute(node_sizes.into_iter(), undirected, directed)?; - // if let Some(bounding_box) = ui::bounding_rect_from_iter(layout.values()) { - // state - // .viewer - // .fit_to_screen(bounding_box.scale_from_center(1.05)); - // } - state.layout = Some(layout); + state.should_fit_to_screen = true; + return Ok(()); }; @@ -172,11 +167,13 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); // We keep track of the size of the current entity. - // TODO: let mut entity_rect: Option = None; + let mut entity_rect: Option = None; for node in data.nodes() { let index = NodeIndex::from(&node); - let current = layout.get(&index).unwrap(); + let current = layout + .get(&index) + .expect("missing layout information for node"); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -189,118 +186,86 @@ impl SpaceViewClass for GraphSpaceView { ); layout.insert(index, response.rect); - // entity_rect = - // entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); + entity_rect = + entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); + } + + // TODO(grtlr): handle interactions + let _response = entity_rect.map(|rect| { + scene.entity(rect.min, |ui| { + ui::draw_entity(ui, rect, &data.entity_path, &query.highlights) + }) + }); + } + + for dummy in graph.unknown_nodes() { + let index = NodeIndex::from(&dummy); + let current = layout + .get(&index) + .expect("missing layout information for dummy node"); + let response = scene.node(current.min, |ui| ui::draw_dummy(ui, &dummy)); + layout.insert(index, response.rect); + } + + for data in undirected_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for edge in data.edges() { + let source_ix = NodeIndex::from(edge.source); + let target_ix = NodeIndex::from(edge.target); + let source_pos = layout + .get(&source_ix) + .expect("missing layout information for edge source node"); + let target_pos = layout + .get(&target_ix) + .expect("missing layout information for edge target node"); + + let _response = scene.edge(|ui| { + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + false, + ) + }); + } + } + + // TODO(grtlr): consider reducing this duplication? + for data in directed_system.data.iter() { + let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + + for edge in data.edges() { + let source_ix = NodeIndex::from(edge.source); + let target_ix = NodeIndex::from(edge.target); + let source_pos = layout + .get(&source_ix) + .expect("missing layout information for edge source node"); + let target_pos = layout + .get(&target_ix) + .expect("missing layout information for edge target node"); + + let _response = scene.edge(|ui| { + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + true, + ) + }); } } }); - // let entity_path = data.entity_path.clone(); - - // if let Some(entity_rect) = entity_rect { - // let entity_id = egui::LayerId::new( - // egui::Order::Background, - // id.with(("debug", entity_path.hash())), - // ); - // ui.ctx().set_transform_layer(entity_id, world_to_window); - // ui::draw_entity( - // ui, - // clip_rect_world, - // entity_id, - // entity_rect, - // &entity_path, - // &query.highlights, - // ); - // } - // } - - // for dummy in graph.unknown_nodes() { - // let index = NodeIndex::from(&dummy); - // let current_extent = layout - // .get(&index) - // .expect("missing layout information for dummy node"); - // let response = egui::Area::new(id.with(&index)) - // .current_pos(current_extent.min) - // .order(egui::Order::Middle) - // .constrain(false) - // .show(ui.ctx(), |ui| { - // ui.set_clip_rect(clip_rect_world); - // ui::draw_dummy(ui, &dummy) - // }) - // .response; - - // layout.insert(index, response.rect); - - // let id = response.layer_id; - // ui.ctx().set_transform_layer(id, world_to_window); - // ui.ctx().set_sublayer(window_layer, id); - // } - - // for data in undirected_system.data.iter() { - // let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - // for edge in data.edges() { - // let source_ix = NodeIndex::from(edge.source); - // let target_ix = NodeIndex::from(edge.target); - // let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - // let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - - // let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) - // .current_pos(source_pos.center()) - // .order(egui::Order::Background) - // .constrain(false) - // .show(ui.ctx(), |ui| { - // ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); - // ui::draw_edge( - // ui, - // edge.color, - // source_pos, - // target_pos, - // ent_highlight.index_highlight(edge.instance), - // false, - // ); - // }) - // .response; - - // let id = response.layer_id; - - // ui.ctx().set_transform_layer(id, world_to_window); - // ui.ctx().set_sublayer(window_layer, id); - // } - // } - - // for data in directed_system.data.iter() { - // let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - // for edge in data.edges() { - // let source_ix = NodeIndex::from(edge.source); - // let target_ix = NodeIndex::from(edge.target); - // let source_pos = layout.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - // let target_pos = layout.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - - // let response = egui::Area::new(id.with((data.entity_path.hash(), edge.instance))) - // .current_pos(source_pos.center()) - // .order(egui::Order::Background) - // .constrain(false) - // .show(ui.ctx(), |ui| { - // ui.set_clip_rect(world_to_window.inverse() * clip_rect_window); - // ui::draw_edge( - // ui, - // edge.color, - // source_pos, - // target_pos, - // ent_highlight.index_highlight(edge.instance), - // true, - // ); - // }) - // .response; - - // let id = response.layer_id; - - // ui.ctx().set_transform_layer(id, world_to_window); - // ui.ctx().set_sublayer(window_layer, id); - // } - // } + // TODO(grtlr): consider improving this! + if state.should_fit_to_screen { + state.viewer.fit_to_screen(); + state.should_fit_to_screen = false; + } Ok(()) } diff --git a/examples/rust/graph_view/src/visualizers/edges_directed.rs b/examples/rust/graph_view/src/visualizers/edges_directed.rs index a54310c68ce0..2147e65967f1 100644 --- a/examples/rust/graph_view/src/visualizers/edges_directed.rs +++ b/examples/rust/graph_view/src/visualizers/edges_directed.rs @@ -41,7 +41,7 @@ impl EdgesDirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - entity_path: &self.entity_path, + _entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) diff --git a/examples/rust/graph_view/src/visualizers/edges_undirected.rs b/examples/rust/graph_view/src/visualizers/edges_undirected.rs index 360b00cb8edd..f4df4fae25d2 100644 --- a/examples/rust/graph_view/src/visualizers/edges_undirected.rs +++ b/examples/rust/graph_view/src/visualizers/edges_undirected.rs @@ -41,7 +41,7 @@ impl EdgesUndirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - entity_path: &self.entity_path, + _entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) From 8fa2c638b5b99f7693b397297930c764ddbf84bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 15 Oct 2024 10:15:31 +0200 Subject: [PATCH 077/159] WIP: fix docs --- .../definitions/rerun/archetypes/graph_edges_directed.fbs | 2 +- .../definitions/rerun/archetypes/graph_edges_undirected.fbs | 2 +- .../definitions/rerun/components/graph_edge_directed.fbs | 2 +- docs/content/reference/types/archetypes.md | 4 ++-- .../reference/types/archetypes/graph_edges_directed.md | 2 +- .../reference/types/archetypes/graph_edges_undirected.md | 2 +- docs/content/reference/types/components.md | 2 +- .../content/reference/types/components/graph_edge_directed.md | 2 +- rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py | 2 +- rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py | 2 +- rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs index 8c5a9425fbad..6ba7008d2a04 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs @@ -2,7 +2,7 @@ namespace rerun.archetypes; // --- -/// A list of nodes in a graph with optional labels, colors, etc. +/// A list of directed edges in a graph with optional labels, colors, etc. table GraphEdgesDirected ( "attr.rust.derive": "PartialEq, Eq", "attr.docs.category": "Graph", diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs index a1624717c676..aa859ba27e15 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs @@ -2,7 +2,7 @@ namespace rerun.archetypes; // --- -/// A list of nodes in a graph with optional labels, colors, etc. +/// A list of undirected edges in a graph with optional labels, colors, etc. table GraphEdgesUndirected ( "attr.rust.derive": "PartialEq, Eq", "attr.docs.category": "Graph", diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs index 483329867309..4c406561fbd1 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs @@ -2,7 +2,7 @@ namespace rerun.components; // --- -/// An undirected edge in a graph connecting two nodes. +/// A directed edge in a graph connecting two nodes. table GraphEdgeDirected ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index 4da922d04b17..ea6cb9368d16 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -14,8 +14,8 @@ This page lists all built-in archetypes. ## Graph -* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of nodes in a graph with optional labels, colors, etc. -* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of nodes in a graph with optional labels, colors, etc. +* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of directed edges in a graph with optional labels, colors, etc. +* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of undirected edges in a graph with optional labels, colors, etc. * [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. ## Image & tensor diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md index 97cb29660eac..603d6c1d7c55 100644 --- a/docs/content/reference/types/archetypes/graph_edges_directed.md +++ b/docs/content/reference/types/archetypes/graph_edges_directed.md @@ -3,7 +3,7 @@ title: "GraphEdgesDirected" --- -A list of nodes in a graph with optional labels, colors, etc. +A list of directed edges in a graph with optional labels, colors, etc. ## Components diff --git a/docs/content/reference/types/archetypes/graph_edges_undirected.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md index 24d4b2dba01f..1838404ba97e 100644 --- a/docs/content/reference/types/archetypes/graph_edges_undirected.md +++ b/docs/content/reference/types/archetypes/graph_edges_undirected.md @@ -3,7 +3,7 @@ title: "GraphEdgesUndirected" --- -A list of nodes in a graph with optional labels, colors, etc. +A list of undirected edges in a graph with optional labels, colors, etc. ## Components diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 8d1effb26a23..51970b0027a1 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,7 +29,7 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. -* [`GraphEdgeDirected`](components/graph_edge_directed.md): An undirected edge in a graph connecting two nodes. +* [`GraphEdgeDirected`](components/graph_edge_directed.md): A directed edge in a graph connecting two nodes. * [`GraphEdgeUndirected`](components/graph_edge_undirected.md): An undirected edge in a graph connecting two nodes. * [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md index b5d1ffcabeab..0fb3d80ae2c8 100644 --- a/docs/content/reference/types/components/graph_edge_directed.md +++ b/docs/content/reference/types/components/graph_edge_directed.md @@ -3,7 +3,7 @@ title: "GraphEdgeDirected" --- -An undirected edge in a graph connecting two nodes. +A directed edge in a graph connecting two nodes. ## Fields diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py index 9fc75322b0dd..8fd3b6349d38 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py @@ -20,7 +20,7 @@ @define(str=False, repr=False, init=False) class GraphEdgesDirected(Archetype): - """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + """**Archetype**: A list of directed edges in a graph with optional labels, colors, etc.""" def __init__( self: Any, diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py index 6bad9dc9fe6b..347c4f0b645d 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py @@ -20,7 +20,7 @@ @define(str=False, repr=False, init=False) class GraphEdgesUndirected(Archetype): - """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + """**Archetype**: A list of undirected edges in a graph with optional labels, colors, etc.""" def __init__( self: Any, diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py index c6335092aff6..590596f6755e 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py @@ -15,7 +15,7 @@ class GraphEdgeDirected(datatypes.GraphEdge, ComponentMixin): - """**Component**: An undirected edge in a graph connecting two nodes.""" + """**Component**: A directed edge in a graph connecting two nodes.""" _BATCH_TYPE = None # You can define your own __init__ function as a member of GraphEdgeDirectedExt in graph_edge_directed_ext.py From 600b81220fdfa10ebd7dcd7d066484c81816d656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 16 Oct 2024 15:06:22 +0200 Subject: [PATCH 078/159] WIP: initial implementation of `re_force` --- Cargo.lock | 10 ++ crates/utils/re_force/Cargo.toml | 27 ++++++ crates/utils/re_force/README.md | 10 ++ crates/utils/re_force/src/collide.rs | 94 +++++++++++++++++++ crates/utils/re_force/src/jiggle.rs | 5 + crates/utils/re_force/src/lcg.rs | 86 +++++++++++++++++ crates/utils/re_force/src/lib.rs | 8 ++ crates/utils/re_force/src/particle.rs | 24 +++++ crates/utils/re_force/src/position.rs | 51 ++++++++++ crates/utils/re_force/src/simulation.rs | 93 ++++++++++++++++++ examples/rust/graph_view/Cargo.toml | 1 + examples/rust/graph_view/src/layout/force.rs | 33 +++++++ .../rust/graph_view/src/layout/fruchterman.rs | 16 +++- examples/rust/graph_view/src/layout/mod.rs | 10 +- examples/rust/graph_view/src/ui/state.rs | 5 +- .../node_link_graph/src/examples/disjoint.rs | 14 +++ .../rust/node_link_graph/src/examples/mod.rs | 1 + examples/rust/node_link_graph/src/main.rs | 8 +- 18 files changed, 488 insertions(+), 8 deletions(-) create mode 100644 crates/utils/re_force/Cargo.toml create mode 100644 crates/utils/re_force/README.md create mode 100644 crates/utils/re_force/src/collide.rs create mode 100644 crates/utils/re_force/src/jiggle.rs create mode 100644 crates/utils/re_force/src/lcg.rs create mode 100644 crates/utils/re_force/src/lib.rs create mode 100644 crates/utils/re_force/src/particle.rs create mode 100644 crates/utils/re_force/src/position.rs create mode 100644 crates/utils/re_force/src/simulation.rs create mode 100644 examples/rust/graph_view/src/layout/force.rs create mode 100644 examples/rust/node_link_graph/src/examples/disjoint.rs diff --git a/Cargo.lock b/Cargo.lock index 0eda51a98585..39691704742c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2776,6 +2776,7 @@ dependencies = [ "petgraph", "rand", "re_crash_handler", + "re_force", "re_format", "re_log_types", "re_sdk_comms", @@ -5310,6 +5311,15 @@ dependencies = [ "anyhow", ] +[[package]] +name = "re_force" +version = "0.19.0-alpha.1+dev" +dependencies = [ + "anyhow", + "emath", + "rand", +] + [[package]] name = "re_format" version = "0.19.0-alpha.1+dev" diff --git a/crates/utils/re_force/Cargo.toml b/crates/utils/re_force/Cargo.toml new file mode 100644 index 000000000000..3d672688347f --- /dev/null +++ b/crates/utils/re_force/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "re_force" +authors.workspace = true +description = "Force-directed graph drawing." +edition.workspace = true +homepage.workspace = true +include.workspace = true +license.workspace = true +publish = true +readme = "README.md" +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true + + +[dependencies] +emath = "0.29.1" +rand = "0.8.5" + +[dev-dependencies] +anyhow.workspace = true diff --git a/crates/utils/re_force/README.md b/crates/utils/re_force/README.md new file mode 100644 index 000000000000..b2ea00de8ee6 --- /dev/null +++ b/crates/utils/re_force/README.md @@ -0,0 +1,10 @@ +# re_force + +Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates. + +[![Latest version](https://img.shields.io/crates/v/re_force.svg)](https://crates.io/crates/re_force) +[![Documentation](https://docs.rs/re_force/badge.svg)](https://docs.rs/re_force) +![MIT](https://img.shields.io/badge/license-MIT-blue.svg) +![Apache](https://img.shields.io/badge/license-Apache-blue.svg) + +Force-directed graph drawing — essentially a Rust port of [`d3-force`](https://d3js.org/d3-force). diff --git a/crates/utils/re_force/src/collide.rs b/crates/utils/re_force/src/collide.rs new file mode 100644 index 000000000000..d2b55fd70741 --- /dev/null +++ b/crates/utils/re_force/src/collide.rs @@ -0,0 +1,94 @@ +use emath::{Pos2, Rect, Vec2}; +use rand::thread_rng; + +use crate::{jiggle::jiggle, particle::Particle}; + +pub struct Collide { + radii: Option>, + strength: f32, + iterations: usize, +} + +impl Default for Collide { + fn default() -> Self { + Collide { + radii: Default::default(), + strength: 1.0, + iterations: 1, + } + } +} + +impl Collide { + // TODO: speed up using quadtree + pub fn force(&mut self, particles: &mut [Particle]) { + // TODO: make this configurable + let radii: Vec<_> = (0..particles.len()).map(|_| 10.0).collect(); + + debug_assert!(radii.len() == particles.len()); + + for _ in 0..self.iterations { + for s in 0..particles.len() { + let (left, right) = particles.split_at_mut(s); + + for (i, node) in left.iter_mut().enumerate() { + let ri = radii[i]; + let ri2 = ri * ri; + let ni = node.pos + node.vel; + + for (j, other) in right.iter_mut().enumerate() { + let rj = radii[s + j]; + + let r = ri + rj; + let mut d = ni - other.pos - other.vel; + let mut l = d.x * d.x + d.y * d.y; + if l < r * r { + // We need to resolve points that coincide. + if d.x == 0.0 { + d.x = jiggle(&mut thread_rng()); + l += d.x * d.x; + } + if d.y == 0.0 { + d.y = jiggle(&mut thread_rng()); + l += d.y * d.y; + } + + l = l.sqrt(); + l = (r - l) / l * self.strength; + d *= l; + let rj2 = rj * rj; + let frac = rj2 / (ri2 + rj2); + node.vel += d * frac; + other.vel -= d * (1.0 - frac); + } + } + } + } + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn resolve_all_coincide() { + let mut particles = std::iter::repeat(Particle { + pos: Pos2::ZERO, + vel: Vec2::ZERO, + }) + .take(5) + .collect::>(); + + let mut collide = Collide::default(); + + collide.force(&mut particles); + + assert_ne!(particles[0].vel, Vec2::ZERO); + assert_ne!(particles[1].vel, Vec2::ZERO); + assert_ne!(particles[2].vel, Vec2::ZERO); + assert_ne!(particles[3].vel, Vec2::ZERO); + assert_ne!(particles[4].vel, Vec2::ZERO); + } +} diff --git a/crates/utils/re_force/src/jiggle.rs b/crates/utils/re_force/src/jiggle.rs new file mode 100644 index 000000000000..25514040ea42 --- /dev/null +++ b/crates/utils/re_force/src/jiggle.rs @@ -0,0 +1,5 @@ +use rand::Rng; + +pub fn jiggle(rng: &mut R) -> f32 { + (rng.gen::() - 0.5) * 1e-6 +} diff --git a/crates/utils/re_force/src/lcg.rs b/crates/utils/re_force/src/lcg.rs new file mode 100644 index 000000000000..2b4c078deabc --- /dev/null +++ b/crates/utils/re_force/src/lcg.rs @@ -0,0 +1,86 @@ +const A: u64 = 1_664_525; +const C: u64 = 1_013_904_223; +const M: u64 = 4_294_967_296; + +pub struct LCG { + seed: u64, +} + +impl LCG { + pub fn new(seed: u64) -> Self { + LCG { seed } + } +} + +impl Default for LCG { + fn default() -> Self { + LCG::new(0) + } +} + +impl Iterator for LCG { + type Item = u32; + + fn next(&mut self) -> Option { + self.seed = self.seed.wrapping_mul(A).wrapping_add(C) % M; + Some(self.seed as u32) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn known_sequence() { + // Initialize with seed 1 + let mut lcg = LCG::new(0); + + // Known sequence generated by the parameters (a, c, m) and seed 1 + let expected_values = vec![1013904223, 1196435762, 3519870697, 2868466484]; + + // Check that the first 5 values generated by the LCG match the expected values + for expected in expected_values { + let generated = lcg.next().unwrap(); + assert_eq!( + generated, expected, + "Expected {}, but got {}", + expected, generated + ); + } + } + + #[test] + fn repeatability() { + // Initialize two LCGs with the same seed + let mut lcg1 = LCG::new(12345); + let mut lcg2 = LCG::new(12345); + + // Generate a sequence from both and check that they are identical + for _ in 0..1000 { + let value1 = lcg1.next().unwrap(); + let value2 = lcg2.next().unwrap(); + assert_eq!(value1, value2, "Values diverged: {} != {}", value1, value2); + } + } + + #[test] + fn different_seeds() { + // Initialize two LCGs with different seeds + let mut lcg1 = LCG::new(1); + let mut lcg2 = LCG::new(2); + + // Check that their sequences differ + let mut diverged = false; + for _ in 0..1000 { + let value1 = lcg1.next().unwrap(); + let value2 = lcg2.next().unwrap(); + if value1 != value2 { + diverged = true; + break; + } + } + + assert!(diverged, "Sequences did not diverge for different seeds"); + } +} diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs new file mode 100644 index 000000000000..08c1da794e02 --- /dev/null +++ b/crates/utils/re_force/src/lib.rs @@ -0,0 +1,8 @@ +mod collide; +mod jiggle; +mod lcg; +mod particle; +mod position; +mod simulation; + +pub use simulation::Simulation; diff --git a/crates/utils/re_force/src/particle.rs b/crates/utils/re_force/src/particle.rs new file mode 100644 index 000000000000..44949c5c7065 --- /dev/null +++ b/crates/utils/re_force/src/particle.rs @@ -0,0 +1,24 @@ +use emath::{Pos2, Vec2}; + +#[derive(Clone, Copy, Debug)] +pub struct Particle { + // TODO: hide implementation details + pub pos: Pos2, + pub(crate) vel: Vec2, +} + +impl Particle { + pub fn new<'a>(pos: impl Into<[f32; 2]>) -> Self { + let pos: [f32; 2] = pos.into(); + Particle { + pos: pos.into(), + vel: Vec2::ZERO, + } + } +} + +impl From for [f32; 2] { + fn from(p: Particle) -> Self { + p.pos.into() + } +} diff --git a/crates/utils/re_force/src/position.rs b/crates/utils/re_force/src/position.rs new file mode 100644 index 000000000000..c256e5c36ae9 --- /dev/null +++ b/crates/utils/re_force/src/position.rs @@ -0,0 +1,51 @@ +use crate::particle::Particle; + +pub struct PositionX { + strength: f32, + x: f32, +} + +impl Default for PositionX { + fn default() -> Self { + Self { + strength: 0.1, + x: 0.0, + } + } +} + +impl PositionX { + pub fn force(&mut self, alpha: f32, particles: &mut [Particle]) { + let strengths = std::iter::repeat(self.strength); + + for (particle, si) in particles.iter_mut().zip(strengths) { + let d = self.x - particle.pos.x; + particle.vel.x += d * si * alpha; + } + } +} + +pub struct PositionY { + strength: f32, + y: f32, +} + +impl Default for PositionY { + fn default() -> Self { + Self { + strength: 0.1, + y: 0.0, + } + } +} + +impl PositionY { + pub fn force(&mut self, alpha: f32, particles: &mut [Particle]) { + let strengths = std::iter::repeat(self.strength); + + for (particle, si) in particles.iter_mut().zip(strengths) { + let d = self.y - particle.pos.y; + particle.vel.y += d * si * alpha; + } + } +} diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs new file mode 100644 index 000000000000..f8763e860ff8 --- /dev/null +++ b/crates/utils/re_force/src/simulation.rs @@ -0,0 +1,93 @@ +use emath::Vec2; + +use crate::{ + collide::Collide, + lcg::LCG, + particle::Particle, + position::{PositionX, PositionY}, +}; + +enum Force { + Collide(Collide), + PositionX(PositionX), + PositionY(PositionY), +} + +pub struct Simulation { + alpha: f32, + alpha_min: f32, + alpha_decay: f32, + alpha_target: f32, + velocity_decay: f32, + random: LCG, + forces: Vec, + particles: Vec, +} + +impl Simulation { + pub fn new<'a>(particles: impl IntoIterator) -> Self { + let alpha_min = 0.001; + Simulation { + alpha: 1.0, + alpha_min, + alpha_decay: 1.0 - alpha_min.powf(1.0 / 300.0), + alpha_target: 0.0, + velocity_decay: 0.6, + random: LCG::default(), + forces: vec![ + Force::Collide(Collide::default()), + Force::PositionX(PositionX::default()), + Force::PositionY(PositionY::default()), + ], + particles: particles.into_iter().map(Particle::new).collect(), + } + } +} + +impl Simulation { + pub fn step(&mut self) -> &[Particle] { + while self.alpha < self.alpha_min { + self.tick(1); + } + &self.particles + } + + pub fn tick(&mut self, iterations: usize) -> &[Particle] { + for _ in 0..iterations { + self.alpha += (self.alpha_target - self.alpha) * self.alpha_decay; + + for force in &mut self.forces { + match force { + Force::Collide(c) => c.force(&mut self.particles), + Force::PositionX(p) => p.force(self.alpha, &mut self.particles), + Force::PositionY(p) => p.force(self.alpha, &mut self.particles), + } + } + + for particle in &mut self.particles { + particle.vel *= self.velocity_decay; + particle.pos += particle.vel; + particle.vel = Vec2::ZERO; + } + } + + &self.particles + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn simulation_tick() { + let particles = [[0.0f32, 1.0], [0.0, -1.0]]; + + let mut simulation = Simulation::new(particles); + let particles = simulation.tick(1000000); + + assert_ne!(particles[0].pos, particles[1].pos); + assert_eq!(particles[0].pos.x, 0.0); + assert_eq!(particles[1].pos.x, 0.0); + } +} diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml index 3cadfe519acd..c303db4f775e 100644 --- a/examples/rust/graph_view/Cargo.toml +++ b/examples/rust/graph_view/Cargo.toml @@ -13,6 +13,7 @@ analytics = ["re_crash_handler/analytics", "re_viewer/analytics"] [dependencies] re_crash_handler = { path = "../../../crates/utils/re_crash_handler" } +re_force = { path = "../../../crates/utils/re_force" } re_format = { path = "../../../crates/utils/re_format" } re_viewer = { path = "../../../crates/viewer/re_viewer", default-features = false } re_log_types = { path = "../../../crates/store/re_log_types" } diff --git a/examples/rust/graph_view/src/layout/force.rs b/examples/rust/graph_view/src/layout/force.rs new file mode 100644 index 000000000000..b5a569b55a2c --- /dev/null +++ b/examples/rust/graph_view/src/layout/force.rs @@ -0,0 +1,33 @@ +use std::collections::HashMap; + +use re_viewer::external::egui; + +use crate::{error::Error, graph::NodeIndex}; + +#[derive(Default, Debug, PartialEq, Eq)] +pub struct Force; + +impl Force { + pub fn compute( + &self, + nodes: impl IntoIterator, + ) -> Result, Error> { + let nodes = nodes.into_iter().collect::>(); + + let particles = vec![[0.0, 0.0]; nodes.len()]; + + let mut sim = re_force::Simulation::new(particles); + + let res = sim.tick(1_000); + + Ok(nodes + .into_iter() + .zip(res.iter()) + .map(|((node_id, _), particle)| { + let center = particle.pos; + let rect = egui::Rect::from_center_size(center, egui::Vec2::new(10.0, 10.0)); + (node_id, rect) + }) + .collect()) + } +} diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs index 9dd4555ac860..18c685f6741c 100644 --- a/examples/rust/graph_view/src/layout/fruchterman.rs +++ b/examples/rust/graph_view/src/layout/fruchterman.rs @@ -1,6 +1,9 @@ -use std::collections::HashMap; +use std::{collections::HashMap, hash::BuildHasherDefault}; -use fdg::{nalgebra::Point2, Force as _}; +use fdg::{ + nalgebra::{Point2, SVector}, + Force, +}; use rand::distributions::Distribution as _; use re_viewer::external::egui; @@ -57,3 +60,12 @@ impl FruchtermanReingoldLayout { Ok(res) } } + +struct Collide { + // TODO(grtlr): specify hash function + pub velocities: HashMap>, +} + +impl fdg::Force for Collide { + fn apply(&mut self, graph: &mut fdg::ForceGraph) {} +} diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs index b1c9329f991e..3f2a9138675a 100644 --- a/examples/rust/graph_view/src/layout/mod.rs +++ b/examples/rust/graph_view/src/layout/mod.rs @@ -10,12 +10,15 @@ mod force_directed; pub(crate) use force_directed::ForceBasedLayout; mod fruchterman; pub(crate) use fruchterman::FruchtermanReingoldLayout; +mod force; +pub(crate) use force::Force; #[derive(Debug, PartialEq, Eq)] pub(crate) enum LayoutProvider { Dot(DotLayout), ForceDirected(ForceBasedLayout), FruchtermanReingold(FruchtermanReingoldLayout), + ReForce(Force), } impl LayoutProvider { @@ -30,6 +33,10 @@ impl LayoutProvider { pub(crate) fn new_fruchterman_reingold() -> Self { LayoutProvider::FruchtermanReingold(Default::default()) } + + pub(crate) fn new_napkin() -> Self { + LayoutProvider::ReForce(Default::default()) + } } impl LayoutProvider { @@ -45,12 +52,13 @@ impl LayoutProvider { LayoutProvider::FruchtermanReingold(layout) => { layout.compute(nodes, directed, undirected) } + LayoutProvider::ReForce(layout) => layout.compute(nodes), } } } impl Default for LayoutProvider { fn default() -> Self { - LayoutProvider::new_fruchterman_reingold() + LayoutProvider::new_napkin() } } diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 105665d987d8..a057f4147725 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -57,8 +57,9 @@ impl GraphSpaceViewState { ui.label("Layout algorithm:"); let layout_options = [ - (LayoutProvider::new_dot(), "Dot"), - (LayoutProvider::new_force_directed(), "Force Directed"), + (LayoutProvider::new_napkin(), "ReForce"), + // (LayoutProvider::new_dot(), "Dot"), + // (LayoutProvider::new_force_directed(), "Force Directed"), ( LayoutProvider::new_fruchterman_reingold(), "Fruchterman-Reingold", diff --git a/examples/rust/node_link_graph/src/examples/disjoint.rs b/examples/rust/node_link_graph/src/examples/disjoint.rs new file mode 100644 index 000000000000..fc269f97ba1e --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/disjoint.rs @@ -0,0 +1,14 @@ +use rerun::GraphNodes; + +use crate::Args; + +pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_simple")?; + + let nodes = (0..num_nodes) + .map(|i| format!("node{}", i)) + .collect::>(); + + rec.log_static("/nodes", &GraphNodes::new(nodes))?; + Ok(()) +} diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs index c1669f2b3912..b3d105db08bc 100644 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -1,2 +1,3 @@ +pub mod disjoint; pub mod simple; pub mod social; diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 879ad28f13eb..808e945f38bc 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -14,6 +14,7 @@ mod examples; enum Example { Simple, Social, + Disjoint, } impl Example { @@ -21,6 +22,7 @@ impl Example { match self { Example::Simple => examples::simple::run(args), Example::Social => examples::social::run(args), + Example::Disjoint => examples::disjoint::run(args, 20), } } } @@ -28,11 +30,11 @@ impl Example { #[derive(Debug, clap::Parser)] #[clap(author, version, about)] pub struct Args { - #[command(flatten)] - rerun: rerun::clap::RerunArgs, - #[arg(short, long)] example: Option, + + #[command(flatten)] + rerun: rerun::clap::RerunArgs, } fn main() -> anyhow::Result<()> { From e5d70f6954ed84ad15573f155a07742bc7a4222a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 17 Oct 2024 15:20:09 +0200 Subject: [PATCH 079/159] WIP: improve `re_force` implementation --- Cargo.lock | 1 - crates/utils/re_force/Cargo.toml | 1 - crates/utils/re_force/src/collide.rs | 40 ++-- crates/utils/re_force/src/lcg.rs | 9 +- crates/utils/re_force/src/lib.rs | 4 +- crates/utils/re_force/src/node.rs | 73 +++++++ crates/utils/re_force/src/particle.rs | 24 --- crates/utils/re_force/src/position.rs | 21 +- crates/utils/re_force/src/simulation.rs | 129 ++++++++++--- examples/rust/graph_view/src/layout/dot.rs | 110 ----------- examples/rust/graph_view/src/layout/force.rs | 33 ---- .../graph_view/src/layout/force_directed.rs | 54 ------ .../rust/graph_view/src/layout/fruchterman.rs | 71 ------- examples/rust/graph_view/src/layout/mod.rs | 64 ------- examples/rust/graph_view/src/main.rs | 2 - examples/rust/graph_view/src/select.rs | 55 ------ examples/rust/graph_view/src/ui/state.rs | 64 ++----- examples/rust/graph_view/src/view.rs | 179 ++++++++++-------- 18 files changed, 336 insertions(+), 598 deletions(-) create mode 100644 crates/utils/re_force/src/node.rs delete mode 100644 crates/utils/re_force/src/particle.rs delete mode 100644 examples/rust/graph_view/src/layout/dot.rs delete mode 100644 examples/rust/graph_view/src/layout/force.rs delete mode 100644 examples/rust/graph_view/src/layout/force_directed.rs delete mode 100644 examples/rust/graph_view/src/layout/fruchterman.rs delete mode 100644 examples/rust/graph_view/src/layout/mod.rs delete mode 100644 examples/rust/graph_view/src/select.rs diff --git a/Cargo.lock b/Cargo.lock index 39691704742c..0e66835ddf79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5316,7 +5316,6 @@ name = "re_force" version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", - "emath", "rand", ] diff --git a/crates/utils/re_force/Cargo.toml b/crates/utils/re_force/Cargo.toml index 3d672688347f..faf6c4a37281 100644 --- a/crates/utils/re_force/Cargo.toml +++ b/crates/utils/re_force/Cargo.toml @@ -20,7 +20,6 @@ all-features = true [dependencies] -emath = "0.29.1" rand = "0.8.5" [dev-dependencies] diff --git a/crates/utils/re_force/src/collide.rs b/crates/utils/re_force/src/collide.rs index d2b55fd70741..2f998a9005f4 100644 --- a/crates/utils/re_force/src/collide.rs +++ b/crates/utils/re_force/src/collide.rs @@ -1,8 +1,9 @@ -use emath::{Pos2, Rect, Vec2}; use rand::thread_rng; +use std::hash::Hash; -use crate::{jiggle::jiggle, particle::Particle}; +use crate::{jiggle::jiggle, node::Node}; +#[derive(Clone, Debug)] pub struct Collide { radii: Option>, strength: f32, @@ -21,7 +22,7 @@ impl Default for Collide { impl Collide { // TODO: speed up using quadtree - pub fn force(&mut self, particles: &mut [Particle]) { + pub fn force(&mut self, particles: &mut [Node]) { // TODO: make this configurable let radii: Vec<_> = (0..particles.len()).map(|_| 10.0).collect(); @@ -34,32 +35,37 @@ impl Collide { for (i, node) in left.iter_mut().enumerate() { let ri = radii[i]; let ri2 = ri * ri; - let ni = node.pos + node.vel; + let xi = node.x + node.vx; + let yi = node.y + node.vy; - for (j, other) in right.iter_mut().enumerate() { + for (j, data) in right.iter_mut().enumerate() { let rj = radii[s + j]; let r = ri + rj; - let mut d = ni - other.pos - other.vel; - let mut l = d.x * d.x + d.y * d.y; + let mut x = xi - data.x - data.vx; + let mut y = yi - data.y - data.vx; + let mut l = x * x + y * y; if l < r * r { // We need to resolve points that coincide. - if d.x == 0.0 { - d.x = jiggle(&mut thread_rng()); - l += d.x * d.x; + if x == 0.0 { + x = jiggle(&mut thread_rng()); + l += x * x; } - if d.y == 0.0 { - d.y = jiggle(&mut thread_rng()); - l += d.y * d.y; + if y == 0.0 { + y = jiggle(&mut thread_rng()); + l += y * y; } l = l.sqrt(); l = (r - l) / l * self.strength; - d *= l; + x *= l; + y *= l; let rj2 = rj * rj; let frac = rj2 / (ri2 + rj2); - node.vel += d * frac; - other.vel -= d * (1.0 - frac); + node.vx += x * frac; + node.vy += y * frac; + data.vx -= x * (1.0 - frac); + data.vy -= y * (1.0 - frac); } } } @@ -74,7 +80,7 @@ mod test { #[test] fn resolve_all_coincide() { - let mut particles = std::iter::repeat(Particle { + let mut particles = std::iter::repeat(Node { pos: Pos2::ZERO, vel: Vec2::ZERO, }) diff --git a/crates/utils/re_force/src/lcg.rs b/crates/utils/re_force/src/lcg.rs index 2b4c078deabc..1a54428f16cc 100644 --- a/crates/utils/re_force/src/lcg.rs +++ b/crates/utils/re_force/src/lcg.rs @@ -2,13 +2,14 @@ const A: u64 = 1_664_525; const C: u64 = 1_013_904_223; const M: u64 = 4_294_967_296; +#[derive(Clone, Debug)] pub struct LCG { - seed: u64, + state: u64, } impl LCG { pub fn new(seed: u64) -> Self { - LCG { seed } + LCG { state: seed } } } @@ -22,8 +23,8 @@ impl Iterator for LCG { type Item = u32; fn next(&mut self) -> Option { - self.seed = self.seed.wrapping_mul(A).wrapping_add(C) % M; - Some(self.seed as u32) + self.state = self.state.wrapping_mul(A).wrapping_add(C) % M; + Some(self.state as u32) } } diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs index 08c1da794e02..acbe253b7be2 100644 --- a/crates/utils/re_force/src/lib.rs +++ b/crates/utils/re_force/src/lib.rs @@ -1,8 +1,8 @@ mod collide; mod jiggle; mod lcg; -mod particle; +mod node; mod position; mod simulation; -pub use simulation::Simulation; +pub use simulation::{Simulation, SimulationBuilder}; diff --git a/crates/utils/re_force/src/node.rs b/crates/utils/re_force/src/node.rs new file mode 100644 index 000000000000..9fdd9f132b78 --- /dev/null +++ b/crates/utils/re_force/src/node.rs @@ -0,0 +1,73 @@ +use std::hash::Hash; + +// TODO(grtlr): Control memory layout. + +#[derive(Debug)] +pub(crate) struct Node { + pub x: f32, + pub y: f32, + pub vx: f32, + pub vy: f32, + pub ix: Ix, + // The following fields signal that a node is fixed in a certain direction. + // TODO(grtlr): Move this to a separate `Vec` in the simulation to improve the memory layout. + pub fx: Option, + pub fy: Option, +} + +impl Node { + pub fn new(ix: Ix, x: f32, y: f32) -> Self { + Self { + x, + y, + vx: 0.0, + vy: 0.0, + fx: None, + fy: None, + ix, + } + } + + #[inline(always)] + pub fn with_fixed_x(mut self) -> Self { + self.fx = Some(self.x); + self + } + + #[inline(always)] + pub fn with_fixed_y(mut self) -> Self { + self.fx = Some(self.x); + self + } + + /// Applies the velocity to the vectors, while respecting fixed positions. + pub(crate) fn apply_velocities(&mut self, velocity_decay: f32) { + if let Some(fx) = self.fx { + self.x = fx; + self.vx = 0.0; + } else { + self.x += self.vx; + self.vx *= velocity_decay; + } + + if let Some(fy) = self.fy { + self.y = fy; + self.vy = 0.0; + } else { + self.y += self.vy; + self.vy *= velocity_decay; + } + } +} + +impl From> for [f32; 2] { + fn from(p: Node) -> Self { + [p.x, p.y] + } +} + +impl From<(Ix, [f32; 2])> for Node { + fn from((ix, p): (Ix, [f32; 2])) -> Self { + Self::new(ix, p[0], p[1]) + } +} diff --git a/crates/utils/re_force/src/particle.rs b/crates/utils/re_force/src/particle.rs deleted file mode 100644 index 44949c5c7065..000000000000 --- a/crates/utils/re_force/src/particle.rs +++ /dev/null @@ -1,24 +0,0 @@ -use emath::{Pos2, Vec2}; - -#[derive(Clone, Copy, Debug)] -pub struct Particle { - // TODO: hide implementation details - pub pos: Pos2, - pub(crate) vel: Vec2, -} - -impl Particle { - pub fn new<'a>(pos: impl Into<[f32; 2]>) -> Self { - let pos: [f32; 2] = pos.into(); - Particle { - pos: pos.into(), - vel: Vec2::ZERO, - } - } -} - -impl From for [f32; 2] { - fn from(p: Particle) -> Self { - p.pos.into() - } -} diff --git a/crates/utils/re_force/src/position.rs b/crates/utils/re_force/src/position.rs index c256e5c36ae9..27e063fafde1 100644 --- a/crates/utils/re_force/src/position.rs +++ b/crates/utils/re_force/src/position.rs @@ -1,5 +1,7 @@ -use crate::particle::Particle; +use crate::node::Node; +use std::hash::Hash; +#[derive(Clone, Debug)] pub struct PositionX { strength: f32, x: f32, @@ -15,16 +17,17 @@ impl Default for PositionX { } impl PositionX { - pub fn force(&mut self, alpha: f32, particles: &mut [Particle]) { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { let strengths = std::iter::repeat(self.strength); - for (particle, si) in particles.iter_mut().zip(strengths) { - let d = self.x - particle.pos.x; - particle.vel.x += d * si * alpha; + for (node, si) in nodes.iter_mut().zip(strengths) { + let d = self.x - node.x; + node.vx += d * si * alpha; } } } +#[derive(Clone, Debug)] pub struct PositionY { strength: f32, y: f32, @@ -40,12 +43,12 @@ impl Default for PositionY { } impl PositionY { - pub fn force(&mut self, alpha: f32, particles: &mut [Particle]) { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { let strengths = std::iter::repeat(self.strength); - for (particle, si) in particles.iter_mut().zip(strengths) { - let d = self.y - particle.pos.y; - particle.vel.y += d * si * alpha; + for (node, si) in nodes.iter_mut().zip(strengths) { + let d = self.y - node.y; + node.vy += d * si * alpha; } } } diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs index f8763e860ff8..abb73d0e0d04 100644 --- a/crates/utils/re_force/src/simulation.rs +++ b/crates/utils/re_force/src/simulation.rs @@ -1,77 +1,148 @@ -use emath::Vec2; +use std::collections::HashMap; +use std::hash::Hash; use crate::{ collide::Collide, lcg::LCG, - particle::Particle, + node::Node, position::{PositionX, PositionY}, }; +#[derive(Clone, Debug)] enum Force { Collide(Collide), PositionX(PositionX), PositionY(PositionY), } -pub struct Simulation { +#[derive(Debug)] +pub struct SimulationBuilder { alpha: f32, alpha_min: f32, alpha_decay: f32, alpha_target: f32, velocity_decay: f32, - random: LCG, - forces: Vec, - particles: Vec, + _random: LCG, } -impl Simulation { - pub fn new<'a>(particles: impl IntoIterator) -> Self { +impl Default for SimulationBuilder { + fn default() -> Self { let alpha_min = 0.001; - Simulation { + Self { alpha: 1.0, alpha_min, alpha_decay: 1.0 - alpha_min.powf(1.0 / 300.0), alpha_target: 0.0, velocity_decay: 0.6, - random: LCG::default(), - forces: vec![ - Force::Collide(Collide::default()), - Force::PositionX(PositionX::default()), - Force::PositionY(PositionY::default()), - ], - particles: particles.into_iter().map(Particle::new).collect(), + _random: LCG::default(), + } + } +} + +impl SimulationBuilder { + // TODO(grtlr): build with fixed positions! + + #[inline(always)] + pub fn build(&self, nodes: impl IntoIterator) -> Simulation + where + P: Into<[f32; 2]>, + Ix: Hash + Eq, + { + let nodes = nodes.into_iter().map(|(ix, p)| { + let p = p.into(); + Node::new(ix, p[0], p[1]) + }); + + Simulation { + alpha: self.alpha, + alpha_min: self.alpha_min, + alpha_decay: self.alpha_decay, + alpha_target: self.alpha_target, + velocity_decay: self.velocity_decay, + nodes: nodes.collect(), + _random: self._random.clone(), + forces: Default::default(), } } } -impl Simulation { - pub fn step(&mut self) -> &[Particle] { +#[derive(Debug)] + +pub struct Simulation +where + Ix: Hash + Eq, +{ + alpha: f32, + alpha_min: f32, + alpha_decay: f32, + alpha_target: f32, + velocity_decay: f32, + _random: LCG, + forces: HashMap, + nodes: Vec>, +} + +// TODO(grtlr): Could simulation be an iterator? +impl Simulation { + pub fn step(&mut self) { while self.alpha < self.alpha_min { self.tick(1); } - &self.particles } - pub fn tick(&mut self, iterations: usize) -> &[Particle] { + pub fn tick(&mut self, iterations: usize) { for _ in 0..iterations { self.alpha += (self.alpha_target - self.alpha) * self.alpha_decay; - for force in &mut self.forces { + for force in &mut self.forces.values_mut() { match force { - Force::Collide(c) => c.force(&mut self.particles), - Force::PositionX(p) => p.force(self.alpha, &mut self.particles), - Force::PositionY(p) => p.force(self.alpha, &mut self.particles), + Force::Collide(c) => c.force(&mut self.nodes), + Force::PositionX(p) => p.force(self.alpha, &mut self.nodes), + Force::PositionY(p) => p.force(self.alpha, &mut self.nodes), } } - for particle in &mut self.particles { - particle.vel *= self.velocity_decay; - particle.pos += particle.vel; - particle.vel = Vec2::ZERO; + for n in &mut self.nodes { + n.apply_velocities(self.velocity_decay); } } + } + + pub fn positions<'a>(&'a self) -> impl Iterator { + self.nodes + .iter() + .map(move |n: &'a Node| (&n.ix, [n.x, n.y])) + } + + #[inline(always)] + pub fn add_force_collide(mut self, name: String, force: Collide) -> Self { + self.forces.insert(name, Force::Collide(force)); + self + } - &self.particles + #[inline(always)] + pub fn add_force_x(mut self, name: String, force: PositionX) -> Self { + self.forces.insert(name, Force::PositionX(force)); + self + } + + #[inline(always)] + pub fn add_force_y(mut self, name: String, force: PositionY) -> Self { + self.forces.insert(name, Force::PositionY(force)); + self + } +} + +impl From> for SimulationBuilder { + fn from(value: Simulation) -> Self { + Self { + alpha: value.alpha, + alpha_min: value.alpha_min, + alpha_decay: value.alpha_decay, + alpha_target: value.alpha_target, + velocity_decay: value.velocity_decay, + _random: value._random, + } } } diff --git a/examples/rust/graph_view/src/layout/dot.rs b/examples/rust/graph_view/src/layout/dot.rs deleted file mode 100644 index baff40d8fd09..000000000000 --- a/examples/rust/graph_view/src/layout/dot.rs +++ /dev/null @@ -1,110 +0,0 @@ -use std::collections::HashMap; - -use layout::{ - core::{ - base::Orientation, - format::{ClipHandle, RenderBackend}, - geometry::Point, - style::StyleAttr, - }, - std_shapes::shapes::{Arrow, Element, ShapeKind}, - topo::layout::VisualGraph, -}; -use re_viewer::external::egui; - -use crate::{error::Error, graph::NodeIndex}; - -#[derive(Debug, Default, PartialEq, Eq)] -pub struct DotLayout; - -impl DotLayout { - pub fn compute( - &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { - let mut handle_to_ix = HashMap::new(); - let mut ix_to_handle = HashMap::new(); - - let mut graph = VisualGraph::new(Orientation::TopToBottom); - - for (ix, size) in nodes { - let size = Point::new(size.x as f64, size.y as f64); - let handle = graph.add_node(Element::create( - ShapeKind::new_box("test"), - StyleAttr::simple(), - Orientation::LeftToRight, - size, - )); - handle_to_ix.insert(handle, ix.clone()); - ix_to_handle.insert(ix, handle); - } - - for (source_ix, target_ix) in directed { - let source = ix_to_handle.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - let target = ix_to_handle.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - graph.add_edge(Arrow::simple("test"), *source, *target); - } - - for (source_ix, target_ix) in undirected { - let source = ix_to_handle.get(&source_ix).ok_or(Error::EdgeUnknownNode)?; - let target = ix_to_handle.get(&target_ix).ok_or(Error::EdgeUnknownNode)?; - - // TODO(grtlr): find a better way other than adding duplicate edges. - graph.add_edge(Arrow::simple("test"), *source, *target); - graph.add_edge(Arrow::simple("test"), *target, *source); - } - - graph.do_it(false, false, false, &mut DummyBackend); - - let res = handle_to_ix - .into_iter() - .map(|(h, ix)| { - let (min, max) = graph.pos(h).bbox(false); - ( - ix, - egui::Rect::from_min_max( - egui::Pos2::new(min.x as f32, min.y as f32), - egui::Pos2::new(max.x as f32, max.y as f32), - ), - ) - }) - .collect(); - - Ok(res) - } -} - -struct DummyBackend; - -impl RenderBackend for DummyBackend { - fn draw_rect( - &mut self, - _xy: Point, - _size: Point, - _look: &StyleAttr, - _clip: Option, - ) { - } - - fn draw_line(&mut self, _start: Point, _stop: Point, _look: &StyleAttr) {} - - fn draw_circle(&mut self, _xy: Point, _size: Point, _look: &StyleAttr) {} - - fn draw_text(&mut self, _xy: Point, _text: &str, _look: &StyleAttr) {} - - fn draw_arrow( - &mut self, - _path: &[(Point, Point)], - _dashed: bool, - _head: (bool, bool), - _look: &StyleAttr, - _text: &str, - ) { - } - - fn create_clip(&mut self, _xy: Point, _size: Point, _rounded_px: usize) -> ClipHandle { - ClipHandle::default() - } -} diff --git a/examples/rust/graph_view/src/layout/force.rs b/examples/rust/graph_view/src/layout/force.rs deleted file mode 100644 index b5a569b55a2c..000000000000 --- a/examples/rust/graph_view/src/layout/force.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::collections::HashMap; - -use re_viewer::external::egui; - -use crate::{error::Error, graph::NodeIndex}; - -#[derive(Default, Debug, PartialEq, Eq)] -pub struct Force; - -impl Force { - pub fn compute( - &self, - nodes: impl IntoIterator, - ) -> Result, Error> { - let nodes = nodes.into_iter().collect::>(); - - let particles = vec![[0.0, 0.0]; nodes.len()]; - - let mut sim = re_force::Simulation::new(particles); - - let res = sim.tick(1_000); - - Ok(nodes - .into_iter() - .zip(res.iter()) - .map(|((node_id, _), particle)| { - let center = particle.pos; - let rect = egui::Rect::from_center_size(center, egui::Vec2::new(10.0, 10.0)); - (node_id, rect) - }) - .collect()) - } -} diff --git a/examples/rust/graph_view/src/layout/force_directed.rs b/examples/rust/graph_view/src/layout/force_directed.rs deleted file mode 100644 index df18813b3b8b..000000000000 --- a/examples/rust/graph_view/src/layout/force_directed.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::collections::HashMap; - -use fdg_sim::{self as fdg, ForceGraphHelper}; -use re_viewer::external::egui; - -use crate::{error::Error, graph::NodeIndex}; - -#[deprecated] -#[derive(Debug, Default, PartialEq, Eq)] -pub struct ForceBasedLayout; - -impl ForceBasedLayout { - pub fn compute( - &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { - let mut node_to_index = HashMap::new(); - let mut graph: fdg::ForceGraph<(NodeIndex, egui::Vec2), ()> = fdg::ForceGraph::default(); - - for (node_id, size) in nodes { - let ix = graph.add_force_node(format!("{node_id:?}"), (node_id.clone(), size)); - node_to_index.insert(node_id, ix); - } - - for (source, target) in directed.into_iter().chain(undirected) { - let source_ix = node_to_index.get(&source).ok_or(Error::EdgeUnknownNode)?; - let target_ix = node_to_index.get(&target).ok_or(Error::EdgeUnknownNode)?; - graph.add_edge(*source_ix, *target_ix, ()); - } - - // create a simulation from the graph - let mut simulation = - fdg::Simulation::from_graph(graph, fdg::SimulationParameters::default()); - - for _ in 0..1000 { - simulation.update(0.035); - } - - let res = simulation - .get_graph() - .node_weights() - .map(|fdg::Node { data, location, .. }| { - let (ix, size) = data; - let center = egui::Pos2::new(location.x, location.y); - let rect = egui::Rect::from_center_size(center, *size); - (ix.clone(), rect) - }) - .collect(); - - Ok(res) - } -} diff --git a/examples/rust/graph_view/src/layout/fruchterman.rs b/examples/rust/graph_view/src/layout/fruchterman.rs deleted file mode 100644 index 18c685f6741c..000000000000 --- a/examples/rust/graph_view/src/layout/fruchterman.rs +++ /dev/null @@ -1,71 +0,0 @@ -use std::{collections::HashMap, hash::BuildHasherDefault}; - -use fdg::{ - nalgebra::{Point2, SVector}, - Force, -}; -use rand::distributions::Distribution as _; -use re_viewer::external::egui; - -use crate::{error::Error, graph::NodeIndex}; - -#[derive(Debug, Default, PartialEq, Eq)] -pub struct FruchtermanReingoldLayout; - -impl FruchtermanReingoldLayout { - pub fn compute( - &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { - let mut node_to_index = HashMap::new(); - let mut graph: fdg::ForceGraph = - fdg::ForceGraph::default(); - - for (node_id, size) in nodes { - let dist = fdg::rand_distributions::Uniform::new(-10.0, 10.0); - - let ix = graph.add_node(( - (node_id.clone(), size), - Point2::new( - dist.sample(&mut rand::thread_rng()), - dist.sample(&mut rand::thread_rng()), - ), - )); - node_to_index.insert(node_id, ix); - } - - for (source, target) in directed.into_iter().chain(undirected) { - let source_ix = node_to_index.get(&source).ok_or(Error::EdgeUnknownNode)?; - let target_ix = node_to_index.get(&target).ok_or(Error::EdgeUnknownNode)?; - graph.add_edge(*source_ix, *target_ix, ()); - } - - // create a simulation from the graph - fdg::fruchterman_reingold::FruchtermanReingold::default().apply_many(&mut graph, 1000); - // Center the graph's average around (0,0). - fdg::simple::Center::default().apply_many(&mut graph, 100); - - let res = graph - .node_weights() - .map(|(data, pos)| { - let (ix, size) = data; - let center = egui::Pos2::new(pos.x, pos.y); - let rect = egui::Rect::from_center_size(center, *size); - (ix.clone(), rect) - }) - .collect(); - - Ok(res) - } -} - -struct Collide { - // TODO(grtlr): specify hash function - pub velocities: HashMap>, -} - -impl fdg::Force for Collide { - fn apply(&mut self, graph: &mut fdg::ForceGraph) {} -} diff --git a/examples/rust/graph_view/src/layout/mod.rs b/examples/rust/graph_view/src/layout/mod.rs deleted file mode 100644 index 3f2a9138675a..000000000000 --- a/examples/rust/graph_view/src/layout/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::collections::HashMap; - -use re_viewer::external::egui; - -use crate::{error::Error, graph::NodeIndex}; - -mod dot; -pub(crate) use dot::DotLayout; -mod force_directed; -pub(crate) use force_directed::ForceBasedLayout; -mod fruchterman; -pub(crate) use fruchterman::FruchtermanReingoldLayout; -mod force; -pub(crate) use force::Force; - -#[derive(Debug, PartialEq, Eq)] -pub(crate) enum LayoutProvider { - Dot(DotLayout), - ForceDirected(ForceBasedLayout), - FruchtermanReingold(FruchtermanReingoldLayout), - ReForce(Force), -} - -impl LayoutProvider { - pub(crate) fn new_dot() -> Self { - LayoutProvider::Dot(Default::default()) - } - - pub(crate) fn new_force_directed() -> Self { - LayoutProvider::ForceDirected(Default::default()) - } - - pub(crate) fn new_fruchterman_reingold() -> Self { - LayoutProvider::FruchtermanReingold(Default::default()) - } - - pub(crate) fn new_napkin() -> Self { - LayoutProvider::ReForce(Default::default()) - } -} - -impl LayoutProvider { - pub(crate) fn compute( - &self, - nodes: impl IntoIterator, - directed: impl IntoIterator, - undirected: impl IntoIterator, - ) -> Result, Error> { - match self { - LayoutProvider::Dot(layout) => layout.compute(nodes, directed, undirected), - LayoutProvider::ForceDirected(layout) => layout.compute(nodes, directed, undirected), - LayoutProvider::FruchtermanReingold(layout) => { - layout.compute(nodes, directed, undirected) - } - LayoutProvider::ReForce(layout) => layout.compute(nodes), - } - } -} - -impl Default for LayoutProvider { - fn default() -> Self { - LayoutProvider::new_napkin() - } -} diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs index 3bf3b383d2fb..dd65e1eee8d7 100644 --- a/examples/rust/graph_view/src/main.rs +++ b/examples/rust/graph_view/src/main.rs @@ -4,8 +4,6 @@ use re_viewer::external::{re_log, re_memory}; mod error; mod graph; -mod layout; -mod select; mod types; mod ui; mod view; diff --git a/examples/rust/graph_view/src/select.rs b/examples/rust/graph_view/src/select.rs deleted file mode 100644 index 4a1a9ea469c3..000000000000 --- a/examples/rust/graph_view/src/select.rs +++ /dev/null @@ -1,55 +0,0 @@ -use re_viewer::external::egui::{self, ahash::HashMap}; - -use crate::graph::NodeIndex; - -pub struct Layout { - nodes: HashMap, -} - -// TODO(grtlr): For now we use enumerate to get slight disturbances, in the future we should use a proper random distribution. -#[deprecated] -fn rect_from_index(i: usize) -> egui::Rect { - egui::Rect::from_center_size( - egui::Pos2::new(0.0 * i as f32, 0.0 * i as f32), - egui::Vec2::ZERO, - ) -} - -impl Layout { - pub fn select(&mut self, nodes: impl IntoIterator) { - self.nodes = nodes - .into_iter() - .enumerate() - .map(|(i, incoming)| match self.nodes.get_mut(&incoming) { - Some(rect) => (incoming, *rect), - None => (incoming, rect_from_index(i)), - }) - .collect(); - } - - pub fn extent(&self, ix: &NodeIndex) -> Option<&egui::Rect> { - self.nodes.get(ix) - } - - pub fn update(&mut self, ix: NodeIndex, extent: egui::Rect) -> Option { - self.nodes.insert(ix, extent) - } -} - -trait Drawable { - // Decorations don't influence the extent of an object an are not considered during a measurement path. - type Decoration; - - fn draw(&self, ui: &mut egui::Ui, decorations: Self::Decoration) -> egui::Response; -} - -impl Layout { - // fn update(&mut self, nodes: impl Iterator) { - // todo!(); - // // check if nodes have changed - // // * added node indexes - // // * removed node indexes - // // * current nodes -> need to remeasure first. - - // } -} diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index a057f4147725..6777031da51b 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use re_format::format_f32; use re_viewer::external::{egui, re_ui::UiExt, re_viewer_context::SpaceViewState}; -use crate::{graph::NodeIndex, layout::LayoutProvider}; +use crate::graph::NodeIndex; use super::{bounding_rect_from_iter, scene::ViewBuilder}; @@ -18,31 +18,30 @@ pub(crate) struct GraphSpaceViewState { pub should_fit_to_screen: bool, /// Positions of the nodes in world space. - pub layout: Option>, - pub layout_provider: LayoutProvider, + pub layout: HashMap, + + pub simulation: re_force::SimulationBuilder, } impl GraphSpaceViewState { pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { - if let Some(layout) = &self.layout { - ui.grid_left_hand_label("Bounding box") - .on_hover_text("The bounding box encompassing all Entities in the view right now"); - ui.vertical(|ui| { - ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(layout.values()) { - ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); - ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); - } - }); - ui.end_row(); - - if ui - .button("Fit to screen") - .on_hover_text("Fit the bounding box to the screen") - .clicked() - { - self.should_fit_to_screen = true; + ui.grid_left_hand_label("Bounding box") + .on_hover_text("The bounding box encompassing all Entities in the view right now"); + ui.vertical(|ui| { + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); + if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(self.layout.values()) { + ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); + ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); } + }); + ui.end_row(); + + if ui + .button("Fit to screen") + .on_hover_text("Fit the bounding box to the screen") + .clicked() + { + self.should_fit_to_screen = true; } } @@ -51,29 +50,6 @@ impl GraphSpaceViewState { .on_hover_text("Shows debug information for the current graph"); ui.end_row(); } - - pub fn layout_provider_ui(&mut self, ui: &mut egui::Ui) { - ui.horizontal(|ui| { - ui.label("Layout algorithm:"); - - let layout_options = [ - (LayoutProvider::new_napkin(), "ReForce"), - // (LayoutProvider::new_dot(), "Dot"), - // (LayoutProvider::new_force_directed(), "Force Directed"), - ( - LayoutProvider::new_fruchterman_reingold(), - "Fruchterman-Reingold", - ), - ]; - - for (l, t) in layout_options { - if ui.re_radio_value(&mut self.layout_provider, l, t).changed() { - self.layout = None - }; - } - }); - ui.end_row(); - } } impl SpaceViewState for GraphSpaceViewState { diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index e426e0ae333a..d9b8a551fc59 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -1,5 +1,7 @@ +use std::collections::HashSet; + use re_viewer::external::{ - egui, + egui::{self, Rect}, re_entity_db::InstancePath, re_log::external::log, re_log_types::EntityPath, @@ -93,7 +95,7 @@ impl SpaceViewClass for GraphSpaceView { ui.selection_grid("graph_settings_ui").show(ui, |ui| { state.bounding_box_ui(ui); state.debug_ui(ui); - state.layout_provider_ui(ui); + // state.layout_provider_ui(ui); }); Ok(()) @@ -129,38 +131,44 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; - let Some(layout) = &mut state.layout else { - let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); + // let Some(layout) = &mut state.layout else { + // let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); - let undirected = undirected_system - .data - .iter() - .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + // let undirected = undirected_system + // .data + // .iter() + // .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - let directed = directed_system - .data - .iter() - .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); + // let directed = directed_system + // .data + // .iter() + // .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - let layout = - state - .layout_provider - .compute(node_sizes.into_iter(), undirected, directed)?; + // let layout = + // state + // .layout_provider + // .compute(node_sizes.into_iter(), undirected, directed)?; - state.layout = Some(layout); + // state.layout = Some(layout); - state.should_fit_to_screen = true; + // state.should_fit_to_screen = true; - return Ok(()); - }; + // return Ok(()); + // }; - if graph - .all_nodes() - .any(|n| !layout.contains_key(&NodeIndex::from(&n))) - { - state.layout = None; - return Ok(()); - } + // if graph + // .all_nodes() + // .any(|n| !layout.contains_key(&NodeIndex::from(&n))) + // { + // state.layout = None; + // return Ok(()); + // } + + // We keep track of the nodes in the data to clean up the layout. + // TODO: once we settle on a design, it might make sense to create a + // `Layout` struct that keeps track of the layout and the nodes that + // get added and removed and cleans up automatically (guard pattern). + let mut seen: HashSet = HashSet::new(); state.viewer.scene(ui, |mut scene| { for data in node_system.data.iter() { @@ -170,10 +178,9 @@ impl SpaceViewClass for GraphSpaceView { let mut entity_rect: Option = None; for node in data.nodes() { - let index = NodeIndex::from(&node); - let current = layout - .get(&index) - .expect("missing layout information for node"); + let ix = NodeIndex::from(&node); + seen.insert(ix); + let current = state.layout.entry(ix).or_insert(egui::Rect::ZERO); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -185,7 +192,7 @@ impl SpaceViewClass for GraphSpaceView { Item::DataResult(query.space_view_id, instance), ); - layout.insert(index, response.rect); + *current = response.rect; entity_rect = entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); } @@ -199,37 +206,32 @@ impl SpaceViewClass for GraphSpaceView { } for dummy in graph.unknown_nodes() { - let index = NodeIndex::from(&dummy); - let current = layout - .get(&index) - .expect("missing layout information for dummy node"); + let ix = NodeIndex::from(&dummy); + seen.insert(ix); + let current = state.layout.entry(ix).or_insert(Rect::ZERO); let response = scene.node(current.min, |ui| ui::draw_dummy(ui, &dummy)); - layout.insert(index, response.rect); + *current = response.rect; } for data in undirected_system.data.iter() { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - let source_ix = NodeIndex::from(edge.source); - let target_ix = NodeIndex::from(edge.target); - let source_pos = layout - .get(&source_ix) - .expect("missing layout information for edge source node"); - let target_pos = layout - .get(&target_ix) - .expect("missing layout information for edge target node"); - - let _response = scene.edge(|ui| { - ui::draw_edge( - ui, - edge.color, - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - false, - ) - }); + if let (Some(source_pos), Some(target_pos)) = ( + state.layout.get(&edge.source.into()), + state.layout.get(&edge.target.into()), + ) { + scene.edge(|ui| { + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + false, + ) + }); + }; } } @@ -238,35 +240,56 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - let source_ix = NodeIndex::from(edge.source); - let target_ix = NodeIndex::from(edge.target); - let source_pos = layout - .get(&source_ix) - .expect("missing layout information for edge source node"); - let target_pos = layout - .get(&target_ix) - .expect("missing layout information for edge target node"); - - let _response = scene.edge(|ui| { - ui::draw_edge( - ui, - edge.color, - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - true, - ) - }); + if let (Some(source_pos), Some(target_pos)) = ( + state.layout.get(&edge.source.into()), + state.layout.get(&edge.target.into()), + ) { + let _response = scene.edge(|ui| { + ui::draw_edge( + ui, + edge.color, + source_pos, + target_pos, + ent_highlight.index_highlight(edge.instance), + true, + ) + }); + } } } }); // TODO(grtlr): consider improving this! - if state.should_fit_to_screen { - state.viewer.fit_to_screen(); - state.should_fit_to_screen = false; + // if state.should_fit_to_screen { + // state.viewer.fit_to_screen(); + // state.should_fit_to_screen = false; + // } + + // Clean up the layout for nodes that are no longer present. + state.layout.retain(|k, _| seen.contains(k)); + + let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); + + let mut sim = state + .simulation + .build(pos) + .add_force_collide("collide".to_string(), Default::default()) + .add_force_x("x".to_string(), Default::default()) + .add_force_y("y".to_string(), Default::default()); + + sim.tick(1); + + for (ix, pos) in sim.positions() { + state.layout.get_mut(ix).unwrap().set_center(pos.into()) } + state.simulation = sim.into(); + + // TODO(grtlr): come up with a good heuristic of when to do this. + state.viewer.fit_to_screen(); + + // TODO(grtlr): only do this while the simulation makes sense! + ui.ctx().request_repaint(); Ok(()) } } From 898afc636906ae7671c2463a0a45c64ba37a1e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 11:15:57 +0200 Subject: [PATCH 080/159] WIP: before improving `link` force --- crates/utils/re_force/src/collide.rs | 10 +- crates/utils/re_force/src/func.rs | 29 ++++ crates/utils/re_force/src/jiggle.rs | 2 + crates/utils/re_force/src/lib.rs | 5 + crates/utils/re_force/src/link.rs | 143 ++++++++++++++++++ crates/utils/re_force/src/many_body.rs | 72 +++++++++ crates/utils/re_force/src/node.rs | 8 +- crates/utils/re_force/src/position.rs | 4 +- crates/utils/re_force/src/simulation.rs | 40 +++-- examples/rust/graph_view/src/graph/mod.rs | 6 +- examples/rust/graph_view/src/view.rs | 11 +- .../node_link_graph/src/examples/disjoint.rs | 2 +- .../node_link_graph/src/examples/lattice.rs | 37 +++++ .../rust/node_link_graph/src/examples/mod.rs | 1 + examples/rust/node_link_graph/src/main.rs | 2 + 15 files changed, 347 insertions(+), 25 deletions(-) create mode 100644 crates/utils/re_force/src/func.rs create mode 100644 crates/utils/re_force/src/link.rs create mode 100644 crates/utils/re_force/src/many_body.rs create mode 100644 examples/rust/node_link_graph/src/examples/lattice.rs diff --git a/crates/utils/re_force/src/collide.rs b/crates/utils/re_force/src/collide.rs index 2f998a9005f4..bc64c19bca6b 100644 --- a/crates/utils/re_force/src/collide.rs +++ b/crates/utils/re_force/src/collide.rs @@ -22,15 +22,15 @@ impl Default for Collide { impl Collide { // TODO: speed up using quadtree - pub fn force(&mut self, particles: &mut [Node]) { + pub fn force(&mut self, nodes: &mut [Node]) { // TODO: make this configurable - let radii: Vec<_> = (0..particles.len()).map(|_| 10.0).collect(); + let radii: Vec<_> = (0..nodes.len()).map(|_| 10.0).collect(); - debug_assert!(radii.len() == particles.len()); + debug_assert!(radii.len() == nodes.len()); for _ in 0..self.iterations { - for s in 0..particles.len() { - let (left, right) = particles.split_at_mut(s); + for s in 0..nodes.len() { + let (left, right) = nodes.split_at_mut(s); for (i, node) in left.iter_mut().enumerate() { let ri = radii[i]; diff --git a/crates/utils/re_force/src/func.rs b/crates/utils/re_force/src/func.rs new file mode 100644 index 000000000000..d6f000a1702f --- /dev/null +++ b/crates/utils/re_force/src/func.rs @@ -0,0 +1,29 @@ +use std::hash::Hash; + +#[repr(transparent)] +pub struct DistanceFn(pub Box f32>); + +impl From for DistanceFn { + #[inline(always)] + fn from(value: f32) -> Self { + Self(Box::new(move |_, _| value)) + } +} + +#[repr(transparent)] +pub struct StrengthFn(pub Box f32>); + +impl From for StrengthFn { + #[inline(always)] + fn from(value: f32) -> Self { + Self(Box::new(move |_, _| value)) + } +} + +#[inline(always)] +pub fn constant(value: f32) -> F +where + F: From, +{ + value.into() +} diff --git a/crates/utils/re_force/src/jiggle.rs b/crates/utils/re_force/src/jiggle.rs index 25514040ea42..740a8833326c 100644 --- a/crates/utils/re_force/src/jiggle.rs +++ b/crates/utils/re_force/src/jiggle.rs @@ -1,5 +1,7 @@ use rand::Rng; +// TODO(grtlr): refactor this to be optional + pub fn jiggle(rng: &mut R) -> f32 { (rng.gen::() - 0.5) * 1e-6 } diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs index acbe253b7be2..7132933b00f4 100644 --- a/crates/utils/re_force/src/lib.rs +++ b/crates/utils/re_force/src/lib.rs @@ -1,8 +1,13 @@ mod collide; mod jiggle; mod lcg; +mod link; mod node; mod position; mod simulation; +mod many_body; +mod func; pub use simulation::{Simulation, SimulationBuilder}; + +pub use link::LinkBuilder; diff --git a/crates/utils/re_force/src/link.rs b/crates/utils/re_force/src/link.rs new file mode 100644 index 000000000000..cee26d475b1e --- /dev/null +++ b/crates/utils/re_force/src/link.rs @@ -0,0 +1,143 @@ +use std::{collections::HashMap, hash::Hash}; + +use rand::thread_rng; + +use crate::{ + func::{constant, DistanceFn, StrengthFn}, + jiggle::jiggle, + node::Node, +}; + +pub struct LinkBuilder { + links: Vec<(Ix, Ix)>, + distance: DistanceFn, + strength: StrengthFn, + strengths: Vec, + iterations: usize, +} + +impl LinkBuilder { + pub fn new(links: Vec<(Ix, Ix)>) -> Self { + Self { + links, + distance: constant(20.0), + strength: constant(1.0), + strengths: Vec::new(), + iterations: 1, + } + } + + pub fn with_iterations(mut self, iterations: usize) -> Self { + self.iterations = iterations; + self + } + + pub fn initialize(&self, nodes: &[Node]) -> Link { + Link::new(nodes, self.links.clone()) + } + + // fn initialize_strengths(&self, nodes: &[Node]) -> Vec { + // nodes + // .iter() + // .enumerate() + // .map(|(i, node)| self.strength.0(&node.ix, i)) + // .collect() + // } +} + +#[derive(Debug)] +pub struct Link { + links: Vec<(Ix, Ix)>, + node_by_id: HashMap, + + // TODO(grtlr): These two are arrays in d3. + count: HashMap, + bias: HashMap<(Ix, Ix), f32>, + + // TODO(grtlr): In `d3`, the following fields are computed using variable functions. For now we just use defaults. + strengths: Vec, + + distances: Vec, + + iterations: usize, +} + +impl Link { + pub fn new(nodes: &[Node], links: Vec<(Ix, Ix)>) -> Self { + let node_by_id = nodes + .iter() + .enumerate() + .map(|(arr_ix, node)| (node.ix.clone(), arr_ix)) + .collect::>(); + + let mut count = HashMap::new(); + for link in &links { + *count.entry(link.0.clone()).or_insert(0) += 1; + *count.entry(link.1.clone()).or_insert(0) += 1; + } + + let bias = links + .iter() + .cloned() + .map(|link| { + ( + link.clone(), + count[&link.0] as f32 / (count[&link.0] + count[&link.1]) as f32, + ) + }) + .collect(); + + // TODO(grtlr): For now we only implement the `defaultStrength` function. + let strengths = links + .iter() + .map(|link| 1.0 / usize::min(count[&link.0], count[&link.1]) as f32) + .collect(); + + // TODO(grtlr): Move this to the builder + let mut distance: DistanceFn = constant(30.0); + let distances = links + .iter() + .enumerate() + .map(|(i, edge)| distance.0(edge, i)) + .collect(); + + Self { + links, + node_by_id, + count, + bias, + strengths, + distances, + iterations: 1, + } + } + + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { + for (i, link) in self.links.iter().enumerate() { + let (source, target) = link; + let (source, target) = ( + &nodes[self.node_by_id[source]], + &nodes[self.node_by_id[target]], + ); + + let mut x = target.x + target.vx - source.x - source.vx; + if x == 0.0 { + x = jiggle(&mut thread_rng()); + } + let mut y = target.y + target.vy - source.y - source.vy; + if y == 0.0 { + y = jiggle(&mut thread_rng()); + } + let l = x.hypot(y); + let l = (l - self.distances[i]) / l * self.strengths[i] * alpha; + + let bx = self.bias[&(source.ix.clone(), target.ix.clone())]; + let by = 1.0 - bx; + + nodes[self.node_by_id[&link.0]].vx += x * l * bx; + nodes[self.node_by_id[&link.0]].vy += y * l * bx; + nodes[self.node_by_id[&link.1]].vx -= x * l * by; + nodes[self.node_by_id[&link.1]].vy -= y * l * by; + } + } +} diff --git a/crates/utils/re_force/src/many_body.rs b/crates/utils/re_force/src/many_body.rs new file mode 100644 index 000000000000..2d151740bcd8 --- /dev/null +++ b/crates/utils/re_force/src/many_body.rs @@ -0,0 +1,72 @@ +use rand::thread_rng; + +use crate::{ + func::{constant, StrengthFn}, + jiggle::jiggle, + node::Node, +}; +use std::hash::Hash; + +pub struct ManyBodyBuilder { + strength: StrengthFn, +} + +impl Default for ManyBodyBuilder { + fn default() -> Self { + Self { + strength: constant(-30.0), + } + } +} + +impl ManyBodyBuilder { + pub fn initialize(mut self, nodes: &[Node]) -> ManyBody { + let strengths = nodes + .iter() + .enumerate() + .map(|(i, node)| self.strength.0(&node.ix, i)) + .collect(); + + ManyBody { + strengths, + theta_2: 0.81, + } + } +} + +pub struct ManyBody { + strengths: Vec, + theta_2: f32, +} + +impl ManyBody { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { + // TODO(grtlr): accerlerate with quadtree + barnes hut. + for s in 0..nodes.len() { + let (left, right) = nodes.split_at_mut(s); + + for (i, node) in left.iter_mut().enumerate() { + for (j, data) in right.iter_mut().enumerate() { + let mut x = node.x - data.x; + let mut y = node.y - data.y; + let mut l = x * x + y * y; + if x == 0.0 { + x = jiggle(&mut thread_rng()); + l += x * x; + } + + if y == 0.0 { + y = jiggle(&mut thread_rng()); + l += y * y; + } + + let l = l.sqrt(); + let w = self.strengths[s + j] * alpha / l; + + node.vx += x * w; + node.vy += y * w; + } + } + } + } +} diff --git a/crates/utils/re_force/src/node.rs b/crates/utils/re_force/src/node.rs index 9fdd9f132b78..8145698c4558 100644 --- a/crates/utils/re_force/src/node.rs +++ b/crates/utils/re_force/src/node.rs @@ -3,7 +3,7 @@ use std::hash::Hash; // TODO(grtlr): Control memory layout. #[derive(Debug)] -pub(crate) struct Node { +pub struct Node { pub x: f32, pub y: f32, pub vx: f32, @@ -15,7 +15,7 @@ pub(crate) struct Node { pub fy: Option, } -impl Node { +impl Node { pub fn new(ix: Ix, x: f32, y: f32) -> Self { Self { x, @@ -60,13 +60,13 @@ impl Node { } } -impl From> for [f32; 2] { +impl From> for [f32; 2] { fn from(p: Node) -> Self { [p.x, p.y] } } -impl From<(Ix, [f32; 2])> for Node { +impl From<(Ix, [f32; 2])> for Node { fn from((ix, p): (Ix, [f32; 2])) -> Self { Self::new(ix, p[0], p[1]) } diff --git a/crates/utils/re_force/src/position.rs b/crates/utils/re_force/src/position.rs index 27e063fafde1..6a2617242bd5 100644 --- a/crates/utils/re_force/src/position.rs +++ b/crates/utils/re_force/src/position.rs @@ -17,7 +17,7 @@ impl Default for PositionX { } impl PositionX { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { let strengths = std::iter::repeat(self.strength); for (node, si) in nodes.iter_mut().zip(strengths) { @@ -43,7 +43,7 @@ impl Default for PositionY { } impl PositionY { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { let strengths = std::iter::repeat(self.strength); for (node, si) in nodes.iter_mut().zip(strengths) { diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs index abb73d0e0d04..3504b0c60d51 100644 --- a/crates/utils/re_force/src/simulation.rs +++ b/crates/utils/re_force/src/simulation.rs @@ -4,15 +4,18 @@ use std::hash::Hash; use crate::{ collide::Collide, lcg::LCG, + many_body::{ManyBody, ManyBodyBuilder}, node::Node, position::{PositionX, PositionY}, + LinkBuilder, }; -#[derive(Clone, Debug)] -enum Force { +enum Force { Collide(Collide), PositionX(PositionX), PositionY(PositionY), + Link(LinkBuilder), + ManyBody(ManyBody), } #[derive(Debug)] @@ -46,7 +49,7 @@ impl SimulationBuilder { pub fn build(&self, nodes: impl IntoIterator) -> Simulation where P: Into<[f32; 2]>, - Ix: Hash + Eq, + Ix: Hash + Eq + Clone, { let nodes = nodes.into_iter().map(|(ix, p)| { let p = p.into(); @@ -66,11 +69,9 @@ impl SimulationBuilder { } } -#[derive(Debug)] - pub struct Simulation where - Ix: Hash + Eq, + Ix: Hash + Eq + Clone, { alpha: f32, alpha_min: f32, @@ -78,12 +79,12 @@ where alpha_target: f32, velocity_decay: f32, _random: LCG, - forces: HashMap, + forces: HashMap>, nodes: Vec>, } // TODO(grtlr): Could simulation be an iterator? -impl Simulation { +impl Simulation { pub fn step(&mut self) { while self.alpha < self.alpha_min { self.tick(1); @@ -99,6 +100,14 @@ impl Simulation { Force::Collide(c) => c.force(&mut self.nodes), Force::PositionX(p) => p.force(self.alpha, &mut self.nodes), Force::PositionY(p) => p.force(self.alpha, &mut self.nodes), + Force::Link(l) => { + // TODO(grtlr): don't rebuild the forces on every run, separate the build and run steps instead. + l.initialize(&self.nodes).force(self.alpha, &mut self.nodes); + } + Force::ManyBody(m) => { + // TODO(grtlr): don't rebuild the forces on every run, separate the build and run steps instead. + m.force(self.alpha, &mut self.nodes); + } } } @@ -131,9 +140,22 @@ impl Simulation { self.forces.insert(name, Force::PositionY(force)); self } + + #[inline(always)] + pub fn add_force_link(mut self, name: String, force: LinkBuilder) -> Self { + self.forces.insert(name, Force::Link(force)); + self + } + + #[inline(always)] + pub fn add_force_many_body(mut self, name: String, builder: ManyBodyBuilder) -> Self { + let force = builder.initialize(&self.nodes); + self.forces.insert(name, Force::ManyBody(force)); + self + } } -impl From> for SimulationBuilder { +impl From> for SimulationBuilder { fn from(value: Simulation) -> Self { Self { alpha: value.alpha, diff --git a/examples/rust/graph_view/src/graph/mod.rs b/examples/rust/graph_view/src/graph/mod.rs index ff91197bc469..c78c8af799f6 100644 --- a/examples/rust/graph_view/src/graph/mod.rs +++ b/examples/rust/graph_view/src/graph/mod.rs @@ -109,8 +109,10 @@ impl<'a> Graph<'a> { self.undirected.iter() } - pub fn edges(&self) -> impl Iterator { - self.undirected.iter().flat_map(|entity| entity.edges()) + pub fn all_edges(&self) -> impl Iterator { + let undirected = self.undirected.iter().flat_map(|entity| entity.edges()); + let directed = self.directed.iter().flat_map(|entity| entity.edges()); + undirected.chain(directed) } pub fn unknown_nodes(&'a self) -> impl Iterator> { diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index d9b8a551fc59..182f988593f6 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -1,5 +1,6 @@ use std::collections::HashSet; +use re_force::LinkBuilder; use re_viewer::external::{ egui::{self, Rect}, re_entity_db::InstancePath, @@ -269,13 +270,19 @@ impl SpaceViewClass for GraphSpaceView { state.layout.retain(|k, _| seen.contains(k)); let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); + let links = graph + .all_edges() + .map(|e| (e.source.into(), e.target.into())) + .collect(); let mut sim = state .simulation .build(pos) .add_force_collide("collide".to_string(), Default::default()) .add_force_x("x".to_string(), Default::default()) - .add_force_y("y".to_string(), Default::default()); + .add_force_y("y".to_string(), Default::default()) + .add_force_link("link".to_string(), LinkBuilder::new(links)) + .add_force_many_body("many_body".to_string(), Default::default()); sim.tick(1); @@ -286,7 +293,7 @@ impl SpaceViewClass for GraphSpaceView { state.simulation = sim.into(); // TODO(grtlr): come up with a good heuristic of when to do this. - state.viewer.fit_to_screen(); + // state.viewer.fit_to_screen(); // TODO(grtlr): only do this while the simulation makes sense! ui.ctx().request_repaint(); diff --git a/examples/rust/node_link_graph/src/examples/disjoint.rs b/examples/rust/node_link_graph/src/examples/disjoint.rs index fc269f97ba1e..28ccb2bf76a7 100644 --- a/examples/rust/node_link_graph/src/examples/disjoint.rs +++ b/examples/rust/node_link_graph/src/examples/disjoint.rs @@ -3,7 +3,7 @@ use rerun::GraphNodes; use crate::Args; pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { - let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_simple")?; + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_disjoint")?; let nodes = (0..num_nodes) .map(|i| format!("node{}", i)) diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link_graph/src/examples/lattice.rs new file mode 100644 index 000000000000..a295e0d749ed --- /dev/null +++ b/examples/rust/node_link_graph/src/examples/lattice.rs @@ -0,0 +1,37 @@ +use core::num; + +use itertools::Itertools; + +use rerun::{GraphEdgesUndirected, GraphNodes}; + +use crate::Args; + +pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_lattice")?; + + let coordinates = (0..num_nodes).cartesian_product(0..num_nodes); + + let nodes = coordinates + .clone() + .enumerate() + .map(|(i, _)| i.to_string()) + .collect::>(); + rec.log_static("/nodes", &GraphNodes::new(nodes))?; + + let mut edges = Vec::new(); + for (x, y) in coordinates { + if y > 0 { + let source = (y - 1) * num_nodes + x; + let target = y * num_nodes + x; + edges.push(("/nodes", source.to_string(), target.to_string())); + } + if x > 0 { + let source = y * num_nodes + (x - 1); + let target = y * num_nodes + x; + edges.push(("/nodes", source.to_string(), target.to_string())); + } + } + + rec.log_static("/edges", &GraphEdgesUndirected::new(edges))?; + Ok(()) +} diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs index b3d105db08bc..582de63936fe 100644 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -1,3 +1,4 @@ pub mod disjoint; pub mod simple; pub mod social; +pub mod lattice; diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 808e945f38bc..f9c7263327e7 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -15,6 +15,7 @@ enum Example { Simple, Social, Disjoint, + Lattice, } impl Example { @@ -23,6 +24,7 @@ impl Example { Example::Simple => examples::simple::run(args), Example::Social => examples::social::run(args), Example::Disjoint => examples::disjoint::run(args, 20), + Example::Lattice => examples::lattice::run(args, 20), } } } From e60b06f5c6012080ffd73aee240b1b8808d3da07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 11:16:24 +0200 Subject: [PATCH 081/159] WIP: fmt --- crates/utils/re_force/src/lib.rs | 4 ++-- examples/rust/node_link_graph/src/examples/mod.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs index 7132933b00f4..93cb870178f7 100644 --- a/crates/utils/re_force/src/lib.rs +++ b/crates/utils/re_force/src/lib.rs @@ -1,12 +1,12 @@ mod collide; +mod func; mod jiggle; mod lcg; mod link; +mod many_body; mod node; mod position; mod simulation; -mod many_body; -mod func; pub use simulation::{Simulation, SimulationBuilder}; diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs index 582de63936fe..18b4f95543db 100644 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -1,4 +1,4 @@ pub mod disjoint; +pub mod lattice; pub mod simple; pub mod social; -pub mod lattice; From 6c9f32757e1be57fcaacd1ce91495143c6ad53fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 12:14:34 +0200 Subject: [PATCH 082/159] WIP: improve forces --- crates/utils/re_force/src/func.rs | 20 +++- crates/utils/re_force/src/link.rs | 152 ++++++++++++------------ crates/utils/re_force/src/many_body.rs | 45 ++++--- crates/utils/re_force/src/simulation.rs | 19 ++- examples/rust/graph_view/src/view.rs | 11 +- 5 files changed, 138 insertions(+), 109 deletions(-) diff --git a/crates/utils/re_force/src/func.rs b/crates/utils/re_force/src/func.rs index d6f000a1702f..1a7f3ede91b5 100644 --- a/crates/utils/re_force/src/func.rs +++ b/crates/utils/re_force/src/func.rs @@ -1,9 +1,15 @@ use std::hash::Hash; #[repr(transparent)] -pub struct DistanceFn(pub Box f32>); +pub struct LinkFn(pub Box f32>); -impl From for DistanceFn { +impl LinkFn { + pub(crate) fn apply(&mut self, (i, link): (usize, &(Ix, Ix))) -> f32 { + self.0(link, i) + } +} + +impl From for LinkFn { #[inline(always)] fn from(value: f32) -> Self { Self(Box::new(move |_, _| value)) @@ -11,9 +17,15 @@ impl From for DistanceFn { } #[repr(transparent)] -pub struct StrengthFn(pub Box f32>); +pub struct NodeFn(pub Box f32>); + +impl NodeFn { + pub(crate) fn apply(&mut self, (i, node): (usize, &Ix)) -> f32 { + self.0(node, i) + } +} -impl From for StrengthFn { +impl From for NodeFn { #[inline(always)] fn from(value: f32) -> Self { Self(Box::new(move |_, _| value)) diff --git a/crates/utils/re_force/src/link.rs b/crates/utils/re_force/src/link.rs index cee26d475b1e..eb66c22aae2a 100644 --- a/crates/utils/re_force/src/link.rs +++ b/crates/utils/re_force/src/link.rs @@ -3,16 +3,16 @@ use std::{collections::HashMap, hash::Hash}; use rand::thread_rng; use crate::{ - func::{constant, DistanceFn, StrengthFn}, + func::{constant, LinkFn}, jiggle::jiggle, node::Node, }; pub struct LinkBuilder { links: Vec<(Ix, Ix)>, - distance: DistanceFn, - strength: StrengthFn, + strength: Option>, strengths: Vec, + distance: LinkFn, iterations: usize, } @@ -20,10 +20,14 @@ impl LinkBuilder { pub fn new(links: Vec<(Ix, Ix)>) -> Self { Self { links, + // TODO(grtlr): Change this back distance: constant(20.0), - strength: constant(1.0), + // TODO(grtlr): Change this back to `None` to match `d3`. + strength: Some(constant(1.0)), strengths: Vec::new(), - iterations: 1, + + // TODO(grtlr): Return this back to 1 + iterations: 20, } } @@ -32,51 +36,26 @@ impl LinkBuilder { self } - pub fn initialize(&self, nodes: &[Node]) -> Link { - Link::new(nodes, self.links.clone()) - } - - // fn initialize_strengths(&self, nodes: &[Node]) -> Vec { - // nodes - // .iter() - // .enumerate() - // .map(|(i, node)| self.strength.0(&node.ix, i)) - // .collect() - // } -} - -#[derive(Debug)] -pub struct Link { - links: Vec<(Ix, Ix)>, - node_by_id: HashMap, - - // TODO(grtlr): These two are arrays in d3. - count: HashMap, - bias: HashMap<(Ix, Ix), f32>, - - // TODO(grtlr): In `d3`, the following fields are computed using variable functions. For now we just use defaults. - strengths: Vec, - - distances: Vec, - - iterations: usize, -} + pub fn initialize(mut self, nodes: &[Node]) -> Option> { + if nodes.is_empty() { + return None; + } -impl Link { - pub fn new(nodes: &[Node], links: Vec<(Ix, Ix)>) -> Self { let node_by_id = nodes .iter() .enumerate() .map(|(arr_ix, node)| (node.ix.clone(), arr_ix)) .collect::>(); + // TODO(grtlr): This is in array d3. let mut count = HashMap::new(); - for link in &links { + for link in &self.links { *count.entry(link.0.clone()).or_insert(0) += 1; *count.entry(link.1.clone()).or_insert(0) += 1; } - let bias = links + let bias = self + .links .iter() .cloned() .map(|link| { @@ -87,57 +66,82 @@ impl Link { }) .collect(); - // TODO(grtlr): For now we only implement the `defaultStrength` function. - let strengths = links + let strengths = self + .links .iter() - .map(|link| 1.0 / usize::min(count[&link.0], count[&link.1]) as f32) + .enumerate() + .map(|(i, link)| { + if let Some(strength) = &mut self.strength { + strength.0(&link, i) + } else { + 1.0 / usize::min(count[&link.0], count[&link.1]) as f32 + } + }) .collect(); - // TODO(grtlr): Move this to the builder - let mut distance: DistanceFn = constant(30.0); - let distances = links + let distances = self + .links .iter() .enumerate() - .map(|(i, edge)| distance.0(edge, i)) + .map(|link| self.distance.apply(link)) .collect(); - Self { - links, + Some(Link { + links: self.links, node_by_id, - count, bias, strengths, distances, - iterations: 1, - } + iterations: self.iterations, + }) } +} - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { - for (i, link) in self.links.iter().enumerate() { - let (source, target) = link; - let (source, target) = ( - &nodes[self.node_by_id[source]], - &nodes[self.node_by_id[target]], - ); - - let mut x = target.x + target.vx - source.x - source.vx; - if x == 0.0 { - x = jiggle(&mut thread_rng()); - } - let mut y = target.y + target.vy - source.y - source.vy; - if y == 0.0 { - y = jiggle(&mut thread_rng()); - } - let l = x.hypot(y); - let l = (l - self.distances[i]) / l * self.strengths[i] * alpha; +#[derive(Debug)] +pub struct Link { + links: Vec<(Ix, Ix)>, + node_by_id: HashMap, - let bx = self.bias[&(source.ix.clone(), target.ix.clone())]; - let by = 1.0 - bx; + // TODO(grtlr): This is in array d3. + bias: HashMap<(Ix, Ix), f32>, - nodes[self.node_by_id[&link.0]].vx += x * l * bx; - nodes[self.node_by_id[&link.0]].vy += y * l * bx; - nodes[self.node_by_id[&link.1]].vx -= x * l * by; - nodes[self.node_by_id[&link.1]].vy -= y * l * by; + // TODO(grtlr): In `d3`, the following fields are computed using variable functions. For now we just use defaults. + strengths: Vec, + + distances: Vec, + + iterations: usize, +} + +impl Link { + pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { + for _ in 0..self.iterations { + for (i, link) in self.links.iter().enumerate() { + let (source, target) = link; + let (source, target) = ( + &nodes[self.node_by_id[source]], + &nodes[self.node_by_id[target]], + ); + + let mut x = target.x + target.vx - source.x - source.vx; + if x == 0.0 { + x = jiggle(&mut thread_rng()); + } + let mut y = target.y + target.vy - source.y - source.vy; + if y == 0.0 { + y = jiggle(&mut thread_rng()); + } + let l = x.hypot(y); + let l = (l - self.distances[i]) / l * self.strengths[i] * alpha; + + let bx = self.bias[&(source.ix.clone(), target.ix.clone())]; + let by = 1.0 - bx; + + nodes[self.node_by_id[&link.0]].vx += x * l * bx; + nodes[self.node_by_id[&link.0]].vy += y * l * bx; + nodes[self.node_by_id[&link.1]].vx -= x * l * by; + nodes[self.node_by_id[&link.1]].vy -= y * l * by; + } } } } diff --git a/crates/utils/re_force/src/many_body.rs b/crates/utils/re_force/src/many_body.rs index 2d151740bcd8..854e01d21f3d 100644 --- a/crates/utils/re_force/src/many_body.rs +++ b/crates/utils/re_force/src/many_body.rs @@ -1,20 +1,25 @@ use rand::thread_rng; use crate::{ - func::{constant, StrengthFn}, + func::{constant, NodeFn}, jiggle::jiggle, node::Node, }; +use core::f32; use std::hash::Hash; pub struct ManyBodyBuilder { - strength: StrengthFn, + strength: NodeFn, + distance_min_2: f32, + distance_max_2: f32, } impl Default for ManyBodyBuilder { fn default() -> Self { Self { strength: constant(-30.0), + distance_min_2: 1.0, + distance_max_2: f32::INFINITY, } } } @@ -29,14 +34,16 @@ impl ManyBodyBuilder { ManyBody { strengths, - theta_2: 0.81, + distance_min_2: self.distance_min_2, + distance_max_2: self.distance_max_2, } } } pub struct ManyBody { strengths: Vec, - theta_2: f32, + distance_min_2: f32, + distance_max_2: f32, } impl ManyBody { @@ -50,21 +57,27 @@ impl ManyBody { let mut x = node.x - data.x; let mut y = node.y - data.y; let mut l = x * x + y * y; - if x == 0.0 { - x = jiggle(&mut thread_rng()); - l += x * x; - } - if y == 0.0 { - y = jiggle(&mut thread_rng()); - l += y * y; - } + if l < self.distance_max_2 { + if x == 0.0 { + x = jiggle(&mut thread_rng()); + l += x * x; + } + + if y == 0.0 { + y = jiggle(&mut thread_rng()); + l += y * y; + } - let l = l.sqrt(); - let w = self.strengths[s + j] * alpha / l; + if l < self.distance_min_2 { + l = (self.distance_min_2 * l).sqrt(); + } + + let w = self.strengths[s + j] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } - node.vx += x * w; - node.vy += y * w; } } } diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs index 3504b0c60d51..5dfa3f67960b 100644 --- a/crates/utils/re_force/src/simulation.rs +++ b/crates/utils/re_force/src/simulation.rs @@ -4,6 +4,7 @@ use std::hash::Hash; use crate::{ collide::Collide, lcg::LCG, + link::Link, many_body::{ManyBody, ManyBodyBuilder}, node::Node, position::{PositionX, PositionY}, @@ -14,7 +15,7 @@ enum Force { Collide(Collide), PositionX(PositionX), PositionY(PositionY), - Link(LinkBuilder), + Link(Link), ManyBody(ManyBody), } @@ -100,14 +101,8 @@ impl Simulation { Force::Collide(c) => c.force(&mut self.nodes), Force::PositionX(p) => p.force(self.alpha, &mut self.nodes), Force::PositionY(p) => p.force(self.alpha, &mut self.nodes), - Force::Link(l) => { - // TODO(grtlr): don't rebuild the forces on every run, separate the build and run steps instead. - l.initialize(&self.nodes).force(self.alpha, &mut self.nodes); - } - Force::ManyBody(m) => { - // TODO(grtlr): don't rebuild the forces on every run, separate the build and run steps instead. - m.force(self.alpha, &mut self.nodes); - } + Force::Link(l) => l.force(self.alpha, &mut self.nodes), + Force::ManyBody(m) => m.force(self.alpha, &mut self.nodes), } } @@ -142,8 +137,10 @@ impl Simulation { } #[inline(always)] - pub fn add_force_link(mut self, name: String, force: LinkBuilder) -> Self { - self.forces.insert(name, Force::Link(force)); + pub fn add_force_link(mut self, name: String, builder: LinkBuilder) -> Self { + if let Some(force) = builder.initialize(&self.nodes) { + self.forces.insert(name, Force::Link(force)); + } self } diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 182f988593f6..4bb9ca515bbd 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -278,9 +278,9 @@ impl SpaceViewClass for GraphSpaceView { let mut sim = state .simulation .build(pos) - .add_force_collide("collide".to_string(), Default::default()) - .add_force_x("x".to_string(), Default::default()) - .add_force_y("y".to_string(), Default::default()) + // .add_force_collide("collide".to_string(), Default::default()) + // .add_force_x("x".to_string(), Default::default()) + // .add_force_y("y".to_string(), Default::default()) .add_force_link("link".to_string(), LinkBuilder::new(links)) .add_force_many_body("many_body".to_string(), Default::default()); @@ -293,7 +293,10 @@ impl SpaceViewClass for GraphSpaceView { state.simulation = sim.into(); // TODO(grtlr): come up with a good heuristic of when to do this. - // state.viewer.fit_to_screen(); + if state.should_fit_to_screen { + state.viewer.fit_to_screen(); + state.should_fit_to_screen = false; + } // TODO(grtlr): only do this while the simulation makes sense! ui.ctx().request_repaint(); From 8685be0a60afa205fd02d3910589f6884b45f075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 13:52:11 +0200 Subject: [PATCH 083/159] WIP: improve simulation flow --- crates/utils/re_force/src/link.rs | 6 ++--- crates/utils/re_force/src/many_body.rs | 1 - crates/utils/re_force/src/simulation.rs | 4 +++ examples/rust/graph_view/src/ui/state.rs | 13 +++++++++- examples/rust/graph_view/src/view.rs | 32 ++++++++++++------------ 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/crates/utils/re_force/src/link.rs b/crates/utils/re_force/src/link.rs index eb66c22aae2a..bf770c75a1a7 100644 --- a/crates/utils/re_force/src/link.rs +++ b/crates/utils/re_force/src/link.rs @@ -11,7 +11,6 @@ use crate::{ pub struct LinkBuilder { links: Vec<(Ix, Ix)>, strength: Option>, - strengths: Vec, distance: LinkFn, iterations: usize, } @@ -24,7 +23,6 @@ impl LinkBuilder { distance: constant(20.0), // TODO(grtlr): Change this back to `None` to match `d3`. strength: Some(constant(1.0)), - strengths: Vec::new(), // TODO(grtlr): Return this back to 1 iterations: 20, @@ -47,7 +45,7 @@ impl LinkBuilder { .map(|(arr_ix, node)| (node.ix.clone(), arr_ix)) .collect::>(); - // TODO(grtlr): This is in array d3. + // TODO(grtlr): This is in array d3. let mut count = HashMap::new(); for link in &self.links { *count.entry(link.0.clone()).or_insert(0) += 1; @@ -72,7 +70,7 @@ impl LinkBuilder { .enumerate() .map(|(i, link)| { if let Some(strength) = &mut self.strength { - strength.0(&link, i) + strength.0(link, i) } else { 1.0 / usize::min(count[&link.0], count[&link.1]) as f32 } diff --git a/crates/utils/re_force/src/many_body.rs b/crates/utils/re_force/src/many_body.rs index 854e01d21f3d..39ddd296a48c 100644 --- a/crates/utils/re_force/src/many_body.rs +++ b/crates/utils/re_force/src/many_body.rs @@ -77,7 +77,6 @@ impl ManyBody { node.vx += x * w; node.vy += y * w; } - } } } diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs index 5dfa3f67960b..a33c5f2dc848 100644 --- a/crates/utils/re_force/src/simulation.rs +++ b/crates/utils/re_force/src/simulation.rs @@ -92,6 +92,10 @@ impl Simulation { } } + pub fn finished(&self) -> bool { + self.alpha < self.alpha_min + } + pub fn tick(&mut self, iterations: usize) { for _ in 0..iterations { self.alpha += (self.alpha_target - self.alpha) * self.alpha_decay; diff --git a/examples/rust/graph_view/src/ui/state.rs b/examples/rust/graph_view/src/ui/state.rs index 6777031da51b..53d527b23313 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/examples/rust/graph_view/src/ui/state.rs @@ -16,11 +16,12 @@ pub(crate) struct GraphSpaceViewState { /// Indicates if the viewer should fit to the screen the next time it is rendered. pub should_fit_to_screen: bool, + pub should_tick: bool, /// Positions of the nodes in world space. pub layout: HashMap, - pub simulation: re_force::SimulationBuilder, + pub simulation: Option>, } impl GraphSpaceViewState { @@ -50,6 +51,16 @@ impl GraphSpaceViewState { .on_hover_text("Shows debug information for the current graph"); ui.end_row(); } + + pub fn simulation_ui(&mut self, ui: &mut egui::Ui) { + ui.grid_left_hand_label("Simulation") + .on_hover_text("Control the simulation of the graph layout"); + if ui.button("Tick").clicked() { + self.should_tick = true; + } + + ui.end_row(); + } } impl SpaceViewState for GraphSpaceViewState { diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 4bb9ca515bbd..3b80b6241a92 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -96,7 +96,7 @@ impl SpaceViewClass for GraphSpaceView { ui.selection_grid("graph_settings_ui").show(ui, |ui| { state.bounding_box_ui(ui); state.debug_ui(ui); - // state.layout_provider_ui(ui); + state.simulation_ui(ui); }); Ok(()) @@ -275,31 +275,31 @@ impl SpaceViewClass for GraphSpaceView { .map(|e| (e.source.into(), e.target.into())) .collect(); - let mut sim = state - .simulation - .build(pos) - // .add_force_collide("collide".to_string(), Default::default()) - // .add_force_x("x".to_string(), Default::default()) - // .add_force_y("y".to_string(), Default::default()) - .add_force_link("link".to_string(), LinkBuilder::new(links)) - .add_force_many_body("many_body".to_string(), Default::default()); + let simulation = state.simulation.get_or_insert_with(|| { + re_force::SimulationBuilder::default() + .build(pos) + // .add_force_collide("collide".to_string(), Default::default()) + // .add_force_x("x".to_string(), Default::default()) + // .add_force_y("y".to_string(), Default::default()) + .add_force_link("link".to_string(), LinkBuilder::new(links)) + // .add_force_many_body("many_body".to_string(), Default::default()) + }); - sim.tick(1); + if state.should_tick { + simulation.tick(1); + state.should_tick = false; - for (ix, pos) in sim.positions() { - state.layout.get_mut(ix).unwrap().set_center(pos.into()) + for (ix, pos) in simulation.positions() { + state.layout.get_mut(ix).unwrap().set_center(pos.into()) + } } - state.simulation = sim.into(); - // TODO(grtlr): come up with a good heuristic of when to do this. if state.should_fit_to_screen { state.viewer.fit_to_screen(); state.should_fit_to_screen = false; } - // TODO(grtlr): only do this while the simulation makes sense! - ui.ctx().request_repaint(); Ok(()) } } From b919f178d41a8c10de23e61481c039f505ff38fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 15:47:03 +0200 Subject: [PATCH 084/159] WIP: improve example --- .../rust/node_link_graph/src/examples/lattice.rs | 16 +++++++++------- examples/rust/node_link_graph/src/main.rs | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link_graph/src/examples/lattice.rs index a295e0d749ed..36dd80b3769c 100644 --- a/examples/rust/node_link_graph/src/examples/lattice.rs +++ b/examples/rust/node_link_graph/src/examples/lattice.rs @@ -1,8 +1,6 @@ -use core::num; - use itertools::Itertools; -use rerun::{GraphEdgesUndirected, GraphNodes}; +use rerun::{Color, GraphEdgesUndirected, GraphNodes}; use crate::Args; @@ -11,12 +9,16 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { let coordinates = (0..num_nodes).cartesian_product(0..num_nodes); - let nodes = coordinates + let (nodes, colors): (Vec<_>, Vec<_>) = coordinates .clone() .enumerate() - .map(|(i, _)| i.to_string()) - .collect::>(); - rec.log_static("/nodes", &GraphNodes::new(nodes))?; + .map(|(i, (x, y))| { + let r = ((x as f32 / (num_nodes - 1) as f32) * 255.0).round() as u8; + let g = ((y as f32 / (num_nodes - 1) as f32) * 255.0).round() as u8; + (i.to_string(), Color::from_rgb(r, g, 0)) + }) + .unzip(); + rec.log_static("/nodes", &GraphNodes::new(nodes).with_colors(colors))?; let mut edges = Vec::new(); for (x, y) in coordinates { diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index f9c7263327e7..fe95373978a1 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -24,7 +24,7 @@ impl Example { Example::Simple => examples::simple::run(args), Example::Social => examples::social::run(args), Example::Disjoint => examples::disjoint::run(args, 20), - Example::Lattice => examples::lattice::run(args, 20), + Example::Lattice => examples::lattice::run(args, 10), } } } From 9c7e02176eb344fdba67254a7d3515e2ec9984d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 18 Oct 2024 17:45:27 +0200 Subject: [PATCH 085/159] WIP: start implementing quadtree --- crates/utils/re_force/src/collide.rs | 25 --- crates/utils/re_force/src/lib.rs | 1 + crates/utils/re_force/src/quadtree/mod.rs | 145 ++++++++++++++++++ .../utils/re_force/src/quadtree/position.rs | 48 ++++++ crates/utils/re_force/src/simulation.rs | 17 -- examples/rust/graph_view/src/view.rs | 2 +- 6 files changed, 195 insertions(+), 43 deletions(-) create mode 100644 crates/utils/re_force/src/quadtree/mod.rs create mode 100644 crates/utils/re_force/src/quadtree/position.rs diff --git a/crates/utils/re_force/src/collide.rs b/crates/utils/re_force/src/collide.rs index bc64c19bca6b..162d0cdc8d9b 100644 --- a/crates/utils/re_force/src/collide.rs +++ b/crates/utils/re_force/src/collide.rs @@ -73,28 +73,3 @@ impl Collide { } } } - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn resolve_all_coincide() { - let mut particles = std::iter::repeat(Node { - pos: Pos2::ZERO, - vel: Vec2::ZERO, - }) - .take(5) - .collect::>(); - - let mut collide = Collide::default(); - - collide.force(&mut particles); - - assert_ne!(particles[0].vel, Vec2::ZERO); - assert_ne!(particles[1].vel, Vec2::ZERO); - assert_ne!(particles[2].vel, Vec2::ZERO); - assert_ne!(particles[3].vel, Vec2::ZERO); - assert_ne!(particles[4].vel, Vec2::ZERO); - } -} diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs index 93cb870178f7..7742115ed682 100644 --- a/crates/utils/re_force/src/lib.rs +++ b/crates/utils/re_force/src/lib.rs @@ -7,6 +7,7 @@ mod many_body; mod node; mod position; mod simulation; +mod quadtree; pub use simulation::{Simulation, SimulationBuilder}; diff --git a/crates/utils/re_force/src/quadtree/mod.rs b/crates/utils/re_force/src/quadtree/mod.rs new file mode 100644 index 000000000000..9ce258c29797 --- /dev/null +++ b/crates/utils/re_force/src/quadtree/mod.rs @@ -0,0 +1,145 @@ +mod position; +pub use position::Position; + +#[derive(Debug)] +pub enum Node { + Leaf { data: T }, + Internal { children: [Option>>; 4] }, +} + +#[derive(Debug)] +pub struct Quadtree { + x0: f32, + y0: f32, + x1: f32, + y1: f32, + root: Option>>, +} + +impl Default for Quadtree { + fn default() -> Self { + Self { + x0: f32::NAN, + y0: f32::NAN, + x1: f32::NAN, + y1: f32::NAN, + root: None, + } + } +} + +impl Quadtree { + pub fn with_nodes(nodes: &[T]) -> Self { + let tree = Self { + x0: f32::NAN, + y0: f32::NAN, + x1: f32::NAN, + y1: f32::NAN, + root: None, + }; + + if nodes.is_empty() { + return tree; + } + + // tree.add_all(nodes); + + tree + } + + pub fn cover(&mut self, value: &impl Position) { + let x = value.x(); + let y = value.y(); + + debug_assert!(!f32::is_nan(x)); + debug_assert!(!f32::is_nan(y)); + + if f32::is_nan(self.x0) { + self.x0 = x.floor(); + self.x1 = self.x0 + 1.0; + self.y0 = y.floor(); + self.y1 = self.y0 + 1.0; + } else { + // Otherwise, double repeatedly to cover. + let mut z = if (self.x1 - self.x0).is_sign_positive() { + 1.0 + } else { + 0.0 + }; + + while self.x0 > x || x >= self.x1 || self.y0 > y || y >= self.y1 { + let i = ((y < self.y0) as usize) << 1 | ((x < self.x0) as usize); + let mut children = [None, None, None, None]; + children[i] = self.root.take(); + self.root = Some(Box::new(Node::Internal { children })); + z *= 2.0; + match i { + 0 => { + self.x1 = self.x0 + z; + self.y1 = self.y0 + z; + } + 1 => { + self.x0 = self.x1 - z; + self.y1 = self.y0 + z; + } + 2 => { + self.x1 = self.x0 + z; + self.y0 = self.y1 - z; + } + 3 => { + self.x0 = self.x1 - z; + self.y0 = self.y1 - z; + } + _ => unreachable!(), + } + } + } + } + + pub fn add(mut self, value: T) -> Self { + self.cover(&value); + + if self.root.is_none() { + self.root = Some(Box::new(Node::Leaf { data: value })); + return self; + } + + todo!(); + + self + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn cover() { + let mut tree = Quadtree::<[f32; 2]>::default(); + assert!(tree.x0.is_nan()); + + tree.cover(&[0.5, 0.5]); + assert_eq!(tree.x0, 0.0); + assert_eq!(tree.y0, 0.0); + assert_eq!(tree.x1, 1.0); + assert_eq!(tree.y1, 1.0); + + tree.cover(&[1.5, 1.5]); + assert_eq!(tree.x0, 0.0); + assert_eq!(tree.y0, 0.0); + assert_eq!(tree.x1, 2.0); + assert_eq!(tree.y1, 2.0); + } + + #[test] + fn add() { + let tree = Quadtree::<[f32; 2]>::default().add([0.5, 0.5]); + assert_eq!(tree.x0, 0.0); + assert_eq!(tree.y0, 0.0); + assert_eq!(tree.x1, 1.0); + assert_eq!(tree.y1, 1.0); + + // TODO: test adding more nodes when we have a getter. + } +} diff --git a/crates/utils/re_force/src/quadtree/position.rs b/crates/utils/re_force/src/quadtree/position.rs new file mode 100644 index 000000000000..d962bf20e5d9 --- /dev/null +++ b/crates/utils/re_force/src/quadtree/position.rs @@ -0,0 +1,48 @@ +pub trait Position { + fn x(&self) -> f32; + fn y(&self) -> f32; +} + +impl Position for [f32; 2] { + #[inline(always)] + fn x(&self) -> f32 { + self[0] + } + #[inline(always)] + fn y(&self) -> f32 { + self[1] + } +} + +impl Position for &[f32; 2] { + #[inline(always)] + fn x(&self) -> f32 { + self[0] + } + #[inline(always)] + fn y(&self) -> f32 { + self[1] + } +} + +impl Position for (f32, f32) { + #[inline(always)] + fn x(&self) -> f32 { + self.0 + } + #[inline(always)] + fn y(&self) -> f32 { + self.1 + } +} + +impl Position for &(f32, f32) { + #[inline(always)] + fn x(&self) -> f32 { + self.0 + } + #[inline(always)] + fn y(&self) -> f32 { + self.1 + } +} diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs index a33c5f2dc848..848c9c9643c1 100644 --- a/crates/utils/re_force/src/simulation.rs +++ b/crates/utils/re_force/src/simulation.rs @@ -168,20 +168,3 @@ impl From> for SimulationBuilder { } } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn simulation_tick() { - let particles = [[0.0f32, 1.0], [0.0, -1.0]]; - - let mut simulation = Simulation::new(particles); - let particles = simulation.tick(1000000); - - assert_ne!(particles[0].pos, particles[1].pos); - assert_eq!(particles[0].pos.x, 0.0); - assert_eq!(particles[1].pos.x, 0.0); - } -} diff --git a/examples/rust/graph_view/src/view.rs b/examples/rust/graph_view/src/view.rs index 3b80b6241a92..a7d171ca300d 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/examples/rust/graph_view/src/view.rs @@ -282,7 +282,7 @@ impl SpaceViewClass for GraphSpaceView { // .add_force_x("x".to_string(), Default::default()) // .add_force_y("y".to_string(), Default::default()) .add_force_link("link".to_string(), LinkBuilder::new(links)) - // .add_force_many_body("many_body".to_string(), Default::default()) + .add_force_many_body("many_body".to_string(), Default::default()) }); if state.should_tick { From eb09bfbc4a2fa6bcaa6bd4a35cdbdb34183b6f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 09:48:51 +0200 Subject: [PATCH 086/159] WIP: fix cover --- crates/utils/re_force/src/quadtree/add.rs | 311 ++++++++++++++++ crates/utils/re_force/src/quadtree/cover.rs | 346 ++++++++++++++++++ crates/utils/re_force/src/quadtree/indexer.rs | 89 +++++ crates/utils/re_force/src/quadtree/mod.rs | 188 +++++----- crates/utils/re_force/src/quadtree/quad.rs | 6 + 5 files changed, 842 insertions(+), 98 deletions(-) create mode 100644 crates/utils/re_force/src/quadtree/add.rs create mode 100644 crates/utils/re_force/src/quadtree/cover.rs create mode 100644 crates/utils/re_force/src/quadtree/indexer.rs create mode 100644 crates/utils/re_force/src/quadtree/quad.rs diff --git a/crates/utils/re_force/src/quadtree/add.rs b/crates/utils/re_force/src/quadtree/add.rs new file mode 100644 index 000000000000..8f37e59d4948 --- /dev/null +++ b/crates/utils/re_force/src/quadtree/add.rs @@ -0,0 +1,311 @@ +use super::{indexer::Indexer, LeafNode, Node, Position, Quadtree}; + +#[inline(always)] +fn leaf(value: T) -> Box> { + Box::new(Node::Leaf(LeafNode::new(value))) +} + +impl Quadtree

{ + pub fn add(&mut self, value: P) { + self.cover(&value); + + let node = self.root.as_mut(); + + let Some(mut node) = node else { + self.root = Some(leaf(value)); + return; + }; + + let x = value.x(); + let y = value.y(); + let mut ix = Indexer::with_extent([self.x0, self.y0], [self.x1, self.y1]); + + loop { + match node.as_mut() { + Node::Internal(ref mut parent) => { + let i = ix.get_and_descend(x, y); + if let Some(ref mut n) = parent[i] { + node = n; + } else { + parent[i] = Some(leaf(value)); + return; + } + } + // The new point coincides with the existing point. + Node::Leaf(ref mut leaf) if x == leaf.data.x() && y == leaf.data.y() => { + let xp = leaf.data.x(); + let yp = leaf.data.y(); + + if (x == xp) && (y == yp) { + leaf.insert(value); + return; + } + + return; + } + old_leaf @ Node::Leaf(_) => { + let inner = + std::mem::replace(old_leaf, Node::Internal([None, None, None, None])); + if let Node::Leaf(inner) = inner { + let xp = inner.data.x(); + let yp = inner.data.y(); + + let mut new_internal = old_leaf; + + loop { + let Node::Internal(ref mut parent) = new_internal else { + unreachable!() + }; + + let j = ix.get(xp, yp); + let i = ix.get_and_descend(x, y); + + debug_assert!(i < 4); + debug_assert!(j < 4); + + if i != j { + parent[i] = Some(leaf(value)); + parent[j] = Some(Box::new(Node::Leaf(inner))); + return; + } + + parent[i] = Some(Box::new(Node::Internal([None, None, None, None]))); + new_internal = parent[i].as_mut().unwrap(); + } + } + unreachable!() + } + } + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn creates_a_new_point_and_adds_it_to_the_quadtree() { + let mut q = Quadtree::default(); + + q.add([0., 0.]); + assert_eq!(q.root().unwrap().leaf().unwrap().data, [0., 0.]); + + q.add([0.9, 0.9]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.9], + .. + })), + ] + )); + + q.add([0.9, 0.0]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.], + .. + })), + None, + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.9], + .. + })), + ] + )); + + q.add([0., 0.9]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [0.0, 0.9], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.9], + .. + })), + ] + )); + + q.add([0.4, 0.4]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Internal(_)), + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [0.0, 0.9], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [0.9, 0.9], + .. + })), + ] + )); + assert!(matches!( + q.root().unwrap().children().unwrap()[0].unwrap().children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [0.4, 0.4], .. })), + ]) + )); + + } + + #[test] + fn handles_points_being_on_the_perimeter_of_the_quadtree_bounds() { + let mut q = Quadtree::with_extent([0., 0.], [1., 1.]); + q.add([0., 0.]); + assert!(matches!(q.root(), Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })))); + + q.add([1.,1.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { + data: [0., 0.], + .. + })), + None, + None, + Some(&Node::Leaf(LeafNode { + data: [1., 1.], + .. + })), + ] + )); + + q.add([1.,0.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { + data: [0., 0.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [1., 0.], + .. + })), + None, + Some(&Node::Leaf(LeafNode { + data: [1., 1.], + .. + })), + ] + )); + + q.add([0.,1.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { + data: [0., 0.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [1., 0.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [0., 1.], + .. + })), + Some(&Node::Leaf(LeafNode { + data: [1., 1.], + .. + })), + ] + )); + } + + #[test] + fn handles_points_being_to_the_left_of_quadtree_bounds() { + let mut q = Quadtree::with_extent([0., 0.], [2., 2.]); + q.add([-1., 1.]); + assert_eq!(dbg!(q).extent(), ([-4., 0.], [4., 8.])); + } + + #[test] + fn handles_coincident_points_by_creating_linked_list() { + let mut q = Quadtree::with_extent([0., 0.], [1., 1.]); + q.add([0., 0.]); + assert!(matches!( + q.root().unwrap(), + &Node::Leaf(LeafNode { data: [0., 0.], .. }) + )); + + q.add([1., 0.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), + None, + None, + ] + )); + + q.add([0., 1.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), + None, + ] + )); + + q.add([0., 1.]); + assert!(matches!( + q.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), + None, + ] + )); + assert_eq!( + q.root().unwrap().children().unwrap()[2] + .unwrap() + .leaf() + .unwrap() + .iter() + .collect::>(), + vec![&[0., 1.], &[0., 1.]], + ) + } + + #[test] + fn trivial_bounds_for_first_point() { + let mut q = Quadtree::default(); + q.add([1.0, 2.0]); + assert_eq!(q.extent(), ([1.0, 2.0], [2.0, 3.0])); + assert!( + matches!(q.root().unwrap(), Node::Leaf(leaf) if leaf.data.x() == 1.0 && leaf.data.y() == 2.0) + ); + } +} diff --git a/crates/utils/re_force/src/quadtree/cover.rs b/crates/utils/re_force/src/quadtree/cover.rs new file mode 100644 index 000000000000..8323926ed221 --- /dev/null +++ b/crates/utils/re_force/src/quadtree/cover.rs @@ -0,0 +1,346 @@ +use crate::node; + +use super::{Node, Position, Quadtree}; + +impl Quadtree { + pub fn cover(&mut self, value: &T) { + let x = value.x(); + let y = value.y(); + + assert!(!f32::is_nan(x), "Encountered NaN value for x"); + assert!(!f32::is_nan(y), "Encountered NaN value for y"); + + let mut x0 = self.x0; + let mut y0 = self.y0; + let mut x1 = self.x1; + let mut y1 = self.y1; + + if f32::is_nan(x0) { + x0 = x.floor(); + x1 = x0 + 1.0; + y0 = y.floor(); + y1 = y0 + 1.0; + } else { + // Otherwise, double repeatedly to cover. + let mut z = if (x1 - x0).is_sign_positive() { + (x1 - x0) + } else { + 1.0 + }; + + let node = if matches!(self.root(), Some(&Node::Internal(_))) { + &mut self.root + } else { + &mut None + }; + + while x0 > x || x >= x1 || y0 > y || y >= y1 { + let i = ((y < y0) as usize) << 1 | ((x < x0) as usize); + + let mut parent = [None, None, None, None]; + parent[i] = node.take(); + *node = Some(Box::new(Node::Internal(parent))); + + z *= 2.0; + match i { + 0 => { + x1 = x0 + z; + y1 = y0 + z; + } + 1 => { + x0 = x1 - z; + y1 = y0 + z; + } + 2 => { + x1 = x0 + z; + y0 = y1 - z; + } + 3 => { + x0 = x1 - z; + y0 = y1 - z; + } + _ => unreachable!(), + } + } + } + + self.x0 = x0; + self.y0 = y0; + self.x1 = x1; + self.y1 = y1; + } +} + +#[cfg(test)] +mod test { + use crate::quadtree::LeafNode; + + use super::*; + + #[test] + fn sets_a_trivial_extent_if_the_extent_was_undefined() { + let mut q = Quadtree::<[f32; 2]>::default(); + q.cover(&[1., 2.]); + assert_eq!(q.extent(), ([1., 2.], [2., 3.])); + } + + #[test] + fn sets_a_non_trivial_squarified_and_centered_extent_if_the_extent_was_trivial() { + let mut q = Quadtree::<[f32; 2]>::default(); + q.cover(&[0., 0.]); + q.cover(&[1., 2.]); + assert_eq!(q.extent(), ([0., 0.], [4., 4.])); + } + + #[test] + #[should_panic(expected = "Encountered NaN value for x")] + fn ignores_panics_on_invalid_points() { + let mut q = Quadtree::<[f32; 2]>::default(); + q.cover(&[0., 0.]); + q.cover(&[f32::NAN, 2.]); + } + + #[test] + fn repeatedly_doubles_the_existing_extent_if_the_extent_was_non_trivial() { + fn cover_multiple(q: &mut Quadtree<[f32; 2]>, ps: &[[f32; 2]]) { + for p in ps { + q.cover(p); + } + } + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., -1.]]); + assert_eq!(q.extent(), ([-4., -4.], [4., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [1., -1.]]); + assert_eq!(q.extent(), ([0., -4.], [8., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., -1.]]); + assert_eq!(q.extent(), ([0., -4.], [8., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 1.]]); + assert_eq!(q.extent(), ([0., 0.], [4., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 3.]]); + assert_eq!(q.extent(), ([0., 0.], [4., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [1., 3.]]); + assert_eq!(q.extent(), ([0., 0.], [4., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., 3.]]); + assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., 1.]]); + assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., -3.]]); + assert_eq!(q.extent(), ([-4., -4.], [4., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., -3.]]); + assert_eq!(q.extent(), ([0., -4.], [8., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., -3.]]); + assert_eq!(q.extent(), ([0., -4.], [8., 4.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., 3.]]); + assert_eq!(q.extent(), ([0., 0.], [8., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., 5.]]); + assert_eq!(q.extent(), ([0., 0.], [8., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 5.]]); + assert_eq!(q.extent(), ([0., 0.], [8., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., 5.]]); + assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); + + let mut q = Quadtree::<[f32; 2]>::default(); + cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., 3.]]); + assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); + } + + #[test] + fn repeatedly_wraps_the_root_node_if_it_has_children() { + let mut q = Quadtree::<[f32; 2]>::default(); + q.add([0., 0.]); + q.add([2., 2.]); + + let mut tmp = q.clone(); + tmp.cover(&[3., 3.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap(), + [ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ] + )); + + let mut tmp = q.clone(); + tmp.cover(&[-1., 3.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[1] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[3., -1.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[2] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[-1., -1.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[3] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[5., 5.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[0] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[-3., 5.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[1] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[5., -3.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[2] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + + let mut tmp = q.clone(); + tmp.cover(&[-3., -3.]); + assert!(matches!( + tmp.root().unwrap().children().unwrap()[3] + .unwrap() + .children(), + Some([ + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + None, + None, + Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), + ]) + )); + } + + #[test] + fn does_not_wrap_root_node_if_it_is_a_leaf() { + fn test_point<'a>(mut q: Quadtree<[f32; 2]>, p: [f32; 2]) { + q.cover(&p); + assert!(matches!( + q.root(), + Some(Node::Leaf(LeafNode { data: [2., 2.], .. })) + )); + } + + let mut q = Quadtree::<[f32; 2]>::default(); + q.cover(&[0., 0.]); + q.add([2., 2.]); + assert!(matches!( + q.root(), + Some(Node::Leaf(LeafNode { data: [2., 2.], .. })) + )); + test_point(q.clone(), [3., 3.]); + test_point(q.clone(), [-1., 3.]); + test_point(q.clone(), [3., -1.]); + test_point(q.clone(), [-1., -1.]); + test_point(q.clone(), [5., 5.]); + test_point(q.clone(), [-3., 5.]); + test_point(q.clone(), [5., -3.]); + test_point(q.clone(), [-3., -3.]); + } + + #[test] + fn does_not_wrap_root_node_if_it_is_undefined() { + fn cover_root(mut q: Quadtree<[f32; 2]>, p: [f32; 2]) -> Option>> { + q.cover(&p); + q.root + } + + let mut q = Quadtree::<[f32; 2]>::default(); + q.cover(&[0., 0.]); + q.cover(&[2., 2.]); + assert!(q.root().is_none()); + assert_eq!(cover_root(q.clone(), [3., 3.]), None); + assert_eq!(cover_root(q.clone(), [-1., 3.]), None); + assert_eq!(cover_root(q.clone(), [3., -1.]), None); + assert_eq!(cover_root(q.clone(), [-1., -1.]), None); + assert_eq!(cover_root(q.clone(), [5., 5.]), None); + assert_eq!(cover_root(q.clone(), [-3., 5.]), None); + assert_eq!(cover_root(q.clone(), [5., -3.]), None); + assert_eq!(cover_root(q.clone(), [-3., -3.]), None); + } + + #[test] + fn does_not_crash_on_huge_values() { + let mut q = Quadtree::<[f32; 2]>::default(); + q.add([1e23, 0.]); + } +} diff --git a/crates/utils/re_force/src/quadtree/indexer.rs b/crates/utils/re_force/src/quadtree/indexer.rs new file mode 100644 index 000000000000..21be3f5f1af5 --- /dev/null +++ b/crates/utils/re_force/src/quadtree/indexer.rs @@ -0,0 +1,89 @@ +#[derive(Debug)] +pub struct Indexer { + x0: f32, + y0: f32, + x1: f32, + y1: f32, + xm: f32, + ym: f32, +} + +impl Indexer { + #[inline(always)] + pub fn with_extent(min: [f32; 2], max: [f32; 2]) -> Self { + Self { + x0: min[0], + y0: min[1], + x1: max[0], + y1: max[1], + xm: (min[0] + max[0]) / 2.0, + ym: (min[1] + max[1]) / 2.0, + } + } + + #[inline(always)] + pub fn extent(&self) -> ([f32; 2], [f32; 2]) { + ([self.x0, self.y0], [self.x1, self.y1]) + } + + #[inline(always)] + pub fn get(&self, x: f32, y: f32) -> usize { + let right = x >= self.xm; + let bottom = y >= self.ym; + (bottom as usize) << 1 | right as usize + } + + #[inline(always)] + pub fn get_and_descend(&mut self, x: f32, y: f32) -> usize { + let right = if x >= self.xm { + self.x0 = self.xm; + true + } else { + self.x1 = self.xm; + false + }; + + let bottom = if y >= self.ym { + self.y0 = self.ym; + true + } else { + self.y1 = self.ym; + false + }; + + self.xm = (self.x0 + self.x1) / 2.0; + self.ym = (self.y0 + self.y1) / 2.0; + + (bottom as usize) << 1 | right as usize + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn simple_indexation() { + let ix = Indexer::with_extent([0.0, 0.0], [1.0, 1.0]); + assert_eq!(ix.get(0.1, 0.1), 0); + assert_eq!(ix.get(0.9, 0.1), 1); + assert_eq!(ix.get(0.1, 0.9), 2); + assert_eq!(ix.get(0.9, 0.9), 3); + } + + #[test] + fn nested_indexation() { + let mut ix = Indexer::with_extent([0.0, 0.0], [1.0, 1.0]); + assert_eq!(ix.get(0.1, 0.1), 0); + assert_eq!(ix.get(0.9, 0.1), 1); + assert_eq!(ix.get(0.1, 0.9), 2); + assert_eq!(ix.get(0.9, 0.9), 3); + assert_eq!(ix.get(0.4, 0.4), 0); + assert_eq!(ix.get_and_descend(0.4, 0.4), 0); + assert_eq!(ix.extent(), ([0.0, 0.0], [0.5, 0.5])); + assert_eq!(ix.xm, 0.25); + assert_eq!(ix.ym, 0.25); + assert_eq!(ix.get(0.1, 0.1), 0); + assert_eq!(ix.get(0.4, 0.4), 3); + } +} diff --git a/crates/utils/re_force/src/quadtree/mod.rs b/crates/utils/re_force/src/quadtree/mod.rs index 9ce258c29797..e2b697e92177 100644 --- a/crates/utils/re_force/src/quadtree/mod.rs +++ b/crates/utils/re_force/src/quadtree/mod.rs @@ -1,13 +1,83 @@ +mod add; +mod cover; +mod indexer; mod position; + pub use position::Position; -#[derive(Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] +struct LeafNode { + data: T, + next: Option>>, +} + +impl<'a, T: Position> LeafNode { + fn new(data: T) -> Self { + Self { data, next: None } + } + + fn insert(&mut self, data: T) { + let mut node = self; + loop { + match node.next { + Some(ref mut next) => { + node = next; + } + None => { + node.next = Some(Box::new(LeafNode::new(data))); + return; + } + } + } + } + + fn iter(&self) -> impl Iterator { + LeafListIterator { next: Some(self) } + } +} + +struct LeafListIterator<'a, T: Position> { + next: Option<&'a LeafNode>, +} + +impl<'a, T: Position> Iterator for LeafListIterator<'a, T> { + type Item = &'a T; + + fn next(&mut self) -> Option { + let next = self.next; + self.next = next.and_then(|node| node.next.as_deref()); + next.map(|node| &node.data) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Node { - Leaf { data: T }, - Internal { children: [Option>>; 4] }, + Leaf(LeafNode), + Internal([Option>>; 4]), } -#[derive(Debug)] +impl Node { + fn leaf(&self) -> Option<&LeafNode> { + match self { + Node::Leaf(leaf) => Some(leaf), + _ => None, + } + } + + fn children(&self) -> Option<[Option<&Node>; 4]> { + match self { + Node::Leaf(_) => None, + Node::Internal(children) => Some([ + children[0].as_deref(), + children[1].as_deref(), + children[2].as_deref(), + children[3].as_deref(), + ]), + } + } +} + +#[derive(Clone, Debug, PartialEq)] pub struct Quadtree { x0: f32, y0: f32, @@ -28,8 +98,18 @@ impl Default for Quadtree { } } -impl Quadtree { - pub fn with_nodes(nodes: &[T]) -> Self { +impl Quadtree

{ + pub fn with_extent(min: [f32; 2], max: [f32; 2]) -> Self { + Self { + x0: min[0], + y0: min[1], + x1: max[0], + y1: max[1], + root: None, + } + } + + pub fn from_nodes(nodes: &[P]) -> Self { let tree = Self { x0: f32::NAN, y0: f32::NAN, @@ -47,99 +127,11 @@ impl Quadtree { tree } - pub fn cover(&mut self, value: &impl Position) { - let x = value.x(); - let y = value.y(); - - debug_assert!(!f32::is_nan(x)); - debug_assert!(!f32::is_nan(y)); - - if f32::is_nan(self.x0) { - self.x0 = x.floor(); - self.x1 = self.x0 + 1.0; - self.y0 = y.floor(); - self.y1 = self.y0 + 1.0; - } else { - // Otherwise, double repeatedly to cover. - let mut z = if (self.x1 - self.x0).is_sign_positive() { - 1.0 - } else { - 0.0 - }; - - while self.x0 > x || x >= self.x1 || self.y0 > y || y >= self.y1 { - let i = ((y < self.y0) as usize) << 1 | ((x < self.x0) as usize); - let mut children = [None, None, None, None]; - children[i] = self.root.take(); - self.root = Some(Box::new(Node::Internal { children })); - z *= 2.0; - match i { - 0 => { - self.x1 = self.x0 + z; - self.y1 = self.y0 + z; - } - 1 => { - self.x0 = self.x1 - z; - self.y1 = self.y0 + z; - } - 2 => { - self.x1 = self.x0 + z; - self.y0 = self.y1 - z; - } - 3 => { - self.x0 = self.x1 - z; - self.y0 = self.y1 - z; - } - _ => unreachable!(), - } - } - } - } - - pub fn add(mut self, value: T) -> Self { - self.cover(&value); - - if self.root.is_none() { - self.root = Some(Box::new(Node::Leaf { data: value })); - return self; - } - - todo!(); - - self + pub fn extent(&self) -> ([f32; 2], [f32; 2]) { + ([self.x0, self.y0], [self.x1, self.y1]) } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn cover() { - let mut tree = Quadtree::<[f32; 2]>::default(); - assert!(tree.x0.is_nan()); - - tree.cover(&[0.5, 0.5]); - assert_eq!(tree.x0, 0.0); - assert_eq!(tree.y0, 0.0); - assert_eq!(tree.x1, 1.0); - assert_eq!(tree.y1, 1.0); - - tree.cover(&[1.5, 1.5]); - assert_eq!(tree.x0, 0.0); - assert_eq!(tree.y0, 0.0); - assert_eq!(tree.x1, 2.0); - assert_eq!(tree.y1, 2.0); - } - - #[test] - fn add() { - let tree = Quadtree::<[f32; 2]>::default().add([0.5, 0.5]); - assert_eq!(tree.x0, 0.0); - assert_eq!(tree.y0, 0.0); - assert_eq!(tree.x1, 1.0); - assert_eq!(tree.y1, 1.0); - // TODO: test adding more nodes when we have a getter. + pub fn root(&self) -> Option<&Node

> { + self.root.as_ref().map(|node| &**node) } } diff --git a/crates/utils/re_force/src/quadtree/quad.rs b/crates/utils/re_force/src/quadtree/quad.rs new file mode 100644 index 000000000000..766a9c6649fd --- /dev/null +++ b/crates/utils/re_force/src/quadtree/quad.rs @@ -0,0 +1,6 @@ +struct Quad { + x0: f32, + y0: f32, + x1: f32, + y1: f32, +} From 748740c4fa27d49b35ec56745480ea94fe41f4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 12:20:45 +0200 Subject: [PATCH 087/159] WIP: fmt --- crates/utils/re_force/src/lib.rs | 2 +- crates/utils/re_force/src/quadtree/add.rs | 62 ++++++++--------------- 2 files changed, 21 insertions(+), 43 deletions(-) diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs index 7742115ed682..df8e944a8c54 100644 --- a/crates/utils/re_force/src/lib.rs +++ b/crates/utils/re_force/src/lib.rs @@ -6,8 +6,8 @@ mod link; mod many_body; mod node; mod position; -mod simulation; mod quadtree; +mod simulation; pub use simulation::{Simulation, SimulationBuilder}; diff --git a/crates/utils/re_force/src/quadtree/add.rs b/crates/utils/re_force/src/quadtree/add.rs index 8f37e59d4948..9da0333eefc4 100644 --- a/crates/utils/re_force/src/quadtree/add.rs +++ b/crates/utils/re_force/src/quadtree/add.rs @@ -167,75 +167,53 @@ mod test { Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), None, None, - Some(&Node::Leaf(LeafNode { data: [0.4, 0.4], .. })), + Some(&Node::Leaf(LeafNode { + data: [0.4, 0.4], + .. + })), ]) )); - } #[test] fn handles_points_being_on_the_perimeter_of_the_quadtree_bounds() { let mut q = Quadtree::with_extent([0., 0.], [1., 1.]); q.add([0., 0.]); - assert!(matches!(q.root(), Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })))); + assert!(matches!( + q.root(), + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })) + )); - q.add([1.,1.]); + q.add([1., 1.]); assert!(matches!( q.root().unwrap().children().unwrap(), [ - Some(&Node::Leaf(LeafNode { - data: [0., 0.], - .. - })), + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), None, None, - Some(&Node::Leaf(LeafNode { - data: [1., 1.], - .. - })), + Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), ] )); - q.add([1.,0.]); + q.add([1., 0.]); assert!(matches!( q.root().unwrap().children().unwrap(), [ - Some(&Node::Leaf(LeafNode { - data: [0., 0.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [1., 0.], - .. - })), + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), None, - Some(&Node::Leaf(LeafNode { - data: [1., 1.], - .. - })), + Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), ] )); - q.add([0.,1.]); + q.add([0., 1.]); assert!(matches!( q.root().unwrap().children().unwrap(), [ - Some(&Node::Leaf(LeafNode { - data: [0., 0.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [1., 0.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [0., 1.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [1., 1.], - .. - })), + Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), + Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), + Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), ] )); } From 229e6b69a7ab88bd3ac8423105d382c18e35c36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 17:09:54 +0200 Subject: [PATCH 088/159] WIP: move graph view inside of Rerun --- ARCHITECTURE.md | 1 + Cargo.lock | 201 ++-------- Cargo.toml | 1 + crates/utils/re_force/Cargo.toml | 26 -- crates/utils/re_force/README.md | 10 - crates/utils/re_force/src/collide.rs | 75 ---- crates/utils/re_force/src/func.rs | 41 --- crates/utils/re_force/src/jiggle.rs | 7 - crates/utils/re_force/src/lcg.rs | 87 ----- crates/utils/re_force/src/lib.rs | 14 - crates/utils/re_force/src/link.rs | 145 -------- crates/utils/re_force/src/many_body.rs | 84 ----- crates/utils/re_force/src/node.rs | 73 ---- crates/utils/re_force/src/position.rs | 54 --- crates/utils/re_force/src/quadtree/add.rs | 289 --------------- crates/utils/re_force/src/quadtree/cover.rs | 346 ------------------ crates/utils/re_force/src/quadtree/indexer.rs | 89 ----- crates/utils/re_force/src/quadtree/mod.rs | 137 ------- .../utils/re_force/src/quadtree/position.rs | 48 --- crates/utils/re_force/src/quadtree/quad.rs | 6 - crates/utils/re_force/src/simulation.rs | 170 --------- crates/viewer/re_space_view_graph/Cargo.toml | 42 +++ crates/viewer/re_space_view_graph/README.md | 1 + .../viewer/re_space_view_graph}/src/error.rs | 3 +- .../re_space_view_graph}/src/graph/hash.rs | 2 +- .../re_space_view_graph}/src/graph/index.rs | 2 +- .../re_space_view_graph}/src/graph/mod.rs | 2 +- crates/viewer/re_space_view_graph/src/lib.rs | 12 + .../viewer/re_space_view_graph}/src/types.rs | 5 +- .../re_space_view_graph}/src/ui/edge.rs | 5 +- .../viewer/re_space_view_graph}/src/ui/mod.rs | 5 +- .../re_space_view_graph}/src/ui/node.rs | 5 +- .../re_space_view_graph}/src/ui/scene.rs | 10 +- .../re_space_view_graph}/src/ui/state.rs | 6 +- .../viewer/re_space_view_graph}/src/view.rs | 78 ++-- .../src/visualizers/edges_directed.rs | 29 +- .../src/visualizers/edges_undirected.rs | 29 +- .../src/visualizers/mod.rs | 7 + .../src/visualizers/nodes.rs | 32 +- crates/viewer/re_viewer/Cargo.toml | 1 + crates/viewer/re_viewer/src/app.rs | 31 +- crates/viewer/re_viewer/src/ui/rerun_menu.rs | 25 +- .../re_viewer_context/src/app_options.rs | 5 + .../re_viewer_context/src/command_sender.rs | 3 + .../re_viewer_context/src/test_context.rs | 3 +- examples/rust/graph_view/Cargo.toml | 38 -- examples/rust/graph_view/README.md | 1 - examples/rust/graph_view/src/main.rs | 65 ---- .../rust/graph_view/src/visualizers/mod.rs | 7 - 49 files changed, 253 insertions(+), 2105 deletions(-) delete mode 100644 crates/utils/re_force/Cargo.toml delete mode 100644 crates/utils/re_force/README.md delete mode 100644 crates/utils/re_force/src/collide.rs delete mode 100644 crates/utils/re_force/src/func.rs delete mode 100644 crates/utils/re_force/src/jiggle.rs delete mode 100644 crates/utils/re_force/src/lcg.rs delete mode 100644 crates/utils/re_force/src/lib.rs delete mode 100644 crates/utils/re_force/src/link.rs delete mode 100644 crates/utils/re_force/src/many_body.rs delete mode 100644 crates/utils/re_force/src/node.rs delete mode 100644 crates/utils/re_force/src/position.rs delete mode 100644 crates/utils/re_force/src/quadtree/add.rs delete mode 100644 crates/utils/re_force/src/quadtree/cover.rs delete mode 100644 crates/utils/re_force/src/quadtree/indexer.rs delete mode 100644 crates/utils/re_force/src/quadtree/mod.rs delete mode 100644 crates/utils/re_force/src/quadtree/position.rs delete mode 100644 crates/utils/re_force/src/quadtree/quad.rs delete mode 100644 crates/utils/re_force/src/simulation.rs create mode 100644 crates/viewer/re_space_view_graph/Cargo.toml create mode 100644 crates/viewer/re_space_view_graph/README.md rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/error.rs (84%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/graph/hash.rs (95%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/graph/index.rs (95%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/graph/mod.rs (98%) create mode 100644 crates/viewer/re_space_view_graph/src/lib.rs rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/types.rs (95%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/ui/edge.rs (95%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/ui/mod.rs (96%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/ui/node.rs (95%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/ui/scene.rs (97%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/ui/state.rs (93%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/view.rs (84%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/visualizers/edges_directed.rs (85%) rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/visualizers/edges_undirected.rs (85%) create mode 100644 crates/viewer/re_space_view_graph/src/visualizers/mod.rs rename {examples/rust/graph_view => crates/viewer/re_space_view_graph}/src/visualizers/nodes.rs (86%) delete mode 100644 examples/rust/graph_view/Cargo.toml delete mode 100644 examples/rust/graph_view/README.md delete mode 100644 examples/rust/graph_view/src/main.rs delete mode 100644 examples/rust/graph_view/src/visualizers/mod.rs diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index cdd9347e7980..10975496aac3 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -135,6 +135,7 @@ Update instructions: | re_space_view | Types & utilities for defining Space View classes and communicating with the Viewport. | | re_space_view_bar_chart | A Space View that shows a single bar chart. | | re_space_view_dataframe | A Space View that shows the data contained in entities in a table. | +| re_space_view_graph | A Space View that shows a graph (node-link diagram). | | re_space_view_spatial | Space Views that show entities in a 2D or 3D spatial relationship. | | re_space_view_tensor | A Space View dedicated to visualizing tensors with arbitrary dimensionality. | | re_space_view_text_document | A simple Space View that shows a single text box. | diff --git a/Cargo.lock b/Cargo.lock index 0afd048fb97b..7683fbf0de50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -259,15 +259,6 @@ version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arboard" version = "3.4.0" @@ -2454,30 +2445,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "fdg" -version = "1.0.0" -source = "git+https://github.com/grantshandy/fdg?rev=50755f1dea20249d753600e7e7e51ca33e87b5a1#50755f1dea20249d753600e7e7e51ca33e87b5a1" -dependencies = [ - "nalgebra", - "num-traits", - "petgraph", - "rand", - "rustc-hash", -] - -[[package]] -name = "fdg-sim" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2417e237094dfd115a4aa11b2a3dc6cda45e8d36572a7862ba9a48402f7441a3" -dependencies = [ - "glam 0.21.3", - "hashlink", - "petgraph", - "quad-rand", -] - [[package]] name = "filetime" version = "0.2.23" @@ -2553,7 +2520,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2736,12 +2703,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "glam" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" - [[package]] name = "glam" version = "0.28.0" @@ -2882,26 +2843,6 @@ dependencies = [ "bitflags 2.6.0", ] -[[package]] -name = "graph_view" -version = "0.0.0" -dependencies = [ - "bytemuck", - "fdg", - "fdg-sim", - "layout-rs", - "mimalloc", - "petgraph", - "rand", - "re_crash_handler", - "re_force", - "re_format", - "re_log_types", - "re_sdk_comms", - "re_viewer", - "thiserror", -] - [[package]] name = "h2" version = "0.4.6" @@ -2962,15 +2903,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown 0.14.5", -] - [[package]] name = "hassle-rs" version = "0.11.0" @@ -3035,7 +2967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "344d5bf5d6b6da1020fcfd4014d44e0cc695356c603db9c774b30bd6d385ad2b" dependencies = [ "constgebra", - "glam 0.28.0", + "glam", ] [[package]] @@ -3469,12 +3401,6 @@ dependencies = [ "libc", ] -[[package]] -name = "layout-rs" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84deb28a3a6c839ca42a7341664f32281416d69e2f29deb85aec5cc0243fdea8" - [[package]] name = "lazy_static" version = "1.4.0" @@ -3653,7 +3579,7 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam 0.28.0", + "glam", "re_tracing", "rerun", ] @@ -3806,7 +3732,7 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam 0.28.0", + "glam", "rerun", ] @@ -3872,35 +3798,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "nalgebra" -version = "0.32.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.82", -] - [[package]] name = "nasm-rs" version = "0.3.0" @@ -4006,7 +3903,7 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam 0.28.0", + "glam", "itertools 0.13.0", "rerun", "strum", @@ -4449,7 +4346,7 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam 0.28.0", + "glam", "prost 0.12.6", "prost-build 0.12.6", "protoc-prebuilt", @@ -5078,12 +4975,6 @@ dependencies = [ "syn 2.0.82", ] -[[package]] -name = "quad-rand" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b76f1009795ca44bb5aaae8fd3f18953e209259c33d9b059b1f53d58ab7511db" - [[package]] name = "quick-xml" version = "0.34.0" @@ -5582,14 +5473,6 @@ dependencies = [ "anyhow", ] -[[package]] -name = "re_force" -version = "0.20.0-alpha.1+dev" -dependencies = [ - "anyhow", - "rand", -] - [[package]] name = "re_format" version = "0.20.0-alpha.1+dev" @@ -5702,7 +5585,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "999db5029a2879efeddb538f2e486aabf33adf7a0b3708c6df5c1cae13b3af49" dependencies = [ - "glam 0.28.0", + "glam", "serde", ] @@ -5833,7 +5716,7 @@ dependencies = [ "ecolor", "enumset", "getrandom", - "glam 0.28.0", + "glam", "gltf", "half 2.3.1", "itertools 0.13.0", @@ -5878,7 +5761,7 @@ dependencies = [ "anyhow", "bytemuck", "console_error_panic_hook", - "glam 0.28.0", + "glam", "image", "itertools 0.13.0", "pollster", @@ -6046,6 +5929,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "re_space_view_graph" +version = "0.20.0-alpha.1+dev" +dependencies = [ + "bytemuck", + "egui", + "rand", + "re_chunk", + "re_chunk_store", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_renderer", + "re_space_view", + "re_tracing", + "re_types", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "thiserror", +] + [[package]] name = "re_space_view_spatial" version = "0.20.0-alpha.1+dev" @@ -6056,7 +5962,7 @@ dependencies = [ "bytemuck", "criterion", "egui", - "glam 0.28.0", + "glam", "hexasphere", "image", "itertools 0.13.0", @@ -6238,7 +6144,7 @@ dependencies = [ "ecolor", "egui_plot", "emath", - "glam 0.28.0", + "glam", "half 2.3.1", "image", "infer", @@ -6412,6 +6318,7 @@ dependencies = [ "re_smart_channel", "re_space_view_bar_chart", "re_space_view_dataframe", + "re_space_view_graph", "re_space_view_spatial", "re_space_view_tensor", "re_space_view_text_document", @@ -6457,7 +6364,7 @@ dependencies = [ "egui_extras", "egui_tiles", "emath", - "glam 0.28.0", + "glam", "half 2.3.1", "image", "indexmap 2.1.0", @@ -6502,7 +6409,7 @@ dependencies = [ "ahash", "egui", "egui_tiles", - "glam 0.28.0", + "glam", "image", "itertools 0.13.0", "nohash-hasher", @@ -7175,15 +7082,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "safe_arch" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -7351,19 +7249,6 @@ dependencies = [ "libc", ] -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simd-adler32" version = "0.3.5" @@ -7687,7 +7572,7 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam 0.28.0", + "glam", "itertools 0.13.0", "ndarray", "ndarray-rand", @@ -8845,16 +8730,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wide" -version = "0.7.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "widestring" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index ea41a9a9f7e7..20614e15716d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,7 @@ re_selection_panel = { path = "crates/viewer/re_selection_panel", version = "=0. re_space_view = { path = "crates/viewer/re_space_view", version = "=0.20.0-alpha.1", default-features = false } re_space_view_bar_chart = { path = "crates/viewer/re_space_view_bar_chart", version = "=0.20.0-alpha.1", default-features = false } re_space_view_dataframe = { path = "crates/viewer/re_space_view_dataframe", version = "=0.20.0-alpha.1", default-features = false } +re_space_view_graph = { path = "crates/viewer/re_space_view_graph", version = "=0.20.0-alpha.1", default-features = false } re_space_view_spatial = { path = "crates/viewer/re_space_view_spatial", version = "=0.20.0-alpha.1", default-features = false } re_space_view_tensor = { path = "crates/viewer/re_space_view_tensor", version = "=0.20.0-alpha.1", default-features = false } re_space_view_text_document = { path = "crates/viewer/re_space_view_text_document", version = "=0.20.0-alpha.1", default-features = false } diff --git a/crates/utils/re_force/Cargo.toml b/crates/utils/re_force/Cargo.toml deleted file mode 100644 index faf6c4a37281..000000000000 --- a/crates/utils/re_force/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "re_force" -authors.workspace = true -description = "Force-directed graph drawing." -edition.workspace = true -homepage.workspace = true -include.workspace = true -license.workspace = true -publish = true -readme = "README.md" -repository.workspace = true -rust-version.workspace = true -version.workspace = true - -[lints] -workspace = true - -[package.metadata.docs.rs] -all-features = true - - -[dependencies] -rand = "0.8.5" - -[dev-dependencies] -anyhow.workspace = true diff --git a/crates/utils/re_force/README.md b/crates/utils/re_force/README.md deleted file mode 100644 index b2ea00de8ee6..000000000000 --- a/crates/utils/re_force/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# re_force - -Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates. - -[![Latest version](https://img.shields.io/crates/v/re_force.svg)](https://crates.io/crates/re_force) -[![Documentation](https://docs.rs/re_force/badge.svg)](https://docs.rs/re_force) -![MIT](https://img.shields.io/badge/license-MIT-blue.svg) -![Apache](https://img.shields.io/badge/license-Apache-blue.svg) - -Force-directed graph drawing — essentially a Rust port of [`d3-force`](https://d3js.org/d3-force). diff --git a/crates/utils/re_force/src/collide.rs b/crates/utils/re_force/src/collide.rs deleted file mode 100644 index 162d0cdc8d9b..000000000000 --- a/crates/utils/re_force/src/collide.rs +++ /dev/null @@ -1,75 +0,0 @@ -use rand::thread_rng; -use std::hash::Hash; - -use crate::{jiggle::jiggle, node::Node}; - -#[derive(Clone, Debug)] -pub struct Collide { - radii: Option>, - strength: f32, - iterations: usize, -} - -impl Default for Collide { - fn default() -> Self { - Collide { - radii: Default::default(), - strength: 1.0, - iterations: 1, - } - } -} - -impl Collide { - // TODO: speed up using quadtree - pub fn force(&mut self, nodes: &mut [Node]) { - // TODO: make this configurable - let radii: Vec<_> = (0..nodes.len()).map(|_| 10.0).collect(); - - debug_assert!(radii.len() == nodes.len()); - - for _ in 0..self.iterations { - for s in 0..nodes.len() { - let (left, right) = nodes.split_at_mut(s); - - for (i, node) in left.iter_mut().enumerate() { - let ri = radii[i]; - let ri2 = ri * ri; - let xi = node.x + node.vx; - let yi = node.y + node.vy; - - for (j, data) in right.iter_mut().enumerate() { - let rj = radii[s + j]; - - let r = ri + rj; - let mut x = xi - data.x - data.vx; - let mut y = yi - data.y - data.vx; - let mut l = x * x + y * y; - if l < r * r { - // We need to resolve points that coincide. - if x == 0.0 { - x = jiggle(&mut thread_rng()); - l += x * x; - } - if y == 0.0 { - y = jiggle(&mut thread_rng()); - l += y * y; - } - - l = l.sqrt(); - l = (r - l) / l * self.strength; - x *= l; - y *= l; - let rj2 = rj * rj; - let frac = rj2 / (ri2 + rj2); - node.vx += x * frac; - node.vy += y * frac; - data.vx -= x * (1.0 - frac); - data.vy -= y * (1.0 - frac); - } - } - } - } - } - } -} diff --git a/crates/utils/re_force/src/func.rs b/crates/utils/re_force/src/func.rs deleted file mode 100644 index 1a7f3ede91b5..000000000000 --- a/crates/utils/re_force/src/func.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::hash::Hash; - -#[repr(transparent)] -pub struct LinkFn(pub Box f32>); - -impl LinkFn { - pub(crate) fn apply(&mut self, (i, link): (usize, &(Ix, Ix))) -> f32 { - self.0(link, i) - } -} - -impl From for LinkFn { - #[inline(always)] - fn from(value: f32) -> Self { - Self(Box::new(move |_, _| value)) - } -} - -#[repr(transparent)] -pub struct NodeFn(pub Box f32>); - -impl NodeFn { - pub(crate) fn apply(&mut self, (i, node): (usize, &Ix)) -> f32 { - self.0(node, i) - } -} - -impl From for NodeFn { - #[inline(always)] - fn from(value: f32) -> Self { - Self(Box::new(move |_, _| value)) - } -} - -#[inline(always)] -pub fn constant(value: f32) -> F -where - F: From, -{ - value.into() -} diff --git a/crates/utils/re_force/src/jiggle.rs b/crates/utils/re_force/src/jiggle.rs deleted file mode 100644 index 740a8833326c..000000000000 --- a/crates/utils/re_force/src/jiggle.rs +++ /dev/null @@ -1,7 +0,0 @@ -use rand::Rng; - -// TODO(grtlr): refactor this to be optional - -pub fn jiggle(rng: &mut R) -> f32 { - (rng.gen::() - 0.5) * 1e-6 -} diff --git a/crates/utils/re_force/src/lcg.rs b/crates/utils/re_force/src/lcg.rs deleted file mode 100644 index 1a54428f16cc..000000000000 --- a/crates/utils/re_force/src/lcg.rs +++ /dev/null @@ -1,87 +0,0 @@ -const A: u64 = 1_664_525; -const C: u64 = 1_013_904_223; -const M: u64 = 4_294_967_296; - -#[derive(Clone, Debug)] -pub struct LCG { - state: u64, -} - -impl LCG { - pub fn new(seed: u64) -> Self { - LCG { state: seed } - } -} - -impl Default for LCG { - fn default() -> Self { - LCG::new(0) - } -} - -impl Iterator for LCG { - type Item = u32; - - fn next(&mut self) -> Option { - self.state = self.state.wrapping_mul(A).wrapping_add(C) % M; - Some(self.state as u32) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn known_sequence() { - // Initialize with seed 1 - let mut lcg = LCG::new(0); - - // Known sequence generated by the parameters (a, c, m) and seed 1 - let expected_values = vec![1013904223, 1196435762, 3519870697, 2868466484]; - - // Check that the first 5 values generated by the LCG match the expected values - for expected in expected_values { - let generated = lcg.next().unwrap(); - assert_eq!( - generated, expected, - "Expected {}, but got {}", - expected, generated - ); - } - } - - #[test] - fn repeatability() { - // Initialize two LCGs with the same seed - let mut lcg1 = LCG::new(12345); - let mut lcg2 = LCG::new(12345); - - // Generate a sequence from both and check that they are identical - for _ in 0..1000 { - let value1 = lcg1.next().unwrap(); - let value2 = lcg2.next().unwrap(); - assert_eq!(value1, value2, "Values diverged: {} != {}", value1, value2); - } - } - - #[test] - fn different_seeds() { - // Initialize two LCGs with different seeds - let mut lcg1 = LCG::new(1); - let mut lcg2 = LCG::new(2); - - // Check that their sequences differ - let mut diverged = false; - for _ in 0..1000 { - let value1 = lcg1.next().unwrap(); - let value2 = lcg2.next().unwrap(); - if value1 != value2 { - diverged = true; - break; - } - } - - assert!(diverged, "Sequences did not diverge for different seeds"); - } -} diff --git a/crates/utils/re_force/src/lib.rs b/crates/utils/re_force/src/lib.rs deleted file mode 100644 index df8e944a8c54..000000000000 --- a/crates/utils/re_force/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -mod collide; -mod func; -mod jiggle; -mod lcg; -mod link; -mod many_body; -mod node; -mod position; -mod quadtree; -mod simulation; - -pub use simulation::{Simulation, SimulationBuilder}; - -pub use link::LinkBuilder; diff --git a/crates/utils/re_force/src/link.rs b/crates/utils/re_force/src/link.rs deleted file mode 100644 index bf770c75a1a7..000000000000 --- a/crates/utils/re_force/src/link.rs +++ /dev/null @@ -1,145 +0,0 @@ -use std::{collections::HashMap, hash::Hash}; - -use rand::thread_rng; - -use crate::{ - func::{constant, LinkFn}, - jiggle::jiggle, - node::Node, -}; - -pub struct LinkBuilder { - links: Vec<(Ix, Ix)>, - strength: Option>, - distance: LinkFn, - iterations: usize, -} - -impl LinkBuilder { - pub fn new(links: Vec<(Ix, Ix)>) -> Self { - Self { - links, - // TODO(grtlr): Change this back - distance: constant(20.0), - // TODO(grtlr): Change this back to `None` to match `d3`. - strength: Some(constant(1.0)), - - // TODO(grtlr): Return this back to 1 - iterations: 20, - } - } - - pub fn with_iterations(mut self, iterations: usize) -> Self { - self.iterations = iterations; - self - } - - pub fn initialize(mut self, nodes: &[Node]) -> Option> { - if nodes.is_empty() { - return None; - } - - let node_by_id = nodes - .iter() - .enumerate() - .map(|(arr_ix, node)| (node.ix.clone(), arr_ix)) - .collect::>(); - - // TODO(grtlr): This is in array d3. - let mut count = HashMap::new(); - for link in &self.links { - *count.entry(link.0.clone()).or_insert(0) += 1; - *count.entry(link.1.clone()).or_insert(0) += 1; - } - - let bias = self - .links - .iter() - .cloned() - .map(|link| { - ( - link.clone(), - count[&link.0] as f32 / (count[&link.0] + count[&link.1]) as f32, - ) - }) - .collect(); - - let strengths = self - .links - .iter() - .enumerate() - .map(|(i, link)| { - if let Some(strength) = &mut self.strength { - strength.0(link, i) - } else { - 1.0 / usize::min(count[&link.0], count[&link.1]) as f32 - } - }) - .collect(); - - let distances = self - .links - .iter() - .enumerate() - .map(|link| self.distance.apply(link)) - .collect(); - - Some(Link { - links: self.links, - node_by_id, - bias, - strengths, - distances, - iterations: self.iterations, - }) - } -} - -#[derive(Debug)] -pub struct Link { - links: Vec<(Ix, Ix)>, - node_by_id: HashMap, - - // TODO(grtlr): This is in array d3. - bias: HashMap<(Ix, Ix), f32>, - - // TODO(grtlr): In `d3`, the following fields are computed using variable functions. For now we just use defaults. - strengths: Vec, - - distances: Vec, - - iterations: usize, -} - -impl Link { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { - for _ in 0..self.iterations { - for (i, link) in self.links.iter().enumerate() { - let (source, target) = link; - let (source, target) = ( - &nodes[self.node_by_id[source]], - &nodes[self.node_by_id[target]], - ); - - let mut x = target.x + target.vx - source.x - source.vx; - if x == 0.0 { - x = jiggle(&mut thread_rng()); - } - let mut y = target.y + target.vy - source.y - source.vy; - if y == 0.0 { - y = jiggle(&mut thread_rng()); - } - let l = x.hypot(y); - let l = (l - self.distances[i]) / l * self.strengths[i] * alpha; - - let bx = self.bias[&(source.ix.clone(), target.ix.clone())]; - let by = 1.0 - bx; - - nodes[self.node_by_id[&link.0]].vx += x * l * bx; - nodes[self.node_by_id[&link.0]].vy += y * l * bx; - nodes[self.node_by_id[&link.1]].vx -= x * l * by; - nodes[self.node_by_id[&link.1]].vy -= y * l * by; - } - } - } -} diff --git a/crates/utils/re_force/src/many_body.rs b/crates/utils/re_force/src/many_body.rs deleted file mode 100644 index 39ddd296a48c..000000000000 --- a/crates/utils/re_force/src/many_body.rs +++ /dev/null @@ -1,84 +0,0 @@ -use rand::thread_rng; - -use crate::{ - func::{constant, NodeFn}, - jiggle::jiggle, - node::Node, -}; -use core::f32; -use std::hash::Hash; - -pub struct ManyBodyBuilder { - strength: NodeFn, - distance_min_2: f32, - distance_max_2: f32, -} - -impl Default for ManyBodyBuilder { - fn default() -> Self { - Self { - strength: constant(-30.0), - distance_min_2: 1.0, - distance_max_2: f32::INFINITY, - } - } -} - -impl ManyBodyBuilder { - pub fn initialize(mut self, nodes: &[Node]) -> ManyBody { - let strengths = nodes - .iter() - .enumerate() - .map(|(i, node)| self.strength.0(&node.ix, i)) - .collect(); - - ManyBody { - strengths, - distance_min_2: self.distance_min_2, - distance_max_2: self.distance_max_2, - } - } -} - -pub struct ManyBody { - strengths: Vec, - distance_min_2: f32, - distance_max_2: f32, -} - -impl ManyBody { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { - // TODO(grtlr): accerlerate with quadtree + barnes hut. - for s in 0..nodes.len() { - let (left, right) = nodes.split_at_mut(s); - - for (i, node) in left.iter_mut().enumerate() { - for (j, data) in right.iter_mut().enumerate() { - let mut x = node.x - data.x; - let mut y = node.y - data.y; - let mut l = x * x + y * y; - - if l < self.distance_max_2 { - if x == 0.0 { - x = jiggle(&mut thread_rng()); - l += x * x; - } - - if y == 0.0 { - y = jiggle(&mut thread_rng()); - l += y * y; - } - - if l < self.distance_min_2 { - l = (self.distance_min_2 * l).sqrt(); - } - - let w = self.strengths[s + j] * alpha / l; - node.vx += x * w; - node.vy += y * w; - } - } - } - } - } -} diff --git a/crates/utils/re_force/src/node.rs b/crates/utils/re_force/src/node.rs deleted file mode 100644 index 8145698c4558..000000000000 --- a/crates/utils/re_force/src/node.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::hash::Hash; - -// TODO(grtlr): Control memory layout. - -#[derive(Debug)] -pub struct Node { - pub x: f32, - pub y: f32, - pub vx: f32, - pub vy: f32, - pub ix: Ix, - // The following fields signal that a node is fixed in a certain direction. - // TODO(grtlr): Move this to a separate `Vec` in the simulation to improve the memory layout. - pub fx: Option, - pub fy: Option, -} - -impl Node { - pub fn new(ix: Ix, x: f32, y: f32) -> Self { - Self { - x, - y, - vx: 0.0, - vy: 0.0, - fx: None, - fy: None, - ix, - } - } - - #[inline(always)] - pub fn with_fixed_x(mut self) -> Self { - self.fx = Some(self.x); - self - } - - #[inline(always)] - pub fn with_fixed_y(mut self) -> Self { - self.fx = Some(self.x); - self - } - - /// Applies the velocity to the vectors, while respecting fixed positions. - pub(crate) fn apply_velocities(&mut self, velocity_decay: f32) { - if let Some(fx) = self.fx { - self.x = fx; - self.vx = 0.0; - } else { - self.x += self.vx; - self.vx *= velocity_decay; - } - - if let Some(fy) = self.fy { - self.y = fy; - self.vy = 0.0; - } else { - self.y += self.vy; - self.vy *= velocity_decay; - } - } -} - -impl From> for [f32; 2] { - fn from(p: Node) -> Self { - [p.x, p.y] - } -} - -impl From<(Ix, [f32; 2])> for Node { - fn from((ix, p): (Ix, [f32; 2])) -> Self { - Self::new(ix, p[0], p[1]) - } -} diff --git a/crates/utils/re_force/src/position.rs b/crates/utils/re_force/src/position.rs deleted file mode 100644 index 6a2617242bd5..000000000000 --- a/crates/utils/re_force/src/position.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::node::Node; -use std::hash::Hash; - -#[derive(Clone, Debug)] -pub struct PositionX { - strength: f32, - x: f32, -} - -impl Default for PositionX { - fn default() -> Self { - Self { - strength: 0.1, - x: 0.0, - } - } -} - -impl PositionX { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { - let strengths = std::iter::repeat(self.strength); - - for (node, si) in nodes.iter_mut().zip(strengths) { - let d = self.x - node.x; - node.vx += d * si * alpha; - } - } -} - -#[derive(Clone, Debug)] -pub struct PositionY { - strength: f32, - y: f32, -} - -impl Default for PositionY { - fn default() -> Self { - Self { - strength: 0.1, - y: 0.0, - } - } -} - -impl PositionY { - pub fn force(&mut self, alpha: f32, nodes: &mut [Node]) { - let strengths = std::iter::repeat(self.strength); - - for (node, si) in nodes.iter_mut().zip(strengths) { - let d = self.y - node.y; - node.vy += d * si * alpha; - } - } -} diff --git a/crates/utils/re_force/src/quadtree/add.rs b/crates/utils/re_force/src/quadtree/add.rs deleted file mode 100644 index 9da0333eefc4..000000000000 --- a/crates/utils/re_force/src/quadtree/add.rs +++ /dev/null @@ -1,289 +0,0 @@ -use super::{indexer::Indexer, LeafNode, Node, Position, Quadtree}; - -#[inline(always)] -fn leaf(value: T) -> Box> { - Box::new(Node::Leaf(LeafNode::new(value))) -} - -impl Quadtree

{ - pub fn add(&mut self, value: P) { - self.cover(&value); - - let node = self.root.as_mut(); - - let Some(mut node) = node else { - self.root = Some(leaf(value)); - return; - }; - - let x = value.x(); - let y = value.y(); - let mut ix = Indexer::with_extent([self.x0, self.y0], [self.x1, self.y1]); - - loop { - match node.as_mut() { - Node::Internal(ref mut parent) => { - let i = ix.get_and_descend(x, y); - if let Some(ref mut n) = parent[i] { - node = n; - } else { - parent[i] = Some(leaf(value)); - return; - } - } - // The new point coincides with the existing point. - Node::Leaf(ref mut leaf) if x == leaf.data.x() && y == leaf.data.y() => { - let xp = leaf.data.x(); - let yp = leaf.data.y(); - - if (x == xp) && (y == yp) { - leaf.insert(value); - return; - } - - return; - } - old_leaf @ Node::Leaf(_) => { - let inner = - std::mem::replace(old_leaf, Node::Internal([None, None, None, None])); - if let Node::Leaf(inner) = inner { - let xp = inner.data.x(); - let yp = inner.data.y(); - - let mut new_internal = old_leaf; - - loop { - let Node::Internal(ref mut parent) = new_internal else { - unreachable!() - }; - - let j = ix.get(xp, yp); - let i = ix.get_and_descend(x, y); - - debug_assert!(i < 4); - debug_assert!(j < 4); - - if i != j { - parent[i] = Some(leaf(value)); - parent[j] = Some(Box::new(Node::Leaf(inner))); - return; - } - - parent[i] = Some(Box::new(Node::Internal([None, None, None, None]))); - new_internal = parent[i].as_mut().unwrap(); - } - } - unreachable!() - } - } - } - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn creates_a_new_point_and_adds_it_to_the_quadtree() { - let mut q = Quadtree::default(); - - q.add([0., 0.]); - assert_eq!(q.root().unwrap().leaf().unwrap().data, [0., 0.]); - - q.add([0.9, 0.9]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.9], - .. - })), - ] - )); - - q.add([0.9, 0.0]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.], - .. - })), - None, - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.9], - .. - })), - ] - )); - - q.add([0., 0.9]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [0.0, 0.9], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.9], - .. - })), - ] - )); - - q.add([0.4, 0.4]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Internal(_)), - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [0.0, 0.9], - .. - })), - Some(&Node::Leaf(LeafNode { - data: [0.9, 0.9], - .. - })), - ] - )); - assert!(matches!( - q.root().unwrap().children().unwrap()[0].unwrap().children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { - data: [0.4, 0.4], - .. - })), - ]) - )); - } - - #[test] - fn handles_points_being_on_the_perimeter_of_the_quadtree_bounds() { - let mut q = Quadtree::with_extent([0., 0.], [1., 1.]); - q.add([0., 0.]); - assert!(matches!( - q.root(), - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })) - )); - - q.add([1., 1.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), - ] - )); - - q.add([1., 0.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), - None, - Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), - ] - )); - - q.add([0., 1.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 1.], .. })), - ] - )); - } - - #[test] - fn handles_points_being_to_the_left_of_quadtree_bounds() { - let mut q = Quadtree::with_extent([0., 0.], [2., 2.]); - q.add([-1., 1.]); - assert_eq!(dbg!(q).extent(), ([-4., 0.], [4., 8.])); - } - - #[test] - fn handles_coincident_points_by_creating_linked_list() { - let mut q = Quadtree::with_extent([0., 0.], [1., 1.]); - q.add([0., 0.]); - assert!(matches!( - q.root().unwrap(), - &Node::Leaf(LeafNode { data: [0., 0.], .. }) - )); - - q.add([1., 0.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), - None, - None, - ] - )); - - q.add([0., 1.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), - None, - ] - )); - - q.add([0., 1.]); - assert!(matches!( - q.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [1., 0.], .. })), - Some(&Node::Leaf(LeafNode { data: [0., 1.], .. })), - None, - ] - )); - assert_eq!( - q.root().unwrap().children().unwrap()[2] - .unwrap() - .leaf() - .unwrap() - .iter() - .collect::>(), - vec![&[0., 1.], &[0., 1.]], - ) - } - - #[test] - fn trivial_bounds_for_first_point() { - let mut q = Quadtree::default(); - q.add([1.0, 2.0]); - assert_eq!(q.extent(), ([1.0, 2.0], [2.0, 3.0])); - assert!( - matches!(q.root().unwrap(), Node::Leaf(leaf) if leaf.data.x() == 1.0 && leaf.data.y() == 2.0) - ); - } -} diff --git a/crates/utils/re_force/src/quadtree/cover.rs b/crates/utils/re_force/src/quadtree/cover.rs deleted file mode 100644 index 8323926ed221..000000000000 --- a/crates/utils/re_force/src/quadtree/cover.rs +++ /dev/null @@ -1,346 +0,0 @@ -use crate::node; - -use super::{Node, Position, Quadtree}; - -impl Quadtree { - pub fn cover(&mut self, value: &T) { - let x = value.x(); - let y = value.y(); - - assert!(!f32::is_nan(x), "Encountered NaN value for x"); - assert!(!f32::is_nan(y), "Encountered NaN value for y"); - - let mut x0 = self.x0; - let mut y0 = self.y0; - let mut x1 = self.x1; - let mut y1 = self.y1; - - if f32::is_nan(x0) { - x0 = x.floor(); - x1 = x0 + 1.0; - y0 = y.floor(); - y1 = y0 + 1.0; - } else { - // Otherwise, double repeatedly to cover. - let mut z = if (x1 - x0).is_sign_positive() { - (x1 - x0) - } else { - 1.0 - }; - - let node = if matches!(self.root(), Some(&Node::Internal(_))) { - &mut self.root - } else { - &mut None - }; - - while x0 > x || x >= x1 || y0 > y || y >= y1 { - let i = ((y < y0) as usize) << 1 | ((x < x0) as usize); - - let mut parent = [None, None, None, None]; - parent[i] = node.take(); - *node = Some(Box::new(Node::Internal(parent))); - - z *= 2.0; - match i { - 0 => { - x1 = x0 + z; - y1 = y0 + z; - } - 1 => { - x0 = x1 - z; - y1 = y0 + z; - } - 2 => { - x1 = x0 + z; - y0 = y1 - z; - } - 3 => { - x0 = x1 - z; - y0 = y1 - z; - } - _ => unreachable!(), - } - } - } - - self.x0 = x0; - self.y0 = y0; - self.x1 = x1; - self.y1 = y1; - } -} - -#[cfg(test)] -mod test { - use crate::quadtree::LeafNode; - - use super::*; - - #[test] - fn sets_a_trivial_extent_if_the_extent_was_undefined() { - let mut q = Quadtree::<[f32; 2]>::default(); - q.cover(&[1., 2.]); - assert_eq!(q.extent(), ([1., 2.], [2., 3.])); - } - - #[test] - fn sets_a_non_trivial_squarified_and_centered_extent_if_the_extent_was_trivial() { - let mut q = Quadtree::<[f32; 2]>::default(); - q.cover(&[0., 0.]); - q.cover(&[1., 2.]); - assert_eq!(q.extent(), ([0., 0.], [4., 4.])); - } - - #[test] - #[should_panic(expected = "Encountered NaN value for x")] - fn ignores_panics_on_invalid_points() { - let mut q = Quadtree::<[f32; 2]>::default(); - q.cover(&[0., 0.]); - q.cover(&[f32::NAN, 2.]); - } - - #[test] - fn repeatedly_doubles_the_existing_extent_if_the_extent_was_non_trivial() { - fn cover_multiple(q: &mut Quadtree<[f32; 2]>, ps: &[[f32; 2]]) { - for p in ps { - q.cover(p); - } - } - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., -1.]]); - assert_eq!(q.extent(), ([-4., -4.], [4., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [1., -1.]]); - assert_eq!(q.extent(), ([0., -4.], [8., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., -1.]]); - assert_eq!(q.extent(), ([0., -4.], [8., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 1.]]); - assert_eq!(q.extent(), ([0., 0.], [4., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 3.]]); - assert_eq!(q.extent(), ([0., 0.], [4., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [1., 3.]]); - assert_eq!(q.extent(), ([0., 0.], [4., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., 3.]]); - assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-1., 1.]]); - assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., -3.]]); - assert_eq!(q.extent(), ([-4., -4.], [4., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., -3.]]); - assert_eq!(q.extent(), ([0., -4.], [8., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., -3.]]); - assert_eq!(q.extent(), ([0., -4.], [8., 4.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., 3.]]); - assert_eq!(q.extent(), ([0., 0.], [8., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [5., 5.]]); - assert_eq!(q.extent(), ([0., 0.], [8., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [3., 5.]]); - assert_eq!(q.extent(), ([0., 0.], [8., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., 5.]]); - assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); - - let mut q = Quadtree::<[f32; 2]>::default(); - cover_multiple(&mut q, &[[0., 0.], [2., 2.], [-3., 3.]]); - assert_eq!(q.extent(), ([-4., 0.], [4., 8.])); - } - - #[test] - fn repeatedly_wraps_the_root_node_if_it_has_children() { - let mut q = Quadtree::<[f32; 2]>::default(); - q.add([0., 0.]); - q.add([2., 2.]); - - let mut tmp = q.clone(); - tmp.cover(&[3., 3.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap(), - [ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ] - )); - - let mut tmp = q.clone(); - tmp.cover(&[-1., 3.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[1] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[3., -1.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[2] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[-1., -1.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[3] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[5., 5.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[0] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[-3., 5.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[1] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[5., -3.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[2] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - - let mut tmp = q.clone(); - tmp.cover(&[-3., -3.]); - assert!(matches!( - tmp.root().unwrap().children().unwrap()[3] - .unwrap() - .children(), - Some([ - Some(&Node::Leaf(LeafNode { data: [0., 0.], .. })), - None, - None, - Some(&Node::Leaf(LeafNode { data: [2., 2.], .. })), - ]) - )); - } - - #[test] - fn does_not_wrap_root_node_if_it_is_a_leaf() { - fn test_point<'a>(mut q: Quadtree<[f32; 2]>, p: [f32; 2]) { - q.cover(&p); - assert!(matches!( - q.root(), - Some(Node::Leaf(LeafNode { data: [2., 2.], .. })) - )); - } - - let mut q = Quadtree::<[f32; 2]>::default(); - q.cover(&[0., 0.]); - q.add([2., 2.]); - assert!(matches!( - q.root(), - Some(Node::Leaf(LeafNode { data: [2., 2.], .. })) - )); - test_point(q.clone(), [3., 3.]); - test_point(q.clone(), [-1., 3.]); - test_point(q.clone(), [3., -1.]); - test_point(q.clone(), [-1., -1.]); - test_point(q.clone(), [5., 5.]); - test_point(q.clone(), [-3., 5.]); - test_point(q.clone(), [5., -3.]); - test_point(q.clone(), [-3., -3.]); - } - - #[test] - fn does_not_wrap_root_node_if_it_is_undefined() { - fn cover_root(mut q: Quadtree<[f32; 2]>, p: [f32; 2]) -> Option>> { - q.cover(&p); - q.root - } - - let mut q = Quadtree::<[f32; 2]>::default(); - q.cover(&[0., 0.]); - q.cover(&[2., 2.]); - assert!(q.root().is_none()); - assert_eq!(cover_root(q.clone(), [3., 3.]), None); - assert_eq!(cover_root(q.clone(), [-1., 3.]), None); - assert_eq!(cover_root(q.clone(), [3., -1.]), None); - assert_eq!(cover_root(q.clone(), [-1., -1.]), None); - assert_eq!(cover_root(q.clone(), [5., 5.]), None); - assert_eq!(cover_root(q.clone(), [-3., 5.]), None); - assert_eq!(cover_root(q.clone(), [5., -3.]), None); - assert_eq!(cover_root(q.clone(), [-3., -3.]), None); - } - - #[test] - fn does_not_crash_on_huge_values() { - let mut q = Quadtree::<[f32; 2]>::default(); - q.add([1e23, 0.]); - } -} diff --git a/crates/utils/re_force/src/quadtree/indexer.rs b/crates/utils/re_force/src/quadtree/indexer.rs deleted file mode 100644 index 21be3f5f1af5..000000000000 --- a/crates/utils/re_force/src/quadtree/indexer.rs +++ /dev/null @@ -1,89 +0,0 @@ -#[derive(Debug)] -pub struct Indexer { - x0: f32, - y0: f32, - x1: f32, - y1: f32, - xm: f32, - ym: f32, -} - -impl Indexer { - #[inline(always)] - pub fn with_extent(min: [f32; 2], max: [f32; 2]) -> Self { - Self { - x0: min[0], - y0: min[1], - x1: max[0], - y1: max[1], - xm: (min[0] + max[0]) / 2.0, - ym: (min[1] + max[1]) / 2.0, - } - } - - #[inline(always)] - pub fn extent(&self) -> ([f32; 2], [f32; 2]) { - ([self.x0, self.y0], [self.x1, self.y1]) - } - - #[inline(always)] - pub fn get(&self, x: f32, y: f32) -> usize { - let right = x >= self.xm; - let bottom = y >= self.ym; - (bottom as usize) << 1 | right as usize - } - - #[inline(always)] - pub fn get_and_descend(&mut self, x: f32, y: f32) -> usize { - let right = if x >= self.xm { - self.x0 = self.xm; - true - } else { - self.x1 = self.xm; - false - }; - - let bottom = if y >= self.ym { - self.y0 = self.ym; - true - } else { - self.y1 = self.ym; - false - }; - - self.xm = (self.x0 + self.x1) / 2.0; - self.ym = (self.y0 + self.y1) / 2.0; - - (bottom as usize) << 1 | right as usize - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn simple_indexation() { - let ix = Indexer::with_extent([0.0, 0.0], [1.0, 1.0]); - assert_eq!(ix.get(0.1, 0.1), 0); - assert_eq!(ix.get(0.9, 0.1), 1); - assert_eq!(ix.get(0.1, 0.9), 2); - assert_eq!(ix.get(0.9, 0.9), 3); - } - - #[test] - fn nested_indexation() { - let mut ix = Indexer::with_extent([0.0, 0.0], [1.0, 1.0]); - assert_eq!(ix.get(0.1, 0.1), 0); - assert_eq!(ix.get(0.9, 0.1), 1); - assert_eq!(ix.get(0.1, 0.9), 2); - assert_eq!(ix.get(0.9, 0.9), 3); - assert_eq!(ix.get(0.4, 0.4), 0); - assert_eq!(ix.get_and_descend(0.4, 0.4), 0); - assert_eq!(ix.extent(), ([0.0, 0.0], [0.5, 0.5])); - assert_eq!(ix.xm, 0.25); - assert_eq!(ix.ym, 0.25); - assert_eq!(ix.get(0.1, 0.1), 0); - assert_eq!(ix.get(0.4, 0.4), 3); - } -} diff --git a/crates/utils/re_force/src/quadtree/mod.rs b/crates/utils/re_force/src/quadtree/mod.rs deleted file mode 100644 index e2b697e92177..000000000000 --- a/crates/utils/re_force/src/quadtree/mod.rs +++ /dev/null @@ -1,137 +0,0 @@ -mod add; -mod cover; -mod indexer; -mod position; - -pub use position::Position; - -#[derive(Clone, Debug, PartialEq, Eq)] -struct LeafNode { - data: T, - next: Option>>, -} - -impl<'a, T: Position> LeafNode { - fn new(data: T) -> Self { - Self { data, next: None } - } - - fn insert(&mut self, data: T) { - let mut node = self; - loop { - match node.next { - Some(ref mut next) => { - node = next; - } - None => { - node.next = Some(Box::new(LeafNode::new(data))); - return; - } - } - } - } - - fn iter(&self) -> impl Iterator { - LeafListIterator { next: Some(self) } - } -} - -struct LeafListIterator<'a, T: Position> { - next: Option<&'a LeafNode>, -} - -impl<'a, T: Position> Iterator for LeafListIterator<'a, T> { - type Item = &'a T; - - fn next(&mut self) -> Option { - let next = self.next; - self.next = next.and_then(|node| node.next.as_deref()); - next.map(|node| &node.data) - } -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum Node { - Leaf(LeafNode), - Internal([Option>>; 4]), -} - -impl Node { - fn leaf(&self) -> Option<&LeafNode> { - match self { - Node::Leaf(leaf) => Some(leaf), - _ => None, - } - } - - fn children(&self) -> Option<[Option<&Node>; 4]> { - match self { - Node::Leaf(_) => None, - Node::Internal(children) => Some([ - children[0].as_deref(), - children[1].as_deref(), - children[2].as_deref(), - children[3].as_deref(), - ]), - } - } -} - -#[derive(Clone, Debug, PartialEq)] -pub struct Quadtree { - x0: f32, - y0: f32, - x1: f32, - y1: f32, - root: Option>>, -} - -impl Default for Quadtree { - fn default() -> Self { - Self { - x0: f32::NAN, - y0: f32::NAN, - x1: f32::NAN, - y1: f32::NAN, - root: None, - } - } -} - -impl Quadtree

{ - pub fn with_extent(min: [f32; 2], max: [f32; 2]) -> Self { - Self { - x0: min[0], - y0: min[1], - x1: max[0], - y1: max[1], - root: None, - } - } - - pub fn from_nodes(nodes: &[P]) -> Self { - let tree = Self { - x0: f32::NAN, - y0: f32::NAN, - x1: f32::NAN, - y1: f32::NAN, - root: None, - }; - - if nodes.is_empty() { - return tree; - } - - // tree.add_all(nodes); - - tree - } - - pub fn extent(&self) -> ([f32; 2], [f32; 2]) { - ([self.x0, self.y0], [self.x1, self.y1]) - } - - pub fn root(&self) -> Option<&Node

> { - self.root.as_ref().map(|node| &**node) - } -} diff --git a/crates/utils/re_force/src/quadtree/position.rs b/crates/utils/re_force/src/quadtree/position.rs deleted file mode 100644 index d962bf20e5d9..000000000000 --- a/crates/utils/re_force/src/quadtree/position.rs +++ /dev/null @@ -1,48 +0,0 @@ -pub trait Position { - fn x(&self) -> f32; - fn y(&self) -> f32; -} - -impl Position for [f32; 2] { - #[inline(always)] - fn x(&self) -> f32 { - self[0] - } - #[inline(always)] - fn y(&self) -> f32 { - self[1] - } -} - -impl Position for &[f32; 2] { - #[inline(always)] - fn x(&self) -> f32 { - self[0] - } - #[inline(always)] - fn y(&self) -> f32 { - self[1] - } -} - -impl Position for (f32, f32) { - #[inline(always)] - fn x(&self) -> f32 { - self.0 - } - #[inline(always)] - fn y(&self) -> f32 { - self.1 - } -} - -impl Position for &(f32, f32) { - #[inline(always)] - fn x(&self) -> f32 { - self.0 - } - #[inline(always)] - fn y(&self) -> f32 { - self.1 - } -} diff --git a/crates/utils/re_force/src/quadtree/quad.rs b/crates/utils/re_force/src/quadtree/quad.rs deleted file mode 100644 index 766a9c6649fd..000000000000 --- a/crates/utils/re_force/src/quadtree/quad.rs +++ /dev/null @@ -1,6 +0,0 @@ -struct Quad { - x0: f32, - y0: f32, - x1: f32, - y1: f32, -} diff --git a/crates/utils/re_force/src/simulation.rs b/crates/utils/re_force/src/simulation.rs deleted file mode 100644 index 848c9c9643c1..000000000000 --- a/crates/utils/re_force/src/simulation.rs +++ /dev/null @@ -1,170 +0,0 @@ -use std::collections::HashMap; -use std::hash::Hash; - -use crate::{ - collide::Collide, - lcg::LCG, - link::Link, - many_body::{ManyBody, ManyBodyBuilder}, - node::Node, - position::{PositionX, PositionY}, - LinkBuilder, -}; - -enum Force { - Collide(Collide), - PositionX(PositionX), - PositionY(PositionY), - Link(Link), - ManyBody(ManyBody), -} - -#[derive(Debug)] -pub struct SimulationBuilder { - alpha: f32, - alpha_min: f32, - alpha_decay: f32, - alpha_target: f32, - velocity_decay: f32, - _random: LCG, -} - -impl Default for SimulationBuilder { - fn default() -> Self { - let alpha_min = 0.001; - Self { - alpha: 1.0, - alpha_min, - alpha_decay: 1.0 - alpha_min.powf(1.0 / 300.0), - alpha_target: 0.0, - velocity_decay: 0.6, - _random: LCG::default(), - } - } -} - -impl SimulationBuilder { - // TODO(grtlr): build with fixed positions! - - #[inline(always)] - pub fn build(&self, nodes: impl IntoIterator) -> Simulation - where - P: Into<[f32; 2]>, - Ix: Hash + Eq + Clone, - { - let nodes = nodes.into_iter().map(|(ix, p)| { - let p = p.into(); - Node::new(ix, p[0], p[1]) - }); - - Simulation { - alpha: self.alpha, - alpha_min: self.alpha_min, - alpha_decay: self.alpha_decay, - alpha_target: self.alpha_target, - velocity_decay: self.velocity_decay, - nodes: nodes.collect(), - _random: self._random.clone(), - forces: Default::default(), - } - } -} - -pub struct Simulation -where - Ix: Hash + Eq + Clone, -{ - alpha: f32, - alpha_min: f32, - alpha_decay: f32, - alpha_target: f32, - velocity_decay: f32, - _random: LCG, - forces: HashMap>, - nodes: Vec>, -} - -// TODO(grtlr): Could simulation be an iterator? -impl Simulation { - pub fn step(&mut self) { - while self.alpha < self.alpha_min { - self.tick(1); - } - } - - pub fn finished(&self) -> bool { - self.alpha < self.alpha_min - } - - pub fn tick(&mut self, iterations: usize) { - for _ in 0..iterations { - self.alpha += (self.alpha_target - self.alpha) * self.alpha_decay; - - for force in &mut self.forces.values_mut() { - match force { - Force::Collide(c) => c.force(&mut self.nodes), - Force::PositionX(p) => p.force(self.alpha, &mut self.nodes), - Force::PositionY(p) => p.force(self.alpha, &mut self.nodes), - Force::Link(l) => l.force(self.alpha, &mut self.nodes), - Force::ManyBody(m) => m.force(self.alpha, &mut self.nodes), - } - } - - for n in &mut self.nodes { - n.apply_velocities(self.velocity_decay); - } - } - } - - pub fn positions<'a>(&'a self) -> impl Iterator { - self.nodes - .iter() - .map(move |n: &'a Node| (&n.ix, [n.x, n.y])) - } - - #[inline(always)] - pub fn add_force_collide(mut self, name: String, force: Collide) -> Self { - self.forces.insert(name, Force::Collide(force)); - self - } - - #[inline(always)] - pub fn add_force_x(mut self, name: String, force: PositionX) -> Self { - self.forces.insert(name, Force::PositionX(force)); - self - } - - #[inline(always)] - pub fn add_force_y(mut self, name: String, force: PositionY) -> Self { - self.forces.insert(name, Force::PositionY(force)); - self - } - - #[inline(always)] - pub fn add_force_link(mut self, name: String, builder: LinkBuilder) -> Self { - if let Some(force) = builder.initialize(&self.nodes) { - self.forces.insert(name, Force::Link(force)); - } - self - } - - #[inline(always)] - pub fn add_force_many_body(mut self, name: String, builder: ManyBodyBuilder) -> Self { - let force = builder.initialize(&self.nodes); - self.forces.insert(name, Force::ManyBody(force)); - self - } -} - -impl From> for SimulationBuilder { - fn from(value: Simulation) -> Self { - Self { - alpha: value.alpha, - alpha_min: value.alpha_min, - alpha_decay: value.alpha_decay, - alpha_target: value.alpha_target, - velocity_decay: value.velocity_decay, - _random: value._random, - } - } -} diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml new file mode 100644 index 000000000000..d2a745a2c280 --- /dev/null +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -0,0 +1,42 @@ +[package] +authors.workspace = true +description = "A space view that shows a graph (node-link diagram)." +edition.workspace = true +homepage.workspace = true +license.workspace = true +name = "re_space_view_graph" +publish = true +readme = "README.md" +repository.workspace = true +rust-version.workspace = true +version.workspace = true +include = ["../../LICENSE-APACHE", "../../LICENSE-MIT", "**/*.rs", "Cargo.toml"] + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true + +[dependencies] +re_chunk.workspace = true +re_chunk_store.workspace = true +re_format.workspace = true +re_entity_db.workspace = true +re_log.workspace = true +re_log_types.workspace = true +re_renderer.workspace = true +re_space_view.workspace = true +re_tracing.workspace = true +re_types.workspace = true +re_ui.workspace = true +re_viewer_context.workspace = true +re_viewport_blueprint.workspace = true + +egui.workspace = true + +#TODO(grtlr): check if all of these are still needed +bytemuck = "1.18" +thiserror = "1.0" + +rand = "0.8" diff --git a/crates/viewer/re_space_view_graph/README.md b/crates/viewer/re_space_view_graph/README.md new file mode 100644 index 000000000000..5ff5e021ffc1 --- /dev/null +++ b/crates/viewer/re_space_view_graph/README.md @@ -0,0 +1 @@ +# re_space_view_graph diff --git a/examples/rust/graph_view/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs similarity index 84% rename from examples/rust/graph_view/src/error.rs rename to crates/viewer/re_space_view_graph/src/error.rs index 94cff13e58fd..0cac43dab59e 100644 --- a/examples/rust/graph_view/src/error.rs +++ b/crates/viewer/re_space_view_graph/src/error.rs @@ -1,5 +1,6 @@ use re_log_types::EntityPath; -use re_viewer::external::{re_types::datatypes, re_viewer_context::SpaceViewSystemExecutionError}; +use re_types::{datatypes, }; +use re_viewer_context::SpaceViewSystemExecutionError; #[derive(thiserror::Error, Debug)] pub enum Error { diff --git a/examples/rust/graph_view/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs similarity index 95% rename from examples/rust/graph_view/src/graph/hash.rs rename to crates/viewer/re_space_view_graph/src/graph/hash.rs index 5b27dfd29c79..655a0d4002ff 100644 --- a/examples/rust/graph_view/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -1,5 +1,5 @@ use re_log_types::hash::Hash64; -use re_viewer::external::re_types::datatypes; +use re_types::datatypes; /// A 64 bit hash of [`GraphNodeId`] with very small risk of collision. #[derive(Copy, Clone, Eq, PartialOrd, Ord)] diff --git a/examples/rust/graph_view/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs similarity index 95% rename from examples/rust/graph_view/src/graph/index.rs rename to crates/viewer/re_space_view_graph/src/graph/index.rs index 550746642187..1bf14bcee2ca 100644 --- a/examples/rust/graph_view/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -1,5 +1,5 @@ use re_log_types::{EntityPath, EntityPathHash}; -use re_viewer::external::re_types::datatypes; +use re_types::datatypes; use super::NodeIdHash; diff --git a/examples/rust/graph_view/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs similarity index 98% rename from examples/rust/graph_view/src/graph/mod.rs rename to crates/viewer/re_space_view_graph/src/graph/mod.rs index c78c8af799f6..7d9c78ffe7c2 100644 --- a/examples/rust/graph_view/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use re_log_types::EntityPath; -use re_viewer::external::re_types::datatypes; +use re_types::datatypes; use crate::{ types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, diff --git a/crates/viewer/re_space_view_graph/src/lib.rs b/crates/viewer/re_space_view_graph/src/lib.rs new file mode 100644 index 000000000000..13d47924cd73 --- /dev/null +++ b/crates/viewer/re_space_view_graph/src/lib.rs @@ -0,0 +1,12 @@ +//! Rerun Graph Space View. +//! +//! A Space View that shows a graph (node-link diagram). + +mod error; +mod graph; +mod types; +mod ui; +mod view; +mod visualizers; + +pub use view::GraphSpaceView; diff --git a/examples/rust/graph_view/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs similarity index 95% rename from examples/rust/graph_view/src/types.rs rename to crates/viewer/re_space_view_graph/src/types.rs index 94dbf9a24e3c..3b2b5ba1a265 100644 --- a/examples/rust/graph_view/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,8 +1,5 @@ use re_log_types::{EntityPath, Instance}; -use re_viewer::external::{ - egui, - re_types::{datatypes, ArrowString}, -}; +use re_types::{datatypes, ArrowString}; use crate::graph::NodeIndex; diff --git a/examples/rust/graph_view/src/ui/edge.rs b/crates/viewer/re_space_view_graph/src/ui/edge.rs similarity index 95% rename from examples/rust/graph_view/src/ui/edge.rs rename to crates/viewer/re_space_view_graph/src/ui/edge.rs index b86507a88769..8238174c4c53 100644 --- a/examples/rust/graph_view/src/ui/edge.rs +++ b/crates/viewer/re_space_view_graph/src/ui/edge.rs @@ -1,7 +1,4 @@ -use re_viewer::external::{ - egui, - re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}, -}; +use re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}; pub fn draw_edge( ui: &mut egui::Ui, diff --git a/examples/rust/graph_view/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs similarity index 96% rename from examples/rust/graph_view/src/ui/mod.rs rename to crates/viewer/re_space_view_graph/src/ui/mod.rs index 951b0ba30354..36a1f7384f56 100644 --- a/examples/rust/graph_view/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -1,10 +1,7 @@ use std::collections::HashMap; use re_log_types::EntityPath; -use re_viewer::external::{ - egui, - re_viewer_context::{InteractionHighlight, SpaceViewHighlights}, -}; +use re_viewer_context::{InteractionHighlight, SpaceViewHighlights}; mod edge; pub(crate) use edge::draw_edge; diff --git a/examples/rust/graph_view/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs similarity index 95% rename from examples/rust/graph_view/src/ui/node.rs rename to crates/viewer/re_space_view_graph/src/ui/node.rs index 672d28677cba..cc644bf24a39 100644 --- a/examples/rust/graph_view/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -1,7 +1,4 @@ -use re_viewer::external::{ - egui, - re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}, -}; +use re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}; use crate::types::NodeInstance; diff --git a/examples/rust/graph_view/src/ui/scene.rs b/crates/viewer/re_space_view_graph/src/ui/scene.rs similarity index 97% rename from examples/rust/graph_view/src/ui/scene.rs rename to crates/viewer/re_space_view_graph/src/ui/scene.rs index 799ed7ec576e..770868046634 100644 --- a/examples/rust/graph_view/src/ui/scene.rs +++ b/crates/viewer/re_space_view_graph/src/ui/scene.rs @@ -1,12 +1,10 @@ use std::ops::RangeFrom; -use re_viewer::external::{ - egui::{ - emath::TSTransform, Area, Color32, Id, LayerId, Order, Painter, Pos2, Rect, Response, - Sense, Stroke, Ui, - }, - re_log::external::log, +use egui::{ + emath::TSTransform, Area, Color32, Id, LayerId, Order, Painter, Pos2, Rect, Response, Sense, + Stroke, Ui, }; +use re_log::external::log; pub struct ViewBuilder { world_to_view: TSTransform, diff --git a/examples/rust/graph_view/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs similarity index 93% rename from examples/rust/graph_view/src/ui/state.rs rename to crates/viewer/re_space_view_graph/src/ui/state.rs index 53d527b23313..577e520033ab 100644 --- a/examples/rust/graph_view/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -1,7 +1,8 @@ use std::collections::HashMap; use re_format::format_f32; -use re_viewer::external::{egui, re_ui::UiExt, re_viewer_context::SpaceViewState}; +use re_ui::UiExt; +use re_viewer_context::SpaceViewState; use crate::graph::NodeIndex; @@ -20,8 +21,7 @@ pub(crate) struct GraphSpaceViewState { /// Positions of the nodes in world space. pub layout: HashMap, - - pub simulation: Option>, + // pub simulation: Option>, } impl GraphSpaceViewState { diff --git a/examples/rust/graph_view/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs similarity index 84% rename from examples/rust/graph_view/src/view.rs rename to crates/viewer/re_space_view_graph/src/view.rs index a7d171ca300d..4e1fa4ebdd02 100644 --- a/examples/rust/graph_view/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,19 +1,15 @@ use std::collections::HashSet; -use re_force::LinkBuilder; -use re_viewer::external::{ - egui::{self, Rect}, - re_entity_db::InstancePath, - re_log::external::log, - re_log_types::EntityPath, - re_types::SpaceViewClassIdentifier, - re_ui::{self, UiExt}, - re_viewer_context::{ - IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, - SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, - SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, - SystemExecutionOutput, ViewQuery, ViewerContext, - }, +use egui::{self, Rect}; +use re_entity_db::InstancePath; +use re_log_types::EntityPath; +use re_types::SpaceViewClassIdentifier; +use re_ui::{self, UiExt}; +use re_viewer_context::{ + IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, + SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, + SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, + SystemExecutionOutput, ViewQuery, ViewerContext, }; use crate::{ @@ -126,7 +122,7 @@ impl SpaceViewClass for GraphSpaceView { &directed_system.data, &undirected_system.data, ) else { - log::warn!("No graph data available."); + re_log::warn!("No graph data available."); return Ok(()); }; @@ -267,32 +263,32 @@ impl SpaceViewClass for GraphSpaceView { // } // Clean up the layout for nodes that are no longer present. - state.layout.retain(|k, _| seen.contains(k)); - - let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); - let links = graph - .all_edges() - .map(|e| (e.source.into(), e.target.into())) - .collect(); - - let simulation = state.simulation.get_or_insert_with(|| { - re_force::SimulationBuilder::default() - .build(pos) - // .add_force_collide("collide".to_string(), Default::default()) - // .add_force_x("x".to_string(), Default::default()) - // .add_force_y("y".to_string(), Default::default()) - .add_force_link("link".to_string(), LinkBuilder::new(links)) - .add_force_many_body("many_body".to_string(), Default::default()) - }); - - if state.should_tick { - simulation.tick(1); - state.should_tick = false; - - for (ix, pos) in simulation.positions() { - state.layout.get_mut(ix).unwrap().set_center(pos.into()) - } - } + // state.layout.retain(|k, _| seen.contains(k)); + + // let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); + // let links = graph + // .all_edges() + // .map(|e| (e.source.into(), e.target.into())) + // .collect(); + + // let simulation = state.simulation.get_or_insert_with(|| { + // re_force::SimulationBuilder::default() + // .build(pos) + // // .add_force_collide("collide".to_string(), Default::default()) + // // .add_force_x("x".to_string(), Default::default()) + // // .add_force_y("y".to_string(), Default::default()) + // .add_force_link("link".to_string(), LinkBuilder::new(links)) + // .add_force_many_body("many_body".to_string(), Default::default()) + // }); + + // if state.should_tick { + // simulation.tick(1); + // state.should_tick = false; + + // for (ix, pos) in simulation.positions() { + // state.layout.get_mut(ix).unwrap().set_center(pos.into()) + // } + // } // TODO(grtlr): come up with a good heuristic of when to do this. if state.should_fit_to_screen { diff --git a/examples/rust/graph_view/src/visualizers/edges_directed.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs similarity index 85% rename from examples/rust/graph_view/src/visualizers/edges_directed.rs rename to crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs index 2147e65967f1..0787d55849ea 100644 --- a/examples/rust/graph_view/src/visualizers/edges_directed.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs @@ -1,20 +1,17 @@ +use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; +use re_entity_db::external::re_query::{clamped_zip_2x1, range_zip_1x1}; use re_log_types::Instance; -use re_viewer::external::{ - egui, - re_chunk::{ChunkComponentIterItem, LatestAtQuery}, - re_query::{clamped_zip_2x1, range_zip_1x1}, - re_renderer, - re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{ - self, archetypes, - components::{self}, - Loggable as _, - }, - re_viewer_context::{ - self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, - ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, - VisualizerSystem, - }, + +use re_renderer; +use re_space_view::{DataResultQuery, RangeResultsExt}; +use re_types::{ + self, archetypes, + components::{self}, + Loggable as _, +}; +use re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, + ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; use crate::types::EdgeInstance; diff --git a/examples/rust/graph_view/src/visualizers/edges_undirected.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs similarity index 85% rename from examples/rust/graph_view/src/visualizers/edges_undirected.rs rename to crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs index f4df4fae25d2..589490706458 100644 --- a/examples/rust/graph_view/src/visualizers/edges_undirected.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs @@ -1,20 +1,17 @@ +use re_chunk_store::{external::re_chunk::ChunkComponentIterItem, LatestAtQuery}; +use re_entity_db::external::re_query::{clamped_zip_2x1, range_zip_1x1}; use re_log_types::Instance; -use re_viewer::external::{ - egui, - re_chunk::{ChunkComponentIterItem, LatestAtQuery}, - re_query::{clamped_zip_2x1, range_zip_1x1}, - re_renderer, - re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{ - self, archetypes, - components::{self}, - Loggable as _, - }, - re_viewer_context::{ - self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, - ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, - VisualizerSystem, - }, + +use re_renderer; +use re_space_view::{DataResultQuery, RangeResultsExt}; +use re_types::{ + self, archetypes, + components::{self}, + Loggable as _, +}; +use re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, + ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; use crate::types::EdgeInstance; diff --git a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs new file mode 100644 index 000000000000..1b28ab06b6f2 --- /dev/null +++ b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs @@ -0,0 +1,7 @@ +mod edges_directed; +mod edges_undirected; +mod nodes; + +pub use edges_directed::{EdgesDirectedData, EdgesDirectedVisualizer}; +pub use edges_undirected::{EdgesUndirectedData, EdgesUndirectedVisualizer}; +pub use nodes::{NodeVisualizer, NodeVisualizerData}; diff --git a/examples/rust/graph_view/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs similarity index 86% rename from examples/rust/graph_view/src/visualizers/nodes.rs rename to crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 85980118760d..785c8d16d813 100644 --- a/examples/rust/graph_view/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -1,21 +1,19 @@ +use egui::Color32; +use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; +use re_entity_db::external::re_query::clamped_zip_2x2; +use re_entity_db::external::re_query::range_zip_1x3; +use re_log_types::EntityPath; use re_log_types::Instance; -use re_viewer::external::{ - egui::Color32, - re_chunk::{ChunkComponentIterItem, LatestAtQuery}, - re_log_types::EntityPath, - re_query::{clamped_zip_2x2, range_zip_1x3}, - re_renderer, - re_space_view::{DataResultQuery, RangeResultsExt}, - re_types::{ - self, archetypes, - components::{self}, - ArrowString, Loggable as _, - }, - re_viewer_context::{ - self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, - ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, - VisualizerSystem, - }, +use re_renderer; +use re_space_view::{DataResultQuery, RangeResultsExt}; +use re_types::{ + self, archetypes, + components::{self}, + ArrowString, Loggable as _, +}; +use re_viewer_context::{ + self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, + ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; use crate::types::NodeInstance; diff --git a/crates/viewer/re_viewer/Cargo.toml b/crates/viewer/re_viewer/Cargo.toml index 7cf74b51cdd5..f2a13453a629 100644 --- a/crates/viewer/re_viewer/Cargo.toml +++ b/crates/viewer/re_viewer/Cargo.toml @@ -66,6 +66,7 @@ re_sdk_comms.workspace = true re_smart_channel.workspace = true re_space_view_bar_chart.workspace = true re_space_view_dataframe.workspace = true +re_space_view_graph.workspace = true re_space_view_spatial.workspace = true re_space_view_tensor.workspace = true re_space_view_text_document.workspace = true diff --git a/crates/viewer/re_viewer/src/app.rs b/crates/viewer/re_viewer/src/app.rs index 8bec98fa0df5..60f5544d6926 100644 --- a/crates/viewer/re_viewer/src/app.rs +++ b/crates/viewer/re_viewer/src/app.rs @@ -257,9 +257,10 @@ impl App { } let mut space_view_class_registry = SpaceViewClassRegistry::default(); - if let Err(err) = - populate_space_view_class_registry_with_builtin(&mut space_view_class_registry) - { + if let Err(err) = populate_space_view_class_registry_with_builtin( + &mut space_view_class_registry, + state.app_options(), + ) { re_log::error!( "Failed to populate the view type registry with built-in space views: {}", err @@ -534,6 +535,23 @@ impl App { self.app_options_mut().inspect_blueprint_timeline = show; } + SystemCommand::EnableExperimentalGraphSpaceView(enabled) => { + let result = if enabled { + self.space_view_class_registry + .add_class::() + } else { + self.space_view_class_registry + .remove_class::() + }; + + if let Err(err) = result { + re_log::warn_once!( + "Failed to {} experimental graph space view: {err}", + if enabled { "enable" } else { "disable" } + ); + } + } + SystemCommand::SetSelection(item) => { self.state.selection_state.set_selection(item); } @@ -1710,16 +1728,21 @@ impl eframe::App for App { /// Add built-in space views to the registry. fn populate_space_view_class_registry_with_builtin( space_view_class_registry: &mut SpaceViewClassRegistry, + app_options: &AppOptions, ) -> Result<(), SpaceViewClassRegistryError> { re_tracing::profile_function!(); space_view_class_registry.add_class::()?; + space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; - space_view_class_registry.add_class::()?; + + if app_options.experimental_graph_space_view { + space_view_class_registry.add_class::()?; + } Ok(()) } diff --git a/crates/viewer/re_viewer/src/ui/rerun_menu.rs b/crates/viewer/re_viewer/src/ui/rerun_menu.rs index 5d75274b4a49..b5e12963aae3 100644 --- a/crates/viewer/re_viewer/src/ui/rerun_menu.rs +++ b/crates/viewer/re_viewer/src/ui/rerun_menu.rs @@ -4,7 +4,7 @@ use egui::NumExt as _; use re_log_types::TimeZone; use re_ui::{UICommand, UiExt as _}; -use re_viewer_context::StoreContext; +use re_viewer_context::{StoreContext, SystemCommand, SystemCommandSender}; use crate::App; @@ -295,7 +295,7 @@ fn render_state_ui(ui: &mut egui::Ui, render_state: &egui_wgpu::RenderState) { } fn options_menu_ui( - _command_sender: &re_viewer_context::CommandSender, + command_sender: &re_viewer_context::CommandSender, ui: &mut egui::Ui, frame: &eframe::Frame, app_options: &mut re_viewer_context::AppOptions, @@ -358,7 +358,7 @@ fn options_menu_ui( { ui.add_space(SPACING); ui.label("Experimental features:"); - experimental_feature_ui(ui, app_options); + experimental_feature_ui(command_sender, ui, app_options); } if let Some(_backend) = frame @@ -371,9 +371,9 @@ fn options_menu_ui( { ui.add_space(SPACING); if _backend == wgpu::Backend::BrowserWebGpu { - UICommand::RestartWithWebGl.menu_button_ui(ui, _command_sender); + UICommand::RestartWithWebGl.menu_button_ui(ui, command_sender); } else { - UICommand::RestartWithWebGpu.menu_button_ui(ui, _command_sender); + UICommand::RestartWithWebGpu.menu_button_ui(ui, command_sender); } } } @@ -383,10 +383,23 @@ fn options_menu_ui( // compilation directive to `space_view_screenshot` and remove the one above the call size of this // function!! #[cfg(not(target_arch = "wasm32"))] -fn experimental_feature_ui(ui: &mut egui::Ui, app_options: &mut re_viewer_context::AppOptions) { +fn experimental_feature_ui(command_sender: &re_viewer_context::CommandSender, ui: &mut egui::Ui, app_options: &mut re_viewer_context::AppOptions) { ui .re_checkbox(&mut app_options.experimental_space_view_screenshots, "Space view screenshots") .on_hover_text("Allow taking screenshots of 2D and 3D space views via their context menu. Does not contain labels."); + + if ui + .re_checkbox( + &mut app_options.experimental_graph_space_view, + "Graph space view", + ) + .on_hover_text("Enable the experimental graph space view.") + .clicked() + { + command_sender.send_system(SystemCommand::EnableExperimentalGraphSpaceView( + app_options.experimental_graph_space_view, + )); + } } #[cfg(debug_assertions)] diff --git a/crates/viewer/re_viewer_context/src/app_options.rs b/crates/viewer/re_viewer_context/src/app_options.rs index 0c7cd154edbc..06bfb57d3eda 100644 --- a/crates/viewer/re_viewer_context/src/app_options.rs +++ b/crates/viewer/re_viewer_context/src/app_options.rs @@ -17,6 +17,9 @@ pub struct AppOptions { #[cfg(not(target_arch = "wasm32"))] pub experimental_space_view_screenshots: bool, + /// Enable experimental graph space views. + pub experimental_graph_space_view: bool, + /// Displays an overlay for debugging picking. pub show_picking_debug_overlay: bool, @@ -47,6 +50,8 @@ impl Default for AppOptions { #[cfg(not(target_arch = "wasm32"))] experimental_space_view_screenshots: false, + experimental_graph_space_view: false, + show_picking_debug_overlay: false, inspect_blueprint_timeline: false, diff --git a/crates/viewer/re_viewer_context/src/command_sender.rs b/crates/viewer/re_viewer_context/src/command_sender.rs index 0219a5d31230..a5675706d16f 100644 --- a/crates/viewer/re_viewer_context/src/command_sender.rs +++ b/crates/viewer/re_viewer_context/src/command_sender.rs @@ -62,6 +62,9 @@ pub enum SystemCommand { #[cfg(debug_assertions)] EnableInspectBlueprintTimeline(bool), + /// Enable or disable the experimental graph space views. + EnableExperimentalGraphSpaceView(bool), + /// Set the item selection. SetSelection(crate::Item), diff --git a/crates/viewer/re_viewer_context/src/test_context.rs b/crates/viewer/re_viewer_context/src/test_context.rs index 361adcb50f50..d612cc7e9027 100644 --- a/crates/viewer/re_viewer_context/src/test_context.rs +++ b/crates/viewer/re_viewer_context/src/test_context.rs @@ -166,7 +166,8 @@ impl TestContext { | SystemCommand::ClearAndGenerateBlueprint | SystemCommand::ActivateRecording(_) | SystemCommand::CloseStore(_) - | SystemCommand::CloseAllRecordings => handled = false, + | SystemCommand::CloseAllRecordings + | SystemCommand::EnableExperimentalGraphSpaceView(_) => handled = false, #[cfg(debug_assertions)] SystemCommand::EnableInspectBlueprintTimeline(_) => handled = false, diff --git a/examples/rust/graph_view/Cargo.toml b/examples/rust/graph_view/Cargo.toml deleted file mode 100644 index c303db4f775e..000000000000 --- a/examples/rust/graph_view/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "graph_view" -edition = "2021" -rust-version = "1.76" -license = "MIT OR Apache-2.0" -publish = false - -[features] -default = [] - -# Turn on if you want to share analytics with Rerun (e.g. callstacks on crashes). -analytics = ["re_crash_handler/analytics", "re_viewer/analytics"] - -[dependencies] -re_crash_handler = { path = "../../../crates/utils/re_crash_handler" } -re_force = { path = "../../../crates/utils/re_force" } -re_format = { path = "../../../crates/utils/re_format" } -re_viewer = { path = "../../../crates/viewer/re_viewer", default-features = false } -re_log_types = { path = "../../../crates/store/re_log_types" } - -# We need re_sdk_comms to receive log events from and SDK: -re_sdk_comms = { path = "../../../crates/store/re_sdk_comms", features = [ - "server", -] } - -# mimalloc is a much faster allocator: -mimalloc = "0.1" - -petgraph = "0.6" -bytemuck = "1.18" -thiserror = "1.0" - -# Experiment with different layout algorithms. -layout-rs = "0.1" -fdg-sim = "0.9" -# `fdg` supersedes `fdg-sim` and is more featureful but not released to crates.io yet. -fdg = { git = "https://github.com/grantshandy/fdg", rev = "50755f1dea20249d753600e7e7e51ca33e87b5a1", default-features = false } -rand = "0.8" diff --git a/examples/rust/graph_view/README.md b/examples/rust/graph_view/README.md deleted file mode 100644 index 05c762cec414..000000000000 --- a/examples/rust/graph_view/README.md +++ /dev/null @@ -1 +0,0 @@ -# graph_view diff --git a/examples/rust/graph_view/src/main.rs b/examples/rust/graph_view/src/main.rs deleted file mode 100644 index dd65e1eee8d7..000000000000 --- a/examples/rust/graph_view/src/main.rs +++ /dev/null @@ -1,65 +0,0 @@ -//! This example shows how to add custom Space Views to the Rerun Viewer. - -use re_viewer::external::{re_log, re_memory}; - -mod error; -mod graph; -mod types; -mod ui; -mod view; -mod visualizers; - -// By using `re_memory::AccountingAllocator` Rerun can keep track of exactly how much memory it is using, -// and prune the data store when it goes above a certain limit. -// By using `mimalloc` we get faster allocations. -#[global_allocator] -static GLOBAL: re_memory::AccountingAllocator = - re_memory::AccountingAllocator::new(mimalloc::MiMalloc); - -fn main() -> Result<(), Box> { - // Direct calls using the `log` crate to stderr. Control with `RUST_LOG=debug` etc. - re_log::setup_logging(); - - // Install handlers for panics and crashes that prints to stderr and send - // them to Rerun analytics (if the `analytics` feature is on in `Cargo.toml`). - re_crash_handler::install_crash_handlers(re_viewer::build_info()); - - // Listen for TCP connections from Rerun's logging SDKs. - // There are other ways of "feeding" the viewer though - all you need is a `re_smart_channel::Receiver`. - let rx = re_sdk_comms::serve( - "0.0.0.0", - re_sdk_comms::DEFAULT_SERVER_PORT, - Default::default(), - )?; - - let startup_options = re_viewer::StartupOptions::default(); - - // This is used for analytics, if the `analytics` feature is on in `Cargo.toml` - let app_env = re_viewer::AppEnvironment::Custom("Rerun Graph Viewer".to_owned()); - - println!( - "This example starts a graph viewer that is ready to accept data… you have to give it some!" - ); - println!("Try for example to run: `cargo run -p node_link_graph -- --connect` in another terminal instance."); - - re_viewer::run_native_app( - Box::new(move |cc| { - let mut app = re_viewer::App::new( - re_viewer::build_info(), - &app_env, - startup_options, - cc.egui_ctx.clone(), - cc.storage, - ); - app.add_receiver(rx); - - // Register the custom space view - app.add_space_view_class::().unwrap(); - - Box::new(app) - }), - None, - )?; - - Ok(()) -} diff --git a/examples/rust/graph_view/src/visualizers/mod.rs b/examples/rust/graph_view/src/visualizers/mod.rs deleted file mode 100644 index d55fa4e7662d..000000000000 --- a/examples/rust/graph_view/src/visualizers/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod edges_directed; -mod edges_undirected; -mod nodes; - -pub(crate) use edges_directed::{EdgesDirectedData, EdgesDirectedVisualizer}; -pub(crate) use edges_undirected::{EdgesUndirectedData, EdgesUndirectedVisualizer}; -pub(crate) use nodes::{NodeVisualizer, NodeVisualizerData}; From dda39472153940b77d6b26d36b7a640c4bc4c4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 17:10:24 +0200 Subject: [PATCH 089/159] WIP: fmt --- crates/viewer/re_space_view_graph/src/error.rs | 2 +- crates/viewer/re_viewer/src/ui/rerun_menu.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs index 0cac43dab59e..1f0d5bbafff8 100644 --- a/crates/viewer/re_space_view_graph/src/error.rs +++ b/crates/viewer/re_space_view_graph/src/error.rs @@ -1,5 +1,5 @@ use re_log_types::EntityPath; -use re_types::{datatypes, }; +use re_types::datatypes; use re_viewer_context::SpaceViewSystemExecutionError; #[derive(thiserror::Error, Debug)] diff --git a/crates/viewer/re_viewer/src/ui/rerun_menu.rs b/crates/viewer/re_viewer/src/ui/rerun_menu.rs index b5e12963aae3..3c58fa9aa9e7 100644 --- a/crates/viewer/re_viewer/src/ui/rerun_menu.rs +++ b/crates/viewer/re_viewer/src/ui/rerun_menu.rs @@ -383,12 +383,16 @@ fn options_menu_ui( // compilation directive to `space_view_screenshot` and remove the one above the call size of this // function!! #[cfg(not(target_arch = "wasm32"))] -fn experimental_feature_ui(command_sender: &re_viewer_context::CommandSender, ui: &mut egui::Ui, app_options: &mut re_viewer_context::AppOptions) { +fn experimental_feature_ui( + command_sender: &re_viewer_context::CommandSender, + ui: &mut egui::Ui, + app_options: &mut re_viewer_context::AppOptions, +) { ui .re_checkbox(&mut app_options.experimental_space_view_screenshots, "Space view screenshots") .on_hover_text("Allow taking screenshots of 2D and 3D space views via their context menu. Does not contain labels."); - if ui + if ui .re_checkbox( &mut app_options.experimental_graph_space_view, "Graph space view", From b63f0ed6a32fd87bfa301a4a054bf9551a6f46d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 17:39:25 +0200 Subject: [PATCH 090/159] WIP: fix `Cargo.lock` --- Cargo.lock | 249 +++++++------------ crates/viewer/re_space_view_graph/Cargo.toml | 2 - 2 files changed, 91 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7683fbf0de50..5a543b013324 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -296,7 +296,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -333,13 +333,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9ba0d7248932f4e2a12fb37f0a2e3ec82b3bdedbac2a1dce186e036843b8f8c" dependencies = [ "arrow-arith", - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", + "arrow-array", + "arrow-buffer", "arrow-cast", - "arrow-data 53.1.0", + "arrow-data", "arrow-ord", "arrow-row", - "arrow-schema 53.1.0", + "arrow-schema", "arrow-select", "arrow-string", "pyo3", @@ -351,31 +351,15 @@ version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d60afcdc004841a5c8d8da4f4fa22d64eb19c0c01ef4bcedd77f175a7cf6e38f" dependencies = [ - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "half 2.3.1", "num", ] -[[package]] -name = "arrow-array" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f4a9468c882dc66862cef4e1fd8423d47e67972377d85d80e022786427768c" -dependencies = [ - "ahash", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "chrono", - "half 2.3.1", - "hashbrown 0.14.5", - "num", -] - [[package]] name = "arrow-array" version = "53.1.0" @@ -383,26 +367,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f16835e8599dbbb1659fd869d865254c4cf32c6c2bb60b6942ac9fc36bfa5da" dependencies = [ "ahash", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "half 2.3.1", "hashbrown 0.14.5", "num", ] -[[package]] -name = "arrow-buffer" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c975484888fc95ec4a632cdc98be39c085b1bb518531b0c80c5d462063e5daa1" -dependencies = [ - "bytes", - "half 2.3.1", - "num", -] - [[package]] name = "arrow-buffer" version = "53.1.0" @@ -420,10 +393,10 @@ version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "450e4abb5775bca0740bec0bcf1b1a5ae07eff43bd625661c4436d8e8e4540c4" dependencies = [ - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", "atoi", "base64 0.22.1", @@ -434,26 +407,14 @@ dependencies = [ "ryu", ] -[[package]] -name = "arrow-data" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9d6f18c65ef7a2573ab498c374d8ae364b4a4edf67105357491c031f716ca5" -dependencies = [ - "arrow-buffer 52.2.0", - "arrow-schema 52.2.0", - "half 2.3.1", - "num", -] - [[package]] name = "arrow-data" version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b1e618bbf714c7a9e8d97203c806734f012ff71ae3adc8ad1b075689f540634" dependencies = [ - "arrow-buffer 53.1.0", - "arrow-schema 53.1.0", + "arrow-buffer", + "arrow-schema", "half 2.3.1", "num", ] @@ -474,10 +435,10 @@ version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2427f37b4459a4b9e533045abe87a5183a5e0995a3fc2c2fd45027ae2cc4ef3f" dependencies = [ - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", "half 2.3.1", "num", @@ -490,19 +451,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15959657d92e2261a7a323517640af87f5afd9fd8a6492e424ebee2203c567f6" dependencies = [ "ahash", - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "half 2.3.1", ] -[[package]] -name = "arrow-schema" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8" - [[package]] name = "arrow-schema" version = "53.1.0" @@ -519,10 +474,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b83e5723d307a38bf00ecd2972cd078d1339c7fd3eb044f609958a9a24463f3a" dependencies = [ "ahash", - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "num", ] @@ -532,10 +487,10 @@ version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab3db7c09dd826e74079661d84ed01ed06547cf75d52c2818ef776d0d852305" dependencies = [ - "arrow-array 53.1.0", - "arrow-buffer 53.1.0", - "arrow-data 53.1.0", - "arrow-schema 53.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", "memchr", "num", @@ -755,7 +710,7 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -795,7 +750,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -812,7 +767,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1122,7 +1077,7 @@ checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1133,9 +1088,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.8.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "calloop" @@ -1370,7 +1325,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1799,7 +1754,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1810,7 +1765,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2200,7 +2155,7 @@ checksum = "04d0b288e3bb1d861c4403c1774a6f7a798781dfc519b3647df2a3dd4ae95f25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2221,7 +2176,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2232,7 +2187,7 @@ checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2253,7 +2208,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2399,7 +2354,7 @@ dependencies = [ "document-features", "js-sys", "log", - "tungstenite 0.24.0", + "tungstenite", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -2520,7 +2475,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2610,7 +2565,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2767,7 +2722,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -3039,9 +2994,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -3992,7 +3947,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4066,7 +4021,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4488,12 +4443,12 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 1.9.3", ] [[package]] @@ -4519,7 +4474,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4702,7 +4657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4741,7 +4696,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce97fecd27bc49296e5e20518b5a1bb54a14f7d5fe6228bc9686ee2a74915cc8" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4781,7 +4736,7 @@ dependencies = [ "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.82", + "syn 2.0.79", "tempfile", ] @@ -4802,7 +4757,7 @@ dependencies = [ "prost 0.13.3", "prost-types 0.13.3", "regex", - "syn 2.0.82", + "syn 2.0.79", "tempfile", ] @@ -4816,7 +4771,7 @@ dependencies = [ "itertools 0.10.5", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4829,7 +4784,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4959,7 +4914,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4972,7 +4927,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5119,11 +5074,11 @@ version = "0.17.6" source = "git+https://github.com/rerun-io/re_arrow2?rev=e4717d6debc6d4474ec10db8f629f823f57bad07#e4717d6debc6d4474ec10db8f629f823f57bad07" dependencies = [ "ahash", - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", "arrow-format", - "arrow-schema 52.2.0", + "arrow-schema", "bytemuck", "chrono", "comfy-table", @@ -5935,7 +5890,6 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "bytemuck", "egui", - "rand", "re_chunk", "re_chunk_store", "re_entity_db", @@ -6205,7 +6159,7 @@ dependencies = [ "re_log", "re_tracing", "rust-format", - "syn 2.0.82", + "syn 2.0.79", "tempfile", "unindent", "xshell", @@ -6483,7 +6437,7 @@ dependencies = [ "re_smart_channel", "re_tracing", "thiserror", - "tungstenite 0.23.0", + "tungstenite", ] [[package]] @@ -7040,9 +6994,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "log", "once_cell", @@ -7055,9 +7009,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -7155,7 +7109,7 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7177,7 +7131,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7468,7 +7422,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7496,9 +7450,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.82" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -7646,7 +7600,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7799,7 +7753,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7913,7 +7867,7 @@ dependencies = [ "prost-build 0.13.3", "prost-types 0.13.3", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7982,7 +7936,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8027,27 +7981,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror", - "utf-8", - "webpki-roots", -] - [[package]] name = "twox-hash" version = "1.6.3" @@ -8304,7 +8237,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -8371,7 +8304,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8816,7 +8749,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8827,7 +8760,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -9285,7 +9218,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index d2a745a2c280..92f17c93e4b4 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -38,5 +38,3 @@ egui.workspace = true #TODO(grtlr): check if all of these are still needed bytemuck = "1.18" thiserror = "1.0" - -rand = "0.8" From b4c5ce3831c86411b60149af038e57d2bd03c7e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 22 Oct 2024 17:49:31 +0200 Subject: [PATCH 091/159] WIP: fix imports --- Cargo.lock | 3 +-- crates/viewer/re_space_view_graph/Cargo.toml | 3 +-- crates/viewer/re_space_view_graph/src/view.rs | 6 +----- .../re_space_view_graph/src/visualizers/edges_directed.rs | 4 +--- .../re_space_view_graph/src/visualizers/edges_undirected.rs | 6 ++---- crates/viewer/re_space_view_graph/src/visualizers/nodes.rs | 5 ++--- 6 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a543b013324..272a140d73ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5891,11 +5891,10 @@ dependencies = [ "bytemuck", "egui", "re_chunk", - "re_chunk_store", - "re_entity_db", "re_format", "re_log", "re_log_types", + "re_query", "re_renderer", "re_space_view", "re_tracing", diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 92f17c93e4b4..0e76a103f18f 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -20,11 +20,10 @@ all-features = true [dependencies] re_chunk.workspace = true -re_chunk_store.workspace = true re_format.workspace = true -re_entity_db.workspace = true re_log.workspace = true re_log_types.workspace = true +re_query.workspace = true re_renderer.workspace = true re_space_view.workspace = true re_tracing.workspace = true diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 4e1fa4ebdd02..79a079ef81ba 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,15 +1,11 @@ use std::collections::HashSet; use egui::{self, Rect}; -use re_entity_db::InstancePath; use re_log_types::EntityPath; use re_types::SpaceViewClassIdentifier; use re_ui::{self, UiExt}; use re_viewer_context::{ - IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, - SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, - SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, - SystemExecutionOutput, ViewQuery, ViewerContext, + external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext }; use crate::{ diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs index 0787d55849ea..11d85e49fe52 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs @@ -1,8 +1,6 @@ use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; -use re_entity_db::external::re_query::{clamped_zip_2x1, range_zip_1x1}; +use re_query::{clamped_zip_2x1, range_zip_1x1}; use re_log_types::Instance; - -use re_renderer; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::{ self, archetypes, diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs index 589490706458..7221a6eddd67 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs @@ -1,8 +1,6 @@ -use re_chunk_store::{external::re_chunk::ChunkComponentIterItem, LatestAtQuery}; -use re_entity_db::external::re_query::{clamped_zip_2x1, range_zip_1x1}; +use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; +use re_query::{clamped_zip_2x1, range_zip_1x1}; use re_log_types::Instance; - -use re_renderer; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::{ self, archetypes, diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 785c8d16d813..046e03d6449c 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -1,10 +1,9 @@ use egui::Color32; use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; -use re_entity_db::external::re_query::clamped_zip_2x2; -use re_entity_db::external::re_query::range_zip_1x3; use re_log_types::EntityPath; use re_log_types::Instance; -use re_renderer; +use re_query::clamped_zip_2x2; +use re_query::range_zip_1x3; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::{ self, archetypes, From 812a5d1f96cadeff548fa7d8244ddba11d209d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 23 Oct 2024 11:03:27 +0200 Subject: [PATCH 092/159] WIP: implement radial layout --- .../re_space_view_graph/src/ui/state.rs | 26 ++++++++++-- crates/viewer/re_space_view_graph/src/view.rs | 41 ++++++++++++++----- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index 577e520033ab..e9ce9521f13e 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; +use re_chunk::EntityPath; use re_format::format_f32; use re_ui::UiExt; use re_viewer_context::SpaceViewState; @@ -8,11 +9,24 @@ use crate::graph::NodeIndex; use super::{bounding_rect_from_iter, scene::ViewBuilder}; +#[derive(Debug)] +pub struct RadialLayoutConfig { + pub circle_radius: f32, +} + +impl Default for RadialLayoutConfig { + fn default() -> Self { + Self { + circle_radius: 400.0, + } + } +} + /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] -pub(crate) struct GraphSpaceViewState { +pub struct GraphSpaceViewState { pub viewer: ViewBuilder, /// Indicates if the viewer should fit to the screen the next time it is rendered. @@ -20,8 +34,10 @@ pub(crate) struct GraphSpaceViewState { pub should_tick: bool, /// Positions of the nodes in world space. - pub layout: HashMap, - // pub simulation: Option>, + pub layout: HashMap, egui::Rect)>, + + /// Layout properties. + pub layout_config: RadialLayoutConfig, } impl GraphSpaceViewState { @@ -30,7 +46,9 @@ impl GraphSpaceViewState { .on_hover_text("The bounding box encompassing all Entities in the view right now"); ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(self.layout.values()) { + if let Some(egui::Rect { min, max }) = + bounding_rect_from_iter(self.layout.values().map(|n| &n.1)) + { ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); } diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 79a079ef81ba..9cf180038a47 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,11 +1,16 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; +use std::hash::Hash; use egui::{self, Rect}; use re_log_types::EntityPath; use re_types::SpaceViewClassIdentifier; use re_ui::{self, UiExt}; use re_viewer_context::{ - external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext + external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, + SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, + SpaceViewSpawnHeuristics, SpaceViewState, SpaceViewStateExt as _, + SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, + ViewerContext, }; use crate::{ @@ -17,6 +22,20 @@ use crate::{ #[derive(Default)] pub struct GraphSpaceView; +fn arrange_in_circle(nodes: &mut HashMap, radius: f32) { + let n = nodes.len(); + let center = egui::Pos2::new(0.0, 0.0); + + let nodes_by_entity = nodes.iter().map(|(entity, (ix, _))| (entity, ix)).collect::>(); + + for (i, (_id, (_, rect))) in nodes.iter_mut().enumerate() { + let angle = 2.0 * std::f32::consts::PI * i as f32 / n as f32; + let x = center.x + radius * angle.cos(); + let y = center.y + radius * angle.sin(); + rect.set_center(egui::Pos2::new(x, y)); + } +} + impl SpaceViewClass for GraphSpaceView { // State type as described above. @@ -173,7 +192,7 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let ix = NodeIndex::from(&node); seen.insert(ix); - let current = state.layout.entry(ix).or_insert(egui::Rect::ZERO); + let (_,current) = state.layout.entry(ix).or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -201,7 +220,7 @@ impl SpaceViewClass for GraphSpaceView { for dummy in graph.unknown_nodes() { let ix = NodeIndex::from(&dummy); seen.insert(ix); - let current = state.layout.entry(ix).or_insert(Rect::ZERO); + let (_, current) = state.layout.entry(ix).or_insert((None, Rect::ZERO)); let response = scene.node(current.min, |ui| ui::draw_dummy(ui, &dummy)); *current = response.rect; } @@ -210,7 +229,7 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some(source_pos), Some(target_pos)) = ( + if let (Some((_, source_pos)), Some((_,target_pos))) = ( state.layout.get(&edge.source.into()), state.layout.get(&edge.target.into()), ) { @@ -233,7 +252,7 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some(source_pos), Some(target_pos)) = ( + if let (Some((_,source_pos)), Some((_,target_pos))) = ( state.layout.get(&edge.source.into()), state.layout.get(&edge.target.into()), ) { @@ -252,11 +271,13 @@ impl SpaceViewClass for GraphSpaceView { } }); + arrange_in_circle(&mut state.layout, state.layout_config.circle_radius); + // TODO(grtlr): consider improving this! - // if state.should_fit_to_screen { - // state.viewer.fit_to_screen(); - // state.should_fit_to_screen = false; - // } + if state.should_fit_to_screen { + state.viewer.fit_to_screen(); + state.should_fit_to_screen = false; + } // Clean up the layout for nodes that are no longer present. // state.layout.retain(|k, _| seen.contains(k)); From 85b5963926dc552d45c4015bed6a60ae8f400431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 23 Oct 2024 15:16:05 +0200 Subject: [PATCH 093/159] WIP --- .editorconfig | 5 + .../re_types/definitions/rerun/archetypes.fbs | 4 +- .../definitions/rerun/archetypes/graph.fbs | 27 ++ .../rerun/archetypes/graph_edges_directed.fbs | 32 -- .../archetypes/graph_edges_undirected.fbs | 32 -- .../rerun/archetypes/graph_nodes.fbs | 36 -- .../re_types/definitions/rerun/components.fbs | 6 +- ...aph_edge_undirected.fbs => graph_edge.fbs} | 2 +- .../rerun/components/graph_edge_directed.fbs | 13 - .../{graph_node_id.fbs => graph_node.fbs} | 4 +- .../rerun/components/graph_type.fbs | 11 + .../re_types/definitions/rerun/datatypes.fbs | 4 +- .../rerun/datatypes/graph_edge.fbs | 12 +- .../rerun/datatypes/graph_location.fbs | 19 - .../{graph_node_id.fbs => graph_node.fbs} | 4 +- .../rerun/datatypes/graph_type.fbs | 19 + .../re_types/src/archetypes/.gitattributes | 4 +- crates/store/re_types/src/archetypes/graph.rs | 258 +++++++++++++ .../src/archetypes/graph_edges_directed.rs | 303 ---------------- .../src/archetypes/graph_edges_undirected.rs | 303 ---------------- .../re_types/src/archetypes/graph_nodes.rs | 336 ----------------- crates/store/re_types/src/archetypes/mod.rs | 8 +- .../re_types/src/components/.gitattributes | 6 +- .../{graph_edge_directed.rs => graph_edge.rs} | 20 +- .../{graph_node_id.rs => graph_node.rs} | 36 +- ...graph_edge_undirected.rs => graph_type.rs} | 47 ++- crates/store/re_types/src/components/mod.rs | 12 +- .../re_types/src/datatypes/.gitattributes | 4 +- .../re_types/src/datatypes/graph_edge.rs | 146 +++++++- .../re_types/src/datatypes/graph_edge_ext.rs | 26 -- .../re_types/src/datatypes/graph_location.rs | 341 ------------------ .../src/datatypes/graph_location_ext.rs | 16 - .../{graph_node_id.rs => graph_node.rs} | 28 +- ...graph_node_id_ext.rs => graph_node_ext.rs} | 8 +- .../re_types/src/datatypes/graph_type.rs | 153 ++++++++ crates/store/re_types/src/datatypes/mod.rs | 12 +- crates/viewer/re_viewer/src/reflection/mod.rs | 98 +---- docs/content/reference/types/archetypes.md | 4 +- .../reference/types/archetypes/.gitattributes | 4 +- .../reference/types/archetypes/graph.md | 26 ++ .../types/archetypes/graph_edges_directed.md | 24 -- .../archetypes/graph_edges_undirected.md | 24 -- .../reference/types/archetypes/graph_nodes.md | 24 -- docs/content/reference/types/components.md | 6 +- .../reference/types/components/.gitattributes | 6 +- .../reference/types/components/class_id.md | 3 - .../reference/types/components/color.md | 3 - .../reference/types/components/graph_edge.md | 20 + .../types/components/graph_edge_directed.md | 20 - .../types/components/graph_edge_undirected.md | 20 - .../reference/types/components/graph_node.md | 20 + .../types/components/graph_node_id.md | 20 - .../reference/types/components/graph_type.md | 20 + .../reference/types/components/position2d.md | 2 +- .../reference/types/components/show_labels.md | 3 - .../reference/types/components/text.md | 3 - docs/content/reference/types/datatypes.md | 4 +- .../reference/types/datatypes/.gitattributes | 4 +- .../reference/types/datatypes/entity_path.md | 11 +- .../reference/types/datatypes/graph_edge.md | 7 +- .../types/datatypes/graph_location.md | 23 -- .../reference/types/datatypes/graph_node.md | 21 ++ .../types/datatypes/graph_node_id.md | 21 -- .../reference/types/datatypes/graph_type.md | 21 ++ rerun_cpp/src/rerun/archetypes.hpp | 4 +- rerun_cpp/src/rerun/archetypes/.gitattributes | 8 +- .../{graph_edges_directed.cpp => graph.cpp} | 31 +- rerun_cpp/src/rerun/archetypes/graph.hpp | 86 +++++ .../rerun/archetypes/graph_edges_directed.hpp | 102 ------ .../archetypes/graph_edges_undirected.cpp | 53 --- .../archetypes/graph_edges_undirected.hpp | 102 ------ .../src/rerun/archetypes/graph_nodes.cpp | 58 --- .../src/rerun/archetypes/graph_nodes.hpp | 112 ------ rerun_cpp/src/rerun/components.hpp | 6 +- rerun_cpp/src/rerun/components/.gitattributes | 6 +- ...graph_edge_directed.hpp => graph_edge.hpp} | 20 +- .../{graph_node_id.hpp => graph_node.hpp} | 38 +- ...aph_edge_undirected.hpp => graph_type.hpp} | 41 +-- rerun_cpp/src/rerun/datatypes.hpp | 4 +- rerun_cpp/src/rerun/datatypes/.gitattributes | 8 +- rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 42 +-- rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 6 +- .../src/rerun/datatypes/graph_location.cpp | 90 ----- .../{graph_node_id.cpp => graph_node.cpp} | 16 +- .../{graph_node_id.hpp => graph_node.hpp} | 23 +- rerun_cpp/src/rerun/datatypes/graph_type.cpp | 56 +++ .../{graph_location.hpp => graph_type.hpp} | 42 +-- .../rerun_sdk/rerun/archetypes/.gitattributes | 4 +- .../rerun_sdk/rerun/archetypes/__init__.py | 8 +- rerun_py/rerun_sdk/rerun/archetypes/graph.py | 111 ++++++ .../rerun/archetypes/graph_edges_directed.py | 124 ------- .../archetypes/graph_edges_undirected.py | 124 ------- .../rerun_sdk/rerun/archetypes/graph_nodes.py | 144 -------- .../rerun_sdk/rerun/components/.gitattributes | 6 +- .../rerun_sdk/rerun/components/__init__.py | 24 +- .../rerun_sdk/rerun/components/graph_edge.py | 36 ++ .../rerun/components/graph_edge_directed.py | 36 -- .../rerun/components/graph_edge_undirected.py | 36 -- .../rerun_sdk/rerun/components/graph_node.py | 36 ++ .../rerun/components/graph_node_id.py | 36 -- .../rerun_sdk/rerun/components/graph_type.py | 36 ++ .../rerun_sdk/rerun/datatypes/.gitattributes | 4 +- .../rerun_sdk/rerun/datatypes/__init__.py | 30 +- .../rerun_sdk/rerun/datatypes/graph_edge.py | 46 ++- .../rerun/datatypes/graph_location.py | 108 ------ .../{graph_node_id.py => graph_node.py} | 38 +- .../rerun_sdk/rerun/datatypes/graph_type.py | 74 ++++ 107 files changed, 1529 insertions(+), 3245 deletions(-) create mode 100644 .editorconfig create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph.fbs delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs rename crates/store/re_types/definitions/rerun/components/{graph_edge_undirected.fbs => graph_edge.fbs} (92%) delete mode 100644 crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs rename crates/store/re_types/definitions/rerun/components/{graph_node_id.fbs => graph_node.fbs} (85%) create mode 100644 crates/store/re_types/definitions/rerun/components/graph_type.fbs delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs rename crates/store/re_types/definitions/rerun/datatypes/{graph_node_id.fbs => graph_node.fbs} (85%) create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs create mode 100644 crates/store/re_types/src/archetypes/graph.rs delete mode 100644 crates/store/re_types/src/archetypes/graph_edges_directed.rs delete mode 100644 crates/store/re_types/src/archetypes/graph_edges_undirected.rs delete mode 100644 crates/store/re_types/src/archetypes/graph_nodes.rs rename crates/store/re_types/src/components/{graph_edge_directed.rs => graph_edge.rs} (86%) rename crates/store/re_types/src/components/{graph_node_id.rs => graph_node.rs} (69%) rename crates/store/re_types/src/components/{graph_edge_undirected.rs => graph_type.rs} (63%) delete mode 100644 crates/store/re_types/src/datatypes/graph_edge_ext.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_location.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_location_ext.rs rename crates/store/re_types/src/datatypes/{graph_node_id.rs => graph_node.rs} (88%) rename crates/store/re_types/src/datatypes/{graph_node_id_ext.rs => graph_node_ext.rs} (59%) create mode 100644 crates/store/re_types/src/datatypes/graph_type.rs create mode 100644 docs/content/reference/types/archetypes/graph.md delete mode 100644 docs/content/reference/types/archetypes/graph_edges_directed.md delete mode 100644 docs/content/reference/types/archetypes/graph_edges_undirected.md delete mode 100644 docs/content/reference/types/archetypes/graph_nodes.md create mode 100644 docs/content/reference/types/components/graph_edge.md delete mode 100644 docs/content/reference/types/components/graph_edge_directed.md delete mode 100644 docs/content/reference/types/components/graph_edge_undirected.md create mode 100644 docs/content/reference/types/components/graph_node.md delete mode 100644 docs/content/reference/types/components/graph_node_id.md create mode 100644 docs/content/reference/types/components/graph_type.md delete mode 100644 docs/content/reference/types/datatypes/graph_location.md create mode 100644 docs/content/reference/types/datatypes/graph_node.md delete mode 100644 docs/content/reference/types/datatypes/graph_node_id.md create mode 100644 docs/content/reference/types/datatypes/graph_type.md rename rerun_cpp/src/rerun/archetypes/{graph_edges_directed.cpp => graph.cpp} (65%) create mode 100644 rerun_cpp/src/rerun/archetypes/graph.hpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.cpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.hpp rename rerun_cpp/src/rerun/components/{graph_edge_directed.hpp => graph_edge.hpp} (79%) rename rerun_cpp/src/rerun/components/{graph_node_id.hpp => graph_node.hpp} (58%) rename rerun_cpp/src/rerun/components/{graph_edge_undirected.hpp => graph_type.hpp} (52%) delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_location.cpp rename rerun_cpp/src/rerun/datatypes/{graph_node_id.cpp => graph_node.cpp} (82%) rename rerun_cpp/src/rerun/datatypes/{graph_node_id.hpp => graph_node.hpp} (69%) create mode 100644 rerun_cpp/src/rerun/datatypes/graph_type.cpp rename rerun_cpp/src/rerun/datatypes/{graph_location.hpp => graph_type.hpp} (50%) create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph.py delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_type.py delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_location.py rename rerun_py/rerun_sdk/rerun/datatypes/{graph_node_id.py => graph_node.py} (50%) create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_type.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..ba1d27e908cd --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*.fbs] +indent_style = space +indent_size = 2 diff --git a/crates/store/re_types/definitions/rerun/archetypes.fbs b/crates/store/re_types/definitions/rerun/archetypes.fbs index fab88b42ca62..ff750afc6274 100644 --- a/crates/store/re_types/definitions/rerun/archetypes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes.fbs @@ -13,9 +13,7 @@ include "./archetypes/depth_image.fbs"; include "./archetypes/disconnected_space.fbs"; include "./archetypes/ellipsoids3d.fbs"; include "./archetypes/encoded_image.fbs"; -include "./archetypes/graph_edges_directed.fbs"; -include "./archetypes/graph_edges_undirected.fbs"; -include "./archetypes/graph_nodes.fbs"; +include "./archetypes/graph.fbs"; include "./archetypes/image.fbs"; include "./archetypes/instance_poses3d.fbs"; include "./archetypes/line_strips2d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph.fbs new file mode 100644 index 000000000000..a52668b9b36e --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph.fbs @@ -0,0 +1,27 @@ +namespace rerun.archetypes; + +/// A graph that consists of nodes and edges. +/// +/// By default, the graph is undirected. +table Graph ( + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of nodes. + nodes: [rerun.components.GraphNode] ("attr.rerun.component_required", order: 1000); + + // --- Recommended --- + + /// A list of edges. + edges: [rerun.components.GraphEdge] ("attr.rerun.component_recommended", nullable, order: 2000); + + /// Specifies if the graph is directed or undirected. + graph_type: rerun.components.GraphType ("attr.rerun.component_recommended", nullable, order: 2100); + + // --- Optional --- + + /// The position for each of the nodes. + node_positions: [rerun.components.Position2D] ("attr.rerun.component_optional", nullable, order: 3000); +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs deleted file mode 100644 index 6ba7008d2a04..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs +++ /dev/null @@ -1,32 +0,0 @@ -namespace rerun.archetypes; - -// --- - -/// A list of directed edges in a graph with optional labels, colors, etc. -table GraphEdgesDirected ( - "attr.rust.derive": "PartialEq, Eq", - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of node IDs. - edges: [rerun.components.GraphEdgeDirected] ("attr.rerun.component_required", order: 1000); - - - // --- Optional --- - - /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); - - /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); -} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs deleted file mode 100644 index aa859ba27e15..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs +++ /dev/null @@ -1,32 +0,0 @@ -namespace rerun.archetypes; - -// --- - -/// A list of undirected edges in a graph with optional labels, colors, etc. -table GraphEdgesUndirected ( - "attr.rust.derive": "PartialEq, Eq", - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of node IDs. - edges: [rerun.components.GraphEdgeUndirected] ("attr.rerun.component_required", order: 1000); - - - // --- Optional --- - - /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); - - /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); -} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs deleted file mode 100644 index d6f82df6b1ec..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs +++ /dev/null @@ -1,36 +0,0 @@ -namespace rerun.archetypes; - -// --- - -/// A list of nodes in a graph with optional labels, colors, etc. -table GraphNodes ( - "attr.rust.derive": "PartialEq", - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of node IDs. - node_ids: [rerun.components.GraphNodeId] ("attr.rerun.component_required", order: 1000); - - // --- Recommended --- - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 2000); - - // --- Optional --- - - /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); - - /// Optional center positions of the nodes. - centers: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); - - /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); -} diff --git a/crates/store/re_types/definitions/rerun/components.fbs b/crates/store/re_types/definitions/rerun/components.fbs index 6a5d335c3f25..0a3aebf0603c 100644 --- a/crates/store/re_types/definitions/rerun/components.fbs +++ b/crates/store/re_types/definitions/rerun/components.fbs @@ -16,9 +16,9 @@ include "./components/entity_path.fbs"; include "./components/fill_mode.fbs"; include "./components/fill_ratio.fbs"; include "./components/gamma_correction.fbs"; -include "./components/graph_edge_directed.fbs"; -include "./components/graph_edge_undirected.fbs"; -include "./components/graph_node_id.fbs"; +include "./components/graph_edge.fbs"; +include "./components/graph_node.fbs"; +include "./components/graph_type.fbs"; include "./components/half_size2d.fbs"; include "./components/half_size3d.fbs"; include "./components/image_buffer.fbs"; diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs similarity index 92% rename from crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs rename to crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 6788b8ac6061..d5cd18e3772d 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -3,7 +3,7 @@ namespace rerun.components; // --- /// An undirected edge in a graph connecting two nodes. -table GraphEdgeUndirected ( +table GraphEdge ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs deleted file mode 100644 index 4c406561fbd1..000000000000 --- a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs +++ /dev/null @@ -1,13 +0,0 @@ -namespace rerun.components; - -// --- - -/// A directed edge in a graph connecting two nodes. -table GraphEdgeDirected ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.repr": "transparent", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - edge: rerun.datatypes.GraphEdge (order: 100); -} diff --git a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/components/graph_node.fbs similarity index 85% rename from crates/store/re_types/definitions/rerun/components/graph_node_id.fbs rename to crates/store/re_types/definitions/rerun/components/graph_node.fbs index 7080453f25c1..10f5a8bc9bc1 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node.fbs @@ -3,7 +3,7 @@ namespace rerun.components; // --- /// A 32-bit ID representing a node in a graph. -table GraphNodeId ( +table GraphNode ( "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", @@ -11,5 +11,5 @@ table GraphNodeId ( "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - id: rerun.datatypes.GraphNodeId (order: 100); + id: rerun.datatypes.GraphNode (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs new file mode 100644 index 000000000000..eaaab78a0617 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_type.fbs @@ -0,0 +1,11 @@ +namespace rerun.components; + +/// An undirected edge in a graph connecting two nodes. +struct GraphType ( + "attr.rust.derive": "Default, PartialEq, Eq", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + graph_type: rerun.datatypes.GraphType (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 8861f2830e64..8786552bc468 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -13,8 +13,8 @@ include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; include "./datatypes/graph_edge.fbs"; -include "./datatypes/graph_location.fbs"; -include "./datatypes/graph_node_id.fbs"; +include "./datatypes/graph_node.fbs"; +include "./datatypes/graph_type.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs index 170216ea1cde..1717a1bec1ef 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -1,16 +1,14 @@ -include "graph_location.fbs"; - namespace rerun.datatypes; /// Represents an edge in a graph connecting two nodes (possibly in different entities). table GraphEdge ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { /// The id of the source node. - source: rerun.datatypes.GraphLocation (order: 100); + source: rerun.datatypes.GraphNode (order: 100); /// The id of the target node. - target: rerun.datatypes.GraphLocation (order: 200); + target: rerun.datatypes.GraphNode (order: 200); } diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs deleted file mode 100644 index fbe9a25da3ce..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs +++ /dev/null @@ -1,19 +0,0 @@ -include "entity_path.fbs"; -include "graph_node_id.fbs"; - -namespace rerun.datatypes; - -/// Uniquely identifies a node in a graph by its entity path and node id. -/// -/// We require this because the same node id can be used in multiple entities. -table GraphLocation ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - /// The entity path that specifies where to find the node. - entity_path: rerun.datatypes.EntityPath (order: 100); - - /// The id of the node. - node_id: rerun.datatypes.GraphNodeId (order: 200); -} diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs similarity index 85% rename from crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs rename to crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs index 17cd44af794c..636f4a1d47a8 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs @@ -1,7 +1,7 @@ namespace rerun.datatypes; -/// A 32-bit ID representing a node in a graph. -table GraphNodeId ( +/// A string ID representing a node in a graph. +table GraphNode ( "attr.arrow.transparent", "attr.python.aliases": "str", "attr.python.array_aliases": "Sequence[str]", diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs new file mode 100644 index 000000000000..c18487f97e82 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs @@ -0,0 +1,19 @@ +namespace rerun.datatypes; + +// -- + +/// Specifies if a graph has directed or undirected edges. +enum GraphType: ubyte ( + "attr.rust.derive": "Default, PartialEq, Eq", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// Invalid value. Won't show up in generated types. + Invalid = 0, + + /// The graph has undirected edges. + Undirected (default), + + /// The graph has directed edges. + Directed, +} diff --git a/crates/store/re_types/src/archetypes/.gitattributes b/crates/store/re_types/src/archetypes/.gitattributes index 81c3d8f1adea..9667ed7ff477 100644 --- a/crates/store/re_types/src/archetypes/.gitattributes +++ b/crates/store/re_types/src/archetypes/.gitattributes @@ -13,9 +13,7 @@ depth_image.rs linguist-generated=true disconnected_space.rs linguist-generated=true ellipsoids3d.rs linguist-generated=true encoded_image.rs linguist-generated=true -graph_edges_directed.rs linguist-generated=true -graph_edges_undirected.rs linguist-generated=true -graph_nodes.rs linguist-generated=true +graph.rs linguist-generated=true image.rs linguist-generated=true instance_poses3d.rs linguist-generated=true line_strips2d.rs linguist-generated=true diff --git a/crates/store/re_types/src/archetypes/graph.rs b/crates/store/re_types/src/archetypes/graph.rs new file mode 100644 index 000000000000..55170f95ad26 --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph.rs @@ -0,0 +1,258 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A graph that consists of nodes and edges. +/// +/// By default, the graph is undirected. +#[derive(Clone, Debug)] +pub struct Graph { + /// A list of nodes. + pub nodes: Vec, + + /// A list of edges. + pub edges: Option>, + + /// Specifies if the graph is directed or undirected. + pub graph_type: Option, + + /// The position for each of the nodes. + pub node_positions: Option>, +} + +impl ::re_types_core::SizeBytes for Graph { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.nodes.heap_size_bytes() + + self.edges.heap_size_bytes() + + self.graph_type.heap_size_bytes() + + self.node_positions.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphNode".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdge".into(), + "rerun.components.GraphType".into(), + "rerun.components.GraphIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.Position2D".into()]); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 5usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphNode".into(), + "rerun.components.GraphEdge".into(), + "rerun.components.GraphType".into(), + "rerun.components.GraphIndicator".into(), + "rerun.components.Position2D".into(), + ] + }); + +impl Graph { + /// The total number of components in the archetype: 1 required, 3 recommended, 1 optional + pub const NUM_COMPONENTS: usize = 5usize; +} + +/// Indicator component for the [`Graph`] [`::re_types_core::Archetype`] +pub type GraphIndicator = ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for Graph { + type Indicator = GraphIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.Graph".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphIndicator = GraphIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let nodes = { + let array = arrays_by_name + .get("rerun.components.GraphNode") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.Graph#nodes")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.Graph#nodes")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.Graph#nodes")? + }; + let edges = if let Some(array) = arrays_by_name.get("rerun.components.GraphEdge") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.Graph#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.Graph#edges")? + }) + } else { + None + }; + let graph_type = if let Some(array) = arrays_by_name.get("rerun.components.GraphType") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.Graph#graph_type")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let node_positions = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") + { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.Graph#node_positions")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.Graph#node_positions")? + }) + } else { + None + }; + Ok(Self { + nodes, + edges, + graph_type, + node_positions, + }) + } +} + +impl ::re_types_core::AsComponents for Graph { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.nodes as &dyn ComponentBatch).into()), + self.edges + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.graph_type + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.node_positions + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for Graph {} + +impl Graph { + /// Create a new `Graph`. + #[inline] + pub fn new(nodes: impl IntoIterator>) -> Self { + Self { + nodes: nodes.into_iter().map(Into::into).collect(), + edges: None, + graph_type: None, + node_positions: None, + } + } + + /// A list of edges. + #[inline] + pub fn with_edges( + mut self, + edges: impl IntoIterator>, + ) -> Self { + self.edges = Some(edges.into_iter().map(Into::into).collect()); + self + } + + /// Specifies if the graph is directed or undirected. + #[inline] + pub fn with_graph_type(mut self, graph_type: impl Into) -> Self { + self.graph_type = Some(graph_type.into()); + self + } + + /// The position for each of the nodes. + #[inline] + pub fn with_node_positions( + mut self, + node_positions: impl IntoIterator>, + ) -> Self { + self.node_positions = Some(node_positions.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_edges_directed.rs b/crates/store/re_types/src/archetypes/graph_edges_directed.rs deleted file mode 100644 index cee936099e80..000000000000 --- a/crates/store/re_types/src/archetypes/graph_edges_directed.rs +++ /dev/null @@ -1,303 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GraphEdgesDirected { - /// A list of node IDs. - pub edges: Vec, - - /// Optional colors for the boxes. - pub colors: Option>, - - /// Optional text labels for the node. - pub labels: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, -} - -impl ::re_types_core::SizeBytes for GraphEdgesDirected { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.edges.heap_size_bytes() - + self.colors.heap_size_bytes() - + self.labels.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeDirected".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Color".into(), - "rerun.components.GraphEdgesDirectedIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphEdgeDirected".into(), - "rerun.components.Color".into(), - "rerun.components.GraphEdgesDirectedIndicator".into(), - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -impl GraphEdgesDirected { - /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 6usize; -} - -/// Indicator component for the [`GraphEdgesDirected`] [`::re_types_core::Archetype`] -pub type GraphEdgesDirectedIndicator = - ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for GraphEdgesDirected { - type Indicator = GraphEdgesDirectedIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphEdgesDirected".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph edges directed" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphEdgesDirectedIndicator = GraphEdgesDirectedIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let edges = { - let array = arrays_by_name - .get("rerun.components.GraphEdgeDirected") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphEdgesDirected#edges")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#edges")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#edges")? - }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#colors")? - }) - } else { - None - }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#labels")? - }) - } else { - None - }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? - }) - } else { - None - }; - Ok(Self { - edges, - colors, - labels, - show_labels, - class_ids, - }) - } -} - -impl ::re_types_core::AsComponents for GraphEdgesDirected { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.edges as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesDirected {} - -impl GraphEdgesDirected { - /// Create a new `GraphEdgesDirected`. - #[inline] - pub fn new( - edges: impl IntoIterator>, - ) -> Self { - Self { - edges: edges.into_iter().map(Into::into).collect(), - colors: None, - labels: None, - show_labels: None, - class_ids: None, - } - } - - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - #[inline] - pub fn with_class_ids( - mut self, - class_ids: impl IntoIterator>, - ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/graph_edges_undirected.rs b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs deleted file mode 100644 index cac910e150ec..000000000000 --- a/crates/store/re_types/src/archetypes/graph_edges_undirected.rs +++ /dev/null @@ -1,303 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GraphEdgesUndirected { - /// A list of node IDs. - pub edges: Vec, - - /// Optional colors for the boxes. - pub colors: Option>, - - /// Optional text labels for the node. - pub labels: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, -} - -impl ::re_types_core::SizeBytes for GraphEdgesUndirected { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.edges.heap_size_bytes() - + self.colors.heap_size_bytes() - + self.labels.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeUndirected".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Color".into(), - "rerun.components.GraphEdgesUndirectedIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphEdgeUndirected".into(), - "rerun.components.Color".into(), - "rerun.components.GraphEdgesUndirectedIndicator".into(), - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -impl GraphEdgesUndirected { - /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 6usize; -} - -/// Indicator component for the [`GraphEdgesUndirected`] [`::re_types_core::Archetype`] -pub type GraphEdgesUndirectedIndicator = - ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for GraphEdgesUndirected { - type Indicator = GraphEdgesUndirectedIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphEdgesUndirected".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph edges undirected" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphEdgesUndirectedIndicator = GraphEdgesUndirectedIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let edges = { - let array = arrays_by_name - .get("rerun.components.GraphEdgeUndirected") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? - }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? - }) - } else { - None - }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? - }) - } else { - None - }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? - }) - } else { - None - }; - Ok(Self { - edges, - colors, - labels, - show_labels, - class_ids, - }) - } -} - -impl ::re_types_core::AsComponents for GraphEdgesUndirected { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.edges as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesUndirected {} - -impl GraphEdgesUndirected { - /// Create a new `GraphEdgesUndirected`. - #[inline] - pub fn new( - edges: impl IntoIterator>, - ) -> Self { - Self { - edges: edges.into_iter().map(Into::into).collect(), - colors: None, - labels: None, - show_labels: None, - class_ids: None, - } - } - - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - #[inline] - pub fn with_class_ids( - mut self, - class_ids: impl IntoIterator>, - ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs deleted file mode 100644 index 14620a3973c4..000000000000 --- a/crates/store/re_types/src/archetypes/graph_nodes.rs +++ /dev/null @@ -1,336 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq)] -pub struct GraphNodes { - /// A list of node IDs. - pub node_ids: Vec, - - /// Optional text labels for the node. - pub labels: Option>, - - /// Optional colors for the boxes. - pub colors: Option>, - - /// Optional center positions of the nodes. - pub centers: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, -} - -impl ::re_types_core::SizeBytes for GraphNodes { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.node_ids.heap_size_bytes() - + self.labels.heap_size_bytes() - + self.colors.heap_size_bytes() - + self.centers.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >>::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphNodeId".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Color".into(), - "rerun.components.Position2D".into(), - "rerun.components.GraphNodesIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 7usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphNodeId".into(), - "rerun.components.Color".into(), - "rerun.components.Position2D".into(), - "rerun.components.GraphNodesIndicator".into(), - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -impl GraphNodes { - /// The total number of components in the archetype: 1 required, 3 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 7usize; -} - -/// Indicator component for the [`GraphNodes`] [`::re_types_core::Archetype`] -pub type GraphNodesIndicator = ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for GraphNodes { - type Indicator = GraphNodesIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphNodes".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph nodes" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphNodesIndicator = GraphNodesIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let node_ids = { - let array = arrays_by_name - .get("rerun.components.GraphNodeId") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphNodes#node_ids")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#node_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#node_ids")? - }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#labels")? - }) - } else { - None - }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#colors")? - }) - } else { - None - }; - let centers = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#centers")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#centers")? - }) - } else { - None - }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#class_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#class_ids")? - }) - } else { - None - }; - Ok(Self { - node_ids, - labels, - colors, - centers, - show_labels, - class_ids, - }) - } -} - -impl ::re_types_core::AsComponents for GraphNodes { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.node_ids as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.centers - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for GraphNodes {} - -impl GraphNodes { - /// Create a new `GraphNodes`. - #[inline] - pub fn new( - node_ids: impl IntoIterator>, - ) -> Self { - Self { - node_ids: node_ids.into_iter().map(Into::into).collect(), - labels: None, - colors: None, - centers: None, - show_labels: None, - class_ids: None, - } - } - - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - - /// Optional center positions of the nodes. - #[inline] - pub fn with_centers( - mut self, - centers: impl IntoIterator>, - ) -> Self { - self.centers = Some(centers.into_iter().map(Into::into).collect()); - self - } - - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - #[inline] - pub fn with_class_ids( - mut self, - class_ids: impl IntoIterator>, - ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 57e15f07ff54..35f9e5cf33ae 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -21,9 +21,7 @@ mod ellipsoids3d; mod ellipsoids3d_ext; mod encoded_image; mod encoded_image_ext; -mod graph_edges_directed; -mod graph_edges_undirected; -mod graph_nodes; +mod graph; mod image; mod image_ext; mod instance_poses3d; @@ -64,9 +62,7 @@ pub use self::depth_image::DepthImage; pub use self::disconnected_space::DisconnectedSpace; pub use self::ellipsoids3d::Ellipsoids3D; pub use self::encoded_image::EncodedImage; -pub use self::graph_edges_directed::GraphEdgesDirected; -pub use self::graph_edges_undirected::GraphEdgesUndirected; -pub use self::graph_nodes::GraphNodes; +pub use self::graph::Graph; pub use self::image::Image; pub use self::instance_poses3d::InstancePoses3D; pub use self::line_strips2d::LineStrips2D; diff --git a/crates/store/re_types/src/components/.gitattributes b/crates/store/re_types/src/components/.gitattributes index bccd38dfe671..5c1d3e6ff0dc 100644 --- a/crates/store/re_types/src/components/.gitattributes +++ b/crates/store/re_types/src/components/.gitattributes @@ -16,9 +16,9 @@ entity_path.rs linguist-generated=true fill_mode.rs linguist-generated=true fill_ratio.rs linguist-generated=true gamma_correction.rs linguist-generated=true -graph_edge_directed.rs linguist-generated=true -graph_edge_undirected.rs linguist-generated=true -graph_node_id.rs linguist-generated=true +graph_edge.rs linguist-generated=true +graph_node.rs linguist-generated=true +graph_type.rs linguist-generated=true half_size2d.rs linguist-generated=true half_size3d.rs linguist-generated=true image_buffer.rs linguist-generated=true diff --git a/crates/store/re_types/src/components/graph_edge_directed.rs b/crates/store/re_types/src/components/graph_edge.rs similarity index 86% rename from crates/store/re_types/src/components/graph_edge_directed.rs rename to crates/store/re_types/src/components/graph_edge.rs index 32590c811970..7ca3db3d999d 100644 --- a/crates/store/re_types/src/components/graph_edge_directed.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -22,9 +22,9 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdgeDirected(pub crate::datatypes::GraphEdge); +pub struct GraphEdge(pub crate::datatypes::GraphEdge); -impl ::re_types_core::SizeBytes for GraphEdgeDirected { +impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,20 +36,20 @@ impl ::re_types_core::SizeBytes for GraphEdgeDirected { } } -impl> From for GraphEdgeDirected { +impl> From for GraphEdge { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdgeDirected { +impl std::borrow::Borrow for GraphEdge { #[inline] fn borrow(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::Deref for GraphEdgeDirected { +impl std::ops::Deref for GraphEdge { type Target = crate::datatypes::GraphEdge; #[inline] @@ -58,21 +58,21 @@ impl std::ops::Deref for GraphEdgeDirected { } } -impl std::ops::DerefMut for GraphEdgeDirected { +impl std::ops::DerefMut for GraphEdge { #[inline] fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdgeDirected); +::re_types_core::macros::impl_into_cow!(GraphEdge); -impl ::re_types_core::Loggable for GraphEdgeDirected { +impl ::re_types_core::Loggable for GraphEdge { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdgeDirected".into() + "rerun.components.GraphEdge".into() } #[inline] diff --git a/crates/store/re_types/src/components/graph_node_id.rs b/crates/store/re_types/src/components/graph_node.rs similarity index 69% rename from crates/store/re_types/src/components/graph_node_id.rs rename to crates/store/re_types/src/components/graph_node.rs index 9f4a51bf95c5..43c71a86f1ba 100644 --- a/crates/store/re_types/src/components/graph_node_id.rs +++ b/crates/store/re_types/src/components/graph_node.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -22,9 +22,9 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNodeId(pub crate::datatypes::GraphNodeId); +pub struct GraphNode(pub crate::datatypes::GraphNode); -impl ::re_types_core::SizeBytes for GraphNodeId { +impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphNodeId { +impl> From for GraphNode { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphNodeId { +impl std::borrow::Borrow for GraphNode { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphNodeId { + fn borrow(&self) -> &crate::datatypes::GraphNode { &self.0 } } -impl std::ops::Deref for GraphNodeId { - type Target = crate::datatypes::GraphNodeId; +impl std::ops::Deref for GraphNode { + type Target = crate::datatypes::GraphNode; #[inline] - fn deref(&self) -> &crate::datatypes::GraphNodeId { + fn deref(&self) -> &crate::datatypes::GraphNode { &self.0 } } -impl std::ops::DerefMut for GraphNodeId { +impl std::ops::DerefMut for GraphNode { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNodeId { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNode { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphNodeId); +::re_types_core::macros::impl_into_cow!(GraphNode); -impl ::re_types_core::Loggable for GraphNodeId { +impl ::re_types_core::Loggable for GraphNode { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphNodeId".into() + "rerun.components.GraphNode".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphNodeId::arrow_datatype() + crate::datatypes::GraphNode::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphNodeId { where Self: Clone + 'a, { - crate::datatypes::GraphNodeId::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphNode::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,7 @@ impl ::re_types_core::Loggable for GraphNodeId { where Self: Sized, { - crate::datatypes::GraphNodeId::from_arrow_opt(arrow_data) + crate::datatypes::GraphNode::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/graph_edge_undirected.rs b/crates/store/re_types/src/components/graph_type.rs similarity index 63% rename from crates/store/re_types/src/components/graph_edge_undirected.rs rename to crates/store/re_types/src/components/graph_type.rs index 4fed04ebf720..fbb48bca80db 100644 --- a/crates/store/re_types/src/components/graph_edge_undirected.rs +++ b/crates/store/re_types/src/components/graph_type.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -19,12 +19,12 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: An undirected edge in a graph connecting two nodes. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, Default, PartialEq, Eq)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdgeUndirected(pub crate::datatypes::GraphEdge); +pub struct GraphType(pub crate::datatypes::GraphType); -impl ::re_types_core::SizeBytes for GraphEdgeUndirected { +impl ::re_types_core::SizeBytes for GraphType { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphEdgeUndirected { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphEdgeUndirected { +impl> From for GraphType { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdgeUndirected { +impl std::borrow::Borrow for GraphType { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphEdge { + fn borrow(&self) -> &crate::datatypes::GraphType { &self.0 } } -impl std::ops::Deref for GraphEdgeUndirected { - type Target = crate::datatypes::GraphEdge; +impl std::ops::Deref for GraphType { + type Target = crate::datatypes::GraphType; #[inline] - fn deref(&self) -> &crate::datatypes::GraphEdge { + fn deref(&self) -> &crate::datatypes::GraphType { &self.0 } } -impl std::ops::DerefMut for GraphEdgeUndirected { +impl std::ops::DerefMut for GraphType { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphType { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdgeUndirected); +::re_types_core::macros::impl_into_cow!(GraphType); -impl ::re_types_core::Loggable for GraphEdgeUndirected { +impl ::re_types_core::Loggable for GraphType { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdgeUndirected".into() + "rerun.components.GraphType".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphEdge::arrow_datatype() + crate::datatypes::GraphType::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphEdgeUndirected { where Self: Clone + 'a, { - crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphType::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,16 @@ impl ::re_types_core::Loggable for GraphEdgeUndirected { where Self: Sized, { - crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) + crate::datatypes::GraphType::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } + + #[inline] + fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> + where + Self: Sized, + { + crate::datatypes::GraphType::from_arrow(arrow_data) + .map(|v| v.into_iter().map(Self).collect()) + } } diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index 1c0323037b67..3a1cc3200f35 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -24,9 +24,9 @@ mod fill_ratio; mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; -mod graph_edge_directed; -mod graph_edge_undirected; -mod graph_node_id; +mod graph_edge; +mod graph_node; +mod graph_type; mod half_size2d; mod half_size2d_ext; mod half_size3d; @@ -131,9 +131,9 @@ pub use self::entity_path::EntityPath; pub use self::fill_mode::FillMode; pub use self::fill_ratio::FillRatio; pub use self::gamma_correction::GammaCorrection; -pub use self::graph_edge_directed::GraphEdgeDirected; -pub use self::graph_edge_undirected::GraphEdgeUndirected; -pub use self::graph_node_id::GraphNodeId; +pub use self::graph_edge::GraphEdge; +pub use self::graph_node::GraphNode; +pub use self::graph_type::GraphType; pub use self::half_size2d::HalfSize2D; pub use self::half_size3d::HalfSize3D; pub use self::image_buffer::ImageBuffer; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 3982583ca7c0..16f4597c2ff7 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -10,8 +10,8 @@ class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true graph_edge.rs linguist-generated=true -graph_location.rs linguist-generated=true -graph_node_id.rs linguist-generated=true +graph_node.rs linguist-generated=true +graph_type.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index 292b8ac8742b..6b68a86183da 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -23,10 +23,10 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge { /// The id of the source node. - pub source: crate::datatypes::GraphLocation, + pub source: crate::datatypes::GraphNode, /// The id of the target node. - pub target: crate::datatypes::GraphLocation, + pub target: crate::datatypes::GraphNode, } impl ::re_types_core::SizeBytes for GraphEdge { @@ -37,7 +37,7 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - ::is_pod() && ::is_pod() + ::is_pod() && ::is_pod() } } @@ -58,12 +58,12 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Struct(std::sync::Arc::new(vec![ Field::new( "source", - ::arrow_datatype(), + ::arrow_datatype(), false, ), Field::new( "target", - ::arrow_datatype(), + ::arrow_datatype(), false, ), ])) @@ -107,8 +107,28 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - _ = source_bitmap; - crate::datatypes::GraphLocation::to_arrow_opt(source)? + let offsets = arrow2::offset::Offsets::::try_from_lengths( + source.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = source + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + source_bitmap, + ) + } + .boxed() } }, { @@ -124,8 +144,28 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - _ = target_bitmap; - crate::datatypes::GraphLocation::to_arrow_opt(target)? + let offsets = arrow2::offset::Offsets::::try_from_lengths( + target.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = target + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + target_bitmap, + ) + } + .boxed() } }, ], @@ -173,9 +213,51 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["source"]; - crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#source")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() .with_context("rerun.datatypes.GraphEdge#source")? .into_iter() + } }; let target = { if !arrays_by_name.contains_key("target") { @@ -186,9 +268,51 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["target"]; - crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#target")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() .with_context("rerun.datatypes.GraphEdge#target")? .into_iter() + } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( ::itertools::izip!(source, target), diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs deleted file mode 100644 index d4cd8d4636c1..000000000000 --- a/crates/store/re_types/src/datatypes/graph_edge_ext.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::datatypes::{EntityPath, GraphEdge, GraphLocation, GraphNodeId}; - -impl> From<(T, T)> for GraphEdge { - fn from(value: (T, T)) -> Self { - Self { - source: value.0.into(), - target: value.1.into(), - } - } -} - -impl, N: Into> From<(E, N, N)> for GraphEdge { - fn from(value: (E, N, N)) -> Self { - let entity_path = value.0.into(); - Self { - source: GraphLocation { - entity_path: entity_path.clone(), - node_id: value.1.into(), - }, - target: GraphLocation { - entity_path, - node_id: value.2.into(), - }, - } - } -} diff --git a/crates/store/re_types/src/datatypes/graph_location.rs b/crates/store/re_types/src/datatypes/graph_location.rs deleted file mode 100644 index 51954a2c866d..000000000000 --- a/crates/store/re_types/src/datatypes/graph_location.rs +++ /dev/null @@ -1,341 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. -/// -/// We require this because the same node id can be used in multiple entities. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphLocation { - /// The entity path that specifies where to find the node. - pub entity_path: crate::datatypes::EntityPath, - - /// The id of the node. - pub node_id: crate::datatypes::GraphNodeId, -} - -impl ::re_types_core::SizeBytes for GraphLocation { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.entity_path.heap_size_bytes() + self.node_id.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - ::is_pod() && ::is_pod() - } -} - -::re_types_core::macros::impl_into_cow!(GraphLocation); - -impl ::re_types_core::Loggable for GraphLocation { - type Name = ::re_types_core::DatatypeName; - - #[inline] - fn name() -> Self::Name { - "rerun.datatypes.GraphLocation".into() - } - - #[inline] - fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::Struct(std::sync::Arc::new(vec![ - Field::new( - "entity_path", - ::arrow_datatype(), - false, - ), - Field::new( - "node_id", - ::arrow_datatype(), - false, - ), - ])) - } - - fn to_arrow_opt<'a>( - data: impl IntoIterator>>>, - ) -> SerializationResult> - where - Self: Clone + 'a, - { - #![allow(clippy::wildcard_imports)] - #![allow(clippy::manual_is_variant_and)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - (datum.is_some(), datum) - }) - .unzip(); - let bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - StructArray::new( - Self::arrow_datatype(), - vec![ - { - let (somes, entity_path): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.entity_path.clone()); - (datum.is_some(), datum) - }) - .unzip(); - let entity_path_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - entity_path.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = entity_path - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - entity_path_bitmap, - ) - } - .boxed() - } - }, - { - let (somes, node_id): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.node_id.clone()); - (datum.is_some(), datum) - }) - .unzip(); - let node_id_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - node_id.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = node_id - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - node_id_bitmap, - ) - } - .boxed() - } - }, - ], - bitmap, - ) - .boxed() - }) - } - - fn from_arrow_opt( - arrow_data: &dyn arrow2::array::Array, - ) -> DeserializationResult>> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok({ - let arrow_data = arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation")?; - if arrow_data.is_empty() { - Vec::new() - } else { - let (arrow_data_fields, arrow_data_arrays) = - (arrow_data.fields(), arrow_data.values()); - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields - .iter() - .map(|field| field.name.as_str()) - .zip(arrow_data_arrays) - .collect(); - let entity_path = { - if !arrays_by_name.contains_key("entity_path") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "entity_path", - )) - .with_context("rerun.datatypes.GraphLocation"); - } - let arrow_data = &**arrays_by_name["entity_path"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation#entity_path")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphLocation#entity_path")? - .into_iter() - } - }; - let node_id = { - if !arrays_by_name.contains_key("node_id") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "node_id", - )) - .with_context("rerun.datatypes.GraphLocation"); - } - let arrow_data = &**arrays_by_name["node_id"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation#node_id")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphLocation#node_id")? - .into_iter() - } - }; - arrow2::bitmap::utils::ZipValidity::new_with_validity( - ::itertools::izip!(entity_path, node_id), - arrow_data.validity(), - ) - .map(|opt| { - opt.map(|(entity_path, node_id)| { - Ok(Self { - entity_path: entity_path - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphLocation#entity_path")?, - node_id: node_id - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphLocation#node_id")?, - }) - }) - .transpose() - }) - .collect::>>() - .with_context("rerun.datatypes.GraphLocation")? - } - }) - } -} diff --git a/crates/store/re_types/src/datatypes/graph_location_ext.rs b/crates/store/re_types/src/datatypes/graph_location_ext.rs deleted file mode 100644 index 44a3df63889c..000000000000 --- a/crates/store/re_types/src/datatypes/graph_location_ext.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::datatypes::{EntityPath, GraphNodeId}; - -impl, N: Into> From<(E, N)> for super::GraphLocation { - fn from(value: (E, N)) -> Self { - Self { - entity_path: value.0.into(), - node_id: value.1.into(), - } - } -} - -impl std::fmt::Display for super::GraphLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_path) - } -} diff --git a/crates/store/re_types/src/datatypes/graph_node_id.rs b/crates/store/re_types/src/datatypes/graph_node.rs similarity index 88% rename from crates/store/re_types/src/datatypes/graph_node_id.rs rename to crates/store/re_types/src/datatypes/graph_node.rs index 876da591e151..220219d413ea 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id.rs +++ b/crates/store/re_types/src/datatypes/graph_node.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: A 32-bit ID representing a node in a graph. +/// **Datatype**: A string ID representing a node in a graph. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNodeId(pub ::re_types_core::ArrowString); +pub struct GraphNode(pub ::re_types_core::ArrowString); -impl ::re_types_core::SizeBytes for GraphNodeId { +impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,28 +36,28 @@ impl ::re_types_core::SizeBytes for GraphNodeId { } } -impl From<::re_types_core::ArrowString> for GraphNodeId { +impl From<::re_types_core::ArrowString> for GraphNode { #[inline] fn from(id: ::re_types_core::ArrowString) -> Self { Self(id) } } -impl From for ::re_types_core::ArrowString { +impl From for ::re_types_core::ArrowString { #[inline] - fn from(value: GraphNodeId) -> Self { + fn from(value: GraphNode) -> Self { value.0 } } -::re_types_core::macros::impl_into_cow!(GraphNodeId); +::re_types_core::macros::impl_into_cow!(GraphNode); -impl ::re_types_core::Loggable for GraphNodeId { +impl ::re_types_core::Loggable for GraphNode { type Name = ::re_types_core::DatatypeName; #[inline] fn name() -> Self::Name { - "rerun.datatypes.GraphNodeId".into() + "rerun.datatypes.GraphNode".into() } #[inline] @@ -132,7 +132,7 @@ impl ::re_types_core::Loggable for GraphNodeId { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphNodeId#id")?; + .with_context("rerun.datatypes.GraphNode#id")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -160,13 +160,13 @@ impl ::re_types_core::Loggable for GraphNodeId { res_or_opt.map(|res_or_opt| res_or_opt.map(|v| ::re_types_core::ArrowString(v))) }) .collect::>>>() - .with_context("rerun.datatypes.GraphNodeId#id")? + .with_context("rerun.datatypes.GraphNode#id")? .into_iter() } .map(|v| v.ok_or_else(DeserializationError::missing_data)) .map(|res| res.map(|v| Some(Self(v)))) .collect::>>>() - .with_context("rerun.datatypes.GraphNodeId#id") - .with_context("rerun.datatypes.GraphNodeId")?) + .with_context("rerun.datatypes.GraphNode#id") + .with_context("rerun.datatypes.GraphNode")?) } } diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_ext.rs similarity index 59% rename from crates/store/re_types/src/datatypes/graph_node_id_ext.rs rename to crates/store/re_types/src/datatypes/graph_node_ext.rs index 4b1d0612c51d..3265bdd535b9 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_ext.rs @@ -1,18 +1,18 @@ -use super::GraphNodeId; +use super::GraphNode; -impl std::convert::From<&str> for GraphNodeId { +impl std::convert::From<&str> for GraphNode { fn from(s: &str) -> Self { Self(s.into()) } } -impl std::convert::From for GraphNodeId { +impl std::convert::From for GraphNode { fn from(s: String) -> Self { Self(s.into()) } } -impl std::fmt::Display for GraphNodeId { +impl std::fmt::Display for GraphNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } diff --git a/crates/store/re_types/src/datatypes/graph_type.rs b/crates/store/re_types/src/datatypes/graph_type.rs new file mode 100644 index 000000000000..401ecb99a002 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_type.rs @@ -0,0 +1,153 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] +#![allow(non_camel_case_types)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: Specifies if a graph has directed or undirected edges. +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[repr(u8)] +pub enum GraphType { + /// The graph has undirected edges. + #[default] + Undirected = 1, + + /// The graph has directed edges. + Directed = 2, +} + +impl ::re_types_core::reflection::Enum for GraphType { + #[inline] + fn variants() -> &'static [Self] { + &[Self::Undirected, Self::Directed] + } + + #[inline] + fn docstring_md(self) -> &'static str { + match self { + Self::Undirected => "The graph has undirected edges.", + Self::Directed => "The graph has directed edges.", + } + } +} + +impl ::re_types_core::SizeBytes for GraphType { + #[inline] + fn heap_size_bytes(&self) -> u64 { + 0 + } + + #[inline] + fn is_pod() -> bool { + true + } +} + +impl std::fmt::Display for GraphType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Undirected => write!(f, "Undirected"), + Self::Directed => write!(f, "Directed"), + } + } +} + +::re_types_core::macros::impl_into_cow!(GraphType); + +impl ::re_types_core::Loggable for GraphType { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphType".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::UInt8 + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data0): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + let datum = datum.map(|datum| *datum as u8); + (datum.is_some(), datum) + }) + .unzip(); + let data0_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + PrimitiveArray::new( + Self::arrow_datatype(), + data0.into_iter().map(|v| v.unwrap_or_default()).collect(), + data0_bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok(arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphType#enum")? + .into_iter() + .map(|opt| opt.copied()) + .map(|typ| match typ { + Some(1) => Ok(Some(Self::Undirected)), + Some(2) => Ok(Some(Self::Directed)), + None => Ok(None), + Some(invalid) => Err(DeserializationError::missing_union_arm( + Self::arrow_datatype(), + "", + invalid as _, + )), + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphType")?) + } +} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 2b31d3f54759..57198084ab1e 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -17,11 +17,9 @@ mod class_id_ext; mod color_model; mod color_model_ext; mod graph_edge; -mod graph_edge_ext; -mod graph_location; -mod graph_location_ext; -mod graph_node_id; -mod graph_node_id_ext; +mod graph_node; +mod graph_node_ext; +mod graph_type; mod image_format; mod image_format_ext; mod keypoint_id; @@ -81,8 +79,8 @@ pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; pub use self::graph_edge::GraphEdge; -pub use self::graph_location::GraphLocation; -pub use self::graph_node_id::GraphNodeId; +pub use self::graph_node::GraphNode; +pub use self::graph_type::GraphType; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index f3fcf65d6910..772ef5678e8d 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -371,24 +371,24 @@ fn generate_component_reflection() -> Result::name(), + ::name(), ComponentReflection { docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphEdgeDirected::default().to_arrow()?), + placeholder: Some(GraphEdge::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphEdgeUndirected::default().to_arrow()?), + docstring_md: "A 32-bit ID representing a node in a graph.", + placeholder: Some(GraphNode::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "A 32-bit ID representing a node in a graph.", - placeholder: Some(GraphNodeId::default().to_arrow()?), + docstring_md: "An undirected edge in a graph connecting two nodes.", + placeholder: Some(GraphType::default().to_arrow()?), }, ), ( @@ -1079,83 +1079,23 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { }, ), ( - ArchetypeName::new("rerun.archetypes.GraphEdgesDirected"), + ArchetypeName::new("rerun.archetypes.Graph"), ArchetypeReflection { - display_name: "Graph edges directed", + display_name: "Graph", fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdgeDirected".into(), display_name : "Edges", - docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, - ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", - is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", - is_required : false, }, - ], - }, - ), - ( - ArchetypeName::new("rerun.archetypes.GraphEdgesUndirected"), - ArchetypeReflection { - display_name: "Graph edges undirected", - fields: vec![ - ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdgeUndirected".into(), display_name : - "Edges", docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, - ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", - is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", - is_required : false, }, - ], - }, - ), - ( - ArchetypeName::new("rerun.archetypes.GraphNodes"), - ArchetypeReflection { - display_name: "Graph nodes", - fields: vec![ + "rerun.components.GraphNode".into(), display_name : "Nodes", + docstring_md : "A list of nodes.", is_required : true, }, ArchetypeFieldReflection { component_name : - "rerun.components.GraphNodeId".into(), display_name : "Node ids", - docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, + "rerun.components.GraphEdge".into(), display_name : "Edges", + docstring_md : "A list of edges.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.Position2D".into(), display_name : "Centers", - docstring_md : "Optional center positions of the nodes.", is_required - : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", + "rerun.components.GraphType".into(), display_name : "Graph type", + docstring_md : "Specifies if the graph is directed or undirected.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", - is_required : false, }, + "rerun.components.Position2D".into(), display_name : + "Node positions", docstring_md : + "The position for each of the nodes.", is_required : false, }, ], }, ), diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index 414d85b78cbc..3f39e931844c 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -14,9 +14,7 @@ This page lists all built-in archetypes. ## Graph -* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of directed edges in a graph with optional labels, colors, etc. -* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of undirected edges in a graph with optional labels, colors, etc. -* [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. +* [`Graph`](archetypes/graph.md): A graph that consists of nodes and edges. ## Image & tensor diff --git a/docs/content/reference/types/archetypes/.gitattributes b/docs/content/reference/types/archetypes/.gitattributes index a78b41cb32d0..86b6fafe4577 100644 --- a/docs/content/reference/types/archetypes/.gitattributes +++ b/docs/content/reference/types/archetypes/.gitattributes @@ -14,9 +14,7 @@ depth_image.md linguist-generated=true disconnected_space.md linguist-generated=true ellipsoids3d.md linguist-generated=true encoded_image.md linguist-generated=true -graph_edges_directed.md linguist-generated=true -graph_edges_undirected.md linguist-generated=true -graph_nodes.md linguist-generated=true +graph.md linguist-generated=true image.md linguist-generated=true instance_poses3d.md linguist-generated=true line_strips2d.md linguist-generated=true diff --git a/docs/content/reference/types/archetypes/graph.md b/docs/content/reference/types/archetypes/graph.md new file mode 100644 index 000000000000..a9badb88c2a1 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph.md @@ -0,0 +1,26 @@ +--- +title: "Graph" +--- + + +A graph that consists of nodes and edges. + +By default, the graph is undirected. + +## Components + +**Required**: [`GraphNode`](../components/graph_node.md) + +**Recommended**: [`GraphEdge`](../components/graph_edge.md), [`GraphType`](../components/graph_type.md) + +**Optional**: [`Position2D`](../components/position2d.md) + +## Shown in +* [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) + +## API reference links + * 🌊 [C++ API docs for `Graph`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1Graph.html) + * 🐍 [Python API docs for `Graph`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.Graph) + * 🦀 [Rust API docs for `Graph`](https://docs.rs/rerun/latest/rerun/archetypes/struct.Graph.html) + diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md deleted file mode 100644 index 603d6c1d7c55..000000000000 --- a/docs/content/reference/types/archetypes/graph_edges_directed.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "GraphEdgesDirected" ---- - - -A list of directed edges in a graph with optional labels, colors, etc. - -## Components - -**Required**: [`GraphEdgeDirected`](../components/graph_edge_directed.md) - -**Recommended**: [`Color`](../components/color.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesDirected.html) - * 🐍 [Python API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesDirected) - * 🦀 [Rust API docs for `GraphEdgesDirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesDirected.html) - diff --git a/docs/content/reference/types/archetypes/graph_edges_undirected.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md deleted file mode 100644 index 1838404ba97e..000000000000 --- a/docs/content/reference/types/archetypes/graph_edges_undirected.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "GraphEdgesUndirected" ---- - - -A list of undirected edges in a graph with optional labels, colors, etc. - -## Components - -**Required**: [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) - -**Recommended**: [`Color`](../components/color.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesUndirected.html) - * 🐍 [Python API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesUndirected) - * 🦀 [Rust API docs for `GraphEdgesUndirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesUndirected.html) - diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md deleted file mode 100644 index 0338e5a1657a..000000000000 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "GraphNodes" ---- - - -A list of nodes in a graph with optional labels, colors, etc. - -## Components - -**Required**: [`GraphNodeId`](../components/graph_node_id.md) - -**Recommended**: [`Color`](../components/color.md), [`Position2D`](../components/position2d.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html) - * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphNodes) - * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html) - diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 1aa99480f899..71ed12102c68 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,9 +29,9 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. -* [`GraphEdgeDirected`](components/graph_edge_directed.md): A directed edge in a graph connecting two nodes. -* [`GraphEdgeUndirected`](components/graph_edge_undirected.md): An undirected edge in a graph connecting two nodes. -* [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. +* [`GraphEdge`](components/graph_edge.md): An undirected edge in a graph connecting two nodes. +* [`GraphNode`](components/graph_node.md): A 32-bit ID representing a node in a graph. +* [`GraphType`](components/graph_type.md): An undirected edge in a graph connecting two nodes. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. * [`HalfSize3D`](components/half_size3d.md): Half-size (radius) of a 3D box. * [`ImageBuffer`](components/image_buffer.md): A buffer that is known to store image data. diff --git a/docs/content/reference/types/components/.gitattributes b/docs/content/reference/types/components/.gitattributes index 9dc8fc370a5c..a4db0dfd448f 100644 --- a/docs/content/reference/types/components/.gitattributes +++ b/docs/content/reference/types/components/.gitattributes @@ -17,9 +17,9 @@ entity_path.md linguist-generated=true fill_mode.md linguist-generated=true fill_ratio.md linguist-generated=true gamma_correction.md linguist-generated=true -graph_edge_directed.md linguist-generated=true -graph_edge_undirected.md linguist-generated=true -graph_node_id.md linguist-generated=true +graph_edge.md linguist-generated=true +graph_node.md linguist-generated=true +graph_type.md linguist-generated=true half_size2d.md linguist-generated=true half_size3d.md linguist-generated=true image_buffer.md linguist-generated=true diff --git a/docs/content/reference/types/components/class_id.md b/docs/content/reference/types/components/class_id.md index cbf7dca8ea68..be0847bc2e4d 100644 --- a/docs/content/reference/types/components/class_id.md +++ b/docs/content/reference/types/components/class_id.md @@ -22,9 +22,6 @@ A 16-bit ID representing a type of semantic class. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index 8be33395fc02..c5703e66ea2f 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,9 +26,6 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md new file mode 100644 index 000000000000..a356d6077eb4 --- /dev/null +++ b/docs/content/reference/types/components/graph_edge.md @@ -0,0 +1,20 @@ +--- +title: "GraphEdge" +--- + + +An undirected edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) + * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) + * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) + + +## Used by + +* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md deleted file mode 100644 index 0fb3d80ae2c8..000000000000 --- a/docs/content/reference/types/components/graph_edge_directed.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphEdgeDirected" ---- - - -A directed edge in a graph connecting two nodes. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeDirected.html) - * 🐍 [Python API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeDirected) - * 🦀 [Rust API docs for `GraphEdgeDirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeDirected.html) - - -## Used by - -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) diff --git a/docs/content/reference/types/components/graph_edge_undirected.md b/docs/content/reference/types/components/graph_edge_undirected.md deleted file mode 100644 index b4e3fa0a5523..000000000000 --- a/docs/content/reference/types/components/graph_edge_undirected.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphEdgeUndirected" ---- - - -An undirected edge in a graph connecting two nodes. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeUndirected.html) - * 🐍 [Python API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeUndirected) - * 🦀 [Rust API docs for `GraphEdgeUndirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeUndirected.html) - - -## Used by - -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) diff --git a/docs/content/reference/types/components/graph_node.md b/docs/content/reference/types/components/graph_node.md new file mode 100644 index 000000000000..5e86f8d2e843 --- /dev/null +++ b/docs/content/reference/types/components/graph_node.md @@ -0,0 +1,20 @@ +--- +title: "GraphNode" +--- + + +A 32-bit ID representing a node in a graph. + +## Fields + +* id: [`GraphNode`](../datatypes/graph_node.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html) + * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNode) + * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNode.html) + + +## Used by + +* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/graph_node_id.md b/docs/content/reference/types/components/graph_node_id.md deleted file mode 100644 index b74c96382c09..000000000000 --- a/docs/content/reference/types/components/graph_node_id.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphNodeId" ---- - - -A 32-bit ID representing a node in a graph. - -## Fields - -* id: [`GraphNodeId`](../datatypes/graph_node_id.md) - -## API reference links - * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNodeId.html) - * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNodeId) - * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNodeId.html) - - -## Used by - -* [`GraphNodes`](../archetypes/graph_nodes.md) diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md new file mode 100644 index 000000000000..ccb53ca1a00f --- /dev/null +++ b/docs/content/reference/types/components/graph_type.md @@ -0,0 +1,20 @@ +--- +title: "GraphType" +--- + + +An undirected edge in a graph connecting two nodes. + +## Fields + +* graph_type: [`GraphType`](../datatypes/graph_type.md) + +## API reference links + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphType.html) + * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphType) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/struct.GraphType.html) + + +## Used by + +* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/position2d.md b/docs/content/reference/types/components/position2d.md index a787c7672dda..fd6a0aefc0b5 100644 --- a/docs/content/reference/types/components/position2d.md +++ b/docs/content/reference/types/components/position2d.md @@ -19,5 +19,5 @@ A position in 2D space. * [`Arrows2D`](../archetypes/arrows2d.md) * [`Boxes2D`](../archetypes/boxes2d.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`Graph`](../archetypes/graph.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index cd2a4d8b19b3..31b40b8a4ae7 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,9 +26,6 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index 2af14a38050b..54744c09abd2 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,9 +22,6 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index e1b8010b1f0d..9bdd4a862e55 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -20,8 +20,8 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. * [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possibly in different entities). -* [`GraphLocation`](datatypes/graph_location.md): Uniquely identifies a node in a graph by its entity path and node id. -* [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. +* [`GraphNode`](datatypes/graph_node.md): A string ID representing a node in a graph. +* [`GraphType`](datatypes/graph_type.md): Specifies if a graph has directed or undirected edges. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index 4a855f2d725d..09255112d119 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -14,8 +14,8 @@ entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true graph_edge.md linguist-generated=true -graph_location.md linguist-generated=true -graph_node_id.md linguist-generated=true +graph_node.md linguist-generated=true +graph_type.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/entity_path.md b/docs/content/reference/types/datatypes/entity_path.md index b4985a4f44bc..5e7a14c35223 100644 --- a/docs/content/reference/types/datatypes/entity_path.md +++ b/docs/content/reference/types/datatypes/entity_path.md @@ -1,21 +1,20 @@ --- title: "EntityPath" --- - A path to an entity in the `ChunkStore`. ## Fields -- path: `string` +* path: `string` ## API reference links + * 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) + * 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) + * 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) -- 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) -- 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) -- 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) ## Used by -- [`EntityPath`](../components/entity_path.md) +* [`EntityPath`](../components/entity_path.md) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md index c739d535bf7d..c52798330770 100644 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -7,8 +7,8 @@ Represents an edge in a graph connecting two nodes (possibly in different entiti ## Fields -* source: [`GraphLocation`](../datatypes/graph_location.md) -* target: [`GraphLocation`](../datatypes/graph_location.md) +* source: [`GraphNode`](../datatypes/graph_node.md) +* target: [`GraphNode`](../datatypes/graph_node.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) @@ -18,5 +18,4 @@ Represents an edge in a graph connecting two nodes (possibly in different entiti ## Used by -* [`GraphEdgeDirected`](../components/graph_edge_directed.md) -* [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) +* [`GraphEdge`](../components/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_location.md b/docs/content/reference/types/datatypes/graph_location.md deleted file mode 100644 index 73c4bb451fc3..000000000000 --- a/docs/content/reference/types/datatypes/graph_location.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "GraphLocation" ---- - - -Uniquely identifies a node in a graph by its entity path and node id. - -We require this because the same node id can be used in multiple entities. - -## Fields - -* entity_path: [`EntityPath`](../datatypes/entity_path.md) -* node_id: [`GraphNodeId`](../datatypes/graph_node_id.md) - -## API reference links - * 🌊 [C++ API docs for `GraphLocation`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphLocation.html) - * 🐍 [Python API docs for `GraphLocation`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphLocation) - * 🦀 [Rust API docs for `GraphLocation`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphLocation.html) - - -## Used by - -* [`GraphEdge`](../datatypes/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node.md b/docs/content/reference/types/datatypes/graph_node.md new file mode 100644 index 000000000000..66279908066d --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_node.md @@ -0,0 +1,21 @@ +--- +title: "GraphNode" +--- + + +A string ID representing a node in a graph. + +## Fields + +* id: `string` + +## API reference links + * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNode.html) + * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNode) + * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNode.html) + + +## Used by + +* [`GraphEdge`](../datatypes/graph_edge.md) +* [`GraphNode`](../components/graph_node.md) diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md deleted file mode 100644 index 960ff2c6617c..000000000000 --- a/docs/content/reference/types/datatypes/graph_node_id.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphNodeId" ---- - - -A 32-bit ID representing a node in a graph. - -## Fields - -* id: `string` - -## API reference links - * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNodeId.html) - * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNodeId) - * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNodeId.html) - - -## Used by - -* [`GraphLocation`](../datatypes/graph_location.md) -* [`GraphNodeId`](../components/graph_node_id.md) diff --git a/docs/content/reference/types/datatypes/graph_type.md b/docs/content/reference/types/datatypes/graph_type.md new file mode 100644 index 000000000000..ec44318856dd --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_type.md @@ -0,0 +1,21 @@ +--- +title: "GraphType" +--- + + +Specifies if a graph has directed or undirected edges. + +## Variants + +* Undirected +* Directed + +## API reference links + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1datatypes.html) + * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphType) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/datatypes/enum.GraphType.html) + + +## Used by + +* [`GraphType`](../components/graph_type.md) diff --git a/rerun_cpp/src/rerun/archetypes.hpp b/rerun_cpp/src/rerun/archetypes.hpp index 8465c54b56c3..d5ffca9694aa 100644 --- a/rerun_cpp/src/rerun/archetypes.hpp +++ b/rerun_cpp/src/rerun/archetypes.hpp @@ -15,9 +15,7 @@ #include "archetypes/disconnected_space.hpp" #include "archetypes/ellipsoids3d.hpp" #include "archetypes/encoded_image.hpp" -#include "archetypes/graph_edges_directed.hpp" -#include "archetypes/graph_edges_undirected.hpp" -#include "archetypes/graph_nodes.hpp" +#include "archetypes/graph.hpp" #include "archetypes/image.hpp" #include "archetypes/instance_poses3d.hpp" #include "archetypes/line_strips2d.hpp" diff --git a/rerun_cpp/src/rerun/archetypes/.gitattributes b/rerun_cpp/src/rerun/archetypes/.gitattributes index 98c0e80d8418..aa5caf76b53e 100644 --- a/rerun_cpp/src/rerun/archetypes/.gitattributes +++ b/rerun_cpp/src/rerun/archetypes/.gitattributes @@ -27,12 +27,8 @@ ellipsoids3d.cpp linguist-generated=true ellipsoids3d.hpp linguist-generated=true encoded_image.cpp linguist-generated=true encoded_image.hpp linguist-generated=true -graph_edges_directed.cpp linguist-generated=true -graph_edges_directed.hpp linguist-generated=true -graph_edges_undirected.cpp linguist-generated=true -graph_edges_undirected.hpp linguist-generated=true -graph_nodes.cpp linguist-generated=true -graph_nodes.hpp linguist-generated=true +graph.cpp linguist-generated=true +graph.hpp linguist-generated=true image.cpp linguist-generated=true image.hpp linguist-generated=true instance_poses3d.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp b/rerun_cpp/src/rerun/archetypes/graph.cpp similarity index 65% rename from rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp rename to rerun_cpp/src/rerun/archetypes/graph.cpp index c528d1db50a7..a4199f29358d 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp +++ b/rerun_cpp/src/rerun/archetypes/graph.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". -#include "graph_edges_directed.hpp" +#include "graph.hpp" #include "../collection_adapter_builtins.hpp" @@ -9,40 +9,35 @@ namespace rerun::archetypes {} namespace rerun { - Result> AsComponents::serialize( - const archetypes::GraphEdgesDirected& archetype + Result> AsComponents::serialize( + const archetypes::Graph& archetype ) { using namespace archetypes; std::vector cells; - cells.reserve(6); + cells.reserve(5); { - auto result = ComponentBatch::from_loggable(archetype.edges); + auto result = ComponentBatch::from_loggable(archetype.nodes); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); + if (archetype.edges.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.edges.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); + if (archetype.graph_type.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.graph_type.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + if (archetype.node_positions.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.node_positions.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } { - auto indicator = GraphEdgesDirected::IndicatorComponent(); + auto indicator = Graph::IndicatorComponent(); auto result = ComponentBatch::from_loggable(indicator); RR_RETURN_NOT_OK(result.error); cells.emplace_back(std::move(result.value)); diff --git a/rerun_cpp/src/rerun/archetypes/graph.hpp b/rerun_cpp/src/rerun/archetypes/graph.hpp new file mode 100644 index 000000000000..bd2dd30b8f20 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph.hpp @@ -0,0 +1,86 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/graph_edge.hpp" +#include "../components/graph_node.hpp" +#include "../components/graph_type.hpp" +#include "../components/position2d.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A graph that consists of nodes and edges. + /// + /// By default, the graph is undirected. + struct Graph { + /// A list of nodes. + Collection nodes; + + /// A list of edges. + std::optional> edges; + + /// Specifies if the graph is directed or undirected. + std::optional graph_type; + + /// The position for each of the nodes. + std::optional> node_positions; + + public: + static constexpr const char IndicatorComponentName[] = "rerun.components.GraphIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + Graph() = default; + Graph(Graph&& other) = default; + + explicit Graph(Collection _nodes) + : nodes(std::move(_nodes)) {} + + /// A list of edges. + Graph with_edges(Collection _edges) && { + edges = std::move(_edges); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Specifies if the graph is directed or undirected. + Graph with_graph_type(rerun::components::GraphType _graph_type) && { + graph_type = std::move(_graph_type); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// The position for each of the nodes. + Graph with_node_positions(Collection _node_positions) && { + node_positions = std::move(_node_positions); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize(const archetypes::Graph& archetype); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp deleted file mode 100644 index 25287f28ce3e..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/class_id.hpp" -#include "../components/color.hpp" -#include "../components/graph_edge_directed.hpp" -#include "../components/show_labels.hpp" -#include "../components/text.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphEdgesDirected { - /// A list of node IDs. - Collection edges; - - /// Optional colors for the boxes. - std::optional> colors; - - /// Optional text labels for the node. - std::optional> labels; - - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; - - public: - static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphEdgesDirectedIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - GraphEdgesDirected() = default; - GraphEdgesDirected(GraphEdgesDirected&& other) = default; - - explicit GraphEdgesDirected(Collection _edges) - : edges(std::move(_edges)) {} - - /// Optional colors for the boxes. - GraphEdgesDirected with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional text labels for the node. - GraphEdgesDirected with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphEdgesDirected with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphEdgesDirected with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize( - const archetypes::GraphEdgesDirected& archetype - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp deleted file mode 100644 index 01a9a49ea1da..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#include "graph_edges_undirected.hpp" - -#include "../collection_adapter_builtins.hpp" - -namespace rerun::archetypes {} - -namespace rerun { - - Result> AsComponents::serialize( - const archetypes::GraphEdgesUndirected& archetype - ) { - using namespace archetypes; - std::vector cells; - cells.reserve(6); - - { - auto result = ComponentBatch::from_loggable(archetype.edges); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - { - auto indicator = GraphEdgesUndirected::IndicatorComponent(); - auto result = ComponentBatch::from_loggable(indicator); - RR_RETURN_NOT_OK(result.error); - cells.emplace_back(std::move(result.value)); - } - - return cells; - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp deleted file mode 100644 index 1ba357558f00..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/class_id.hpp" -#include "../components/color.hpp" -#include "../components/graph_edge_undirected.hpp" -#include "../components/show_labels.hpp" -#include "../components/text.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphEdgesUndirected { - /// A list of node IDs. - Collection edges; - - /// Optional colors for the boxes. - std::optional> colors; - - /// Optional text labels for the node. - std::optional> labels; - - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; - - public: - static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphEdgesUndirectedIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - GraphEdgesUndirected() = default; - GraphEdgesUndirected(GraphEdgesUndirected&& other) = default; - - explicit GraphEdgesUndirected(Collection _edges) - : edges(std::move(_edges)) {} - - /// Optional colors for the boxes. - GraphEdgesUndirected with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional text labels for the node. - GraphEdgesUndirected with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphEdgesUndirected with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphEdgesUndirected with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize( - const archetypes::GraphEdgesUndirected& archetype - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp deleted file mode 100644 index 2e1febe0fbca..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". - -#include "graph_nodes.hpp" - -#include "../collection_adapter_builtins.hpp" - -namespace rerun::archetypes {} - -namespace rerun { - - Result> AsComponents::serialize( - const archetypes::GraphNodes& archetype - ) { - using namespace archetypes; - std::vector cells; - cells.reserve(7); - - { - auto result = ComponentBatch::from_loggable(archetype.node_ids); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.centers.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.centers.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - { - auto indicator = GraphNodes::IndicatorComponent(); - auto result = ComponentBatch::from_loggable(indicator); - RR_RETURN_NOT_OK(result.error); - cells.emplace_back(std::move(result.value)); - } - - return cells; - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp deleted file mode 100644 index e97b80461f2b..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp +++ /dev/null @@ -1,112 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/class_id.hpp" -#include "../components/color.hpp" -#include "../components/graph_node_id.hpp" -#include "../components/position2d.hpp" -#include "../components/show_labels.hpp" -#include "../components/text.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphNodes { - /// A list of node IDs. - Collection node_ids; - - /// Optional text labels for the node. - std::optional> labels; - - /// Optional colors for the boxes. - std::optional> colors; - - /// Optional center positions of the nodes. - std::optional> centers; - - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; - - public: - static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphNodesIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - GraphNodes() = default; - GraphNodes(GraphNodes&& other) = default; - - explicit GraphNodes(Collection _node_ids) - : node_ids(std::move(_node_ids)) {} - - /// Optional text labels for the node. - GraphNodes with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional colors for the boxes. - GraphNodes with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional center positions of the nodes. - GraphNodes with_centers(Collection _centers) && { - centers = std::move(_centers); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphNodes with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphNodes with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize(const archetypes::GraphNodes& archetype - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/components.hpp b/rerun_cpp/src/rerun/components.hpp index 33653f4e4020..68687fda028a 100644 --- a/rerun_cpp/src/rerun/components.hpp +++ b/rerun_cpp/src/rerun/components.hpp @@ -18,9 +18,9 @@ #include "components/fill_mode.hpp" #include "components/fill_ratio.hpp" #include "components/gamma_correction.hpp" -#include "components/graph_edge_directed.hpp" -#include "components/graph_edge_undirected.hpp" -#include "components/graph_node_id.hpp" +#include "components/graph_edge.hpp" +#include "components/graph_node.hpp" +#include "components/graph_type.hpp" #include "components/half_size2d.hpp" #include "components/half_size3d.hpp" #include "components/image_buffer.hpp" diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 370edb1baa02..6c5adccb600e 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,9 +21,9 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true -graph_edge_directed.hpp linguist-generated=true -graph_edge_undirected.hpp linguist-generated=true -graph_node_id.hpp linguist-generated=true +graph_edge.hpp linguist-generated=true +graph_node.hpp linguist-generated=true +graph_type.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true image_buffer.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge_directed.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp similarity index 79% rename from rerun_cpp/src/rerun/components/graph_edge_directed.hpp rename to rerun_cpp/src/rerun/components/graph_edge.hpp index 83cbe1e40020..c6c2911da1cb 100644 --- a/rerun_cpp/src/rerun/components/graph_edge_directed.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". #pragma once @@ -12,15 +12,15 @@ namespace rerun::components { /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphEdgeDirected { + struct GraphEdge { rerun::datatypes::GraphEdge edge; public: - GraphEdgeDirected() = default; + GraphEdge() = default; - GraphEdgeDirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphEdgeDirected& operator=(rerun::datatypes::GraphEdge edge_) { + GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { edge = std::move(edge_); return *this; } @@ -33,21 +33,21 @@ namespace rerun::components { } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeDirected)); + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdgeDirected"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdge"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphEdgeDirected` into an arrow array. + /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. static Result> to_arrow( - const components::GraphEdgeDirected* instances, size_t num_instances + const components::GraphEdge* instances, size_t num_instances ) { if (num_instances == 0) { return Loggable::to_arrow(nullptr, 0); diff --git a/rerun_cpp/src/rerun/components/graph_node_id.hpp b/rerun_cpp/src/rerun/components/graph_node.hpp similarity index 58% rename from rerun_cpp/src/rerun/components/graph_node_id.hpp rename to rerun_cpp/src/rerun/components/graph_node.hpp index d63ad98bda84..1f633942049a 100644 --- a/rerun_cpp/src/rerun/components/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/components/graph_node.hpp @@ -1,9 +1,9 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". #pragma once -#include "../datatypes/graph_node_id.hpp" +#include "../datatypes/graph_node.hpp" #include "../result.hpp" #include @@ -13,59 +13,59 @@ namespace rerun::components { /// **Component**: A 32-bit ID representing a node in a graph. - struct GraphNodeId { - rerun::datatypes::GraphNodeId id; + struct GraphNode { + rerun::datatypes::GraphNode id; public: - GraphNodeId() = default; + GraphNode() = default; - GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(std::move(id_)) {} + GraphNode(rerun::datatypes::GraphNode id_) : id(std::move(id_)) {} - GraphNodeId& operator=(rerun::datatypes::GraphNodeId id_) { + GraphNode& operator=(rerun::datatypes::GraphNode id_) { id = std::move(id_); return *this; } - GraphNodeId(std::string id_) : id(std::move(id_)) {} + GraphNode(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(std::string id_) { + GraphNode& operator=(std::string id_) { id = std::move(id_); return *this; } - /// Cast to the underlying GraphNodeId datatype - operator rerun::datatypes::GraphNodeId() const { + /// Cast to the underlying GraphNode datatype + operator rerun::datatypes::GraphNode() const { return id; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphNodeId) == sizeof(components::GraphNodeId)); + static_assert(sizeof(rerun::datatypes::GraphNode) == sizeof(components::GraphNode)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphNodeId"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphNode"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphNodeId` into an arrow array. + /// Serializes an array of `rerun::components::GraphNode` into an arrow array. static Result> to_arrow( - const components::GraphNodeId* instances, size_t num_instances + const components::GraphNode* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( + return Loggable::to_arrow( &instances->id, num_instances ); diff --git a/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp b/rerun_cpp/src/rerun/components/graph_type.hpp similarity index 52% rename from rerun_cpp/src/rerun/components/graph_edge_undirected.hpp rename to rerun_cpp/src/rerun/components/graph_type.hpp index f949d4040277..c6ad3ef17a53 100644 --- a/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp +++ b/rerun_cpp/src/rerun/components/graph_type.hpp @@ -1,64 +1,63 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". #pragma once -#include "../datatypes/graph_edge.hpp" +#include "../datatypes/graph_type.hpp" #include "../result.hpp" #include #include -#include namespace rerun::components { /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphEdgeUndirected { - rerun::datatypes::GraphEdge edge; + struct GraphType { + rerun::datatypes::GraphType graph_type; public: - GraphEdgeUndirected() = default; + GraphType() = default; - GraphEdgeUndirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphType(rerun::datatypes::GraphType graph_type_) : graph_type(graph_type_) {} - GraphEdgeUndirected& operator=(rerun::datatypes::GraphEdge edge_) { - edge = std::move(edge_); + GraphType& operator=(rerun::datatypes::GraphType graph_type_) { + graph_type = graph_type_; return *this; } - /// Cast to the underlying GraphEdge datatype - operator rerun::datatypes::GraphEdge() const { - return edge; + /// Cast to the underlying GraphType datatype + operator rerun::datatypes::GraphType() const { + return graph_type; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeUndirected)); + static_assert(sizeof(rerun::datatypes::GraphType) == sizeof(components::GraphType)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdgeUndirected"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphType"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphEdgeUndirected` into an arrow array. + /// Serializes an array of `rerun::components::GraphType` into an arrow array. static Result> to_arrow( - const components::GraphEdgeUndirected* instances, size_t num_instances + const components::GraphType* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( - &instances->edge, + return Loggable::to_arrow( + &instances->graph_type, num_instances ); } diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index de1b06885622..4be967809c3a 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -15,8 +15,8 @@ #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" #include "datatypes/graph_edge.hpp" -#include "datatypes/graph_location.hpp" -#include "datatypes/graph_node_id.hpp" +#include "datatypes/graph_node.hpp" +#include "datatypes/graph_type.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 923a0a15924f..3b6db9b9e234 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -27,10 +27,10 @@ float64.cpp linguist-generated=true float64.hpp linguist-generated=true graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true -graph_location.cpp linguist-generated=true -graph_location.hpp linguist-generated=true -graph_node_id.cpp linguist-generated=true -graph_node_id.hpp linguist-generated=true +graph_node.cpp linguist-generated=true +graph_node.hpp linguist-generated=true +graph_type.cpp linguist-generated=true +graph_type.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp index 28f4e9286da8..1e4134b5873c 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -3,7 +3,7 @@ #include "graph_edge.hpp" -#include "graph_location.hpp" +#include "graph_node.hpp" #include #include @@ -13,16 +13,8 @@ namespace rerun::datatypes {} namespace rerun { const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::struct_({ - arrow::field( - "source", - Loggable::arrow_datatype(), - false - ), - arrow::field( - "target", - Loggable::arrow_datatype(), - false - ), + arrow::field("source", Loggable::arrow_datatype(), false), + arrow::field("target", Loggable::arrow_datatype(), false), }); return datatype; } @@ -61,29 +53,25 @@ namespace rerun { } { - auto field_builder = static_cast(builder->field_builder(0)); + auto field_builder = static_cast(builder->field_builder(0)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].source, - 1 - ) - ); + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].source, + 1 + )); } } { - auto field_builder = static_cast(builder->field_builder(1)); + auto field_builder = static_cast(builder->field_builder(1)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].target, - 1 - ) - ); + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].target, + 1 + )); } } ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp index eec468dc4e75..151e54f6d0f0 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -4,7 +4,7 @@ #pragma once #include "../result.hpp" -#include "graph_location.hpp" +#include "graph_node.hpp" #include #include @@ -19,10 +19,10 @@ namespace rerun::datatypes { /// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). struct GraphEdge { /// The id of the source node. - rerun::datatypes::GraphLocation source; + rerun::datatypes::GraphNode source; /// The id of the target node. - rerun::datatypes::GraphLocation target; + rerun::datatypes::GraphNode target; public: GraphEdge() = default; diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.cpp b/rerun_cpp/src/rerun/datatypes/graph_location.cpp deleted file mode 100644 index 5d7620f53c3e..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_location.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -#include "graph_location.hpp" - -#include "entity_path.hpp" -#include "graph_node_id.hpp" - -#include -#include - -namespace rerun::datatypes {} - -namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::struct_({ - arrow::field( - "entity_path", - Loggable::arrow_datatype(), - false - ), - arrow::field( - "node_id", - Loggable::arrow_datatype(), - false - ), - }); - return datatype; - } - - Result> Loggable::to_arrow( - const datatypes::GraphLocation* instances, size_t num_instances - ) { - // TODO(andreas): Allow configuring the memory pool. - arrow::MemoryPool* pool = arrow::default_memory_pool(); - auto datatype = arrow_datatype(); - - ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) - if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), - instances, - num_instances - )); - } - std::shared_ptr array; - ARROW_RETURN_NOT_OK(builder->Finish(&array)); - return array; - } - - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, size_t num_elements - ) { - if (builder == nullptr) { - return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); - } - if (elements == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Cannot serialize null pointer to arrow array." - ); - } - - { - auto field_builder = static_cast(builder->field_builder(0)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].entity_path, - 1 - )); - } - } - { - auto field_builder = static_cast(builder->field_builder(1)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].node_id, - 1 - )); - } - } - ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); - - return Error::ok(); - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp b/rerun_cpp/src/rerun/datatypes/graph_node.cpp similarity index 82% rename from rerun_cpp/src/rerun/datatypes/graph_node_id.cpp rename to rerun_cpp/src/rerun/datatypes/graph_node.cpp index 3fc45d4d8926..bd40260590f0 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". -#include "graph_node_id.hpp" +#include "graph_node.hpp" #include #include @@ -9,13 +9,13 @@ namespace rerun::datatypes {} namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { + const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::utf8(); return datatype; } - Result> Loggable::to_arrow( - const datatypes::GraphNodeId* instances, size_t num_instances + Result> Loggable::to_arrow( + const datatypes::GraphNode* instances, size_t num_instances ) { // TODO(andreas): Allow configuring the memory pool. arrow::MemoryPool* pool = arrow::default_memory_pool(); @@ -23,7 +23,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( static_cast(builder.get()), instances, num_instances @@ -34,8 +34,8 @@ namespace rerun { return array; } - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, size_t num_elements + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp b/rerun_cpp/src/rerun/datatypes/graph_node.hpp similarity index 69% rename from rerun_cpp/src/rerun/datatypes/graph_node_id.hpp rename to rerun_cpp/src/rerun/datatypes/graph_node.hpp index 3a29ab76e9cd..025befbd8c64 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". #pragma once @@ -17,16 +17,16 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: A 32-bit ID representing a node in a graph. - struct GraphNodeId { + /// **Datatype**: A string ID representing a node in a graph. + struct GraphNode { std::string id; public: - GraphNodeId() = default; + GraphNode() = default; - GraphNodeId(std::string id_) : id(std::move(id_)) {} + GraphNode(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(std::string id_) { + GraphNode& operator=(std::string id_) { id = std::move(id_); return *this; } @@ -39,21 +39,20 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphNodeId"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphNode"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphNodeId` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphNode` into an arrow array. static Result> to_arrow( - const datatypes::GraphNodeId* instances, size_t num_instances + const datatypes::GraphNode* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, - size_t num_elements + arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.cpp b/rerun_cpp/src/rerun/datatypes/graph_type.cpp new file mode 100644 index 000000000000..678579db8df6 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_type.cpp @@ -0,0 +1,56 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +#include "graph_type.hpp" + +#include +#include + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::uint8(); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphType* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + const auto variant = elements[elem_idx]; + ARROW_RETURN_NOT_OK(builder->Append(static_cast(variant))); + } + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.hpp b/rerun_cpp/src/rerun/datatypes/graph_type.hpp similarity index 50% rename from rerun_cpp/src/rerun/datatypes/graph_location.hpp rename to rerun_cpp/src/rerun/datatypes/graph_type.hpp index 6bb821a792f2..bd9293bb27ac 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_location.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_type.hpp @@ -1,34 +1,33 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". #pragma once #include "../result.hpp" -#include "entity_path.hpp" -#include "graph_node_id.hpp" #include #include namespace arrow { + /// \private + template + class NumericBuilder; + class Array; class DataType; - class StructBuilder; + class UInt8Type; + using UInt8Builder = NumericBuilder; } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. - /// - /// We require this because the same node id can be used in multiple entities. - struct GraphLocation { - /// The entity path that specifies where to find the node. - rerun::datatypes::EntityPath entity_path; - - /// The id of the node. - rerun::datatypes::GraphNodeId node_id; - - public: - GraphLocation() = default; + /// **Datatype**: Specifies if a graph has directed or undirected edges. + enum class GraphType : uint8_t { + + /// The graph has undirected edges. + Undirected = 1, + + /// The graph has directed edges. + Directed = 2, }; } // namespace rerun::datatypes @@ -38,21 +37,20 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphLocation"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphType"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphLocation` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphType` into an arrow array. static Result> to_arrow( - const datatypes::GraphLocation* instances, size_t num_instances + const datatypes::GraphType* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, - size_t num_elements + arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes index 7f2f7f651e9d..b39c61a3bda5 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes @@ -15,9 +15,7 @@ depth_image.py linguist-generated=true disconnected_space.py linguist-generated=true ellipsoids3d.py linguist-generated=true encoded_image.py linguist-generated=true -graph_edges_directed.py linguist-generated=true -graph_edges_undirected.py linguist-generated=true -graph_nodes.py linguist-generated=true +graph.py linguist-generated=true image.py linguist-generated=true instance_poses3d.py linguist-generated=true line_strips2d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py index e10bef316177..3854c1a71094 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py @@ -15,9 +15,7 @@ from .disconnected_space import DisconnectedSpace from .ellipsoids3d import Ellipsoids3D from .encoded_image import EncodedImage -from .graph_edges_directed import GraphEdgesDirected -from .graph_edges_undirected import GraphEdgesUndirected -from .graph_nodes import GraphNodes +from .graph import Graph from .image import Image from .instance_poses3d import InstancePoses3D from .line_strips2d import LineStrips2D @@ -51,9 +49,7 @@ "DisconnectedSpace", "Ellipsoids3D", "EncodedImage", - "GraphEdgesDirected", - "GraphEdgesUndirected", - "GraphNodes", + "Graph", "Image", "InstancePoses3D", "LineStrips2D", diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph.py b/rerun_py/rerun_sdk/rerun/archetypes/graph.py new file mode 100644 index 000000000000..25a7d9a104d7 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph.py @@ -0,0 +1,111 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". + +# You can extend this class by creating a "GraphExt" class in "graph_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["Graph"] + + +@define(str=False, repr=False, init=False) +class Graph(Archetype): + """ + **Archetype**: A graph that consists of nodes and edges. + + By default, the graph is undirected. + """ + + def __init__( + self: Any, + nodes: datatypes.GraphNodeArrayLike, + *, + edges: datatypes.GraphEdgeArrayLike | None = None, + graph_type: datatypes.GraphTypeLike | None = None, + node_positions: datatypes.Vec2DArrayLike | None = None, + ): + """ + Create a new instance of the Graph archetype. + + Parameters + ---------- + nodes: + A list of nodes. + edges: + A list of edges. + graph_type: + Specifies if the graph is directed or undirected. + node_positions: + The position for each of the nodes. + + """ + + # You can define your own __init__ function as a member of GraphExt in graph_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(nodes=nodes, edges=edges, graph_type=graph_type, node_positions=node_positions) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + nodes=None, # type: ignore[arg-type] + edges=None, # type: ignore[arg-type] + graph_type=None, # type: ignore[arg-type] + node_positions=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> Graph: + """Produce an empty Graph, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + nodes: components.GraphNodeBatch = field( + metadata={"component": "required"}, + converter=components.GraphNodeBatch._required, # type: ignore[misc] + ) + # A list of nodes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + edges: components.GraphEdgeBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.GraphEdgeBatch._optional, # type: ignore[misc] + ) + # A list of edges. + # + # (Docstring intentionally commented out to hide this field from the docs) + + graph_type: components.GraphTypeBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.GraphTypeBatch._optional, # type: ignore[misc] + ) + # Specifies if the graph is directed or undirected. + # + # (Docstring intentionally commented out to hide this field from the docs) + + node_positions: components.Position2DBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.Position2DBatch._optional, # type: ignore[misc] + ) + # The position for each of the nodes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py deleted file mode 100644 index 8fd3b6349d38..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py +++ /dev/null @@ -1,124 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -# You can extend this class by creating a "GraphEdgesDirectedExt" class in "graph_edges_directed_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["GraphEdgesDirected"] - - -@define(str=False, repr=False, init=False) -class GraphEdgesDirected(Archetype): - """**Archetype**: A list of directed edges in a graph with optional labels, colors, etc.""" - - def __init__( - self: Any, - edges: datatypes.GraphEdgeArrayLike, - *, - colors: datatypes.Rgba32ArrayLike | None = None, - labels: datatypes.Utf8ArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, - ): - """ - Create a new instance of the GraphEdgesDirected archetype. - - Parameters - ---------- - edges: - A list of node IDs. - colors: - Optional colors for the boxes. - labels: - Optional text labels for the node. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - - """ - - # You can define your own __init__ function as a member of GraphEdgesDirectedExt in graph_edges_directed_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - edges=None, # type: ignore[arg-type] - colors=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> GraphEdgesDirected: - """Produce an empty GraphEdgesDirected, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - edges: components.GraphEdgeDirectedBatch = field( - metadata={"component": "required"}, - converter=components.GraphEdgeDirectedBatch._required, # type: ignore[misc] - ) - # A list of node IDs. - # - # (Docstring intentionally commented out to hide this field from the docs) - - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] - ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py deleted file mode 100644 index 347c4f0b645d..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py +++ /dev/null @@ -1,124 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -# You can extend this class by creating a "GraphEdgesUndirectedExt" class in "graph_edges_undirected_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["GraphEdgesUndirected"] - - -@define(str=False, repr=False, init=False) -class GraphEdgesUndirected(Archetype): - """**Archetype**: A list of undirected edges in a graph with optional labels, colors, etc.""" - - def __init__( - self: Any, - edges: datatypes.GraphEdgeArrayLike, - *, - colors: datatypes.Rgba32ArrayLike | None = None, - labels: datatypes.Utf8ArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, - ): - """ - Create a new instance of the GraphEdgesUndirected archetype. - - Parameters - ---------- - edges: - A list of node IDs. - colors: - Optional colors for the boxes. - labels: - Optional text labels for the node. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - - """ - - # You can define your own __init__ function as a member of GraphEdgesUndirectedExt in graph_edges_undirected_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - edges=None, # type: ignore[arg-type] - colors=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> GraphEdgesUndirected: - """Produce an empty GraphEdgesUndirected, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - edges: components.GraphEdgeUndirectedBatch = field( - metadata={"component": "required"}, - converter=components.GraphEdgeUndirectedBatch._required, # type: ignore[misc] - ) - # A list of node IDs. - # - # (Docstring intentionally commented out to hide this field from the docs) - - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] - ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py deleted file mode 100644 index ad6fb9244bc5..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py +++ /dev/null @@ -1,144 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". - -# You can extend this class by creating a "GraphNodesExt" class in "graph_nodes_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["GraphNodes"] - - -@define(str=False, repr=False, init=False) -class GraphNodes(Archetype): - """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" - - def __init__( - self: Any, - node_ids: datatypes.GraphNodeIdArrayLike, - *, - labels: datatypes.Utf8ArrayLike | None = None, - colors: datatypes.Rgba32ArrayLike | None = None, - centers: datatypes.Vec2DArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, - ): - """ - Create a new instance of the GraphNodes archetype. - - Parameters - ---------- - node_ids: - A list of node IDs. - labels: - Optional text labels for the node. - colors: - Optional colors for the boxes. - centers: - Optional center positions of the nodes. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - - """ - - # You can define your own __init__ function as a member of GraphNodesExt in graph_nodes_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__( - node_ids=node_ids, - labels=labels, - colors=colors, - centers=centers, - show_labels=show_labels, - class_ids=class_ids, - ) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - node_ids=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] - colors=None, # type: ignore[arg-type] - centers=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> GraphNodes: - """Produce an empty GraphNodes, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - node_ids: components.GraphNodeIdBatch = field( - metadata={"component": "required"}, - converter=components.GraphNodeIdBatch._required, # type: ignore[misc] - ) - # A list of node IDs. - # - # (Docstring intentionally commented out to hide this field from the docs) - - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - centers: components.Position2DBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.Position2DBatch._optional, # type: ignore[misc] - ) - # Optional center positions of the nodes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] - ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/.gitattributes b/rerun_py/rerun_sdk/rerun/components/.gitattributes index e23a94f9df5d..b58a29ae3dac 100644 --- a/rerun_py/rerun_sdk/rerun/components/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/components/.gitattributes @@ -18,9 +18,9 @@ entity_path.py linguist-generated=true fill_mode.py linguist-generated=true fill_ratio.py linguist-generated=true gamma_correction.py linguist-generated=true -graph_edge_directed.py linguist-generated=true -graph_edge_undirected.py linguist-generated=true -graph_node_id.py linguist-generated=true +graph_edge.py linguist-generated=true +graph_node.py linguist-generated=true +graph_type.py linguist-generated=true half_size2d.py linguist-generated=true half_size3d.py linguist-generated=true image_buffer.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index f4c280e724bc..4c07d684c17f 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,9 +30,9 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType -from .graph_edge_directed import GraphEdgeDirected, GraphEdgeDirectedBatch, GraphEdgeDirectedType -from .graph_edge_undirected import GraphEdgeUndirected, GraphEdgeUndirectedBatch, GraphEdgeUndirectedType -from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType +from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType +from .graph_node import GraphNode, GraphNodeBatch, GraphNodeType +from .graph_type import GraphType, GraphTypeBatch, GraphTypeType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType from .image_buffer import ImageBuffer, ImageBufferBatch, ImageBufferType @@ -154,15 +154,15 @@ "GammaCorrection", "GammaCorrectionBatch", "GammaCorrectionType", - "GraphEdgeDirected", - "GraphEdgeDirectedBatch", - "GraphEdgeDirectedType", - "GraphEdgeUndirected", - "GraphEdgeUndirectedBatch", - "GraphEdgeUndirectedType", - "GraphNodeId", - "GraphNodeIdBatch", - "GraphNodeIdType", + "GraphEdge", + "GraphEdgeBatch", + "GraphEdgeType", + "GraphNode", + "GraphNodeBatch", + "GraphNodeType", + "GraphType", + "GraphTypeBatch", + "GraphTypeType", "HalfSize2D", "HalfSize2DBatch", "HalfSize2DType", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py new file mode 100644 index 000000000000..f36c270848f0 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] + + +class GraphEdge(datatypes.GraphEdge, ComponentMixin): + """**Component**: An undirected edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py + + # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge + pass + + +class GraphEdgeType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdge" + + +class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeType() + + +# This is patched in late to avoid circular dependencies. +GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py deleted file mode 100644 index 590596f6755e..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". - -# You can extend this class by creating a "GraphEdgeDirectedExt" class in "graph_edge_directed_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdgeDirected", "GraphEdgeDirectedBatch", "GraphEdgeDirectedType"] - - -class GraphEdgeDirected(datatypes.GraphEdge, ComponentMixin): - """**Component**: A directed edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeDirectedExt in graph_edge_directed_ext.py - - # Note: there are no fields here because GraphEdgeDirected delegates to datatypes.GraphEdge - pass - - -class GraphEdgeDirectedType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdgeDirected" - - -class GraphEdgeDirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeDirectedType() - - -# This is patched in late to avoid circular dependencies. -GraphEdgeDirected._BATCH_TYPE = GraphEdgeDirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py deleted file mode 100644 index 0519c78ebaae..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". - -# You can extend this class by creating a "GraphEdgeUndirectedExt" class in "graph_edge_undirected_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdgeUndirected", "GraphEdgeUndirectedBatch", "GraphEdgeUndirectedType"] - - -class GraphEdgeUndirected(datatypes.GraphEdge, ComponentMixin): - """**Component**: An undirected edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeUndirectedExt in graph_edge_undirected_ext.py - - # Note: there are no fields here because GraphEdgeUndirected delegates to datatypes.GraphEdge - pass - - -class GraphEdgeUndirectedType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdgeUndirected" - - -class GraphEdgeUndirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeUndirectedType() - - -# This is patched in late to avoid circular dependencies. -GraphEdgeUndirected._BATCH_TYPE = GraphEdgeUndirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node.py b/rerun_py/rerun_sdk/rerun/components/graph_node.py new file mode 100644 index 000000000000..a9b7c95afca0 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_node.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". + +# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphNode", "GraphNodeBatch", "GraphNodeType"] + + +class GraphNode(datatypes.GraphNode, ComponentMixin): + """**Component**: A 32-bit ID representing a node in a graph.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py + + # Note: there are no fields here because GraphNode delegates to datatypes.GraphNode + pass + + +class GraphNodeType(datatypes.GraphNodeType): + _TYPE_NAME: str = "rerun.components.GraphNode" + + +class GraphNodeBatch(datatypes.GraphNodeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphNodeType() + + +# This is patched in late to avoid circular dependencies. +GraphNode._BATCH_TYPE = GraphNodeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py deleted file mode 100644 index 4ff668e9281c..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". - -# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphNodeId", "GraphNodeIdBatch", "GraphNodeIdType"] - - -class GraphNodeId(datatypes.GraphNodeId, ComponentMixin): - """**Component**: A 32-bit ID representing a node in a graph.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py - - # Note: there are no fields here because GraphNodeId delegates to datatypes.GraphNodeId - pass - - -class GraphNodeIdType(datatypes.GraphNodeIdType): - _TYPE_NAME: str = "rerun.components.GraphNodeId" - - -class GraphNodeIdBatch(datatypes.GraphNodeIdBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphNodeIdType() - - -# This is patched in late to avoid circular dependencies. -GraphNodeId._BATCH_TYPE = GraphNodeIdBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_type.py b/rerun_py/rerun_sdk/rerun/components/graph_type.py new file mode 100644 index 000000000000..b458ca637822 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_type.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". + +# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphType", "GraphTypeBatch", "GraphTypeType"] + + +class GraphType(datatypes.GraphType, ComponentMixin): + """**Component**: An undirected edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphTypeExt in graph_type_ext.py + + # Note: there are no fields here because GraphType delegates to datatypes.GraphType + pass + + +class GraphTypeType(datatypes.GraphTypeType): + _TYPE_NAME: str = "rerun.components.GraphType" + + +class GraphTypeBatch(datatypes.GraphTypeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphTypeType() + + +# This is patched in late to avoid circular dependencies. +GraphType._BATCH_TYPE = GraphTypeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index af6b5ed76347..95631c93b9f7 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -15,8 +15,8 @@ entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true graph_edge.py linguist-generated=true -graph_location.py linguist-generated=true -graph_node_id.py linguist-generated=true +graph_node.py linguist-generated=true +graph_type.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 5428717d75c0..91e7977ca4fa 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -39,14 +39,8 @@ from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType -from .graph_location import ( - GraphLocation, - GraphLocationArrayLike, - GraphLocationBatch, - GraphLocationLike, - GraphLocationType, -) -from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType +from .graph_node import GraphNode, GraphNodeArrayLike, GraphNodeBatch, GraphNodeLike, GraphNodeType +from .graph_type import GraphType, GraphTypeArrayLike, GraphTypeBatch, GraphTypeLike, GraphTypeType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -195,16 +189,16 @@ "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType", - "GraphLocation", - "GraphLocationArrayLike", - "GraphLocationBatch", - "GraphLocationLike", - "GraphLocationType", - "GraphNodeId", - "GraphNodeIdArrayLike", - "GraphNodeIdBatch", - "GraphNodeIdLike", - "GraphNodeIdType", + "GraphNode", + "GraphNodeArrayLike", + "GraphNodeBatch", + "GraphNodeLike", + "GraphNodeType", + "GraphType", + "GraphTypeArrayLike", + "GraphTypeBatch", + "GraphTypeLike", + "GraphTypeType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py index 3fc8c8953901..b02a2f10394b 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -19,11 +19,25 @@ __all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] +def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: + if isinstance(x, datatypes.GraphNode): + return x + else: + return datatypes.GraphNode(x) + + +def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: + if isinstance(x, datatypes.GraphNode): + return x + else: + return datatypes.GraphNode(x) + + @define(init=False) class GraphEdge: """**Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities).""" - def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.GraphLocationLike): + def __init__(self: Any, source: datatypes.GraphNodeLike, target: datatypes.GraphNodeLike): """ Create a new instance of the GraphEdge datatype. @@ -39,12 +53,12 @@ def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.G # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py self.__attrs_init__(source=source, target=target) - source: datatypes.GraphLocation = field() + source: datatypes.GraphNode = field(converter=_graph_edge__source__special_field_converter_override) # The id of the source node. # # (Docstring intentionally commented out to hide this field from the docs) - target: datatypes.GraphLocation = field() + target: datatypes.GraphNode = field(converter=_graph_edge__target__special_field_converter_override) # The id of the target node. # # (Docstring intentionally commented out to hide this field from the docs) @@ -64,24 +78,8 @@ def __init__(self) -> None: pa.ExtensionType.__init__( self, pa.struct([ - pa.field( - "source", - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - nullable=False, - metadata={}, - ), - pa.field( - "target", - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - nullable=False, - metadata={}, - ), + pa.field("source", pa.utf8(), nullable=False, metadata={}), + pa.field("target", pa.utf8(), nullable=False, metadata={}), ]), self._TYPE_NAME, ) @@ -92,15 +90,15 @@ class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): @staticmethod def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import GraphLocationBatch + from rerun.datatypes import GraphNodeBatch if isinstance(data, GraphEdge): data = [data] return pa.StructArray.from_arrays( [ - GraphLocationBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphLocationBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] ], fields=list(data_type), ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py deleted file mode 100644 index 1925f78eb0ef..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py +++ /dev/null @@ -1,108 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -# You can extend this class by creating a "GraphLocationExt" class in "graph_location_ext.py". - -from __future__ import annotations - -from typing import Any, Sequence, Union - -import pyarrow as pa -from attrs import define, field - -from .. import datatypes -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphLocation", "GraphLocationArrayLike", "GraphLocationBatch", "GraphLocationLike", "GraphLocationType"] - - -def _graph_location__entity_path__special_field_converter_override(x: datatypes.EntityPathLike) -> datatypes.EntityPath: - if isinstance(x, datatypes.EntityPath): - return x - else: - return datatypes.EntityPath(x) - - -def _graph_location__node_id__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: - if isinstance(x, datatypes.GraphNodeId): - return x - else: - return datatypes.GraphNodeId(x) - - -@define(init=False) -class GraphLocation: - """ - **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. - - We require this because the same node id can be used in multiple entities. - """ - - def __init__(self: Any, entity_path: datatypes.EntityPathLike, node_id: datatypes.GraphNodeIdLike): - """ - Create a new instance of the GraphLocation datatype. - - Parameters - ---------- - entity_path: - The entity path that specifies where to find the node. - node_id: - The id of the node. - - """ - - # You can define your own __init__ function as a member of GraphLocationExt in graph_location_ext.py - self.__attrs_init__(entity_path=entity_path, node_id=node_id) - - entity_path: datatypes.EntityPath = field(converter=_graph_location__entity_path__special_field_converter_override) - # The entity path that specifies where to find the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - node_id: datatypes.GraphNodeId = field(converter=_graph_location__node_id__special_field_converter_override) - # The id of the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - -GraphLocationLike = GraphLocation -GraphLocationArrayLike = Union[ - GraphLocation, - Sequence[GraphLocationLike], -] - - -class GraphLocationType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphLocation" - - def __init__(self) -> None: - pa.ExtensionType.__init__( - self, - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - self._TYPE_NAME, - ) - - -class GraphLocationBatch(BaseBatch[GraphLocationArrayLike]): - _ARROW_TYPE = GraphLocationType() - - @staticmethod - def _native_to_pa_array(data: GraphLocationArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch - - if isinstance(data, GraphLocation): - data = [data] - - return pa.StructArray.from_arrays( - [ - EntityPathBatch([x.entity_path for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeIdBatch([x.node_id for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - ], - fields=list(data_type), - ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py similarity index 50% rename from rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py rename to rerun_py/rerun_sdk/rerun/datatypes/graph_node.py index 68af8f033bbe..ab9124a67206 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py @@ -1,12 +1,14 @@ # DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". -# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". +# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". from __future__ import annotations from typing import TYPE_CHECKING, Any, Sequence, Union +import numpy as np +import numpy.typing as npt import pyarrow as pa from attrs import define, field @@ -15,17 +17,17 @@ BaseExtensionType, ) -__all__ = ["GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", "GraphNodeIdLike", "GraphNodeIdType"] +__all__ = ["GraphNode", "GraphNodeArrayLike", "GraphNodeBatch", "GraphNodeLike", "GraphNodeType"] @define(init=False) -class GraphNodeId: - """**Datatype**: A 32-bit ID representing a node in a graph.""" +class GraphNode: + """**Datatype**: A string ID representing a node in a graph.""" - def __init__(self: Any, id: GraphNodeIdLike): - """Create a new instance of the GraphNodeId datatype.""" + def __init__(self: Any, id: GraphNodeLike): + """Create a new instance of the GraphNode datatype.""" - # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py self.__attrs_init__(id=id) id: str = field(converter=str) @@ -38,29 +40,31 @@ def __hash__(self) -> int: if TYPE_CHECKING: - GraphNodeIdLike = Union[GraphNodeId, str] + GraphNodeLike = Union[GraphNode, str] else: - GraphNodeIdLike = Any + GraphNodeLike = Any -GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], Sequence[str]] +GraphNodeArrayLike = Union[GraphNode, Sequence[GraphNodeLike], Sequence[str]] -class GraphNodeIdType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphNodeId" +class GraphNodeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphNode" def __init__(self) -> None: pa.ExtensionType.__init__(self, pa.utf8(), self._TYPE_NAME) -class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): - _ARROW_TYPE = GraphNodeIdType() +class GraphNodeBatch(BaseBatch[GraphNodeArrayLike]): + _ARROW_TYPE = GraphNodeType() @staticmethod - def _native_to_pa_array(data: GraphNodeIdArrayLike, data_type: pa.DataType) -> pa.Array: + def _native_to_pa_array(data: GraphNodeArrayLike, data_type: pa.DataType) -> pa.Array: if isinstance(data, str): - array = [data] + array: Union[list[str], npt.ArrayLike] = [data] elif isinstance(data, Sequence): array = [str(datum) for datum in data] + elif isinstance(data, np.ndarray): + array = data else: array = [str(data)] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py new file mode 100644 index 000000000000..4f59e2cd3996 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py @@ -0,0 +1,74 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". + +from __future__ import annotations + +from typing import Literal, Sequence, Union + +import pyarrow as pa + +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphType", "GraphTypeArrayLike", "GraphTypeBatch", "GraphTypeLike", "GraphTypeType"] + + +from enum import Enum + + +class GraphType(Enum): + """**Datatype**: Specifies if a graph has directed or undirected edges.""" + + Undirected = 1 + """The graph has undirected edges.""" + + Directed = 2 + """The graph has directed edges.""" + + @classmethod + def auto(cls, val: str | int | GraphType) -> GraphType: + """Best-effort converter, including a case-insensitive string matcher.""" + if isinstance(val, GraphType): + return val + if isinstance(val, int): + return cls(val) + try: + return cls[val] + except KeyError: + val_lower = val.lower() + for variant in cls: + if variant.name.lower() == val_lower: + return variant + raise ValueError(f"Cannot convert {val} to {cls.__name__}") + + def __str__(self) -> str: + """Returns the variant name.""" + return self.name + + +GraphTypeLike = Union[GraphType, Literal["Directed", "Undirected", "directed", "undirected"], int] +GraphTypeArrayLike = Union[GraphTypeLike, Sequence[GraphTypeLike]] + + +class GraphTypeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphType" + + def __init__(self) -> None: + pa.ExtensionType.__init__(self, pa.uint8(), self._TYPE_NAME) + + +class GraphTypeBatch(BaseBatch[GraphTypeArrayLike]): + _ARROW_TYPE = GraphTypeType() + + @staticmethod + def _native_to_pa_array(data: GraphTypeArrayLike, data_type: pa.DataType) -> pa.Array: + if isinstance(data, (GraphType, int, str)): + data = [data] + + pa_data = [GraphType.auto(v).value if v is not None else None for v in data] # type: ignore[redundant-expr] + + return pa.array(pa_data, type=data_type) From fb44b7a98ad2ec53187bd3649a5aa555952f175d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 23 Oct 2024 15:16:09 +0200 Subject: [PATCH 094/159] WIP --- .../re_types/src/datatypes/graph_node_ext.rs | 2 ++ .../re_space_view_graph/src/graph/hash.rs | 4 +-- .../re_space_view_graph/src/graph/index.rs | 19 ++++--------- .../re_space_view_graph/src/graph/mod.rs | 22 +++++++-------- .../viewer/re_space_view_graph/src/types.rs | 20 +++++++------- .../viewer/re_space_view_graph/src/ui/mod.rs | 2 +- crates/viewer/re_space_view_graph/src/view.rs | 27 ++++++++++++------- .../src/visualizers/edges_directed.rs | 2 +- .../src/visualizers/edges_undirected.rs | 2 +- 9 files changed, 50 insertions(+), 50 deletions(-) diff --git a/crates/store/re_types/src/datatypes/graph_node_ext.rs b/crates/store/re_types/src/datatypes/graph_node_ext.rs index 3265bdd535b9..8b00d8faea6e 100644 --- a/crates/store/re_types/src/datatypes/graph_node_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_ext.rs @@ -1,3 +1,5 @@ +use re_log_types::hash::Hash64; + use super::GraphNode; impl std::convert::From<&str> for GraphNode { diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 655a0d4002ff..6243e393d3a0 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -25,8 +25,8 @@ impl std::fmt::Debug for NodeIdHash { } } -impl From<&datatypes::GraphNodeId> for NodeIdHash { - fn from(node_id: &datatypes::GraphNodeId) -> Self { +impl From<&datatypes::GraphNode> for NodeIdHash { + fn from(node_id: &datatypes::GraphNode) -> Self { Self(Hash64::hash(node_id)) } } diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index 1bf14bcee2ca..e80a5467b1b0 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -4,25 +4,16 @@ use re_types::datatypes; use super::NodeIdHash; #[derive(Clone, Copy, PartialEq, Eq, Hash)] -pub(crate) struct NodeIndex { +pub struct NodeIndex { pub entity_hash: EntityPathHash, pub node_id: NodeIdHash, } -impl From for NodeIndex { - fn from(location: datatypes::GraphLocation) -> Self { +impl NodeIndex { + pub fn new(entity_path: &EntityPath, node_id: &datatypes::GraphNode) -> Self { Self { - entity_hash: EntityPath::from(location.entity_path).hash(), - node_id: NodeIdHash::from(&location.node_id), - } - } -} - -impl From<&datatypes::GraphLocation> for NodeIndex { - fn from(location: &datatypes::GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path.clone()).hash(), - node_id: NodeIdHash::from(&location.node_id), + entity_hash: entity_path.hash(), + node_id: NodeIdHash::from(node_id), } } } diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 7d9c78ffe7c2..86cdde1f2493 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use re_log_types::EntityPath; +use re_log_types::{EntityPath, EntityPathHash}; use re_types::datatypes; use crate::{ @@ -38,7 +38,7 @@ impl<'a> From> for NodeIndex { pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: HashSet<(EntityPath, datatypes::GraphNodeId)>, + unknown: HashSet<(EntityPathHash, datatypes::GraphNode)>, nodes: &'a Vec, directed: &'a Vec, undirected: &'a Vec, @@ -50,32 +50,32 @@ impl<'a> Graph<'a> { directed: &'a Vec, undirected: &'a Vec, ) -> Option { - let mut seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes + let mut seen: HashSet<(EntityPathHash, &datatypes::GraphNode)> = nodes .iter() .flat_map(|entity| entity.nodes()) - .map(|n| (n.entity_path, n.node_id)) + .map(|n| (n.entity_path.hash(), n.node_id)) .collect(); let mut unknown = HashSet::new(); for entity in undirected { + let entity_hash = entity.entity_path.hash(); for edge in entity.edges() { for node in edge.nodes() { - let entity_path = EntityPath::from(node.entity_path.clone()); - if seen.contains(&(&entity_path, &node.node_id)) { + if seen.contains(&(entity_hash, &node)) { continue; } - unknown.insert((entity_path, node.node_id)); + unknown.insert((entity_hash, node)); } } } for entity in directed { + let entity_hash = entity.entity_path.hash(); for edge in entity.edges() { for node in edge.nodes() { - let entity_path = EntityPath::from(node.entity_path.clone()); - if seen.contains(&(&entity_path, &node.node_id)) { + if seen.contains(&(entity_hash, &node)) { continue; } - unknown.insert((entity_path, node.node_id)); + unknown.insert((entity_hash, node)); } } } @@ -119,7 +119,7 @@ impl<'a> Graph<'a> { self.unknown .iter() .map(|(entity_path, node_id)| UnknownNodeInstance { - entity_path, + entity_hash: entity_path, node_id, }) } diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 3b2b5ba1a265..ae4071a3aed1 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,10 +1,10 @@ -use re_log_types::{EntityPath, Instance}; +use re_log_types::{EntityPath, EntityPathHash, Instance}; use re_types::{datatypes, ArrowString}; use crate::graph::NodeIndex; impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { + pub fn nodes(&'a self) -> impl Iterator { [self.source.clone(), self.target.clone()].into_iter() } } @@ -28,7 +28,7 @@ impl<'a> From> for NodeIndex { } pub(crate) struct NodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, + pub node_id: &'a datatypes::GraphNode, pub entity_path: &'a EntityPath, pub instance: Instance, pub show_labels: bool, @@ -37,22 +37,22 @@ pub(crate) struct NodeInstance<'a> { } pub struct EdgeInstance<'a> { - pub source: &'a datatypes::GraphLocation, - pub target: &'a datatypes::GraphLocation, - pub _entity_path: &'a re_log_types::EntityPath, + pub source: &'a datatypes::GraphNode, + pub target: &'a datatypes::GraphNode, + pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, } pub(crate) struct UnknownNodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, - pub entity_path: &'a EntityPath, + pub node_id: &'a datatypes::GraphNode, + pub entity_hash: &'a EntityPathHash, } impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { fn from(node: &UnknownNodeInstance<'a>) -> Self { Self { - entity_hash: node.entity_path.hash(), + entity_hash: node.entity_hash.hash(), node_id: node.node_id.into(), } } @@ -61,7 +61,7 @@ impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { impl<'a> From> for NodeIndex { fn from(node: UnknownNodeInstance<'a>) -> Self { Self { - entity_hash: node.entity_path.hash(), + entity_hash: node.entity_hash.hash(), node_id: node.node_id.into(), } } diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 36a1f7384f56..c0f6748b0c00 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -18,7 +18,7 @@ use crate::{ }; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) + let text = egui::RichText::new(format!("{}", instance.node_id)) .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); ui.add(egui::Button::new(text)) diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 9cf180038a47..9a55e247e967 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,5 +1,4 @@ use std::collections::{HashMap, HashSet}; -use std::hash::Hash; use egui::{self, Rect}; use re_log_types::EntityPath; @@ -22,12 +21,13 @@ use crate::{ #[derive(Default)] pub struct GraphSpaceView; -fn arrange_in_circle(nodes: &mut HashMap, radius: f32) { +fn arrange_in_circle( + nodes: &mut HashMap, egui::Rect)>, + radius: f32, +) { let n = nodes.len(); let center = egui::Pos2::new(0.0, 0.0); - let nodes_by_entity = nodes.iter().map(|(entity, (ix, _))| (entity, ix)).collect::>(); - for (i, (_id, (_, rect))) in nodes.iter_mut().enumerate() { let angle = 2.0 * std::f32::consts::PI * i as f32 / n as f32; let x = center.x + radius * angle.cos(); @@ -192,7 +192,10 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let ix = NodeIndex::from(&node); seen.insert(ix); - let (_,current) = state.layout.entry(ix).or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); + let (_, current) = state + .layout + .entry(ix) + .or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -229,13 +232,17 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some((_, source_pos)), Some((_,target_pos))) = ( - state.layout.get(&edge.source.into()), - state.layout.get(&edge.target.into()), + if let (Some((_, source_pos)), Some((_, target_pos))) = ( + state + .layout + .get(NodeIndex::new(edge.entity_path, &edge.source)), + state + .layout + .get(NodeIndex::new(edge.entity_path, &edge.target)), ) { scene.edge(|ui| { ui::draw_edge( - ui, + &ui, edge.color, source_pos, target_pos, @@ -252,7 +259,7 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some((_,source_pos)), Some((_,target_pos))) = ( + if let (Some((_, source_pos)), Some((_, target_pos))) = ( state.layout.get(&edge.source.into()), state.layout.get(&edge.target.into()), ) { diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs index 11d85e49fe52..6a99d50355b5 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs @@ -36,7 +36,7 @@ impl EdgesDirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - _entity_path: &self.entity_path, + entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs index 7221a6eddd67..e16f7e483cdb 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs @@ -36,7 +36,7 @@ impl EdgesUndirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - _entity_path: &self.entity_path, + entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) From 1408badf5522eddeae82e2ee069771e3510cf7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 23 Oct 2024 16:16:16 +0200 Subject: [PATCH 095/159] WIP: undo data model changes --- .editorconfig | 5 - .../re_types/definitions/rerun/archetypes.fbs | 4 +- .../definitions/rerun/archetypes/graph.fbs | 27 -- .../rerun/archetypes/graph_edges_directed.fbs | 32 ++ .../archetypes/graph_edges_undirected.fbs | 32 ++ .../rerun/archetypes/graph_nodes.fbs | 36 ++ .../re_types/definitions/rerun/components.fbs | 6 +- .../rerun/components/graph_edge_directed.fbs | 13 + ...aph_edge.fbs => graph_edge_undirected.fbs} | 2 +- .../{graph_node.fbs => graph_node_id.fbs} | 4 +- .../rerun/components/graph_type.fbs | 11 - .../re_types/definitions/rerun/datatypes.fbs | 4 +- .../rerun/datatypes/graph_edge.fbs | 12 +- .../rerun/datatypes/graph_location.fbs | 19 + .../{graph_node.fbs => graph_node_id.fbs} | 4 +- .../rerun/datatypes/graph_type.fbs | 19 - .../re_types/src/archetypes/.gitattributes | 4 +- crates/store/re_types/src/archetypes/graph.rs | 258 ------------- .../src/archetypes/graph_edges_directed.rs | 303 ++++++++++++++++ .../src/archetypes/graph_edges_undirected.rs | 303 ++++++++++++++++ .../re_types/src/archetypes/graph_nodes.rs | 336 +++++++++++++++++ crates/store/re_types/src/archetypes/mod.rs | 8 +- .../re_types/src/components/.gitattributes | 6 +- .../{graph_edge.rs => graph_edge_directed.rs} | 20 +- ...graph_type.rs => graph_edge_undirected.rs} | 47 +-- .../{graph_node.rs => graph_node_id.rs} | 36 +- crates/store/re_types/src/components/mod.rs | 12 +- .../re_types/src/datatypes/.gitattributes | 4 +- .../re_types/src/datatypes/graph_edge.rs | 146 +------- .../re_types/src/datatypes/graph_edge_ext.rs | 26 ++ .../re_types/src/datatypes/graph_location.rs | 341 ++++++++++++++++++ .../src/datatypes/graph_location_ext.rs | 16 + .../{graph_node.rs => graph_node_id.rs} | 28 +- ...graph_node_ext.rs => graph_node_id_ext.rs} | 10 +- .../re_types/src/datatypes/graph_type.rs | 153 -------- crates/store/re_types/src/datatypes/mod.rs | 12 +- .../re_space_view_graph/src/graph/hash.rs | 4 +- .../re_space_view_graph/src/graph/index.rs | 19 +- .../re_space_view_graph/src/graph/mod.rs | 22 +- .../viewer/re_space_view_graph/src/types.rs | 20 +- .../viewer/re_space_view_graph/src/ui/mod.rs | 2 +- crates/viewer/re_space_view_graph/src/view.rs | 27 +- .../src/visualizers/edges_directed.rs | 2 +- .../src/visualizers/edges_undirected.rs | 2 +- crates/viewer/re_viewer/src/reflection/mod.rs | 98 ++++- docs/content/reference/types/archetypes.md | 4 +- .../reference/types/archetypes/.gitattributes | 4 +- .../reference/types/archetypes/graph.md | 26 -- .../types/archetypes/graph_edges_directed.md | 24 ++ .../archetypes/graph_edges_undirected.md | 24 ++ .../reference/types/archetypes/graph_nodes.md | 24 ++ docs/content/reference/types/components.md | 6 +- .../reference/types/components/.gitattributes | 6 +- .../reference/types/components/class_id.md | 3 + .../reference/types/components/color.md | 3 + .../reference/types/components/graph_edge.md | 20 - .../types/components/graph_edge_directed.md | 20 + .../types/components/graph_edge_undirected.md | 20 + .../reference/types/components/graph_node.md | 20 - .../types/components/graph_node_id.md | 20 + .../reference/types/components/graph_type.md | 20 - .../reference/types/components/position2d.md | 2 +- .../reference/types/components/show_labels.md | 3 + .../reference/types/components/text.md | 3 + docs/content/reference/types/datatypes.md | 4 +- .../reference/types/datatypes/.gitattributes | 4 +- .../reference/types/datatypes/entity_path.md | 11 +- .../reference/types/datatypes/graph_edge.md | 7 +- .../types/datatypes/graph_location.md | 23 ++ .../reference/types/datatypes/graph_node.md | 21 -- .../types/datatypes/graph_node_id.md | 21 ++ .../reference/types/datatypes/graph_type.md | 21 -- rerun_cpp/src/rerun/archetypes.hpp | 4 +- rerun_cpp/src/rerun/archetypes/.gitattributes | 8 +- rerun_cpp/src/rerun/archetypes/graph.hpp | 86 ----- .../{graph.cpp => graph_edges_directed.cpp} | 31 +- .../rerun/archetypes/graph_edges_directed.hpp | 102 ++++++ .../archetypes/graph_edges_undirected.cpp | 53 +++ .../archetypes/graph_edges_undirected.hpp | 102 ++++++ .../src/rerun/archetypes/graph_nodes.cpp | 58 +++ .../src/rerun/archetypes/graph_nodes.hpp | 112 ++++++ rerun_cpp/src/rerun/components.hpp | 6 +- rerun_cpp/src/rerun/components/.gitattributes | 6 +- ...graph_edge.hpp => graph_edge_directed.hpp} | 20 +- ...aph_type.hpp => graph_edge_undirected.hpp} | 41 ++- .../{graph_node.hpp => graph_node_id.hpp} | 38 +- rerun_cpp/src/rerun/datatypes.hpp | 4 +- rerun_cpp/src/rerun/datatypes/.gitattributes | 8 +- rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 42 ++- rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 6 +- .../src/rerun/datatypes/graph_location.cpp | 90 +++++ .../{graph_type.hpp => graph_location.hpp} | 42 ++- .../{graph_node.cpp => graph_node_id.cpp} | 16 +- .../{graph_node.hpp => graph_node_id.hpp} | 23 +- rerun_cpp/src/rerun/datatypes/graph_type.cpp | 56 --- .../rerun_sdk/rerun/archetypes/.gitattributes | 4 +- .../rerun_sdk/rerun/archetypes/__init__.py | 8 +- rerun_py/rerun_sdk/rerun/archetypes/graph.py | 111 ------ .../rerun/archetypes/graph_edges_directed.py | 124 +++++++ .../archetypes/graph_edges_undirected.py | 124 +++++++ .../rerun_sdk/rerun/archetypes/graph_nodes.py | 144 ++++++++ .../rerun_sdk/rerun/components/.gitattributes | 6 +- .../rerun_sdk/rerun/components/__init__.py | 24 +- .../rerun_sdk/rerun/components/graph_edge.py | 36 -- .../rerun/components/graph_edge_directed.py | 36 ++ .../rerun/components/graph_edge_undirected.py | 36 ++ .../rerun_sdk/rerun/components/graph_node.py | 36 -- .../rerun/components/graph_node_id.py | 36 ++ .../rerun_sdk/rerun/components/graph_type.py | 36 -- .../rerun_sdk/rerun/datatypes/.gitattributes | 4 +- .../rerun_sdk/rerun/datatypes/__init__.py | 30 +- .../rerun_sdk/rerun/datatypes/graph_edge.py | 46 +-- .../rerun/datatypes/graph_location.py | 108 ++++++ .../{graph_node.py => graph_node_id.py} | 38 +- .../rerun_sdk/rerun/datatypes/graph_type.py | 74 ---- 115 files changed, 3295 insertions(+), 1579 deletions(-) delete mode 100644 .editorconfig delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph.fbs create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs create mode 100644 crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs rename crates/store/re_types/definitions/rerun/components/{graph_edge.fbs => graph_edge_undirected.fbs} (92%) rename crates/store/re_types/definitions/rerun/components/{graph_node.fbs => graph_node_id.fbs} (85%) delete mode 100644 crates/store/re_types/definitions/rerun/components/graph_type.fbs create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs rename crates/store/re_types/definitions/rerun/datatypes/{graph_node.fbs => graph_node_id.fbs} (85%) delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs delete mode 100644 crates/store/re_types/src/archetypes/graph.rs create mode 100644 crates/store/re_types/src/archetypes/graph_edges_directed.rs create mode 100644 crates/store/re_types/src/archetypes/graph_edges_undirected.rs create mode 100644 crates/store/re_types/src/archetypes/graph_nodes.rs rename crates/store/re_types/src/components/{graph_edge.rs => graph_edge_directed.rs} (86%) rename crates/store/re_types/src/components/{graph_type.rs => graph_edge_undirected.rs} (63%) rename crates/store/re_types/src/components/{graph_node.rs => graph_node_id.rs} (69%) create mode 100644 crates/store/re_types/src/datatypes/graph_edge_ext.rs create mode 100644 crates/store/re_types/src/datatypes/graph_location.rs create mode 100644 crates/store/re_types/src/datatypes/graph_location_ext.rs rename crates/store/re_types/src/datatypes/{graph_node.rs => graph_node_id.rs} (88%) rename crates/store/re_types/src/datatypes/{graph_node_ext.rs => graph_node_id_ext.rs} (56%) delete mode 100644 crates/store/re_types/src/datatypes/graph_type.rs delete mode 100644 docs/content/reference/types/archetypes/graph.md create mode 100644 docs/content/reference/types/archetypes/graph_edges_directed.md create mode 100644 docs/content/reference/types/archetypes/graph_edges_undirected.md create mode 100644 docs/content/reference/types/archetypes/graph_nodes.md delete mode 100644 docs/content/reference/types/components/graph_edge.md create mode 100644 docs/content/reference/types/components/graph_edge_directed.md create mode 100644 docs/content/reference/types/components/graph_edge_undirected.md delete mode 100644 docs/content/reference/types/components/graph_node.md create mode 100644 docs/content/reference/types/components/graph_node_id.md delete mode 100644 docs/content/reference/types/components/graph_type.md create mode 100644 docs/content/reference/types/datatypes/graph_location.md delete mode 100644 docs/content/reference/types/datatypes/graph_node.md create mode 100644 docs/content/reference/types/datatypes/graph_node_id.md delete mode 100644 docs/content/reference/types/datatypes/graph_type.md delete mode 100644 rerun_cpp/src/rerun/archetypes/graph.hpp rename rerun_cpp/src/rerun/archetypes/{graph.cpp => graph_edges_directed.cpp} (65%) create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.hpp rename rerun_cpp/src/rerun/components/{graph_edge.hpp => graph_edge_directed.hpp} (79%) rename rerun_cpp/src/rerun/components/{graph_type.hpp => graph_edge_undirected.hpp} (52%) rename rerun_cpp/src/rerun/components/{graph_node.hpp => graph_node_id.hpp} (58%) create mode 100644 rerun_cpp/src/rerun/datatypes/graph_location.cpp rename rerun_cpp/src/rerun/datatypes/{graph_type.hpp => graph_location.hpp} (50%) rename rerun_cpp/src/rerun/datatypes/{graph_node.cpp => graph_node_id.cpp} (82%) rename rerun_cpp/src/rerun/datatypes/{graph_node.hpp => graph_node_id.hpp} (69%) delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_type.cpp delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node_id.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_type.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_location.py rename rerun_py/rerun_sdk/rerun/datatypes/{graph_node.py => graph_node_id.py} (50%) delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_type.py diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ba1d27e908cd..000000000000 --- a/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -root = true - -[*.fbs] -indent_style = space -indent_size = 2 diff --git a/crates/store/re_types/definitions/rerun/archetypes.fbs b/crates/store/re_types/definitions/rerun/archetypes.fbs index ff750afc6274..fab88b42ca62 100644 --- a/crates/store/re_types/definitions/rerun/archetypes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes.fbs @@ -13,7 +13,9 @@ include "./archetypes/depth_image.fbs"; include "./archetypes/disconnected_space.fbs"; include "./archetypes/ellipsoids3d.fbs"; include "./archetypes/encoded_image.fbs"; -include "./archetypes/graph.fbs"; +include "./archetypes/graph_edges_directed.fbs"; +include "./archetypes/graph_edges_undirected.fbs"; +include "./archetypes/graph_nodes.fbs"; include "./archetypes/image.fbs"; include "./archetypes/instance_poses3d.fbs"; include "./archetypes/line_strips2d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph.fbs deleted file mode 100644 index a52668b9b36e..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph.fbs +++ /dev/null @@ -1,27 +0,0 @@ -namespace rerun.archetypes; - -/// A graph that consists of nodes and edges. -/// -/// By default, the graph is undirected. -table Graph ( - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of nodes. - nodes: [rerun.components.GraphNode] ("attr.rerun.component_required", order: 1000); - - // --- Recommended --- - - /// A list of edges. - edges: [rerun.components.GraphEdge] ("attr.rerun.component_recommended", nullable, order: 2000); - - /// Specifies if the graph is directed or undirected. - graph_type: rerun.components.GraphType ("attr.rerun.component_recommended", nullable, order: 2100); - - // --- Optional --- - - /// The position for each of the nodes. - node_positions: [rerun.components.Position2D] ("attr.rerun.component_optional", nullable, order: 3000); -} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs new file mode 100644 index 000000000000..6ba7008d2a04 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs @@ -0,0 +1,32 @@ +namespace rerun.archetypes; + +// --- + +/// A list of directed edges in a graph with optional labels, colors, etc. +table GraphEdgesDirected ( + "attr.rust.derive": "PartialEq, Eq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + edges: [rerun.components.GraphEdgeDirected] ("attr.rerun.component_required", order: 1000); + + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs new file mode 100644 index 000000000000..aa859ba27e15 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs @@ -0,0 +1,32 @@ +namespace rerun.archetypes; + +// --- + +/// A list of undirected edges in a graph with optional labels, colors, etc. +table GraphEdgesUndirected ( + "attr.rust.derive": "PartialEq, Eq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + edges: [rerun.components.GraphEdgeUndirected] ("attr.rerun.component_required", order: 1000); + + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs new file mode 100644 index 000000000000..d6f82df6b1ec --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -0,0 +1,36 @@ +namespace rerun.archetypes; + +// --- + +/// A list of nodes in a graph with optional labels, colors, etc. +table GraphNodes ( + "attr.rust.derive": "PartialEq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + node_ids: [rerun.components.GraphNodeId] ("attr.rerun.component_required", order: 1000); + + // --- Recommended --- + + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 2000); + + // --- Optional --- + + /// Optional colors for the boxes. + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + + /// Optional center positions of the nodes. + centers: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); + + /// Optional choice of whether the text labels should be shown by default. + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); + + /// Optional [components.ClassId]s for the boxes. + /// + /// The [components.ClassId] provides colors and labels if not specified explicitly. + class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); +} diff --git a/crates/store/re_types/definitions/rerun/components.fbs b/crates/store/re_types/definitions/rerun/components.fbs index 0a3aebf0603c..6a5d335c3f25 100644 --- a/crates/store/re_types/definitions/rerun/components.fbs +++ b/crates/store/re_types/definitions/rerun/components.fbs @@ -16,9 +16,9 @@ include "./components/entity_path.fbs"; include "./components/fill_mode.fbs"; include "./components/fill_ratio.fbs"; include "./components/gamma_correction.fbs"; -include "./components/graph_edge.fbs"; -include "./components/graph_node.fbs"; -include "./components/graph_type.fbs"; +include "./components/graph_edge_directed.fbs"; +include "./components/graph_edge_undirected.fbs"; +include "./components/graph_node_id.fbs"; include "./components/half_size2d.fbs"; include "./components/half_size3d.fbs"; include "./components/image_buffer.fbs"; diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs new file mode 100644 index 000000000000..4c406561fbd1 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs @@ -0,0 +1,13 @@ +namespace rerun.components; + +// --- + +/// A directed edge in a graph connecting two nodes. +table GraphEdgeDirected ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + edge: rerun.datatypes.GraphEdge (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs similarity index 92% rename from crates/store/re_types/definitions/rerun/components/graph_edge.fbs rename to crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs index d5cd18e3772d..6788b8ac6061 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs @@ -3,7 +3,7 @@ namespace rerun.components; // --- /// An undirected edge in a graph connecting two nodes. -table GraphEdge ( +table GraphEdgeUndirected ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/crates/store/re_types/definitions/rerun/components/graph_node.fbs b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs similarity index 85% rename from crates/store/re_types/definitions/rerun/components/graph_node.fbs rename to crates/store/re_types/definitions/rerun/components/graph_node_id.fbs index 10f5a8bc9bc1..7080453f25c1 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs @@ -3,7 +3,7 @@ namespace rerun.components; // --- /// A 32-bit ID representing a node in a graph. -table GraphNode ( +table GraphNodeId ( "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", @@ -11,5 +11,5 @@ table GraphNode ( "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - id: rerun.datatypes.GraphNode (order: 100); + id: rerun.datatypes.GraphNodeId (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs deleted file mode 100644 index eaaab78a0617..000000000000 --- a/crates/store/re_types/definitions/rerun/components/graph_type.fbs +++ /dev/null @@ -1,11 +0,0 @@ -namespace rerun.components; - -/// An undirected edge in a graph connecting two nodes. -struct GraphType ( - "attr.rust.derive": "Default, PartialEq, Eq", - "attr.rust.repr": "transparent", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - graph_type: rerun.datatypes.GraphType (order: 100); -} diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 8786552bc468..8861f2830e64 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -13,8 +13,8 @@ include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; include "./datatypes/graph_edge.fbs"; -include "./datatypes/graph_node.fbs"; -include "./datatypes/graph_type.fbs"; +include "./datatypes/graph_location.fbs"; +include "./datatypes/graph_node_id.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs index 1717a1bec1ef..170216ea1cde 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -1,14 +1,16 @@ +include "graph_location.fbs"; + namespace rerun.datatypes; /// Represents an edge in a graph connecting two nodes (possibly in different entities). table GraphEdge ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { /// The id of the source node. - source: rerun.datatypes.GraphNode (order: 100); + source: rerun.datatypes.GraphLocation (order: 100); /// The id of the target node. - target: rerun.datatypes.GraphNode (order: 200); + target: rerun.datatypes.GraphLocation (order: 200); } diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs new file mode 100644 index 000000000000..fbe9a25da3ce --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs @@ -0,0 +1,19 @@ +include "entity_path.fbs"; +include "graph_node_id.fbs"; + +namespace rerun.datatypes; + +/// Uniquely identifies a node in a graph by its entity path and node id. +/// +/// We require this because the same node id can be used in multiple entities. +table GraphLocation ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// The entity path that specifies where to find the node. + entity_path: rerun.datatypes.EntityPath (order: 100); + + /// The id of the node. + node_id: rerun.datatypes.GraphNodeId (order: 200); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs similarity index 85% rename from crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs rename to crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs index 636f4a1d47a8..17cd44af794c 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs @@ -1,7 +1,7 @@ namespace rerun.datatypes; -/// A string ID representing a node in a graph. -table GraphNode ( +/// A 32-bit ID representing a node in a graph. +table GraphNodeId ( "attr.arrow.transparent", "attr.python.aliases": "str", "attr.python.array_aliases": "Sequence[str]", diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs deleted file mode 100644 index c18487f97e82..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs +++ /dev/null @@ -1,19 +0,0 @@ -namespace rerun.datatypes; - -// -- - -/// Specifies if a graph has directed or undirected edges. -enum GraphType: ubyte ( - "attr.rust.derive": "Default, PartialEq, Eq", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - /// Invalid value. Won't show up in generated types. - Invalid = 0, - - /// The graph has undirected edges. - Undirected (default), - - /// The graph has directed edges. - Directed, -} diff --git a/crates/store/re_types/src/archetypes/.gitattributes b/crates/store/re_types/src/archetypes/.gitattributes index 9667ed7ff477..81c3d8f1adea 100644 --- a/crates/store/re_types/src/archetypes/.gitattributes +++ b/crates/store/re_types/src/archetypes/.gitattributes @@ -13,7 +13,9 @@ depth_image.rs linguist-generated=true disconnected_space.rs linguist-generated=true ellipsoids3d.rs linguist-generated=true encoded_image.rs linguist-generated=true -graph.rs linguist-generated=true +graph_edges_directed.rs linguist-generated=true +graph_edges_undirected.rs linguist-generated=true +graph_nodes.rs linguist-generated=true image.rs linguist-generated=true instance_poses3d.rs linguist-generated=true line_strips2d.rs linguist-generated=true diff --git a/crates/store/re_types/src/archetypes/graph.rs b/crates/store/re_types/src/archetypes/graph.rs deleted file mode 100644 index 55170f95ad26..000000000000 --- a/crates/store/re_types/src/archetypes/graph.rs +++ /dev/null @@ -1,258 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A graph that consists of nodes and edges. -/// -/// By default, the graph is undirected. -#[derive(Clone, Debug)] -pub struct Graph { - /// A list of nodes. - pub nodes: Vec, - - /// A list of edges. - pub edges: Option>, - - /// Specifies if the graph is directed or undirected. - pub graph_type: Option, - - /// The position for each of the nodes. - pub node_positions: Option>, -} - -impl ::re_types_core::SizeBytes for Graph { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.nodes.heap_size_bytes() - + self.edges.heap_size_bytes() - + self.graph_type.heap_size_bytes() - + self.node_positions.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphNode".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphEdge".into(), - "rerun.components.GraphType".into(), - "rerun.components.GraphIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.Position2D".into()]); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 5usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphNode".into(), - "rerun.components.GraphEdge".into(), - "rerun.components.GraphType".into(), - "rerun.components.GraphIndicator".into(), - "rerun.components.Position2D".into(), - ] - }); - -impl Graph { - /// The total number of components in the archetype: 1 required, 3 recommended, 1 optional - pub const NUM_COMPONENTS: usize = 5usize; -} - -/// Indicator component for the [`Graph`] [`::re_types_core::Archetype`] -pub type GraphIndicator = ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for Graph { - type Indicator = GraphIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.Graph".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphIndicator = GraphIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let nodes = { - let array = arrays_by_name - .get("rerun.components.GraphNode") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.Graph#nodes")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.Graph#nodes")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.Graph#nodes")? - }; - let edges = if let Some(array) = arrays_by_name.get("rerun.components.GraphEdge") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.Graph#edges")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.Graph#edges")? - }) - } else { - None - }; - let graph_type = if let Some(array) = arrays_by_name.get("rerun.components.GraphType") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.Graph#graph_type")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let node_positions = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") - { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.Graph#node_positions")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.Graph#node_positions")? - }) - } else { - None - }; - Ok(Self { - nodes, - edges, - graph_type, - node_positions, - }) - } -} - -impl ::re_types_core::AsComponents for Graph { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.nodes as &dyn ComponentBatch).into()), - self.edges - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.graph_type - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.node_positions - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for Graph {} - -impl Graph { - /// Create a new `Graph`. - #[inline] - pub fn new(nodes: impl IntoIterator>) -> Self { - Self { - nodes: nodes.into_iter().map(Into::into).collect(), - edges: None, - graph_type: None, - node_positions: None, - } - } - - /// A list of edges. - #[inline] - pub fn with_edges( - mut self, - edges: impl IntoIterator>, - ) -> Self { - self.edges = Some(edges.into_iter().map(Into::into).collect()); - self - } - - /// Specifies if the graph is directed or undirected. - #[inline] - pub fn with_graph_type(mut self, graph_type: impl Into) -> Self { - self.graph_type = Some(graph_type.into()); - self - } - - /// The position for each of the nodes. - #[inline] - pub fn with_node_positions( - mut self, - node_positions: impl IntoIterator>, - ) -> Self { - self.node_positions = Some(node_positions.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/graph_edges_directed.rs b/crates/store/re_types/src/archetypes/graph_edges_directed.rs new file mode 100644 index 000000000000..cee936099e80 --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges_directed.rs @@ -0,0 +1,303 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct GraphEdgesDirected { + /// A list of node IDs. + pub edges: Vec, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphEdgesDirected { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.edges.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeDirected".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.GraphEdgesDirectedIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdgeDirected".into(), + "rerun.components.Color".into(), + "rerun.components.GraphEdgesDirectedIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphEdgesDirected { + /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 6usize; +} + +/// Indicator component for the [`GraphEdgesDirected`] [`::re_types_core::Archetype`] +pub type GraphEdgesDirectedIndicator = + ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphEdgesDirected { + type Indicator = GraphEdgesDirectedIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphEdgesDirected".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph edges directed" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphEdgesDirectedIndicator = GraphEdgesDirectedIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let edges = { + let array = arrays_by_name + .get("rerun.components.GraphEdgeDirected") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphEdgesDirected#edges")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#edges")? + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#colors")? + }) + } else { + None + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#labels")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? + }) + } else { + None + }; + Ok(Self { + edges, + colors, + labels, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphEdgesDirected { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.edges as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesDirected {} + +impl GraphEdgesDirected { + /// Create a new `GraphEdgesDirected`. + #[inline] + pub fn new( + edges: impl IntoIterator>, + ) -> Self { + Self { + edges: edges.into_iter().map(Into::into).collect(), + colors: None, + labels: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_edges_undirected.rs b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs new file mode 100644 index 000000000000..cac910e150ec --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs @@ -0,0 +1,303 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct GraphEdgesUndirected { + /// A list of node IDs. + pub edges: Vec, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphEdgesUndirected { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.edges.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeUndirected".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.GraphEdgesUndirectedIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdgeUndirected".into(), + "rerun.components.Color".into(), + "rerun.components.GraphEdgesUndirectedIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphEdgesUndirected { + /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 6usize; +} + +/// Indicator component for the [`GraphEdgesUndirected`] [`::re_types_core::Archetype`] +pub type GraphEdgesUndirectedIndicator = + ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphEdgesUndirected { + type Indicator = GraphEdgesUndirectedIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphEdgesUndirected".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph edges undirected" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphEdgesUndirectedIndicator = GraphEdgesUndirectedIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let edges = { + let array = arrays_by_name + .get("rerun.components.GraphEdgeUndirected") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? + }) + } else { + None + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesUndirected#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? + }) + } else { + None + }; + Ok(Self { + edges, + colors, + labels, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphEdgesUndirected { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.edges as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesUndirected {} + +impl GraphEdgesUndirected { + /// Create a new `GraphEdgesUndirected`. + #[inline] + pub fn new( + edges: impl IntoIterator>, + ) -> Self { + Self { + edges: edges.into_iter().map(Into::into).collect(), + colors: None, + labels: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs new file mode 100644 index 000000000000..14620a3973c4 --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_nodes.rs @@ -0,0 +1,336 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. +#[derive(Clone, Debug, PartialEq)] +pub struct GraphNodes { + /// A list of node IDs. + pub node_ids: Vec, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional colors for the boxes. + pub colors: Option>, + + /// Optional center positions of the nodes. + pub centers: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + pub class_ids: Option>, +} + +impl ::re_types_core::SizeBytes for GraphNodes { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.node_ids.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.colors.heap_size_bytes() + + self.centers.heap_size_bytes() + + self.show_labels.heap_size_bytes() + + self.class_ids.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + && >>::is_pod() + && >>::is_pod() + && >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphNodeId".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Color".into(), + "rerun.components.Position2D".into(), + "rerun.components.GraphNodesIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 7usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphNodeId".into(), + "rerun.components.Color".into(), + "rerun.components.Position2D".into(), + "rerun.components.GraphNodesIndicator".into(), + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + "rerun.components.ClassId".into(), + ] + }); + +impl GraphNodes { + /// The total number of components in the archetype: 1 required, 3 recommended, 3 optional + pub const NUM_COMPONENTS: usize = 7usize; +} + +/// Indicator component for the [`GraphNodes`] [`::re_types_core::Archetype`] +pub type GraphNodesIndicator = ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphNodes { + type Indicator = GraphNodesIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphNodes".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph nodes" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphNodesIndicator = GraphNodesIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let node_ids = { + let array = arrays_by_name + .get("rerun.components.GraphNodeId") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphNodes#node_ids")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#node_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#node_ids")? + }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#labels")? + }) + } else { + None + }; + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#colors")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#colors")? + }) + } else { + None + }; + let centers = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#centers")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#centers")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; + let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#class_ids")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#class_ids")? + }) + } else { + None + }; + Ok(Self { + node_ids, + labels, + colors, + centers, + show_labels, + class_ids, + }) + } +} + +impl ::re_types_core::AsComponents for GraphNodes { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.node_ids as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.colors + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.centers + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), + self.class_ids + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphNodes {} + +impl GraphNodes { + /// Create a new `GraphNodes`. + #[inline] + pub fn new( + node_ids: impl IntoIterator>, + ) -> Self { + Self { + node_ids: node_ids.into_iter().map(Into::into).collect(), + labels: None, + colors: None, + centers: None, + show_labels: None, + class_ids: None, + } + } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional colors for the boxes. + #[inline] + pub fn with_colors( + mut self, + colors: impl IntoIterator>, + ) -> Self { + self.colors = Some(colors.into_iter().map(Into::into).collect()); + self + } + + /// Optional center positions of the nodes. + #[inline] + pub fn with_centers( + mut self, + centers: impl IntoIterator>, + ) -> Self { + self.centers = Some(centers.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } + + /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. + /// + /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + #[inline] + pub fn with_class_ids( + mut self, + class_ids: impl IntoIterator>, + ) -> Self { + self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 35f9e5cf33ae..57e15f07ff54 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -21,7 +21,9 @@ mod ellipsoids3d; mod ellipsoids3d_ext; mod encoded_image; mod encoded_image_ext; -mod graph; +mod graph_edges_directed; +mod graph_edges_undirected; +mod graph_nodes; mod image; mod image_ext; mod instance_poses3d; @@ -62,7 +64,9 @@ pub use self::depth_image::DepthImage; pub use self::disconnected_space::DisconnectedSpace; pub use self::ellipsoids3d::Ellipsoids3D; pub use self::encoded_image::EncodedImage; -pub use self::graph::Graph; +pub use self::graph_edges_directed::GraphEdgesDirected; +pub use self::graph_edges_undirected::GraphEdgesUndirected; +pub use self::graph_nodes::GraphNodes; pub use self::image::Image; pub use self::instance_poses3d::InstancePoses3D; pub use self::line_strips2d::LineStrips2D; diff --git a/crates/store/re_types/src/components/.gitattributes b/crates/store/re_types/src/components/.gitattributes index 5c1d3e6ff0dc..bccd38dfe671 100644 --- a/crates/store/re_types/src/components/.gitattributes +++ b/crates/store/re_types/src/components/.gitattributes @@ -16,9 +16,9 @@ entity_path.rs linguist-generated=true fill_mode.rs linguist-generated=true fill_ratio.rs linguist-generated=true gamma_correction.rs linguist-generated=true -graph_edge.rs linguist-generated=true -graph_node.rs linguist-generated=true -graph_type.rs linguist-generated=true +graph_edge_directed.rs linguist-generated=true +graph_edge_undirected.rs linguist-generated=true +graph_node_id.rs linguist-generated=true half_size2d.rs linguist-generated=true half_size3d.rs linguist-generated=true image_buffer.rs linguist-generated=true diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge_directed.rs similarity index 86% rename from crates/store/re_types/src/components/graph_edge.rs rename to crates/store/re_types/src/components/graph_edge_directed.rs index 7ca3db3d999d..32590c811970 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge_directed.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -22,9 +22,9 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge(pub crate::datatypes::GraphEdge); +pub struct GraphEdgeDirected(pub crate::datatypes::GraphEdge); -impl ::re_types_core::SizeBytes for GraphEdge { +impl ::re_types_core::SizeBytes for GraphEdgeDirected { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,20 +36,20 @@ impl ::re_types_core::SizeBytes for GraphEdge { } } -impl> From for GraphEdge { +impl> From for GraphEdgeDirected { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdge { +impl std::borrow::Borrow for GraphEdgeDirected { #[inline] fn borrow(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::Deref for GraphEdge { +impl std::ops::Deref for GraphEdgeDirected { type Target = crate::datatypes::GraphEdge; #[inline] @@ -58,21 +58,21 @@ impl std::ops::Deref for GraphEdge { } } -impl std::ops::DerefMut for GraphEdge { +impl std::ops::DerefMut for GraphEdgeDirected { #[inline] fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdge); +::re_types_core::macros::impl_into_cow!(GraphEdgeDirected); -impl ::re_types_core::Loggable for GraphEdge { +impl ::re_types_core::Loggable for GraphEdgeDirected { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdge".into() + "rerun.components.GraphEdgeDirected".into() } #[inline] diff --git a/crates/store/re_types/src/components/graph_type.rs b/crates/store/re_types/src/components/graph_edge_undirected.rs similarity index 63% rename from crates/store/re_types/src/components/graph_type.rs rename to crates/store/re_types/src/components/graph_edge_undirected.rs index fbb48bca80db..4fed04ebf720 100644 --- a/crates/store/re_types/src/components/graph_type.rs +++ b/crates/store/re_types/src/components/graph_edge_undirected.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -19,12 +19,12 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: An undirected edge in a graph connecting two nodes. -#[derive(Clone, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphType(pub crate::datatypes::GraphType); +pub struct GraphEdgeUndirected(pub crate::datatypes::GraphEdge); -impl ::re_types_core::SizeBytes for GraphType { +impl ::re_types_core::SizeBytes for GraphEdgeUndirected { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphType { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphType { +impl> From for GraphEdgeUndirected { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphType { +impl std::borrow::Borrow for GraphEdgeUndirected { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphType { + fn borrow(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::Deref for GraphType { - type Target = crate::datatypes::GraphType; +impl std::ops::Deref for GraphEdgeUndirected { + type Target = crate::datatypes::GraphEdge; #[inline] - fn deref(&self) -> &crate::datatypes::GraphType { + fn deref(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::DerefMut for GraphType { +impl std::ops::DerefMut for GraphEdgeUndirected { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphType { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphType); +::re_types_core::macros::impl_into_cow!(GraphEdgeUndirected); -impl ::re_types_core::Loggable for GraphType { +impl ::re_types_core::Loggable for GraphEdgeUndirected { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphType".into() + "rerun.components.GraphEdgeUndirected".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphType::arrow_datatype() + crate::datatypes::GraphEdge::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphType { where Self: Clone + 'a, { - crate::datatypes::GraphType::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,16 +100,7 @@ impl ::re_types_core::Loggable for GraphType { where Self: Sized, { - crate::datatypes::GraphType::from_arrow_opt(arrow_data) + crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } - - #[inline] - fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> - where - Self: Sized, - { - crate::datatypes::GraphType::from_arrow(arrow_data) - .map(|v| v.into_iter().map(Self).collect()) - } } diff --git a/crates/store/re_types/src/components/graph_node.rs b/crates/store/re_types/src/components/graph_node_id.rs similarity index 69% rename from crates/store/re_types/src/components/graph_node.rs rename to crates/store/re_types/src/components/graph_node_id.rs index 43c71a86f1ba..9f4a51bf95c5 100644 --- a/crates/store/re_types/src/components/graph_node.rs +++ b/crates/store/re_types/src/components/graph_node_id.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -22,9 +22,9 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNode(pub crate::datatypes::GraphNode); +pub struct GraphNodeId(pub crate::datatypes::GraphNodeId); -impl ::re_types_core::SizeBytes for GraphNode { +impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphNode { +impl> From for GraphNodeId { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphNode { +impl std::borrow::Borrow for GraphNodeId { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphNode { + fn borrow(&self) -> &crate::datatypes::GraphNodeId { &self.0 } } -impl std::ops::Deref for GraphNode { - type Target = crate::datatypes::GraphNode; +impl std::ops::Deref for GraphNodeId { + type Target = crate::datatypes::GraphNodeId; #[inline] - fn deref(&self) -> &crate::datatypes::GraphNode { + fn deref(&self) -> &crate::datatypes::GraphNodeId { &self.0 } } -impl std::ops::DerefMut for GraphNode { +impl std::ops::DerefMut for GraphNodeId { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNode { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNodeId { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphNode); +::re_types_core::macros::impl_into_cow!(GraphNodeId); -impl ::re_types_core::Loggable for GraphNode { +impl ::re_types_core::Loggable for GraphNodeId { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphNode".into() + "rerun.components.GraphNodeId".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphNode::arrow_datatype() + crate::datatypes::GraphNodeId::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphNode { where Self: Clone + 'a, { - crate::datatypes::GraphNode::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphNodeId::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,7 @@ impl ::re_types_core::Loggable for GraphNode { where Self: Sized, { - crate::datatypes::GraphNode::from_arrow_opt(arrow_data) + crate::datatypes::GraphNodeId::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index 3a1cc3200f35..1c0323037b67 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -24,9 +24,9 @@ mod fill_ratio; mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; -mod graph_edge; -mod graph_node; -mod graph_type; +mod graph_edge_directed; +mod graph_edge_undirected; +mod graph_node_id; mod half_size2d; mod half_size2d_ext; mod half_size3d; @@ -131,9 +131,9 @@ pub use self::entity_path::EntityPath; pub use self::fill_mode::FillMode; pub use self::fill_ratio::FillRatio; pub use self::gamma_correction::GammaCorrection; -pub use self::graph_edge::GraphEdge; -pub use self::graph_node::GraphNode; -pub use self::graph_type::GraphType; +pub use self::graph_edge_directed::GraphEdgeDirected; +pub use self::graph_edge_undirected::GraphEdgeUndirected; +pub use self::graph_node_id::GraphNodeId; pub use self::half_size2d::HalfSize2D; pub use self::half_size3d::HalfSize3D; pub use self::image_buffer::ImageBuffer; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 16f4597c2ff7..3982583ca7c0 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -10,8 +10,8 @@ class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true graph_edge.rs linguist-generated=true -graph_node.rs linguist-generated=true -graph_type.rs linguist-generated=true +graph_location.rs linguist-generated=true +graph_node_id.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index 6b68a86183da..292b8ac8742b 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -23,10 +23,10 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge { /// The id of the source node. - pub source: crate::datatypes::GraphNode, + pub source: crate::datatypes::GraphLocation, /// The id of the target node. - pub target: crate::datatypes::GraphNode, + pub target: crate::datatypes::GraphLocation, } impl ::re_types_core::SizeBytes for GraphEdge { @@ -37,7 +37,7 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - ::is_pod() && ::is_pod() + ::is_pod() && ::is_pod() } } @@ -58,12 +58,12 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Struct(std::sync::Arc::new(vec![ Field::new( "source", - ::arrow_datatype(), + ::arrow_datatype(), false, ), Field::new( "target", - ::arrow_datatype(), + ::arrow_datatype(), false, ), ])) @@ -107,28 +107,8 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - source.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = source - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - source_bitmap, - ) - } - .boxed() + _ = source_bitmap; + crate::datatypes::GraphLocation::to_arrow_opt(source)? } }, { @@ -144,28 +124,8 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - target.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = target - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - target_bitmap, - ) - } - .boxed() + _ = target_bitmap; + crate::datatypes::GraphLocation::to_arrow_opt(target)? } }, ], @@ -213,51 +173,9 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["source"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#source")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() + crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) .with_context("rerun.datatypes.GraphEdge#source")? .into_iter() - } }; let target = { if !arrays_by_name.contains_key("target") { @@ -268,51 +186,9 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["target"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphEdge#target")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() + crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) .with_context("rerun.datatypes.GraphEdge#target")? .into_iter() - } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( ::itertools::izip!(source, target), diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs new file mode 100644 index 000000000000..d4cd8d4636c1 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_edge_ext.rs @@ -0,0 +1,26 @@ +use crate::datatypes::{EntityPath, GraphEdge, GraphLocation, GraphNodeId}; + +impl> From<(T, T)> for GraphEdge { + fn from(value: (T, T)) -> Self { + Self { + source: value.0.into(), + target: value.1.into(), + } + } +} + +impl, N: Into> From<(E, N, N)> for GraphEdge { + fn from(value: (E, N, N)) -> Self { + let entity_path = value.0.into(); + Self { + source: GraphLocation { + entity_path: entity_path.clone(), + node_id: value.1.into(), + }, + target: GraphLocation { + entity_path, + node_id: value.2.into(), + }, + } + } +} diff --git a/crates/store/re_types/src/datatypes/graph_location.rs b/crates/store/re_types/src/datatypes/graph_location.rs new file mode 100644 index 000000000000..51954a2c866d --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_location.rs @@ -0,0 +1,341 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. +/// +/// We require this because the same node id can be used in multiple entities. +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct GraphLocation { + /// The entity path that specifies where to find the node. + pub entity_path: crate::datatypes::EntityPath, + + /// The id of the node. + pub node_id: crate::datatypes::GraphNodeId, +} + +impl ::re_types_core::SizeBytes for GraphLocation { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.entity_path.heap_size_bytes() + self.node_id.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + ::is_pod() && ::is_pod() + } +} + +::re_types_core::macros::impl_into_cow!(GraphLocation); + +impl ::re_types_core::Loggable for GraphLocation { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphLocation".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::Struct(std::sync::Arc::new(vec![ + Field::new( + "entity_path", + ::arrow_datatype(), + false, + ), + Field::new( + "node_id", + ::arrow_datatype(), + false, + ), + ])) + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + (datum.is_some(), datum) + }) + .unzip(); + let bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + StructArray::new( + Self::arrow_datatype(), + vec![ + { + let (somes, entity_path): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.entity_path.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let entity_path_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + entity_path.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = entity_path + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + entity_path_bitmap, + ) + } + .boxed() + } + }, + { + let (somes, node_id): (Vec<_>, Vec<_>) = data + .iter() + .map(|datum| { + let datum = datum.as_ref().map(|datum| datum.node_id.clone()); + (datum.is_some(), datum) + }) + .unzip(); + let node_id_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + { + let offsets = arrow2::offset::Offsets::::try_from_lengths( + node_id.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = node_id + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + node_id_bitmap, + ) + } + .boxed() + } + }, + ], + bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok({ + let arrow_data = arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation")?; + if arrow_data.is_empty() { + Vec::new() + } else { + let (arrow_data_fields, arrow_data_arrays) = + (arrow_data.fields(), arrow_data.values()); + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields + .iter() + .map(|field| field.name.as_str()) + .zip(arrow_data_arrays) + .collect(); + let entity_path = { + if !arrays_by_name.contains_key("entity_path") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "entity_path", + )) + .with_context("rerun.datatypes.GraphLocation"); + } + let arrow_data = &**arrays_by_name["entity_path"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation#entity_path")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphLocation#entity_path")? + .into_iter() + } + }; + let node_id = { + if !arrays_by_name.contains_key("node_id") { + return Err(DeserializationError::missing_struct_field( + Self::arrow_datatype(), + "node_id", + )) + .with_context("rerun.datatypes.GraphLocation"); + } + let arrow_data = &**arrays_by_name["node_id"]; + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphLocation#node_id")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphLocation#node_id")? + .into_iter() + } + }; + arrow2::bitmap::utils::ZipValidity::new_with_validity( + ::itertools::izip!(entity_path, node_id), + arrow_data.validity(), + ) + .map(|opt| { + opt.map(|(entity_path, node_id)| { + Ok(Self { + entity_path: entity_path + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphLocation#entity_path")?, + node_id: node_id + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.datatypes.GraphLocation#node_id")?, + }) + }) + .transpose() + }) + .collect::>>() + .with_context("rerun.datatypes.GraphLocation")? + } + }) + } +} diff --git a/crates/store/re_types/src/datatypes/graph_location_ext.rs b/crates/store/re_types/src/datatypes/graph_location_ext.rs new file mode 100644 index 000000000000..44a3df63889c --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_location_ext.rs @@ -0,0 +1,16 @@ +use crate::datatypes::{EntityPath, GraphNodeId}; + +impl, N: Into> From<(E, N)> for super::GraphLocation { + fn from(value: (E, N)) -> Self { + Self { + entity_path: value.0.into(), + node_id: value.1.into(), + } + } +} + +impl std::fmt::Display for super::GraphLocation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}@{:?}", self.node_id, self.entity_path) + } +} diff --git a/crates/store/re_types/src/datatypes/graph_node.rs b/crates/store/re_types/src/datatypes/graph_node_id.rs similarity index 88% rename from crates/store/re_types/src/datatypes/graph_node.rs rename to crates/store/re_types/src/datatypes/graph_node_id.rs index 220219d413ea..876da591e151 100644 --- a/crates/store/re_types/src/datatypes/graph_node.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: A string ID representing a node in a graph. +/// **Datatype**: A 32-bit ID representing a node in a graph. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNode(pub ::re_types_core::ArrowString); +pub struct GraphNodeId(pub ::re_types_core::ArrowString); -impl ::re_types_core::SizeBytes for GraphNode { +impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,28 +36,28 @@ impl ::re_types_core::SizeBytes for GraphNode { } } -impl From<::re_types_core::ArrowString> for GraphNode { +impl From<::re_types_core::ArrowString> for GraphNodeId { #[inline] fn from(id: ::re_types_core::ArrowString) -> Self { Self(id) } } -impl From for ::re_types_core::ArrowString { +impl From for ::re_types_core::ArrowString { #[inline] - fn from(value: GraphNode) -> Self { + fn from(value: GraphNodeId) -> Self { value.0 } } -::re_types_core::macros::impl_into_cow!(GraphNode); +::re_types_core::macros::impl_into_cow!(GraphNodeId); -impl ::re_types_core::Loggable for GraphNode { +impl ::re_types_core::Loggable for GraphNodeId { type Name = ::re_types_core::DatatypeName; #[inline] fn name() -> Self::Name { - "rerun.datatypes.GraphNode".into() + "rerun.datatypes.GraphNodeId".into() } #[inline] @@ -132,7 +132,7 @@ impl ::re_types_core::Loggable for GraphNode { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphNode#id")?; + .with_context("rerun.datatypes.GraphNodeId#id")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -160,13 +160,13 @@ impl ::re_types_core::Loggable for GraphNode { res_or_opt.map(|res_or_opt| res_or_opt.map(|v| ::re_types_core::ArrowString(v))) }) .collect::>>>() - .with_context("rerun.datatypes.GraphNode#id")? + .with_context("rerun.datatypes.GraphNodeId#id")? .into_iter() } .map(|v| v.ok_or_else(DeserializationError::missing_data)) .map(|res| res.map(|v| Some(Self(v)))) .collect::>>>() - .with_context("rerun.datatypes.GraphNode#id") - .with_context("rerun.datatypes.GraphNode")?) + .with_context("rerun.datatypes.GraphNodeId#id") + .with_context("rerun.datatypes.GraphNodeId")?) } } diff --git a/crates/store/re_types/src/datatypes/graph_node_ext.rs b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs similarity index 56% rename from crates/store/re_types/src/datatypes/graph_node_ext.rs rename to crates/store/re_types/src/datatypes/graph_node_id_ext.rs index 8b00d8faea6e..4b1d0612c51d 100644 --- a/crates/store/re_types/src/datatypes/graph_node_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_id_ext.rs @@ -1,20 +1,18 @@ -use re_log_types::hash::Hash64; +use super::GraphNodeId; -use super::GraphNode; - -impl std::convert::From<&str> for GraphNode { +impl std::convert::From<&str> for GraphNodeId { fn from(s: &str) -> Self { Self(s.into()) } } -impl std::convert::From for GraphNode { +impl std::convert::From for GraphNodeId { fn from(s: String) -> Self { Self(s.into()) } } -impl std::fmt::Display for GraphNode { +impl std::fmt::Display for GraphNodeId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } diff --git a/crates/store/re_types/src/datatypes/graph_type.rs b/crates/store/re_types/src/datatypes/graph_type.rs deleted file mode 100644 index 401ecb99a002..000000000000 --- a/crates/store/re_types/src/datatypes/graph_type.rs +++ /dev/null @@ -1,153 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] -#![allow(non_camel_case_types)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Datatype**: Specifies if a graph has directed or undirected edges. -#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[repr(u8)] -pub enum GraphType { - /// The graph has undirected edges. - #[default] - Undirected = 1, - - /// The graph has directed edges. - Directed = 2, -} - -impl ::re_types_core::reflection::Enum for GraphType { - #[inline] - fn variants() -> &'static [Self] { - &[Self::Undirected, Self::Directed] - } - - #[inline] - fn docstring_md(self) -> &'static str { - match self { - Self::Undirected => "The graph has undirected edges.", - Self::Directed => "The graph has directed edges.", - } - } -} - -impl ::re_types_core::SizeBytes for GraphType { - #[inline] - fn heap_size_bytes(&self) -> u64 { - 0 - } - - #[inline] - fn is_pod() -> bool { - true - } -} - -impl std::fmt::Display for GraphType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Undirected => write!(f, "Undirected"), - Self::Directed => write!(f, "Directed"), - } - } -} - -::re_types_core::macros::impl_into_cow!(GraphType); - -impl ::re_types_core::Loggable for GraphType { - type Name = ::re_types_core::DatatypeName; - - #[inline] - fn name() -> Self::Name { - "rerun.datatypes.GraphType".into() - } - - #[inline] - fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::UInt8 - } - - fn to_arrow_opt<'a>( - data: impl IntoIterator>>>, - ) -> SerializationResult> - where - Self: Clone + 'a, - { - #![allow(clippy::wildcard_imports)] - #![allow(clippy::manual_is_variant_and)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data0): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - let datum = datum.map(|datum| *datum as u8); - (datum.is_some(), datum) - }) - .unzip(); - let data0_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - PrimitiveArray::new( - Self::arrow_datatype(), - data0.into_iter().map(|v| v.unwrap_or_default()).collect(), - data0_bitmap, - ) - .boxed() - }) - } - - fn from_arrow_opt( - arrow_data: &dyn arrow2::array::Array, - ) -> DeserializationResult>> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok(arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphType#enum")? - .into_iter() - .map(|opt| opt.copied()) - .map(|typ| match typ { - Some(1) => Ok(Some(Self::Undirected)), - Some(2) => Ok(Some(Self::Directed)), - None => Ok(None), - Some(invalid) => Err(DeserializationError::missing_union_arm( - Self::arrow_datatype(), - "", - invalid as _, - )), - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphType")?) - } -} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 57198084ab1e..2b31d3f54759 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -17,9 +17,11 @@ mod class_id_ext; mod color_model; mod color_model_ext; mod graph_edge; -mod graph_node; -mod graph_node_ext; -mod graph_type; +mod graph_edge_ext; +mod graph_location; +mod graph_location_ext; +mod graph_node_id; +mod graph_node_id_ext; mod image_format; mod image_format_ext; mod keypoint_id; @@ -79,8 +81,8 @@ pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; pub use self::graph_edge::GraphEdge; -pub use self::graph_node::GraphNode; -pub use self::graph_type::GraphType; +pub use self::graph_location::GraphLocation; +pub use self::graph_node_id::GraphNodeId; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 6243e393d3a0..655a0d4002ff 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -25,8 +25,8 @@ impl std::fmt::Debug for NodeIdHash { } } -impl From<&datatypes::GraphNode> for NodeIdHash { - fn from(node_id: &datatypes::GraphNode) -> Self { +impl From<&datatypes::GraphNodeId> for NodeIdHash { + fn from(node_id: &datatypes::GraphNodeId) -> Self { Self(Hash64::hash(node_id)) } } diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index e80a5467b1b0..1bf14bcee2ca 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -4,16 +4,25 @@ use re_types::datatypes; use super::NodeIdHash; #[derive(Clone, Copy, PartialEq, Eq, Hash)] -pub struct NodeIndex { +pub(crate) struct NodeIndex { pub entity_hash: EntityPathHash, pub node_id: NodeIdHash, } -impl NodeIndex { - pub fn new(entity_path: &EntityPath, node_id: &datatypes::GraphNode) -> Self { +impl From for NodeIndex { + fn from(location: datatypes::GraphLocation) -> Self { Self { - entity_hash: entity_path.hash(), - node_id: NodeIdHash::from(node_id), + entity_hash: EntityPath::from(location.entity_path).hash(), + node_id: NodeIdHash::from(&location.node_id), + } + } +} + +impl From<&datatypes::GraphLocation> for NodeIndex { + fn from(location: &datatypes::GraphLocation) -> Self { + Self { + entity_hash: EntityPath::from(location.entity_path.clone()).hash(), + node_id: NodeIdHash::from(&location.node_id), } } } diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 86cdde1f2493..7d9c78ffe7c2 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use re_log_types::{EntityPath, EntityPathHash}; +use re_log_types::EntityPath; use re_types::datatypes; use crate::{ @@ -38,7 +38,7 @@ impl<'a> From> for NodeIndex { pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: HashSet<(EntityPathHash, datatypes::GraphNode)>, + unknown: HashSet<(EntityPath, datatypes::GraphNodeId)>, nodes: &'a Vec, directed: &'a Vec, undirected: &'a Vec, @@ -50,32 +50,32 @@ impl<'a> Graph<'a> { directed: &'a Vec, undirected: &'a Vec, ) -> Option { - let mut seen: HashSet<(EntityPathHash, &datatypes::GraphNode)> = nodes + let mut seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes .iter() .flat_map(|entity| entity.nodes()) - .map(|n| (n.entity_path.hash(), n.node_id)) + .map(|n| (n.entity_path, n.node_id)) .collect(); let mut unknown = HashSet::new(); for entity in undirected { - let entity_hash = entity.entity_path.hash(); for edge in entity.edges() { for node in edge.nodes() { - if seen.contains(&(entity_hash, &node)) { + let entity_path = EntityPath::from(node.entity_path.clone()); + if seen.contains(&(&entity_path, &node.node_id)) { continue; } - unknown.insert((entity_hash, node)); + unknown.insert((entity_path, node.node_id)); } } } for entity in directed { - let entity_hash = entity.entity_path.hash(); for edge in entity.edges() { for node in edge.nodes() { - if seen.contains(&(entity_hash, &node)) { + let entity_path = EntityPath::from(node.entity_path.clone()); + if seen.contains(&(&entity_path, &node.node_id)) { continue; } - unknown.insert((entity_hash, node)); + unknown.insert((entity_path, node.node_id)); } } } @@ -119,7 +119,7 @@ impl<'a> Graph<'a> { self.unknown .iter() .map(|(entity_path, node_id)| UnknownNodeInstance { - entity_hash: entity_path, + entity_path, node_id, }) } diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index ae4071a3aed1..3b2b5ba1a265 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,10 +1,10 @@ -use re_log_types::{EntityPath, EntityPathHash, Instance}; +use re_log_types::{EntityPath, Instance}; use re_types::{datatypes, ArrowString}; use crate::graph::NodeIndex; impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { + pub fn nodes(&'a self) -> impl Iterator { [self.source.clone(), self.target.clone()].into_iter() } } @@ -28,7 +28,7 @@ impl<'a> From> for NodeIndex { } pub(crate) struct NodeInstance<'a> { - pub node_id: &'a datatypes::GraphNode, + pub node_id: &'a datatypes::GraphNodeId, pub entity_path: &'a EntityPath, pub instance: Instance, pub show_labels: bool, @@ -37,22 +37,22 @@ pub(crate) struct NodeInstance<'a> { } pub struct EdgeInstance<'a> { - pub source: &'a datatypes::GraphNode, - pub target: &'a datatypes::GraphNode, - pub entity_path: &'a re_log_types::EntityPath, + pub source: &'a datatypes::GraphLocation, + pub target: &'a datatypes::GraphLocation, + pub _entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub color: Option, } pub(crate) struct UnknownNodeInstance<'a> { - pub node_id: &'a datatypes::GraphNode, - pub entity_hash: &'a EntityPathHash, + pub node_id: &'a datatypes::GraphNodeId, + pub entity_path: &'a EntityPath, } impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { fn from(node: &UnknownNodeInstance<'a>) -> Self { Self { - entity_hash: node.entity_hash.hash(), + entity_hash: node.entity_path.hash(), node_id: node.node_id.into(), } } @@ -61,7 +61,7 @@ impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { impl<'a> From> for NodeIndex { fn from(node: UnknownNodeInstance<'a>) -> Self { Self { - entity_hash: node.entity_hash.hash(), + entity_hash: node.entity_path.hash(), node_id: node.node_id.into(), } } diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index c0f6748b0c00..36a1f7384f56 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -18,7 +18,7 @@ use crate::{ }; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { - let text = egui::RichText::new(format!("{}", instance.node_id)) + let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); ui.add(egui::Button::new(text)) diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 9a55e247e967..9cf180038a47 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,4 +1,5 @@ use std::collections::{HashMap, HashSet}; +use std::hash::Hash; use egui::{self, Rect}; use re_log_types::EntityPath; @@ -21,13 +22,12 @@ use crate::{ #[derive(Default)] pub struct GraphSpaceView; -fn arrange_in_circle( - nodes: &mut HashMap, egui::Rect)>, - radius: f32, -) { +fn arrange_in_circle(nodes: &mut HashMap, radius: f32) { let n = nodes.len(); let center = egui::Pos2::new(0.0, 0.0); + let nodes_by_entity = nodes.iter().map(|(entity, (ix, _))| (entity, ix)).collect::>(); + for (i, (_id, (_, rect))) in nodes.iter_mut().enumerate() { let angle = 2.0 * std::f32::consts::PI * i as f32 / n as f32; let x = center.x + radius * angle.cos(); @@ -192,10 +192,7 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let ix = NodeIndex::from(&node); seen.insert(ix); - let (_, current) = state - .layout - .entry(ix) - .or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); + let (_,current) = state.layout.entry(ix).or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -232,17 +229,13 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some((_, source_pos)), Some((_, target_pos))) = ( - state - .layout - .get(NodeIndex::new(edge.entity_path, &edge.source)), - state - .layout - .get(NodeIndex::new(edge.entity_path, &edge.target)), + if let (Some((_, source_pos)), Some((_,target_pos))) = ( + state.layout.get(&edge.source.into()), + state.layout.get(&edge.target.into()), ) { scene.edge(|ui| { ui::draw_edge( - &ui, + ui, edge.color, source_pos, target_pos, @@ -259,7 +252,7 @@ impl SpaceViewClass for GraphSpaceView { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some((_, source_pos)), Some((_, target_pos))) = ( + if let (Some((_,source_pos)), Some((_,target_pos))) = ( state.layout.get(&edge.source.into()), state.layout.get(&edge.target.into()), ) { diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs index 6a99d50355b5..11d85e49fe52 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs @@ -36,7 +36,7 @@ impl EdgesDirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - entity_path: &self.entity_path, + _entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs index e16f7e483cdb..7221a6eddd67 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs @@ -36,7 +36,7 @@ impl EdgesUndirectedData { .map(|(edge, instance, color)| EdgeInstance { source: &edge.source, target: &edge.target, - entity_path: &self.entity_path, + _entity_path: &self.entity_path, instance, color: color.map(|c| egui::Color32::from(c.0)), }) diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 772ef5678e8d..f3fcf65d6910 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -371,24 +371,24 @@ fn generate_component_reflection() -> Result::name(), + ::name(), ComponentReflection { docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphEdge::default().to_arrow()?), + placeholder: Some(GraphEdgeDirected::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "A 32-bit ID representing a node in a graph.", - placeholder: Some(GraphNode::default().to_arrow()?), + docstring_md: "An undirected edge in a graph connecting two nodes.", + placeholder: Some(GraphEdgeUndirected::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphType::default().to_arrow()?), + docstring_md: "A 32-bit ID representing a node in a graph.", + placeholder: Some(GraphNodeId::default().to_arrow()?), }, ), ( @@ -1079,23 +1079,83 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { }, ), ( - ArchetypeName::new("rerun.archetypes.Graph"), + ArchetypeName::new("rerun.archetypes.GraphEdgesDirected"), ArchetypeReflection { - display_name: "Graph", + display_name: "Graph edges directed", fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphNode".into(), display_name : "Nodes", - docstring_md : "A list of nodes.", is_required : true, }, + "rerun.components.GraphEdgeDirected".into(), display_name : "Edges", + docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, + ], + }, + ), + ( + ArchetypeName::new("rerun.archetypes.GraphEdgesUndirected"), + ArchetypeReflection { + display_name: "Graph edges undirected", + fields: vec![ + ArchetypeFieldReflection { component_name : + "rerun.components.GraphEdgeUndirected".into(), display_name : + "Edges", docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, + ], + }, + ), + ( + ArchetypeName::new("rerun.archetypes.GraphNodes"), + ArchetypeReflection { + display_name: "Graph nodes", + fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdge".into(), display_name : "Edges", - docstring_md : "A list of edges.", is_required : false, }, + "rerun.components.GraphNodeId".into(), display_name : "Node ids", + docstring_md : "A list of node IDs.", is_required : true, }, + ArchetypeFieldReflection { component_name : "rerun.components.Text" + .into(), display_name : "Labels", docstring_md : + "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : "rerun.components.Color" + .into(), display_name : "Colors", docstring_md : + "Optional colors for the boxes.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.GraphType".into(), display_name : "Graph type", - docstring_md : "Specifies if the graph is directed or undirected.", + "rerun.components.Position2D".into(), display_name : "Centers", + docstring_md : "Optional center positions of the nodes.", is_required + : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.Position2D".into(), display_name : - "Node positions", docstring_md : - "The position for each of the nodes.", is_required : false, }, + "rerun.components.ClassId".into(), display_name : "Class ids", + docstring_md : + "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + is_required : false, }, ], }, ), diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index 3f39e931844c..414d85b78cbc 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -14,7 +14,9 @@ This page lists all built-in archetypes. ## Graph -* [`Graph`](archetypes/graph.md): A graph that consists of nodes and edges. +* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of directed edges in a graph with optional labels, colors, etc. +* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of undirected edges in a graph with optional labels, colors, etc. +* [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. ## Image & tensor diff --git a/docs/content/reference/types/archetypes/.gitattributes b/docs/content/reference/types/archetypes/.gitattributes index 86b6fafe4577..a78b41cb32d0 100644 --- a/docs/content/reference/types/archetypes/.gitattributes +++ b/docs/content/reference/types/archetypes/.gitattributes @@ -14,7 +14,9 @@ depth_image.md linguist-generated=true disconnected_space.md linguist-generated=true ellipsoids3d.md linguist-generated=true encoded_image.md linguist-generated=true -graph.md linguist-generated=true +graph_edges_directed.md linguist-generated=true +graph_edges_undirected.md linguist-generated=true +graph_nodes.md linguist-generated=true image.md linguist-generated=true instance_poses3d.md linguist-generated=true line_strips2d.md linguist-generated=true diff --git a/docs/content/reference/types/archetypes/graph.md b/docs/content/reference/types/archetypes/graph.md deleted file mode 100644 index a9badb88c2a1..000000000000 --- a/docs/content/reference/types/archetypes/graph.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Graph" ---- - - -A graph that consists of nodes and edges. - -By default, the graph is undirected. - -## Components - -**Required**: [`GraphNode`](../components/graph_node.md) - -**Recommended**: [`GraphEdge`](../components/graph_edge.md), [`GraphType`](../components/graph_type.md) - -**Optional**: [`Position2D`](../components/position2d.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `Graph`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1Graph.html) - * 🐍 [Python API docs for `Graph`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.Graph) - * 🦀 [Rust API docs for `Graph`](https://docs.rs/rerun/latest/rerun/archetypes/struct.Graph.html) - diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md new file mode 100644 index 000000000000..603d6c1d7c55 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_edges_directed.md @@ -0,0 +1,24 @@ +--- +title: "GraphEdgesDirected" +--- + + +A list of directed edges in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphEdgeDirected`](../components/graph_edge_directed.md) + +**Recommended**: [`Color`](../components/color.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesDirected.html) + * 🐍 [Python API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesDirected) + * 🦀 [Rust API docs for `GraphEdgesDirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesDirected.html) + diff --git a/docs/content/reference/types/archetypes/graph_edges_undirected.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md new file mode 100644 index 000000000000..1838404ba97e --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_edges_undirected.md @@ -0,0 +1,24 @@ +--- +title: "GraphEdgesUndirected" +--- + + +A list of undirected edges in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) + +**Recommended**: [`Color`](../components/color.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesUndirected.html) + * 🐍 [Python API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesUndirected) + * 🦀 [Rust API docs for `GraphEdgesUndirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesUndirected.html) + diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md new file mode 100644 index 000000000000..0338e5a1657a --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -0,0 +1,24 @@ +--- +title: "GraphNodes" +--- + + +A list of nodes in a graph with optional labels, colors, etc. + +## Components + +**Required**: [`GraphNodeId`](../components/graph_node_id.md) + +**Recommended**: [`Color`](../components/color.md), [`Position2D`](../components/position2d.md) + +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) + +## Shown in +* [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html) + * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphNodes) + * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html) + diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 71ed12102c68..1aa99480f899 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,9 +29,9 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. -* [`GraphEdge`](components/graph_edge.md): An undirected edge in a graph connecting two nodes. -* [`GraphNode`](components/graph_node.md): A 32-bit ID representing a node in a graph. -* [`GraphType`](components/graph_type.md): An undirected edge in a graph connecting two nodes. +* [`GraphEdgeDirected`](components/graph_edge_directed.md): A directed edge in a graph connecting two nodes. +* [`GraphEdgeUndirected`](components/graph_edge_undirected.md): An undirected edge in a graph connecting two nodes. +* [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. * [`HalfSize3D`](components/half_size3d.md): Half-size (radius) of a 3D box. * [`ImageBuffer`](components/image_buffer.md): A buffer that is known to store image data. diff --git a/docs/content/reference/types/components/.gitattributes b/docs/content/reference/types/components/.gitattributes index a4db0dfd448f..9dc8fc370a5c 100644 --- a/docs/content/reference/types/components/.gitattributes +++ b/docs/content/reference/types/components/.gitattributes @@ -17,9 +17,9 @@ entity_path.md linguist-generated=true fill_mode.md linguist-generated=true fill_ratio.md linguist-generated=true gamma_correction.md linguist-generated=true -graph_edge.md linguist-generated=true -graph_node.md linguist-generated=true -graph_type.md linguist-generated=true +graph_edge_directed.md linguist-generated=true +graph_edge_undirected.md linguist-generated=true +graph_node_id.md linguist-generated=true half_size2d.md linguist-generated=true half_size3d.md linguist-generated=true image_buffer.md linguist-generated=true diff --git a/docs/content/reference/types/components/class_id.md b/docs/content/reference/types/components/class_id.md index be0847bc2e4d..cbf7dca8ea68 100644 --- a/docs/content/reference/types/components/class_id.md +++ b/docs/content/reference/types/components/class_id.md @@ -22,6 +22,9 @@ A 16-bit ID representing a type of semantic class. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index c5703e66ea2f..8be33395fc02 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,6 +26,9 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md deleted file mode 100644 index a356d6077eb4..000000000000 --- a/docs/content/reference/types/components/graph_edge.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphEdge" ---- - - -An undirected edge in a graph connecting two nodes. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) - * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) - * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) - - -## Used by - -* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md new file mode 100644 index 000000000000..0fb3d80ae2c8 --- /dev/null +++ b/docs/content/reference/types/components/graph_edge_directed.md @@ -0,0 +1,20 @@ +--- +title: "GraphEdgeDirected" +--- + + +A directed edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeDirected.html) + * 🐍 [Python API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeDirected) + * 🦀 [Rust API docs for `GraphEdgeDirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeDirected.html) + + +## Used by + +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) diff --git a/docs/content/reference/types/components/graph_edge_undirected.md b/docs/content/reference/types/components/graph_edge_undirected.md new file mode 100644 index 000000000000..b4e3fa0a5523 --- /dev/null +++ b/docs/content/reference/types/components/graph_edge_undirected.md @@ -0,0 +1,20 @@ +--- +title: "GraphEdgeUndirected" +--- + + +An undirected edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeUndirected.html) + * 🐍 [Python API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeUndirected) + * 🦀 [Rust API docs for `GraphEdgeUndirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeUndirected.html) + + +## Used by + +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) diff --git a/docs/content/reference/types/components/graph_node.md b/docs/content/reference/types/components/graph_node.md deleted file mode 100644 index 5e86f8d2e843..000000000000 --- a/docs/content/reference/types/components/graph_node.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphNode" ---- - - -A 32-bit ID representing a node in a graph. - -## Fields - -* id: [`GraphNode`](../datatypes/graph_node.md) - -## API reference links - * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html) - * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNode) - * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNode.html) - - -## Used by - -* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/graph_node_id.md b/docs/content/reference/types/components/graph_node_id.md new file mode 100644 index 000000000000..b74c96382c09 --- /dev/null +++ b/docs/content/reference/types/components/graph_node_id.md @@ -0,0 +1,20 @@ +--- +title: "GraphNodeId" +--- + + +A 32-bit ID representing a node in a graph. + +## Fields + +* id: [`GraphNodeId`](../datatypes/graph_node_id.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNodeId.html) + * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNodeId) + * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNodeId.html) + + +## Used by + +* [`GraphNodes`](../archetypes/graph_nodes.md) diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md deleted file mode 100644 index ccb53ca1a00f..000000000000 --- a/docs/content/reference/types/components/graph_type.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphType" ---- - - -An undirected edge in a graph connecting two nodes. - -## Fields - -* graph_type: [`GraphType`](../datatypes/graph_type.md) - -## API reference links - * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphType.html) - * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphType) - * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/struct.GraphType.html) - - -## Used by - -* [`Graph`](../archetypes/graph.md) diff --git a/docs/content/reference/types/components/position2d.md b/docs/content/reference/types/components/position2d.md index fd6a0aefc0b5..a787c7672dda 100644 --- a/docs/content/reference/types/components/position2d.md +++ b/docs/content/reference/types/components/position2d.md @@ -19,5 +19,5 @@ A position in 2D space. * [`Arrows2D`](../archetypes/arrows2d.md) * [`Boxes2D`](../archetypes/boxes2d.md) -* [`Graph`](../archetypes/graph.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index 31b40b8a4ae7..cd2a4d8b19b3 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,6 +26,9 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index 54744c09abd2..2af14a38050b 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,6 +22,9 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) +* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index 9bdd4a862e55..e1b8010b1f0d 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -20,8 +20,8 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. * [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possibly in different entities). -* [`GraphNode`](datatypes/graph_node.md): A string ID representing a node in a graph. -* [`GraphType`](datatypes/graph_type.md): Specifies if a graph has directed or undirected edges. +* [`GraphLocation`](datatypes/graph_location.md): Uniquely identifies a node in a graph by its entity path and node id. +* [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index 09255112d119..4a855f2d725d 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -14,8 +14,8 @@ entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true graph_edge.md linguist-generated=true -graph_node.md linguist-generated=true -graph_type.md linguist-generated=true +graph_location.md linguist-generated=true +graph_node_id.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/entity_path.md b/docs/content/reference/types/datatypes/entity_path.md index 5e7a14c35223..b4985a4f44bc 100644 --- a/docs/content/reference/types/datatypes/entity_path.md +++ b/docs/content/reference/types/datatypes/entity_path.md @@ -1,20 +1,21 @@ --- title: "EntityPath" --- + A path to an entity in the `ChunkStore`. ## Fields -* path: `string` +- path: `string` ## API reference links - * 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) - * 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) - * 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) +- 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) +- 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) +- 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) ## Used by -* [`EntityPath`](../components/entity_path.md) +- [`EntityPath`](../components/entity_path.md) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md index c52798330770..c739d535bf7d 100644 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -7,8 +7,8 @@ Represents an edge in a graph connecting two nodes (possibly in different entiti ## Fields -* source: [`GraphNode`](../datatypes/graph_node.md) -* target: [`GraphNode`](../datatypes/graph_node.md) +* source: [`GraphLocation`](../datatypes/graph_location.md) +* target: [`GraphLocation`](../datatypes/graph_location.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) @@ -18,4 +18,5 @@ Represents an edge in a graph connecting two nodes (possibly in different entiti ## Used by -* [`GraphEdge`](../components/graph_edge.md) +* [`GraphEdgeDirected`](../components/graph_edge_directed.md) +* [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) diff --git a/docs/content/reference/types/datatypes/graph_location.md b/docs/content/reference/types/datatypes/graph_location.md new file mode 100644 index 000000000000..73c4bb451fc3 --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_location.md @@ -0,0 +1,23 @@ +--- +title: "GraphLocation" +--- + + +Uniquely identifies a node in a graph by its entity path and node id. + +We require this because the same node id can be used in multiple entities. + +## Fields + +* entity_path: [`EntityPath`](../datatypes/entity_path.md) +* node_id: [`GraphNodeId`](../datatypes/graph_node_id.md) + +## API reference links + * 🌊 [C++ API docs for `GraphLocation`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphLocation.html) + * 🐍 [Python API docs for `GraphLocation`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphLocation) + * 🦀 [Rust API docs for `GraphLocation`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphLocation.html) + + +## Used by + +* [`GraphEdge`](../datatypes/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node.md b/docs/content/reference/types/datatypes/graph_node.md deleted file mode 100644 index 66279908066d..000000000000 --- a/docs/content/reference/types/datatypes/graph_node.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphNode" ---- - - -A string ID representing a node in a graph. - -## Fields - -* id: `string` - -## API reference links - * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNode.html) - * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNode) - * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNode.html) - - -## Used by - -* [`GraphEdge`](../datatypes/graph_edge.md) -* [`GraphNode`](../components/graph_node.md) diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md new file mode 100644 index 000000000000..960ff2c6617c --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_node_id.md @@ -0,0 +1,21 @@ +--- +title: "GraphNodeId" +--- + + +A 32-bit ID representing a node in a graph. + +## Fields + +* id: `string` + +## API reference links + * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNodeId.html) + * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNodeId) + * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNodeId.html) + + +## Used by + +* [`GraphLocation`](../datatypes/graph_location.md) +* [`GraphNodeId`](../components/graph_node_id.md) diff --git a/docs/content/reference/types/datatypes/graph_type.md b/docs/content/reference/types/datatypes/graph_type.md deleted file mode 100644 index ec44318856dd..000000000000 --- a/docs/content/reference/types/datatypes/graph_type.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphType" ---- - - -Specifies if a graph has directed or undirected edges. - -## Variants - -* Undirected -* Directed - -## API reference links - * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1datatypes.html) - * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphType) - * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/datatypes/enum.GraphType.html) - - -## Used by - -* [`GraphType`](../components/graph_type.md) diff --git a/rerun_cpp/src/rerun/archetypes.hpp b/rerun_cpp/src/rerun/archetypes.hpp index d5ffca9694aa..8465c54b56c3 100644 --- a/rerun_cpp/src/rerun/archetypes.hpp +++ b/rerun_cpp/src/rerun/archetypes.hpp @@ -15,7 +15,9 @@ #include "archetypes/disconnected_space.hpp" #include "archetypes/ellipsoids3d.hpp" #include "archetypes/encoded_image.hpp" -#include "archetypes/graph.hpp" +#include "archetypes/graph_edges_directed.hpp" +#include "archetypes/graph_edges_undirected.hpp" +#include "archetypes/graph_nodes.hpp" #include "archetypes/image.hpp" #include "archetypes/instance_poses3d.hpp" #include "archetypes/line_strips2d.hpp" diff --git a/rerun_cpp/src/rerun/archetypes/.gitattributes b/rerun_cpp/src/rerun/archetypes/.gitattributes index aa5caf76b53e..98c0e80d8418 100644 --- a/rerun_cpp/src/rerun/archetypes/.gitattributes +++ b/rerun_cpp/src/rerun/archetypes/.gitattributes @@ -27,8 +27,12 @@ ellipsoids3d.cpp linguist-generated=true ellipsoids3d.hpp linguist-generated=true encoded_image.cpp linguist-generated=true encoded_image.hpp linguist-generated=true -graph.cpp linguist-generated=true -graph.hpp linguist-generated=true +graph_edges_directed.cpp linguist-generated=true +graph_edges_directed.hpp linguist-generated=true +graph_edges_undirected.cpp linguist-generated=true +graph_edges_undirected.hpp linguist-generated=true +graph_nodes.cpp linguist-generated=true +graph_nodes.hpp linguist-generated=true image.cpp linguist-generated=true image.hpp linguist-generated=true instance_poses3d.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/archetypes/graph.hpp b/rerun_cpp/src/rerun/archetypes/graph.hpp deleted file mode 100644 index bd2dd30b8f20..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/graph_edge.hpp" -#include "../components/graph_node.hpp" -#include "../components/graph_type.hpp" -#include "../components/position2d.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A graph that consists of nodes and edges. - /// - /// By default, the graph is undirected. - struct Graph { - /// A list of nodes. - Collection nodes; - - /// A list of edges. - std::optional> edges; - - /// Specifies if the graph is directed or undirected. - std::optional graph_type; - - /// The position for each of the nodes. - std::optional> node_positions; - - public: - static constexpr const char IndicatorComponentName[] = "rerun.components.GraphIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - Graph() = default; - Graph(Graph&& other) = default; - - explicit Graph(Collection _nodes) - : nodes(std::move(_nodes)) {} - - /// A list of edges. - Graph with_edges(Collection _edges) && { - edges = std::move(_edges); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Specifies if the graph is directed or undirected. - Graph with_graph_type(rerun::components::GraphType _graph_type) && { - graph_type = std::move(_graph_type); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// The position for each of the nodes. - Graph with_node_positions(Collection _node_positions) && { - node_positions = std::move(_node_positions); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize(const archetypes::Graph& archetype); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp similarity index 65% rename from rerun_cpp/src/rerun/archetypes/graph.cpp rename to rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp index a4199f29358d..c528d1db50a7 100644 --- a/rerun_cpp/src/rerun/archetypes/graph.cpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". -#include "graph.hpp" +#include "graph_edges_directed.hpp" #include "../collection_adapter_builtins.hpp" @@ -9,35 +9,40 @@ namespace rerun::archetypes {} namespace rerun { - Result> AsComponents::serialize( - const archetypes::Graph& archetype + Result> AsComponents::serialize( + const archetypes::GraphEdgesDirected& archetype ) { using namespace archetypes; std::vector cells; - cells.reserve(5); + cells.reserve(6); { - auto result = ComponentBatch::from_loggable(archetype.nodes); + auto result = ComponentBatch::from_loggable(archetype.edges); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.edges.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.edges.value()); + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.graph_type.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.graph_type.value()); + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.node_positions.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.node_positions.value()); + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } { - auto indicator = Graph::IndicatorComponent(); + auto indicator = GraphEdgesDirected::IndicatorComponent(); auto result = ComponentBatch::from_loggable(indicator); RR_RETURN_NOT_OK(result.error); cells.emplace_back(std::move(result.value)); diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp new file mode 100644 index 000000000000..25287f28ce3e --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp @@ -0,0 +1,102 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_edge_directed.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphEdgesDirected { + /// A list of node IDs. + Collection edges; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphEdgesDirectedIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphEdgesDirected() = default; + GraphEdgesDirected(GraphEdgesDirected&& other) = default; + + explicit GraphEdgesDirected(Collection _edges) + : edges(std::move(_edges)) {} + + /// Optional colors for the boxes. + GraphEdgesDirected with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional text labels for the node. + GraphEdgesDirected with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphEdgesDirected with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphEdgesDirected with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize( + const archetypes::GraphEdgesDirected& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp new file mode 100644 index 000000000000..01a9a49ea1da --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp @@ -0,0 +1,53 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". + +#include "graph_edges_undirected.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphEdgesUndirected& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(6); + + { + auto result = ComponentBatch::from_loggable(archetype.edges); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphEdgesUndirected::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp new file mode 100644 index 000000000000..1ba357558f00 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp @@ -0,0 +1,102 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_edge_undirected.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphEdgesUndirected { + /// A list of node IDs. + Collection edges; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphEdgesUndirectedIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphEdgesUndirected() = default; + GraphEdgesUndirected(GraphEdgesUndirected&& other) = default; + + explicit GraphEdgesUndirected(Collection _edges) + : edges(std::move(_edges)) {} + + /// Optional colors for the boxes. + GraphEdgesUndirected with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional text labels for the node. + GraphEdgesUndirected with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphEdgesUndirected with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphEdgesUndirected with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize( + const archetypes::GraphEdgesUndirected& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp new file mode 100644 index 000000000000..2e1febe0fbca --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp @@ -0,0 +1,58 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#include "graph_nodes.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphNodes& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(7); + + { + auto result = ComponentBatch::from_loggable(archetype.node_ids); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.centers.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.centers.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.class_ids.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphNodes::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp new file mode 100644 index 000000000000..e97b80461f2b --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp @@ -0,0 +1,112 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/class_id.hpp" +#include "../components/color.hpp" +#include "../components/graph_node_id.hpp" +#include "../components/position2d.hpp" +#include "../components/show_labels.hpp" +#include "../components/text.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. + struct GraphNodes { + /// A list of node IDs. + Collection node_ids; + + /// Optional text labels for the node. + std::optional> labels; + + /// Optional colors for the boxes. + std::optional> colors; + + /// Optional center positions of the nodes. + std::optional> centers; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + std::optional> class_ids; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphNodesIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphNodes() = default; + GraphNodes(GraphNodes&& other) = default; + + explicit GraphNodes(Collection _node_ids) + : node_ids(std::move(_node_ids)) {} + + /// Optional text labels for the node. + GraphNodes with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional colors for the boxes. + GraphNodes with_colors(Collection _colors) && { + colors = std::move(_colors); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional center positions of the nodes. + GraphNodes with_centers(Collection _centers) && { + centers = std::move(_centers); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphNodes with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional `components::ClassId`s for the boxes. + /// + /// The `components::ClassId` provides colors and labels if not specified explicitly. + GraphNodes with_class_ids(Collection _class_ids) && { + class_ids = std::move(_class_ids); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize(const archetypes::GraphNodes& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/components.hpp b/rerun_cpp/src/rerun/components.hpp index 68687fda028a..33653f4e4020 100644 --- a/rerun_cpp/src/rerun/components.hpp +++ b/rerun_cpp/src/rerun/components.hpp @@ -18,9 +18,9 @@ #include "components/fill_mode.hpp" #include "components/fill_ratio.hpp" #include "components/gamma_correction.hpp" -#include "components/graph_edge.hpp" -#include "components/graph_node.hpp" -#include "components/graph_type.hpp" +#include "components/graph_edge_directed.hpp" +#include "components/graph_edge_undirected.hpp" +#include "components/graph_node_id.hpp" #include "components/half_size2d.hpp" #include "components/half_size3d.hpp" #include "components/image_buffer.hpp" diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 6c5adccb600e..370edb1baa02 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,9 +21,9 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true -graph_edge.hpp linguist-generated=true -graph_node.hpp linguist-generated=true -graph_type.hpp linguist-generated=true +graph_edge_directed.hpp linguist-generated=true +graph_edge_undirected.hpp linguist-generated=true +graph_node_id.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true image_buffer.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge_directed.hpp similarity index 79% rename from rerun_cpp/src/rerun/components/graph_edge.hpp rename to rerun_cpp/src/rerun/components/graph_edge_directed.hpp index c6c2911da1cb..83cbe1e40020 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge_directed.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". #pragma once @@ -12,15 +12,15 @@ namespace rerun::components { /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphEdge { + struct GraphEdgeDirected { rerun::datatypes::GraphEdge edge; public: - GraphEdge() = default; + GraphEdgeDirected() = default; - GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphEdgeDirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { + GraphEdgeDirected& operator=(rerun::datatypes::GraphEdge edge_) { edge = std::move(edge_); return *this; } @@ -33,21 +33,21 @@ namespace rerun::components { } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeDirected)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdge"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdgeDirected"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. + /// Serializes an array of `rerun::components::GraphEdgeDirected` into an arrow array. static Result> to_arrow( - const components::GraphEdge* instances, size_t num_instances + const components::GraphEdgeDirected* instances, size_t num_instances ) { if (num_instances == 0) { return Loggable::to_arrow(nullptr, 0); diff --git a/rerun_cpp/src/rerun/components/graph_type.hpp b/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp similarity index 52% rename from rerun_cpp/src/rerun/components/graph_type.hpp rename to rerun_cpp/src/rerun/components/graph_edge_undirected.hpp index c6ad3ef17a53..f949d4040277 100644 --- a/rerun_cpp/src/rerun/components/graph_type.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp @@ -1,63 +1,64 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". #pragma once -#include "../datatypes/graph_type.hpp" +#include "../datatypes/graph_edge.hpp" #include "../result.hpp" #include #include +#include namespace rerun::components { /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphType { - rerun::datatypes::GraphType graph_type; + struct GraphEdgeUndirected { + rerun::datatypes::GraphEdge edge; public: - GraphType() = default; + GraphEdgeUndirected() = default; - GraphType(rerun::datatypes::GraphType graph_type_) : graph_type(graph_type_) {} + GraphEdgeUndirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphType& operator=(rerun::datatypes::GraphType graph_type_) { - graph_type = graph_type_; + GraphEdgeUndirected& operator=(rerun::datatypes::GraphEdge edge_) { + edge = std::move(edge_); return *this; } - /// Cast to the underlying GraphType datatype - operator rerun::datatypes::GraphType() const { - return graph_type; + /// Cast to the underlying GraphEdge datatype + operator rerun::datatypes::GraphEdge() const { + return edge; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphType) == sizeof(components::GraphType)); + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeUndirected)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphType"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdgeUndirected"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphType` into an arrow array. + /// Serializes an array of `rerun::components::GraphEdgeUndirected` into an arrow array. static Result> to_arrow( - const components::GraphType* instances, size_t num_instances + const components::GraphEdgeUndirected* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( - &instances->graph_type, + return Loggable::to_arrow( + &instances->edge, num_instances ); } diff --git a/rerun_cpp/src/rerun/components/graph_node.hpp b/rerun_cpp/src/rerun/components/graph_node_id.hpp similarity index 58% rename from rerun_cpp/src/rerun/components/graph_node.hpp rename to rerun_cpp/src/rerun/components/graph_node_id.hpp index 1f633942049a..d63ad98bda84 100644 --- a/rerun_cpp/src/rerun/components/graph_node.hpp +++ b/rerun_cpp/src/rerun/components/graph_node_id.hpp @@ -1,9 +1,9 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". #pragma once -#include "../datatypes/graph_node.hpp" +#include "../datatypes/graph_node_id.hpp" #include "../result.hpp" #include @@ -13,59 +13,59 @@ namespace rerun::components { /// **Component**: A 32-bit ID representing a node in a graph. - struct GraphNode { - rerun::datatypes::GraphNode id; + struct GraphNodeId { + rerun::datatypes::GraphNodeId id; public: - GraphNode() = default; + GraphNodeId() = default; - GraphNode(rerun::datatypes::GraphNode id_) : id(std::move(id_)) {} + GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(std::move(id_)) {} - GraphNode& operator=(rerun::datatypes::GraphNode id_) { + GraphNodeId& operator=(rerun::datatypes::GraphNodeId id_) { id = std::move(id_); return *this; } - GraphNode(std::string id_) : id(std::move(id_)) {} + GraphNodeId(std::string id_) : id(std::move(id_)) {} - GraphNode& operator=(std::string id_) { + GraphNodeId& operator=(std::string id_) { id = std::move(id_); return *this; } - /// Cast to the underlying GraphNode datatype - operator rerun::datatypes::GraphNode() const { + /// Cast to the underlying GraphNodeId datatype + operator rerun::datatypes::GraphNodeId() const { return id; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphNode) == sizeof(components::GraphNode)); + static_assert(sizeof(rerun::datatypes::GraphNodeId) == sizeof(components::GraphNodeId)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphNode"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphNodeId"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphNode` into an arrow array. + /// Serializes an array of `rerun::components::GraphNodeId` into an arrow array. static Result> to_arrow( - const components::GraphNode* instances, size_t num_instances + const components::GraphNodeId* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( + return Loggable::to_arrow( &instances->id, num_instances ); diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index 4be967809c3a..de1b06885622 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -15,8 +15,8 @@ #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" #include "datatypes/graph_edge.hpp" -#include "datatypes/graph_node.hpp" -#include "datatypes/graph_type.hpp" +#include "datatypes/graph_location.hpp" +#include "datatypes/graph_node_id.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 3b6db9b9e234..923a0a15924f 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -27,10 +27,10 @@ float64.cpp linguist-generated=true float64.hpp linguist-generated=true graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true -graph_node.cpp linguist-generated=true -graph_node.hpp linguist-generated=true -graph_type.cpp linguist-generated=true -graph_type.hpp linguist-generated=true +graph_location.cpp linguist-generated=true +graph_location.hpp linguist-generated=true +graph_node_id.cpp linguist-generated=true +graph_node_id.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp index 1e4134b5873c..28f4e9286da8 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -3,7 +3,7 @@ #include "graph_edge.hpp" -#include "graph_node.hpp" +#include "graph_location.hpp" #include #include @@ -13,8 +13,16 @@ namespace rerun::datatypes {} namespace rerun { const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::struct_({ - arrow::field("source", Loggable::arrow_datatype(), false), - arrow::field("target", Loggable::arrow_datatype(), false), + arrow::field( + "source", + Loggable::arrow_datatype(), + false + ), + arrow::field( + "target", + Loggable::arrow_datatype(), + false + ), }); return datatype; } @@ -53,25 +61,29 @@ namespace rerun { } { - auto field_builder = static_cast(builder->field_builder(0)); + auto field_builder = static_cast(builder->field_builder(0)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].source, - 1 - )); + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].source, + 1 + ) + ); } } { - auto field_builder = static_cast(builder->field_builder(1)); + auto field_builder = static_cast(builder->field_builder(1)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].target, - 1 - )); + RR_RETURN_NOT_OK( + Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].target, + 1 + ) + ); } } ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp index 151e54f6d0f0..eec468dc4e75 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -4,7 +4,7 @@ #pragma once #include "../result.hpp" -#include "graph_node.hpp" +#include "graph_location.hpp" #include #include @@ -19,10 +19,10 @@ namespace rerun::datatypes { /// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). struct GraphEdge { /// The id of the source node. - rerun::datatypes::GraphNode source; + rerun::datatypes::GraphLocation source; /// The id of the target node. - rerun::datatypes::GraphNode target; + rerun::datatypes::GraphLocation target; public: GraphEdge() = default; diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.cpp b/rerun_cpp/src/rerun/datatypes/graph_location.cpp new file mode 100644 index 000000000000..5d7620f53c3e --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_location.cpp @@ -0,0 +1,90 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +#include "graph_location.hpp" + +#include "entity_path.hpp" +#include "graph_node_id.hpp" + +#include +#include + +namespace rerun::datatypes {} + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::struct_({ + arrow::field( + "entity_path", + Loggable::arrow_datatype(), + false + ), + arrow::field( + "node_id", + Loggable::arrow_datatype(), + false + ), + }); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphLocation* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + { + auto field_builder = static_cast(builder->field_builder(0)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].entity_path, + 1 + )); + } + } + { + auto field_builder = static_cast(builder->field_builder(1)); + ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].node_id, + 1 + )); + } + } + ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.hpp b/rerun_cpp/src/rerun/datatypes/graph_location.hpp similarity index 50% rename from rerun_cpp/src/rerun/datatypes/graph_type.hpp rename to rerun_cpp/src/rerun/datatypes/graph_location.hpp index bd9293bb27ac..6bb821a792f2 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_type.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_location.hpp @@ -1,33 +1,34 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". #pragma once #include "../result.hpp" +#include "entity_path.hpp" +#include "graph_node_id.hpp" #include #include namespace arrow { - /// \private - template - class NumericBuilder; - class Array; class DataType; - class UInt8Type; - using UInt8Builder = NumericBuilder; + class StructBuilder; } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: Specifies if a graph has directed or undirected edges. - enum class GraphType : uint8_t { - - /// The graph has undirected edges. - Undirected = 1, - - /// The graph has directed edges. - Directed = 2, + /// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. + /// + /// We require this because the same node id can be used in multiple entities. + struct GraphLocation { + /// The entity path that specifies where to find the node. + rerun::datatypes::EntityPath entity_path; + + /// The id of the node. + rerun::datatypes::GraphNodeId node_id; + + public: + GraphLocation() = default; }; } // namespace rerun::datatypes @@ -37,20 +38,21 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphType"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphLocation"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphType` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphLocation` into an arrow array. static Result> to_arrow( - const datatypes::GraphType* instances, size_t num_instances + const datatypes::GraphLocation* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements + arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, + size_t num_elements ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node.cpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp similarity index 82% rename from rerun_cpp/src/rerun/datatypes/graph_node.cpp rename to rerun_cpp/src/rerun/datatypes/graph_node_id.cpp index bd40260590f0..3fc45d4d8926 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". -#include "graph_node.hpp" +#include "graph_node_id.hpp" #include #include @@ -9,13 +9,13 @@ namespace rerun::datatypes {} namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { + const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::utf8(); return datatype; } - Result> Loggable::to_arrow( - const datatypes::GraphNode* instances, size_t num_instances + Result> Loggable::to_arrow( + const datatypes::GraphNodeId* instances, size_t num_instances ) { // TODO(andreas): Allow configuring the memory pool. arrow::MemoryPool* pool = arrow::default_memory_pool(); @@ -23,7 +23,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( static_cast(builder.get()), instances, num_instances @@ -34,8 +34,8 @@ namespace rerun { return array; } - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); diff --git a/rerun_cpp/src/rerun/datatypes/graph_node.hpp b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp similarity index 69% rename from rerun_cpp/src/rerun/datatypes/graph_node.hpp rename to rerun_cpp/src/rerun/datatypes/graph_node_id.hpp index 025befbd8c64..3a29ab76e9cd 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". #pragma once @@ -17,16 +17,16 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: A string ID representing a node in a graph. - struct GraphNode { + /// **Datatype**: A 32-bit ID representing a node in a graph. + struct GraphNodeId { std::string id; public: - GraphNode() = default; + GraphNodeId() = default; - GraphNode(std::string id_) : id(std::move(id_)) {} + GraphNodeId(std::string id_) : id(std::move(id_)) {} - GraphNode& operator=(std::string id_) { + GraphNodeId& operator=(std::string id_) { id = std::move(id_); return *this; } @@ -39,20 +39,21 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphNode"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphNodeId"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphNode` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphNodeId` into an arrow array. static Result> to_arrow( - const datatypes::GraphNode* instances, size_t num_instances + const datatypes::GraphNodeId* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements + arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, + size_t num_elements ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.cpp b/rerun_cpp/src/rerun/datatypes/graph_type.cpp deleted file mode 100644 index 678579db8df6..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_type.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -#include "graph_type.hpp" - -#include -#include - -namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::uint8(); - return datatype; - } - - Result> Loggable::to_arrow( - const datatypes::GraphType* instances, size_t num_instances - ) { - // TODO(andreas): Allow configuring the memory pool. - arrow::MemoryPool* pool = arrow::default_memory_pool(); - auto datatype = arrow_datatype(); - - ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) - if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), - instances, - num_instances - )); - } - std::shared_ptr array; - ARROW_RETURN_NOT_OK(builder->Finish(&array)); - return array; - } - - rerun::Error Loggable::fill_arrow_array_builder( - arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements - ) { - if (builder == nullptr) { - return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); - } - if (elements == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Cannot serialize null pointer to arrow array." - ); - } - - ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - const auto variant = elements[elem_idx]; - ARROW_RETURN_NOT_OK(builder->Append(static_cast(variant))); - } - - return Error::ok(); - } -} // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes index b39c61a3bda5..7f2f7f651e9d 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes @@ -15,7 +15,9 @@ depth_image.py linguist-generated=true disconnected_space.py linguist-generated=true ellipsoids3d.py linguist-generated=true encoded_image.py linguist-generated=true -graph.py linguist-generated=true +graph_edges_directed.py linguist-generated=true +graph_edges_undirected.py linguist-generated=true +graph_nodes.py linguist-generated=true image.py linguist-generated=true instance_poses3d.py linguist-generated=true line_strips2d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py index 3854c1a71094..e10bef316177 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py @@ -15,7 +15,9 @@ from .disconnected_space import DisconnectedSpace from .ellipsoids3d import Ellipsoids3D from .encoded_image import EncodedImage -from .graph import Graph +from .graph_edges_directed import GraphEdgesDirected +from .graph_edges_undirected import GraphEdgesUndirected +from .graph_nodes import GraphNodes from .image import Image from .instance_poses3d import InstancePoses3D from .line_strips2d import LineStrips2D @@ -49,7 +51,9 @@ "DisconnectedSpace", "Ellipsoids3D", "EncodedImage", - "Graph", + "GraphEdgesDirected", + "GraphEdgesUndirected", + "GraphNodes", "Image", "InstancePoses3D", "LineStrips2D", diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph.py b/rerun_py/rerun_sdk/rerun/archetypes/graph.py deleted file mode 100644 index 25a7d9a104d7..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph.py +++ /dev/null @@ -1,111 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph.fbs". - -# You can extend this class by creating a "GraphExt" class in "graph_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["Graph"] - - -@define(str=False, repr=False, init=False) -class Graph(Archetype): - """ - **Archetype**: A graph that consists of nodes and edges. - - By default, the graph is undirected. - """ - - def __init__( - self: Any, - nodes: datatypes.GraphNodeArrayLike, - *, - edges: datatypes.GraphEdgeArrayLike | None = None, - graph_type: datatypes.GraphTypeLike | None = None, - node_positions: datatypes.Vec2DArrayLike | None = None, - ): - """ - Create a new instance of the Graph archetype. - - Parameters - ---------- - nodes: - A list of nodes. - edges: - A list of edges. - graph_type: - Specifies if the graph is directed or undirected. - node_positions: - The position for each of the nodes. - - """ - - # You can define your own __init__ function as a member of GraphExt in graph_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(nodes=nodes, edges=edges, graph_type=graph_type, node_positions=node_positions) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - nodes=None, # type: ignore[arg-type] - edges=None, # type: ignore[arg-type] - graph_type=None, # type: ignore[arg-type] - node_positions=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> Graph: - """Produce an empty Graph, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - nodes: components.GraphNodeBatch = field( - metadata={"component": "required"}, - converter=components.GraphNodeBatch._required, # type: ignore[misc] - ) - # A list of nodes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - edges: components.GraphEdgeBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.GraphEdgeBatch._optional, # type: ignore[misc] - ) - # A list of edges. - # - # (Docstring intentionally commented out to hide this field from the docs) - - graph_type: components.GraphTypeBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.GraphTypeBatch._optional, # type: ignore[misc] - ) - # Specifies if the graph is directed or undirected. - # - # (Docstring intentionally commented out to hide this field from the docs) - - node_positions: components.Position2DBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.Position2DBatch._optional, # type: ignore[misc] - ) - # The position for each of the nodes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py new file mode 100644 index 000000000000..8fd3b6349d38 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py @@ -0,0 +1,124 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". + +# You can extend this class by creating a "GraphEdgesDirectedExt" class in "graph_edges_directed_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphEdgesDirected"] + + +@define(str=False, repr=False, init=False) +class GraphEdgesDirected(Archetype): + """**Archetype**: A list of directed edges in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + edges: datatypes.GraphEdgeArrayLike, + *, + colors: datatypes.Rgba32ArrayLike | None = None, + labels: datatypes.Utf8ArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphEdgesDirected archetype. + + Parameters + ---------- + edges: + A list of node IDs. + colors: + Optional colors for the boxes. + labels: + Optional text labels for the node. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphEdgesDirectedExt in graph_edges_directed_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + edges=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphEdgesDirected: + """Produce an empty GraphEdgesDirected, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + edges: components.GraphEdgeDirectedBatch = field( + metadata={"component": "required"}, + converter=components.GraphEdgeDirectedBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py new file mode 100644 index 000000000000..347c4f0b645d --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py @@ -0,0 +1,124 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". + +# You can extend this class by creating a "GraphEdgesUndirectedExt" class in "graph_edges_undirected_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphEdgesUndirected"] + + +@define(str=False, repr=False, init=False) +class GraphEdgesUndirected(Archetype): + """**Archetype**: A list of undirected edges in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + edges: datatypes.GraphEdgeArrayLike, + *, + colors: datatypes.Rgba32ArrayLike | None = None, + labels: datatypes.Utf8ArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphEdgesUndirected archetype. + + Parameters + ---------- + edges: + A list of node IDs. + colors: + Optional colors for the boxes. + labels: + Optional text labels for the node. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphEdgesUndirectedExt in graph_edges_undirected_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + edges=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphEdgesUndirected: + """Produce an empty GraphEdgesUndirected, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + edges: components.GraphEdgeUndirectedBatch = field( + metadata={"component": "required"}, + converter=components.GraphEdgeUndirectedBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py new file mode 100644 index 000000000000..ad6fb9244bc5 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py @@ -0,0 +1,144 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs". + +# You can extend this class by creating a "GraphNodesExt" class in "graph_nodes_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphNodes"] + + +@define(str=False, repr=False, init=False) +class GraphNodes(Archetype): + """**Archetype**: A list of nodes in a graph with optional labels, colors, etc.""" + + def __init__( + self: Any, + node_ids: datatypes.GraphNodeIdArrayLike, + *, + labels: datatypes.Utf8ArrayLike | None = None, + colors: datatypes.Rgba32ArrayLike | None = None, + centers: datatypes.Vec2DArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, + class_ids: datatypes.ClassIdArrayLike | None = None, + ): + """ + Create a new instance of the GraphNodes archetype. + + Parameters + ---------- + node_ids: + A list of node IDs. + labels: + Optional text labels for the node. + colors: + Optional colors for the boxes. + centers: + Optional center positions of the nodes. + show_labels: + Optional choice of whether the text labels should be shown by default. + class_ids: + Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + + The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + + """ + + # You can define your own __init__ function as a member of GraphNodesExt in graph_nodes_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__( + node_ids=node_ids, + labels=labels, + colors=colors, + centers=centers, + show_labels=show_labels, + class_ids=class_ids, + ) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + node_ids=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + colors=None, # type: ignore[arg-type] + centers=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] + class_ids=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphNodes: + """Produce an empty GraphNodes, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + node_ids: components.GraphNodeIdBatch = field( + metadata={"component": "required"}, + converter=components.GraphNodeIdBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + colors: components.ColorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ColorBatch._optional, # type: ignore[misc] + ) + # Optional colors for the boxes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + centers: components.Position2DBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.Position2DBatch._optional, # type: ignore[misc] + ) + # Optional center positions of the nodes. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + + class_ids: components.ClassIdBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ClassIdBatch._optional, # type: ignore[misc] + ) + # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. + # + # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/.gitattributes b/rerun_py/rerun_sdk/rerun/components/.gitattributes index b58a29ae3dac..e23a94f9df5d 100644 --- a/rerun_py/rerun_sdk/rerun/components/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/components/.gitattributes @@ -18,9 +18,9 @@ entity_path.py linguist-generated=true fill_mode.py linguist-generated=true fill_ratio.py linguist-generated=true gamma_correction.py linguist-generated=true -graph_edge.py linguist-generated=true -graph_node.py linguist-generated=true -graph_type.py linguist-generated=true +graph_edge_directed.py linguist-generated=true +graph_edge_undirected.py linguist-generated=true +graph_node_id.py linguist-generated=true half_size2d.py linguist-generated=true half_size3d.py linguist-generated=true image_buffer.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index 4c07d684c17f..f4c280e724bc 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,9 +30,9 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType -from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType -from .graph_node import GraphNode, GraphNodeBatch, GraphNodeType -from .graph_type import GraphType, GraphTypeBatch, GraphTypeType +from .graph_edge_directed import GraphEdgeDirected, GraphEdgeDirectedBatch, GraphEdgeDirectedType +from .graph_edge_undirected import GraphEdgeUndirected, GraphEdgeUndirectedBatch, GraphEdgeUndirectedType +from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType from .image_buffer import ImageBuffer, ImageBufferBatch, ImageBufferType @@ -154,15 +154,15 @@ "GammaCorrection", "GammaCorrectionBatch", "GammaCorrectionType", - "GraphEdge", - "GraphEdgeBatch", - "GraphEdgeType", - "GraphNode", - "GraphNodeBatch", - "GraphNodeType", - "GraphType", - "GraphTypeBatch", - "GraphTypeType", + "GraphEdgeDirected", + "GraphEdgeDirectedBatch", + "GraphEdgeDirectedType", + "GraphEdgeUndirected", + "GraphEdgeUndirectedBatch", + "GraphEdgeUndirectedType", + "GraphNodeId", + "GraphNodeIdBatch", + "GraphNodeIdType", "HalfSize2D", "HalfSize2DBatch", "HalfSize2DType", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py deleted file mode 100644 index f36c270848f0..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". - -# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] - - -class GraphEdge(datatypes.GraphEdge, ComponentMixin): - """**Component**: An undirected edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - - # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge - pass - - -class GraphEdgeType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdge" - - -class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeType() - - -# This is patched in late to avoid circular dependencies. -GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py new file mode 100644 index 000000000000..590596f6755e --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". + +# You can extend this class by creating a "GraphEdgeDirectedExt" class in "graph_edge_directed_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdgeDirected", "GraphEdgeDirectedBatch", "GraphEdgeDirectedType"] + + +class GraphEdgeDirected(datatypes.GraphEdge, ComponentMixin): + """**Component**: A directed edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeDirectedExt in graph_edge_directed_ext.py + + # Note: there are no fields here because GraphEdgeDirected delegates to datatypes.GraphEdge + pass + + +class GraphEdgeDirectedType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdgeDirected" + + +class GraphEdgeDirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeDirectedType() + + +# This is patched in late to avoid circular dependencies. +GraphEdgeDirected._BATCH_TYPE = GraphEdgeDirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py new file mode 100644 index 000000000000..0519c78ebaae --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". + +# You can extend this class by creating a "GraphEdgeUndirectedExt" class in "graph_edge_undirected_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdgeUndirected", "GraphEdgeUndirectedBatch", "GraphEdgeUndirectedType"] + + +class GraphEdgeUndirected(datatypes.GraphEdge, ComponentMixin): + """**Component**: An undirected edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeUndirectedExt in graph_edge_undirected_ext.py + + # Note: there are no fields here because GraphEdgeUndirected delegates to datatypes.GraphEdge + pass + + +class GraphEdgeUndirectedType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdgeUndirected" + + +class GraphEdgeUndirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeUndirectedType() + + +# This is patched in late to avoid circular dependencies. +GraphEdgeUndirected._BATCH_TYPE = GraphEdgeUndirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node.py b/rerun_py/rerun_sdk/rerun/components/graph_node.py deleted file mode 100644 index a9b7c95afca0..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_node.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". - -# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphNode", "GraphNodeBatch", "GraphNodeType"] - - -class GraphNode(datatypes.GraphNode, ComponentMixin): - """**Component**: A 32-bit ID representing a node in a graph.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py - - # Note: there are no fields here because GraphNode delegates to datatypes.GraphNode - pass - - -class GraphNodeType(datatypes.GraphNodeType): - _TYPE_NAME: str = "rerun.components.GraphNode" - - -class GraphNodeBatch(datatypes.GraphNodeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphNodeType() - - -# This is patched in late to avoid circular dependencies. -GraphNode._BATCH_TYPE = GraphNodeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py new file mode 100644 index 000000000000..4ff668e9281c --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". + +# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphNodeId", "GraphNodeIdBatch", "GraphNodeIdType"] + + +class GraphNodeId(datatypes.GraphNodeId, ComponentMixin): + """**Component**: A 32-bit ID representing a node in a graph.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + + # Note: there are no fields here because GraphNodeId delegates to datatypes.GraphNodeId + pass + + +class GraphNodeIdType(datatypes.GraphNodeIdType): + _TYPE_NAME: str = "rerun.components.GraphNodeId" + + +class GraphNodeIdBatch(datatypes.GraphNodeIdBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphNodeIdType() + + +# This is patched in late to avoid circular dependencies. +GraphNodeId._BATCH_TYPE = GraphNodeIdBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_type.py b/rerun_py/rerun_sdk/rerun/components/graph_type.py deleted file mode 100644 index b458ca637822..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_type.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". - -# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphType", "GraphTypeBatch", "GraphTypeType"] - - -class GraphType(datatypes.GraphType, ComponentMixin): - """**Component**: An undirected edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphTypeExt in graph_type_ext.py - - # Note: there are no fields here because GraphType delegates to datatypes.GraphType - pass - - -class GraphTypeType(datatypes.GraphTypeType): - _TYPE_NAME: str = "rerun.components.GraphType" - - -class GraphTypeBatch(datatypes.GraphTypeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphTypeType() - - -# This is patched in late to avoid circular dependencies. -GraphType._BATCH_TYPE = GraphTypeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index 95631c93b9f7..af6b5ed76347 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -15,8 +15,8 @@ entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true graph_edge.py linguist-generated=true -graph_node.py linguist-generated=true -graph_type.py linguist-generated=true +graph_location.py linguist-generated=true +graph_node_id.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 91e7977ca4fa..5428717d75c0 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -39,8 +39,14 @@ from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType -from .graph_node import GraphNode, GraphNodeArrayLike, GraphNodeBatch, GraphNodeLike, GraphNodeType -from .graph_type import GraphType, GraphTypeArrayLike, GraphTypeBatch, GraphTypeLike, GraphTypeType +from .graph_location import ( + GraphLocation, + GraphLocationArrayLike, + GraphLocationBatch, + GraphLocationLike, + GraphLocationType, +) +from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -189,16 +195,16 @@ "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType", - "GraphNode", - "GraphNodeArrayLike", - "GraphNodeBatch", - "GraphNodeLike", - "GraphNodeType", - "GraphType", - "GraphTypeArrayLike", - "GraphTypeBatch", - "GraphTypeLike", - "GraphTypeType", + "GraphLocation", + "GraphLocationArrayLike", + "GraphLocationBatch", + "GraphLocationLike", + "GraphLocationType", + "GraphNodeId", + "GraphNodeIdArrayLike", + "GraphNodeIdBatch", + "GraphNodeIdLike", + "GraphNodeIdType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py index b02a2f10394b..3fc8c8953901 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -19,25 +19,11 @@ __all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] -def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: - if isinstance(x, datatypes.GraphNode): - return x - else: - return datatypes.GraphNode(x) - - -def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: - if isinstance(x, datatypes.GraphNode): - return x - else: - return datatypes.GraphNode(x) - - @define(init=False) class GraphEdge: """**Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities).""" - def __init__(self: Any, source: datatypes.GraphNodeLike, target: datatypes.GraphNodeLike): + def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.GraphLocationLike): """ Create a new instance of the GraphEdge datatype. @@ -53,12 +39,12 @@ def __init__(self: Any, source: datatypes.GraphNodeLike, target: datatypes.Graph # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py self.__attrs_init__(source=source, target=target) - source: datatypes.GraphNode = field(converter=_graph_edge__source__special_field_converter_override) + source: datatypes.GraphLocation = field() # The id of the source node. # # (Docstring intentionally commented out to hide this field from the docs) - target: datatypes.GraphNode = field(converter=_graph_edge__target__special_field_converter_override) + target: datatypes.GraphLocation = field() # The id of the target node. # # (Docstring intentionally commented out to hide this field from the docs) @@ -78,8 +64,24 @@ def __init__(self) -> None: pa.ExtensionType.__init__( self, pa.struct([ - pa.field("source", pa.utf8(), nullable=False, metadata={}), - pa.field("target", pa.utf8(), nullable=False, metadata={}), + pa.field( + "source", + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + nullable=False, + metadata={}, + ), + pa.field( + "target", + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + nullable=False, + metadata={}, + ), ]), self._TYPE_NAME, ) @@ -90,15 +92,15 @@ class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): @staticmethod def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import GraphNodeBatch + from rerun.datatypes import GraphLocationBatch if isinstance(data, GraphEdge): data = [data] return pa.StructArray.from_arrays( [ - GraphNodeBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphLocationBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphLocationBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] ], fields=list(data_type), ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py new file mode 100644 index 000000000000..1925f78eb0ef --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py @@ -0,0 +1,108 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". + +# You can extend this class by creating a "GraphLocationExt" class in "graph_location_ext.py". + +from __future__ import annotations + +from typing import Any, Sequence, Union + +import pyarrow as pa +from attrs import define, field + +from .. import datatypes +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphLocation", "GraphLocationArrayLike", "GraphLocationBatch", "GraphLocationLike", "GraphLocationType"] + + +def _graph_location__entity_path__special_field_converter_override(x: datatypes.EntityPathLike) -> datatypes.EntityPath: + if isinstance(x, datatypes.EntityPath): + return x + else: + return datatypes.EntityPath(x) + + +def _graph_location__node_id__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: + if isinstance(x, datatypes.GraphNodeId): + return x + else: + return datatypes.GraphNodeId(x) + + +@define(init=False) +class GraphLocation: + """ + **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. + + We require this because the same node id can be used in multiple entities. + """ + + def __init__(self: Any, entity_path: datatypes.EntityPathLike, node_id: datatypes.GraphNodeIdLike): + """ + Create a new instance of the GraphLocation datatype. + + Parameters + ---------- + entity_path: + The entity path that specifies where to find the node. + node_id: + The id of the node. + + """ + + # You can define your own __init__ function as a member of GraphLocationExt in graph_location_ext.py + self.__attrs_init__(entity_path=entity_path, node_id=node_id) + + entity_path: datatypes.EntityPath = field(converter=_graph_location__entity_path__special_field_converter_override) + # The entity path that specifies where to find the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + node_id: datatypes.GraphNodeId = field(converter=_graph_location__node_id__special_field_converter_override) + # The id of the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + +GraphLocationLike = GraphLocation +GraphLocationArrayLike = Union[ + GraphLocation, + Sequence[GraphLocationLike], +] + + +class GraphLocationType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphLocation" + + def __init__(self) -> None: + pa.ExtensionType.__init__( + self, + pa.struct([ + pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), + pa.field("node_id", pa.utf8(), nullable=False, metadata={}), + ]), + self._TYPE_NAME, + ) + + +class GraphLocationBatch(BaseBatch[GraphLocationArrayLike]): + _ARROW_TYPE = GraphLocationType() + + @staticmethod + def _native_to_pa_array(data: GraphLocationArrayLike, data_type: pa.DataType) -> pa.Array: + from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch + + if isinstance(data, GraphLocation): + data = [data] + + return pa.StructArray.from_arrays( + [ + EntityPathBatch([x.entity_path for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeIdBatch([x.node_id for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + ], + fields=list(data_type), + ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py similarity index 50% rename from rerun_py/rerun_sdk/rerun/datatypes/graph_node.py rename to rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py index ab9124a67206..68af8f033bbe 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py @@ -1,14 +1,12 @@ # DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". -# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". +# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". from __future__ import annotations from typing import TYPE_CHECKING, Any, Sequence, Union -import numpy as np -import numpy.typing as npt import pyarrow as pa from attrs import define, field @@ -17,17 +15,17 @@ BaseExtensionType, ) -__all__ = ["GraphNode", "GraphNodeArrayLike", "GraphNodeBatch", "GraphNodeLike", "GraphNodeType"] +__all__ = ["GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", "GraphNodeIdLike", "GraphNodeIdType"] @define(init=False) -class GraphNode: - """**Datatype**: A string ID representing a node in a graph.""" +class GraphNodeId: + """**Datatype**: A 32-bit ID representing a node in a graph.""" - def __init__(self: Any, id: GraphNodeLike): - """Create a new instance of the GraphNode datatype.""" + def __init__(self: Any, id: GraphNodeIdLike): + """Create a new instance of the GraphNodeId datatype.""" - # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py + # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py self.__attrs_init__(id=id) id: str = field(converter=str) @@ -40,31 +38,29 @@ def __hash__(self) -> int: if TYPE_CHECKING: - GraphNodeLike = Union[GraphNode, str] + GraphNodeIdLike = Union[GraphNodeId, str] else: - GraphNodeLike = Any + GraphNodeIdLike = Any -GraphNodeArrayLike = Union[GraphNode, Sequence[GraphNodeLike], Sequence[str]] +GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], Sequence[str]] -class GraphNodeType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphNode" +class GraphNodeIdType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphNodeId" def __init__(self) -> None: pa.ExtensionType.__init__(self, pa.utf8(), self._TYPE_NAME) -class GraphNodeBatch(BaseBatch[GraphNodeArrayLike]): - _ARROW_TYPE = GraphNodeType() +class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): + _ARROW_TYPE = GraphNodeIdType() @staticmethod - def _native_to_pa_array(data: GraphNodeArrayLike, data_type: pa.DataType) -> pa.Array: + def _native_to_pa_array(data: GraphNodeIdArrayLike, data_type: pa.DataType) -> pa.Array: if isinstance(data, str): - array: Union[list[str], npt.ArrayLike] = [data] + array = [data] elif isinstance(data, Sequence): array = [str(datum) for datum in data] - elif isinstance(data, np.ndarray): - array = data else: array = [str(data)] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py deleted file mode 100644 index 4f59e2cd3996..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py +++ /dev/null @@ -1,74 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". - -from __future__ import annotations - -from typing import Literal, Sequence, Union - -import pyarrow as pa - -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphType", "GraphTypeArrayLike", "GraphTypeBatch", "GraphTypeLike", "GraphTypeType"] - - -from enum import Enum - - -class GraphType(Enum): - """**Datatype**: Specifies if a graph has directed or undirected edges.""" - - Undirected = 1 - """The graph has undirected edges.""" - - Directed = 2 - """The graph has directed edges.""" - - @classmethod - def auto(cls, val: str | int | GraphType) -> GraphType: - """Best-effort converter, including a case-insensitive string matcher.""" - if isinstance(val, GraphType): - return val - if isinstance(val, int): - return cls(val) - try: - return cls[val] - except KeyError: - val_lower = val.lower() - for variant in cls: - if variant.name.lower() == val_lower: - return variant - raise ValueError(f"Cannot convert {val} to {cls.__name__}") - - def __str__(self) -> str: - """Returns the variant name.""" - return self.name - - -GraphTypeLike = Union[GraphType, Literal["Directed", "Undirected", "directed", "undirected"], int] -GraphTypeArrayLike = Union[GraphTypeLike, Sequence[GraphTypeLike]] - - -class GraphTypeType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphType" - - def __init__(self) -> None: - pa.ExtensionType.__init__(self, pa.uint8(), self._TYPE_NAME) - - -class GraphTypeBatch(BaseBatch[GraphTypeArrayLike]): - _ARROW_TYPE = GraphTypeType() - - @staticmethod - def _native_to_pa_array(data: GraphTypeArrayLike, data_type: pa.DataType) -> pa.Array: - if isinstance(data, (GraphType, int, str)): - data = [data] - - pa_data = [GraphType.auto(v).value if v is not None else None for v in data] # type: ignore[redundant-expr] - - return pa.array(pa_data, type=data_type) From a40390cba5f5d62daac2381f41440d318dceea30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 09:28:07 +0200 Subject: [PATCH 096/159] WIP: implement new data model --- .../re_types/definitions/rerun/archetypes.fbs | 3 +- .../rerun/archetypes/graph_edges.fbs | 24 ++ .../rerun/archetypes/graph_edges_directed.fbs | 32 -- .../archetypes/graph_edges_undirected.fbs | 32 -- .../rerun/archetypes/graph_nodes.fbs | 23 +- .../re_types/definitions/rerun/components.fbs | 6 +- ...graph_edge_directed.fbs => graph_edge.fbs} | 4 +- .../components/graph_edge_undirected.fbs | 13 - .../{graph_node_id.fbs => graph_node.fbs} | 6 +- .../rerun/components/graph_type.fbs | 11 + .../re_types/definitions/rerun/datatypes.fbs | 4 +- .../rerun/datatypes/graph_edge.fbs | 8 +- .../rerun/datatypes/graph_location.fbs | 19 - .../{graph_node_id.fbs => graph_node.fbs} | 4 +- .../rerun/datatypes/graph_type.fbs | 19 + .../re_types/src/archetypes/.gitattributes | 3 +- .../re_types/src/archetypes/graph_edges.rs | 192 ++++++++++ .../src/archetypes/graph_edges_directed.rs | 303 ---------------- .../src/archetypes/graph_edges_undirected.rs | 303 ---------------- .../re_types/src/archetypes/graph_nodes.rs | 147 ++------ crates/store/re_types/src/archetypes/mod.rs | 6 +- .../re_types/src/components/.gitattributes | 6 +- .../{graph_edge_directed.rs => graph_edge.rs} | 22 +- .../{graph_node_id.rs => graph_node.rs} | 38 +- ...graph_edge_undirected.rs => graph_type.rs} | 49 ++- crates/store/re_types/src/components/mod.rs | 12 +- .../re_types/src/datatypes/.gitattributes | 4 +- .../re_types/src/datatypes/graph_edge.rs | 148 +++++++- .../re_types/src/datatypes/graph_edge_ext.rs | 20 +- .../re_types/src/datatypes/graph_location.rs | 341 ------------------ .../src/datatypes/graph_location_ext.rs | 16 - .../{graph_node_id.rs => graph_node.rs} | 28 +- ...graph_node_id_ext.rs => graph_node_ext.rs} | 8 +- .../re_types/src/datatypes/graph_type.rs | 153 ++++++++ crates/store/re_types/src/datatypes/mod.rs | 11 +- .../viewer/re_space_view_graph/src/error.rs | 2 +- .../re_space_view_graph/src/graph/hash.rs | 14 +- .../re_space_view_graph/src/graph/index.rs | 23 +- .../re_space_view_graph/src/graph/mod.rs | 70 ++-- .../viewer/re_space_view_graph/src/types.rs | 41 ++- .../re_space_view_graph/src/ui/state.rs | 4 +- crates/viewer/re_space_view_graph/src/view.rs | 79 ++-- .../{edges_directed.rs => edges.rs} | 62 ++-- .../src/visualizers/edges_undirected.rs | 105 ------ .../src/visualizers/mod.rs | 8 +- .../src/visualizers/nodes.rs | 38 +- crates/viewer/re_viewer/src/reflection/mod.rs | 83 +---- docs/content/reference/types/archetypes.md | 3 +- .../reference/types/archetypes/.gitattributes | 3 +- .../reference/types/archetypes/graph_edges.md | 24 ++ .../types/archetypes/graph_edges_directed.md | 24 -- .../archetypes/graph_edges_undirected.md | 24 -- .../reference/types/archetypes/graph_nodes.md | 6 +- docs/content/reference/types/components.md | 6 +- .../reference/types/components/.gitattributes | 6 +- .../reference/types/components/class_id.md | 3 - .../reference/types/components/color.md | 2 - .../reference/types/components/graph_edge.md | 20 + .../types/components/graph_edge_directed.md | 20 - .../types/components/graph_edge_undirected.md | 20 - .../reference/types/components/graph_node.md | 20 + .../types/components/graph_node_id.md | 20 - .../reference/types/components/graph_type.md | 20 + .../reference/types/components/show_labels.md | 3 - .../reference/types/components/text.md | 2 - docs/content/reference/types/datatypes.md | 6 +- .../reference/types/datatypes/.gitattributes | 4 +- .../reference/types/datatypes/entity_path.md | 11 +- .../reference/types/datatypes/graph_edge.md | 9 +- .../types/datatypes/graph_location.md | 23 -- .../reference/types/datatypes/graph_node.md | 21 ++ .../types/datatypes/graph_node_id.md | 21 -- .../reference/types/datatypes/graph_type.md | 21 ++ rerun_cpp/src/rerun/archetypes.hpp | 3 +- rerun_cpp/src/rerun/archetypes/.gitattributes | 6 +- .../src/rerun/archetypes/graph_edges.cpp | 38 ++ .../src/rerun/archetypes/graph_edges.hpp | 66 ++++ .../rerun/archetypes/graph_edges_directed.cpp | 53 --- .../rerun/archetypes/graph_edges_directed.hpp | 102 ------ .../archetypes/graph_edges_undirected.cpp | 53 --- .../archetypes/graph_edges_undirected.hpp | 102 ------ .../src/rerun/archetypes/graph_nodes.cpp | 20 +- .../src/rerun/archetypes/graph_nodes.hpp | 48 +-- rerun_cpp/src/rerun/components.hpp | 6 +- rerun_cpp/src/rerun/components/.gitattributes | 6 +- ...graph_edge_directed.hpp => graph_edge.hpp} | 22 +- .../components/graph_edge_undirected.hpp | 67 ---- .../{graph_node_id.hpp => graph_node.hpp} | 40 +- rerun_cpp/src/rerun/components/graph_type.hpp | 66 ++++ rerun_cpp/src/rerun/datatypes.hpp | 4 +- rerun_cpp/src/rerun/datatypes/.gitattributes | 8 +- rerun_cpp/src/rerun/datatypes/graph_edge.cpp | 42 +-- rerun_cpp/src/rerun/datatypes/graph_edge.hpp | 8 +- .../src/rerun/datatypes/graph_location.cpp | 90 ----- .../{graph_node_id.cpp => graph_node.cpp} | 16 +- .../{graph_node_id.hpp => graph_node.hpp} | 23 +- rerun_cpp/src/rerun/datatypes/graph_type.cpp | 56 +++ .../{graph_location.hpp => graph_type.hpp} | 42 +-- .../rerun_sdk/rerun/archetypes/.gitattributes | 3 +- .../rerun_sdk/rerun/archetypes/__init__.py | 6 +- .../rerun_sdk/rerun/archetypes/graph_edges.py | 82 +++++ .../rerun/archetypes/graph_edges_directed.py | 124 ------- .../archetypes/graph_edges_undirected.py | 124 ------- .../rerun_sdk/rerun/archetypes/graph_nodes.py | 61 +--- .../rerun_sdk/rerun/components/.gitattributes | 6 +- .../rerun_sdk/rerun/components/__init__.py | 24 +- .../rerun_sdk/rerun/components/graph_edge.py | 36 ++ .../rerun/components/graph_edge_directed.py | 36 -- .../rerun/components/graph_edge_undirected.py | 36 -- .../rerun_sdk/rerun/components/graph_node.py | 36 ++ .../rerun/components/graph_node_id.py | 36 -- .../rerun_sdk/rerun/components/graph_type.py | 36 ++ .../rerun_sdk/rerun/datatypes/.gitattributes | 4 +- .../rerun_sdk/rerun/datatypes/__init__.py | 30 +- .../rerun_sdk/rerun/datatypes/graph_edge.py | 48 ++- .../rerun/datatypes/graph_location.py | 108 ------ .../{graph_node_id.py => graph_node.py} | 38 +- .../rerun_sdk/rerun/datatypes/graph_type.py | 74 ++++ 118 files changed, 1708 insertions(+), 3116 deletions(-) create mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs delete mode 100644 crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs rename crates/store/re_types/definitions/rerun/components/{graph_edge_directed.fbs => graph_edge.fbs} (79%) delete mode 100644 crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs rename crates/store/re_types/definitions/rerun/components/{graph_node_id.fbs => graph_node.fbs} (74%) create mode 100644 crates/store/re_types/definitions/rerun/components/graph_type.fbs delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs rename crates/store/re_types/definitions/rerun/datatypes/{graph_node_id.fbs => graph_node.fbs} (85%) create mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs create mode 100644 crates/store/re_types/src/archetypes/graph_edges.rs delete mode 100644 crates/store/re_types/src/archetypes/graph_edges_directed.rs delete mode 100644 crates/store/re_types/src/archetypes/graph_edges_undirected.rs rename crates/store/re_types/src/components/{graph_edge_directed.rs => graph_edge.rs} (84%) rename crates/store/re_types/src/components/{graph_node_id.rs => graph_node.rs} (67%) rename crates/store/re_types/src/components/{graph_edge_undirected.rs => graph_type.rs} (61%) delete mode 100644 crates/store/re_types/src/datatypes/graph_location.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_location_ext.rs rename crates/store/re_types/src/datatypes/{graph_node_id.rs => graph_node.rs} (88%) rename crates/store/re_types/src/datatypes/{graph_node_id_ext.rs => graph_node_ext.rs} (59%) create mode 100644 crates/store/re_types/src/datatypes/graph_type.rs rename crates/viewer/re_space_view_graph/src/visualizers/{edges_directed.rs => edges.rs} (61%) delete mode 100644 crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs create mode 100644 docs/content/reference/types/archetypes/graph_edges.md delete mode 100644 docs/content/reference/types/archetypes/graph_edges_directed.md delete mode 100644 docs/content/reference/types/archetypes/graph_edges_undirected.md create mode 100644 docs/content/reference/types/components/graph_edge.md delete mode 100644 docs/content/reference/types/components/graph_edge_directed.md delete mode 100644 docs/content/reference/types/components/graph_edge_undirected.md create mode 100644 docs/content/reference/types/components/graph_node.md delete mode 100644 docs/content/reference/types/components/graph_node_id.md create mode 100644 docs/content/reference/types/components/graph_type.md delete mode 100644 docs/content/reference/types/datatypes/graph_location.md create mode 100644 docs/content/reference/types/datatypes/graph_node.md delete mode 100644 docs/content/reference/types/datatypes/graph_node_id.md create mode 100644 docs/content/reference/types/datatypes/graph_type.md create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.hpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp delete mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp rename rerun_cpp/src/rerun/components/{graph_edge_directed.hpp => graph_edge.hpp} (76%) delete mode 100644 rerun_cpp/src/rerun/components/graph_edge_undirected.hpp rename rerun_cpp/src/rerun/components/{graph_node_id.hpp => graph_node.hpp} (55%) create mode 100644 rerun_cpp/src/rerun/components/graph_type.hpp delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_location.cpp rename rerun_cpp/src/rerun/datatypes/{graph_node_id.cpp => graph_node.cpp} (82%) rename rerun_cpp/src/rerun/datatypes/{graph_node_id.hpp => graph_node.hpp} (68%) create mode 100644 rerun_cpp/src/rerun/datatypes/graph_type.cpp rename rerun_cpp/src/rerun/datatypes/{graph_location.hpp => graph_type.hpp} (50%) create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py delete mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node.py delete mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_type.py delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_location.py rename rerun_py/rerun_sdk/rerun/datatypes/{graph_node_id.py => graph_node.py} (50%) create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_type.py diff --git a/crates/store/re_types/definitions/rerun/archetypes.fbs b/crates/store/re_types/definitions/rerun/archetypes.fbs index fab88b42ca62..bda48b2bb794 100644 --- a/crates/store/re_types/definitions/rerun/archetypes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes.fbs @@ -13,8 +13,7 @@ include "./archetypes/depth_image.fbs"; include "./archetypes/disconnected_space.fbs"; include "./archetypes/ellipsoids3d.fbs"; include "./archetypes/encoded_image.fbs"; -include "./archetypes/graph_edges_directed.fbs"; -include "./archetypes/graph_edges_undirected.fbs"; +include "./archetypes/graph_edges.fbs"; include "./archetypes/graph_nodes.fbs"; include "./archetypes/image.fbs"; include "./archetypes/instance_poses3d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs new file mode 100644 index 000000000000..aa44cd76be31 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -0,0 +1,24 @@ +namespace rerun.archetypes; + +// --- + +/// A list of edges in a graph. +/// +/// By default, edges are undirected. +table GraphEdges ( + "attr.rust.derive": "PartialEq, Eq", + "attr.docs.category": "Graph", + "attr.docs.view_types": "Graph View" +) { + // --- Required --- + + /// A list of node IDs. + edges: [rerun.components.GraphEdge] ("attr.rerun.component_required", order: 1000); + + + // --- Recommended --- + + /// Specifies if the graph is directed or undirected. + graph_type: [rerun.components.GraphType] ("attr.rerun.component_recommended", nullable, order: 2000); + +} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs deleted file mode 100644 index 6ba7008d2a04..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs +++ /dev/null @@ -1,32 +0,0 @@ -namespace rerun.archetypes; - -// --- - -/// A list of directed edges in a graph with optional labels, colors, etc. -table GraphEdgesDirected ( - "attr.rust.derive": "PartialEq, Eq", - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of node IDs. - edges: [rerun.components.GraphEdgeDirected] ("attr.rerun.component_required", order: 1000); - - - // --- Optional --- - - /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); - - /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); -} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs deleted file mode 100644 index aa859ba27e15..000000000000 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs +++ /dev/null @@ -1,32 +0,0 @@ -namespace rerun.archetypes; - -// --- - -/// A list of undirected edges in a graph with optional labels, colors, etc. -table GraphEdgesUndirected ( - "attr.rust.derive": "PartialEq, Eq", - "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" -) { - // --- Required --- - - /// A list of node IDs. - edges: [rerun.components.GraphEdgeUndirected] ("attr.rerun.component_required", order: 1000); - - - // --- Optional --- - - /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3000); - - /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); -} diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs index d6f82df6b1ec..9aabe3112668 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -11,26 +11,19 @@ table GraphNodes ( // --- Required --- /// A list of node IDs. - node_ids: [rerun.components.GraphNodeId] ("attr.rerun.component_required", order: 1000); - - // --- Recommended --- - - /// Optional text labels for the node. - labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 2000); + node_ids: [rerun.components.GraphNode] ("attr.rerun.component_required", order: 1000); // --- Optional --- + /// Optional center positions of the nodes. + positions: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); + /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 2100); + colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 3100); - /// Optional center positions of the nodes. - centers: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); + /// Optional text labels for the node. + labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3200); /// Optional choice of whether the text labels should be shown by default. - show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3050); - - /// Optional [components.ClassId]s for the boxes. - /// - /// The [components.ClassId] provides colors and labels if not specified explicitly. - class_ids: [rerun.components.ClassId] ("attr.rerun.component_optional", nullable, order: 3200); + show_labels: rerun.components.ShowLabels ("attr.rerun.component_optional", nullable, order: 3250); } diff --git a/crates/store/re_types/definitions/rerun/components.fbs b/crates/store/re_types/definitions/rerun/components.fbs index 6a5d335c3f25..0a3aebf0603c 100644 --- a/crates/store/re_types/definitions/rerun/components.fbs +++ b/crates/store/re_types/definitions/rerun/components.fbs @@ -16,9 +16,9 @@ include "./components/entity_path.fbs"; include "./components/fill_mode.fbs"; include "./components/fill_ratio.fbs"; include "./components/gamma_correction.fbs"; -include "./components/graph_edge_directed.fbs"; -include "./components/graph_edge_undirected.fbs"; -include "./components/graph_node_id.fbs"; +include "./components/graph_edge.fbs"; +include "./components/graph_node.fbs"; +include "./components/graph_type.fbs"; include "./components/half_size2d.fbs"; include "./components/half_size3d.fbs"; include "./components/image_buffer.fbs"; diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs similarity index 79% rename from crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs rename to crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 4c406561fbd1..e1d671eeac6e 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -2,8 +2,8 @@ namespace rerun.components; // --- -/// A directed edge in a graph connecting two nodes. -table GraphEdgeDirected ( +/// An edge in a graph connecting two nodes. +table GraphEdge ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs deleted file mode 100644 index 6788b8ac6061..000000000000 --- a/crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs +++ /dev/null @@ -1,13 +0,0 @@ -namespace rerun.components; - -// --- - -/// An undirected edge in a graph connecting two nodes. -table GraphEdgeUndirected ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.repr": "transparent", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - edge: rerun.datatypes.GraphEdge (order: 100); -} diff --git a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/components/graph_node.fbs similarity index 74% rename from crates/store/re_types/definitions/rerun/components/graph_node_id.fbs rename to crates/store/re_types/definitions/rerun/components/graph_node.fbs index 7080453f25c1..758b89de3200 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node.fbs @@ -2,8 +2,8 @@ namespace rerun.components; // --- -/// A 32-bit ID representing a node in a graph. -table GraphNodeId ( +/// A string-based ID representing a node in a graph. +table GraphNode ( "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", @@ -11,5 +11,5 @@ table GraphNodeId ( "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - id: rerun.datatypes.GraphNodeId (order: 100); + id: rerun.datatypes.GraphNode (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs new file mode 100644 index 000000000000..08798ca8be4d --- /dev/null +++ b/crates/store/re_types/definitions/rerun/components/graph_type.fbs @@ -0,0 +1,11 @@ +namespace rerun.components; + +/// Specifies if a graph has directed or undirected edges. +struct GraphType ( + "attr.rust.derive": "Default, PartialEq, Eq", + "attr.rust.repr": "transparent", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + graph_type: rerun.datatypes.GraphType (order: 100); +} diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 8861f2830e64..8786552bc468 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -13,8 +13,8 @@ include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; include "./datatypes/graph_edge.fbs"; -include "./datatypes/graph_location.fbs"; -include "./datatypes/graph_node_id.fbs"; +include "./datatypes/graph_node.fbs"; +include "./datatypes/graph_type.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs index 170216ea1cde..5449d22ed508 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs @@ -1,16 +1,14 @@ -include "graph_location.fbs"; - namespace rerun.datatypes; -/// Represents an edge in a graph connecting two nodes (possibly in different entities). +/// An edge in a graph connecting two nodes. table GraphEdge ( "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { /// The id of the source node. - source: rerun.datatypes.GraphLocation (order: 100); + source: rerun.datatypes.GraphNode (order: 100); /// The id of the target node. - target: rerun.datatypes.GraphLocation (order: 200); + target: rerun.datatypes.GraphNode (order: 200); } diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs deleted file mode 100644 index fbe9a25da3ce..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs +++ /dev/null @@ -1,19 +0,0 @@ -include "entity_path.fbs"; -include "graph_node_id.fbs"; - -namespace rerun.datatypes; - -/// Uniquely identifies a node in a graph by its entity path and node id. -/// -/// We require this because the same node id can be used in multiple entities. -table GraphLocation ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - /// The entity path that specifies where to find the node. - entity_path: rerun.datatypes.EntityPath (order: 100); - - /// The id of the node. - node_id: rerun.datatypes.GraphNodeId (order: 200); -} diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs similarity index 85% rename from crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs rename to crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs index 17cd44af794c..baf4b2670566 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs @@ -1,7 +1,7 @@ namespace rerun.datatypes; -/// A 32-bit ID representing a node in a graph. -table GraphNodeId ( +/// A string-based ID representing a node in a graph. +table GraphNode ( "attr.arrow.transparent", "attr.python.aliases": "str", "attr.python.array_aliases": "Sequence[str]", diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs new file mode 100644 index 000000000000..c18487f97e82 --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs @@ -0,0 +1,19 @@ +namespace rerun.datatypes; + +// -- + +/// Specifies if a graph has directed or undirected edges. +enum GraphType: ubyte ( + "attr.rust.derive": "Default, PartialEq, Eq", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// Invalid value. Won't show up in generated types. + Invalid = 0, + + /// The graph has undirected edges. + Undirected (default), + + /// The graph has directed edges. + Directed, +} diff --git a/crates/store/re_types/src/archetypes/.gitattributes b/crates/store/re_types/src/archetypes/.gitattributes index 81c3d8f1adea..014d68c38829 100644 --- a/crates/store/re_types/src/archetypes/.gitattributes +++ b/crates/store/re_types/src/archetypes/.gitattributes @@ -13,8 +13,7 @@ depth_image.rs linguist-generated=true disconnected_space.rs linguist-generated=true ellipsoids3d.rs linguist-generated=true encoded_image.rs linguist-generated=true -graph_edges_directed.rs linguist-generated=true -graph_edges_undirected.rs linguist-generated=true +graph_edges.rs linguist-generated=true graph_nodes.rs linguist-generated=true image.rs linguist-generated=true instance_poses3d.rs linguist-generated=true diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs new file mode 100644 index 000000000000..42ca163cb12a --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -0,0 +1,192 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Archetype**: A list of edges in a graph. +/// +/// By default, edges are undirected. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct GraphEdges { + /// A list of node IDs. + pub edges: Vec, + + /// Specifies if the graph is directed or undirected. + pub graph_type: Option>, +} + +impl ::re_types_core::SizeBytes for GraphEdges { + #[inline] + fn heap_size_bytes(&self) -> u64 { + self.edges.heap_size_bytes() + self.graph_type.heap_size_bytes() + } + + #[inline] + fn is_pod() -> bool { + >::is_pod() + && >>::is_pod() + } +} + +static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdge".into()]); + +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphType".into(), + "rerun.components.GraphEdgesIndicator".into(), + ] + }); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 0usize]> = + once_cell::sync::Lazy::new(|| []); + +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.GraphEdge".into(), + "rerun.components.GraphType".into(), + "rerun.components.GraphEdgesIndicator".into(), + ] + }); + +impl GraphEdges { + /// The total number of components in the archetype: 1 required, 2 recommended, 0 optional + pub const NUM_COMPONENTS: usize = 3usize; +} + +/// Indicator component for the [`GraphEdges`] [`::re_types_core::Archetype`] +pub type GraphEdgesIndicator = ::re_types_core::GenericIndicatorComponent; + +impl ::re_types_core::Archetype for GraphEdges { + type Indicator = GraphEdgesIndicator; + + #[inline] + fn name() -> ::re_types_core::ArchetypeName { + "rerun.archetypes.GraphEdges".into() + } + + #[inline] + fn display_name() -> &'static str { + "Graph edges" + } + + #[inline] + fn indicator() -> MaybeOwnedComponentBatch<'static> { + static INDICATOR: GraphEdgesIndicator = GraphEdgesIndicator::DEFAULT; + MaybeOwnedComponentBatch::Ref(&INDICATOR) + } + + #[inline] + fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + REQUIRED_COMPONENTS.as_slice().into() + } + + #[inline] + fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + RECOMMENDED_COMPONENTS.as_slice().into() + } + + #[inline] + fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + OPTIONAL_COMPONENTS.as_slice().into() + } + + #[inline] + fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { + ALL_COMPONENTS.as_slice().into() + } + + #[inline] + fn from_arrow_components( + arrow_data: impl IntoIterator)>, + ) -> DeserializationResult { + re_tracing::profile_function!(); + use ::re_types_core::{Loggable as _, ResultExt as _}; + let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data + .into_iter() + .map(|(name, array)| (name.full_name(), array)) + .collect(); + let edges = { + let array = arrays_by_name + .get("rerun.components.GraphEdge") + .ok_or_else(DeserializationError::missing_data) + .with_context("rerun.archetypes.GraphEdges#edges")?; + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#edges")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#edges")? + }; + let graph_type = if let Some(array) = arrays_by_name.get("rerun.components.GraphType") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#graph_type")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphEdges#graph_type")? + }) + } else { + None + }; + Ok(Self { edges, graph_type }) + } +} + +impl ::re_types_core::AsComponents for GraphEdges { + fn as_component_batches(&self) -> Vec> { + re_tracing::profile_function!(); + use ::re_types_core::Archetype as _; + [ + Some(Self::indicator()), + Some((&self.edges as &dyn ComponentBatch).into()), + self.graph_type + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + ] + .into_iter() + .flatten() + .collect() + } +} + +impl ::re_types_core::ArchetypeReflectionMarker for GraphEdges {} + +impl GraphEdges { + /// Create a new `GraphEdges`. + #[inline] + pub fn new(edges: impl IntoIterator>) -> Self { + Self { + edges: edges.into_iter().map(Into::into).collect(), + graph_type: None, + } + } + + /// Specifies if the graph is directed or undirected. + #[inline] + pub fn with_graph_type( + mut self, + graph_type: impl IntoIterator>, + ) -> Self { + self.graph_type = Some(graph_type.into_iter().map(Into::into).collect()); + self + } +} diff --git a/crates/store/re_types/src/archetypes/graph_edges_directed.rs b/crates/store/re_types/src/archetypes/graph_edges_directed.rs deleted file mode 100644 index cee936099e80..000000000000 --- a/crates/store/re_types/src/archetypes/graph_edges_directed.rs +++ /dev/null @@ -1,303 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GraphEdgesDirected { - /// A list of node IDs. - pub edges: Vec, - - /// Optional colors for the boxes. - pub colors: Option>, - - /// Optional text labels for the node. - pub labels: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, -} - -impl ::re_types_core::SizeBytes for GraphEdgesDirected { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.edges.heap_size_bytes() - + self.colors.heap_size_bytes() - + self.labels.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeDirected".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Color".into(), - "rerun.components.GraphEdgesDirectedIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphEdgeDirected".into(), - "rerun.components.Color".into(), - "rerun.components.GraphEdgesDirectedIndicator".into(), - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -impl GraphEdgesDirected { - /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 6usize; -} - -/// Indicator component for the [`GraphEdgesDirected`] [`::re_types_core::Archetype`] -pub type GraphEdgesDirectedIndicator = - ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for GraphEdgesDirected { - type Indicator = GraphEdgesDirectedIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphEdgesDirected".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph edges directed" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphEdgesDirectedIndicator = GraphEdgesDirectedIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let edges = { - let array = arrays_by_name - .get("rerun.components.GraphEdgeDirected") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphEdgesDirected#edges")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#edges")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#edges")? - }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#colors")? - }) - } else { - None - }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#labels")? - }) - } else { - None - }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesDirected#class_ids")? - }) - } else { - None - }; - Ok(Self { - edges, - colors, - labels, - show_labels, - class_ids, - }) - } -} - -impl ::re_types_core::AsComponents for GraphEdgesDirected { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.edges as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesDirected {} - -impl GraphEdgesDirected { - /// Create a new `GraphEdgesDirected`. - #[inline] - pub fn new( - edges: impl IntoIterator>, - ) -> Self { - Self { - edges: edges.into_iter().map(Into::into).collect(), - colors: None, - labels: None, - show_labels: None, - class_ids: None, - } - } - - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - #[inline] - pub fn with_class_ids( - mut self, - class_ids: impl IntoIterator>, - ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/graph_edges_undirected.rs b/crates/store/re_types/src/archetypes/graph_edges_undirected.rs deleted file mode 100644 index cac910e150ec..000000000000 --- a/crates/store/re_types/src/archetypes/graph_edges_undirected.rs +++ /dev/null @@ -1,303 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GraphEdgesUndirected { - /// A list of node IDs. - pub edges: Vec, - - /// Optional colors for the boxes. - pub colors: Option>, - - /// Optional text labels for the node. - pub labels: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, -} - -impl ::re_types_core::SizeBytes for GraphEdgesUndirected { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.edges.heap_size_bytes() - + self.colors.heap_size_bytes() - + self.labels.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - >::is_pod() - && >>::is_pod() - && >>::is_pod() - && >::is_pod() - && >>::is_pod() - } -} - -static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphEdgeUndirected".into()]); - -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Color".into(), - "rerun.components.GraphEdgesUndirectedIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.GraphEdgeUndirected".into(), - "rerun.components.Color".into(), - "rerun.components.GraphEdgesUndirectedIndicator".into(), - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); - -impl GraphEdgesUndirected { - /// The total number of components in the archetype: 1 required, 2 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 6usize; -} - -/// Indicator component for the [`GraphEdgesUndirected`] [`::re_types_core::Archetype`] -pub type GraphEdgesUndirectedIndicator = - ::re_types_core::GenericIndicatorComponent; - -impl ::re_types_core::Archetype for GraphEdgesUndirected { - type Indicator = GraphEdgesUndirectedIndicator; - - #[inline] - fn name() -> ::re_types_core::ArchetypeName { - "rerun.archetypes.GraphEdgesUndirected".into() - } - - #[inline] - fn display_name() -> &'static str { - "Graph edges undirected" - } - - #[inline] - fn indicator() -> MaybeOwnedComponentBatch<'static> { - static INDICATOR: GraphEdgesUndirectedIndicator = GraphEdgesUndirectedIndicator::DEFAULT; - MaybeOwnedComponentBatch::Ref(&INDICATOR) - } - - #[inline] - fn required_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - REQUIRED_COMPONENTS.as_slice().into() - } - - #[inline] - fn recommended_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - RECOMMENDED_COMPONENTS.as_slice().into() - } - - #[inline] - fn optional_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - OPTIONAL_COMPONENTS.as_slice().into() - } - - #[inline] - fn all_components() -> ::std::borrow::Cow<'static, [ComponentName]> { - ALL_COMPONENTS.as_slice().into() - } - - #[inline] - fn from_arrow_components( - arrow_data: impl IntoIterator)>, - ) -> DeserializationResult { - re_tracing::profile_function!(); - use ::re_types_core::{Loggable as _, ResultExt as _}; - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data - .into_iter() - .map(|(name, array)| (name.full_name(), array)) - .collect(); - let edges = { - let array = arrays_by_name - .get("rerun.components.GraphEdgeUndirected") - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")?; - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#edges")? - }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#colors")? - }) - } else { - None - }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#labels")? - }) - } else { - None - }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdgesUndirected#class_ids")? - }) - } else { - None - }; - Ok(Self { - edges, - colors, - labels, - show_labels, - class_ids, - }) - } -} - -impl ::re_types_core::AsComponents for GraphEdgesUndirected { - fn as_component_batches(&self) -> Vec> { - re_tracing::profile_function!(); - use ::re_types_core::Archetype as _; - [ - Some(Self::indicator()), - Some((&self.edges as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - ] - .into_iter() - .flatten() - .collect() - } -} - -impl ::re_types_core::ArchetypeReflectionMarker for GraphEdgesUndirected {} - -impl GraphEdgesUndirected { - /// Create a new `GraphEdgesUndirected`. - #[inline] - pub fn new( - edges: impl IntoIterator>, - ) -> Self { - Self { - edges: edges.into_iter().map(Into::into).collect(), - colors: None, - labels: None, - show_labels: None, - class_ids: None, - } - } - - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - #[inline] - pub fn with_class_ids( - mut self, - class_ids: impl IntoIterator>, - ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); - self - } -} diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs index 14620a3973c4..053bb8e681c6 100644 --- a/crates/store/re_types/src/archetypes/graph_nodes.rs +++ b/crates/store/re_types/src/archetypes/graph_nodes.rs @@ -22,24 +22,16 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, PartialEq)] pub struct GraphNodes { /// A list of node IDs. - pub node_ids: Vec, + pub node_ids: Vec, /// Optional text labels for the node. pub labels: Option>, - /// Optional colors for the boxes. - pub colors: Option>, - /// Optional center positions of the nodes. - pub centers: Option>, - - /// Optional choice of whether the text labels should be shown by default. - pub show_labels: Option, + pub positions: Option>, - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. - pub class_ids: Option>, + /// Optional colors for the boxes. + pub colors: Option>, } impl ::re_types_core::SizeBytes for GraphNodes { @@ -47,60 +39,48 @@ impl ::re_types_core::SizeBytes for GraphNodes { fn heap_size_bytes(&self) -> u64 { self.node_ids.heap_size_bytes() + self.labels.heap_size_bytes() + + self.positions.heap_size_bytes() + self.colors.heap_size_bytes() - + self.centers.heap_size_bytes() - + self.show_labels.heap_size_bytes() - + self.class_ids.heap_size_bytes() } #[inline] fn is_pod() -> bool { - >::is_pod() + >::is_pod() && >>::is_pod() - && >>::is_pod() && >>::is_pod() - && >::is_pod() - && >>::is_pod() + && >>::is_pod() } } static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.GraphNodeId".into()]); + once_cell::sync::Lazy::new(|| ["rerun.components.GraphNode".into()]); static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = once_cell::sync::Lazy::new(|| { [ - "rerun.components.Color".into(), "rerun.components.Position2D".into(), + "rerun.components.Color".into(), "rerun.components.GraphNodesIndicator".into(), ] }); -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = - once_cell::sync::Lazy::new(|| { - [ - "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), - ] - }); +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.Text".into()]); -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 7usize]> = +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 5usize]> = once_cell::sync::Lazy::new(|| { [ - "rerun.components.GraphNodeId".into(), - "rerun.components.Color".into(), + "rerun.components.GraphNode".into(), "rerun.components.Position2D".into(), + "rerun.components.Color".into(), "rerun.components.GraphNodesIndicator".into(), "rerun.components.Text".into(), - "rerun.components.ShowLabels".into(), - "rerun.components.ClassId".into(), ] }); impl GraphNodes { - /// The total number of components in the archetype: 1 required, 3 recommended, 3 optional - pub const NUM_COMPONENTS: usize = 7usize; + /// The total number of components in the archetype: 1 required, 3 recommended, 1 optional + pub const NUM_COMPONENTS: usize = 5usize; } /// Indicator component for the [`GraphNodes`] [`::re_types_core::Archetype`] @@ -157,10 +137,10 @@ impl ::re_types_core::Archetype for GraphNodes { .collect(); let node_ids = { let array = arrays_by_name - .get("rerun.components.GraphNodeId") + .get("rerun.components.GraphNode") .ok_or_else(DeserializationError::missing_data) .with_context("rerun.archetypes.GraphNodes#node_ids")?; - ::from_arrow_opt(&**array) + ::from_arrow_opt(&**array) .with_context("rerun.archetypes.GraphNodes#node_ids")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) @@ -179,47 +159,26 @@ impl ::re_types_core::Archetype for GraphNodes { } else { None }; - let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#colors")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#colors")? - }) - } else { - None - }; - let centers = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { + let positions = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { Some({ ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#centers")? + .with_context("rerun.archetypes.GraphNodes#positions")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphNodes#centers")? + .with_context("rerun.archetypes.GraphNodes#positions")? }) } else { None }; - let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#show_labels")? - .into_iter() - .next() - .flatten() - } else { - None - }; - let class_ids = if let Some(array) = arrays_by_name.get("rerun.components.ClassId") { + let colors = if let Some(array) = arrays_by_name.get("rerun.components.Color") { Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#class_ids")? + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#colors")? .into_iter() .map(|v| v.ok_or_else(DeserializationError::missing_data)) .collect::>>() - .with_context("rerun.archetypes.GraphNodes#class_ids")? + .with_context("rerun.archetypes.GraphNodes#colors")? }) } else { None @@ -227,10 +186,8 @@ impl ::re_types_core::Archetype for GraphNodes { Ok(Self { node_ids, labels, + positions, colors, - centers, - show_labels, - class_ids, }) } } @@ -245,16 +202,10 @@ impl ::re_types_core::AsComponents for GraphNodes { self.labels .as_ref() .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.colors - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.centers + self.positions .as_ref() .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), - self.show_labels - .as_ref() - .map(|comp| (comp as &dyn ComponentBatch).into()), - self.class_ids + self.colors .as_ref() .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), ] @@ -270,15 +221,13 @@ impl GraphNodes { /// Create a new `GraphNodes`. #[inline] pub fn new( - node_ids: impl IntoIterator>, + node_ids: impl IntoIterator>, ) -> Self { Self { node_ids: node_ids.into_iter().map(Into::into).collect(), labels: None, + positions: None, colors: None, - centers: None, - show_labels: None, - class_ids: None, } } @@ -292,45 +241,23 @@ impl GraphNodes { self } - /// Optional colors for the boxes. - #[inline] - pub fn with_colors( - mut self, - colors: impl IntoIterator>, - ) -> Self { - self.colors = Some(colors.into_iter().map(Into::into).collect()); - self - } - /// Optional center positions of the nodes. #[inline] - pub fn with_centers( + pub fn with_positions( mut self, - centers: impl IntoIterator>, + positions: impl IntoIterator>, ) -> Self { - self.centers = Some(centers.into_iter().map(Into::into).collect()); + self.positions = Some(positions.into_iter().map(Into::into).collect()); self } - /// Optional choice of whether the text labels should be shown by default. - #[inline] - pub fn with_show_labels( - mut self, - show_labels: impl Into, - ) -> Self { - self.show_labels = Some(show_labels.into()); - self - } - - /// Optional [`components::ClassId`][crate::components::ClassId]s for the boxes. - /// - /// The [`components::ClassId`][crate::components::ClassId] provides colors and labels if not specified explicitly. + /// Optional colors for the boxes. #[inline] - pub fn with_class_ids( + pub fn with_colors( mut self, - class_ids: impl IntoIterator>, + colors: impl IntoIterator>, ) -> Self { - self.class_ids = Some(class_ids.into_iter().map(Into::into).collect()); + self.colors = Some(colors.into_iter().map(Into::into).collect()); self } } diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 57e15f07ff54..34f38386f8e2 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -21,8 +21,7 @@ mod ellipsoids3d; mod ellipsoids3d_ext; mod encoded_image; mod encoded_image_ext; -mod graph_edges_directed; -mod graph_edges_undirected; +mod graph_edges; mod graph_nodes; mod image; mod image_ext; @@ -64,8 +63,7 @@ pub use self::depth_image::DepthImage; pub use self::disconnected_space::DisconnectedSpace; pub use self::ellipsoids3d::Ellipsoids3D; pub use self::encoded_image::EncodedImage; -pub use self::graph_edges_directed::GraphEdgesDirected; -pub use self::graph_edges_undirected::GraphEdgesUndirected; +pub use self::graph_edges::GraphEdges; pub use self::graph_nodes::GraphNodes; pub use self::image::Image; pub use self::instance_poses3d::InstancePoses3D; diff --git a/crates/store/re_types/src/components/.gitattributes b/crates/store/re_types/src/components/.gitattributes index bccd38dfe671..5c1d3e6ff0dc 100644 --- a/crates/store/re_types/src/components/.gitattributes +++ b/crates/store/re_types/src/components/.gitattributes @@ -16,9 +16,9 @@ entity_path.rs linguist-generated=true fill_mode.rs linguist-generated=true fill_ratio.rs linguist-generated=true gamma_correction.rs linguist-generated=true -graph_edge_directed.rs linguist-generated=true -graph_edge_undirected.rs linguist-generated=true -graph_node_id.rs linguist-generated=true +graph_edge.rs linguist-generated=true +graph_node.rs linguist-generated=true +graph_type.rs linguist-generated=true half_size2d.rs linguist-generated=true half_size3d.rs linguist-generated=true image_buffer.rs linguist-generated=true diff --git a/crates/store/re_types/src/components/graph_edge_directed.rs b/crates/store/re_types/src/components/graph_edge.rs similarity index 84% rename from crates/store/re_types/src/components/graph_edge_directed.rs rename to crates/store/re_types/src/components/graph_edge.rs index 32590c811970..4fdc295e2d53 100644 --- a/crates/store/re_types/src/components/graph_edge_directed.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Component**: An undirected edge in a graph connecting two nodes. +/// **Component**: An edge in a graph connecting two nodes. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdgeDirected(pub crate::datatypes::GraphEdge); +pub struct GraphEdge(pub crate::datatypes::GraphEdge); -impl ::re_types_core::SizeBytes for GraphEdgeDirected { +impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,20 +36,20 @@ impl ::re_types_core::SizeBytes for GraphEdgeDirected { } } -impl> From for GraphEdgeDirected { +impl> From for GraphEdge { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdgeDirected { +impl std::borrow::Borrow for GraphEdge { #[inline] fn borrow(&self) -> &crate::datatypes::GraphEdge { &self.0 } } -impl std::ops::Deref for GraphEdgeDirected { +impl std::ops::Deref for GraphEdge { type Target = crate::datatypes::GraphEdge; #[inline] @@ -58,21 +58,21 @@ impl std::ops::Deref for GraphEdgeDirected { } } -impl std::ops::DerefMut for GraphEdgeDirected { +impl std::ops::DerefMut for GraphEdge { #[inline] fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdgeDirected); +::re_types_core::macros::impl_into_cow!(GraphEdge); -impl ::re_types_core::Loggable for GraphEdgeDirected { +impl ::re_types_core::Loggable for GraphEdge { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdgeDirected".into() + "rerun.components.GraphEdge".into() } #[inline] diff --git a/crates/store/re_types/src/components/graph_node_id.rs b/crates/store/re_types/src/components/graph_node.rs similarity index 67% rename from crates/store/re_types/src/components/graph_node_id.rs rename to crates/store/re_types/src/components/graph_node.rs index 9f4a51bf95c5..24cbf370bb47 100644 --- a/crates/store/re_types/src/components/graph_node_id.rs +++ b/crates/store/re_types/src/components/graph_node.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Component**: A 32-bit ID representing a node in a graph. +/// **Component**: A string-based ID representing a node in a graph. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNodeId(pub crate::datatypes::GraphNodeId); +pub struct GraphNode(pub crate::datatypes::GraphNode); -impl ::re_types_core::SizeBytes for GraphNodeId { +impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphNodeId { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphNodeId { +impl> From for GraphNode { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphNodeId { +impl std::borrow::Borrow for GraphNode { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphNodeId { + fn borrow(&self) -> &crate::datatypes::GraphNode { &self.0 } } -impl std::ops::Deref for GraphNodeId { - type Target = crate::datatypes::GraphNodeId; +impl std::ops::Deref for GraphNode { + type Target = crate::datatypes::GraphNode; #[inline] - fn deref(&self) -> &crate::datatypes::GraphNodeId { + fn deref(&self) -> &crate::datatypes::GraphNode { &self.0 } } -impl std::ops::DerefMut for GraphNodeId { +impl std::ops::DerefMut for GraphNode { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNodeId { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNode { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphNodeId); +::re_types_core::macros::impl_into_cow!(GraphNode); -impl ::re_types_core::Loggable for GraphNodeId { +impl ::re_types_core::Loggable for GraphNode { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphNodeId".into() + "rerun.components.GraphNode".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphNodeId::arrow_datatype() + crate::datatypes::GraphNode::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphNodeId { where Self: Clone + 'a, { - crate::datatypes::GraphNodeId::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphNode::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,7 @@ impl ::re_types_core::Loggable for GraphNodeId { where Self: Sized, { - crate::datatypes::GraphNodeId::from_arrow_opt(arrow_data) + crate::datatypes::GraphNode::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/graph_edge_undirected.rs b/crates/store/re_types/src/components/graph_type.rs similarity index 61% rename from crates/store/re_types/src/components/graph_edge_undirected.rs rename to crates/store/re_types/src/components/graph_type.rs index 4fed04ebf720..c15dbb31592c 100644 --- a/crates/store/re_types/src/components/graph_edge_undirected.rs +++ b/crates/store/re_types/src/components/graph_type.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Component**: An undirected edge in a graph connecting two nodes. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +/// **Component**: Specifies if a graph has directed or undirected edges. +#[derive(Clone, Debug, Default, PartialEq, Eq)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdgeUndirected(pub crate::datatypes::GraphEdge); +pub struct GraphType(pub crate::datatypes::GraphType); -impl ::re_types_core::SizeBytes for GraphEdgeUndirected { +impl ::re_types_core::SizeBytes for GraphType { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -32,52 +32,52 @@ impl ::re_types_core::SizeBytes for GraphEdgeUndirected { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphEdgeUndirected { +impl> From for GraphType { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdgeUndirected { +impl std::borrow::Borrow for GraphType { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphEdge { + fn borrow(&self) -> &crate::datatypes::GraphType { &self.0 } } -impl std::ops::Deref for GraphEdgeUndirected { - type Target = crate::datatypes::GraphEdge; +impl std::ops::Deref for GraphType { + type Target = crate::datatypes::GraphType; #[inline] - fn deref(&self) -> &crate::datatypes::GraphEdge { + fn deref(&self) -> &crate::datatypes::GraphType { &self.0 } } -impl std::ops::DerefMut for GraphEdgeUndirected { +impl std::ops::DerefMut for GraphType { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { + fn deref_mut(&mut self) -> &mut crate::datatypes::GraphType { &mut self.0 } } -::re_types_core::macros::impl_into_cow!(GraphEdgeUndirected); +::re_types_core::macros::impl_into_cow!(GraphType); -impl ::re_types_core::Loggable for GraphEdgeUndirected { +impl ::re_types_core::Loggable for GraphType { type Name = ::re_types_core::ComponentName; #[inline] fn name() -> Self::Name { - "rerun.components.GraphEdgeUndirected".into() + "rerun.components.GraphType".into() } #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphEdge::arrow_datatype() + crate::datatypes::GraphType::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphEdgeUndirected { where Self: Clone + 'a, { - crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::GraphType::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,16 @@ impl ::re_types_core::Loggable for GraphEdgeUndirected { where Self: Sized, { - crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) + crate::datatypes::GraphType::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } + + #[inline] + fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> + where + Self: Sized, + { + crate::datatypes::GraphType::from_arrow(arrow_data) + .map(|v| v.into_iter().map(Self).collect()) + } } diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index 1c0323037b67..3a1cc3200f35 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -24,9 +24,9 @@ mod fill_ratio; mod fill_ratio_ext; mod gamma_correction; mod gamma_correction_ext; -mod graph_edge_directed; -mod graph_edge_undirected; -mod graph_node_id; +mod graph_edge; +mod graph_node; +mod graph_type; mod half_size2d; mod half_size2d_ext; mod half_size3d; @@ -131,9 +131,9 @@ pub use self::entity_path::EntityPath; pub use self::fill_mode::FillMode; pub use self::fill_ratio::FillRatio; pub use self::gamma_correction::GammaCorrection; -pub use self::graph_edge_directed::GraphEdgeDirected; -pub use self::graph_edge_undirected::GraphEdgeUndirected; -pub use self::graph_node_id::GraphNodeId; +pub use self::graph_edge::GraphEdge; +pub use self::graph_node::GraphNode; +pub use self::graph_type::GraphType; pub use self::half_size2d::HalfSize2D; pub use self::half_size3d::HalfSize3D; pub use self::image_buffer::ImageBuffer; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 3982583ca7c0..16f4597c2ff7 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -10,8 +10,8 @@ class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true graph_edge.rs linguist-generated=true -graph_location.rs linguist-generated=true -graph_node_id.rs linguist-generated=true +graph_node.rs linguist-generated=true +graph_type.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/graph_edge.rs index 292b8ac8742b..1e6ca6abec49 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/graph_edge.rs @@ -18,15 +18,15 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). +/// **Datatype**: An edge in a graph connecting two nodes. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge { /// The id of the source node. - pub source: crate::datatypes::GraphLocation, + pub source: crate::datatypes::GraphNode, /// The id of the target node. - pub target: crate::datatypes::GraphLocation, + pub target: crate::datatypes::GraphNode, } impl ::re_types_core::SizeBytes for GraphEdge { @@ -37,7 +37,7 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - ::is_pod() && ::is_pod() + ::is_pod() && ::is_pod() } } @@ -58,12 +58,12 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Struct(std::sync::Arc::new(vec![ Field::new( "source", - ::arrow_datatype(), + ::arrow_datatype(), false, ), Field::new( "target", - ::arrow_datatype(), + ::arrow_datatype(), false, ), ])) @@ -107,8 +107,28 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - _ = source_bitmap; - crate::datatypes::GraphLocation::to_arrow_opt(source)? + let offsets = arrow2::offset::Offsets::::try_from_lengths( + source.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = source + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + source_bitmap, + ) + } + .boxed() } }, { @@ -124,8 +144,28 @@ impl ::re_types_core::Loggable for GraphEdge { any_nones.then(|| somes.into()) }; { - _ = target_bitmap; - crate::datatypes::GraphLocation::to_arrow_opt(target)? + let offsets = arrow2::offset::Offsets::::try_from_lengths( + target.iter().map(|opt| { + opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() + }), + )? + .into(); + let inner_data: arrow2::buffer::Buffer = target + .into_iter() + .flatten() + .flat_map(|datum| datum.0 .0) + .collect(); + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + unsafe { + Utf8Array::::new_unchecked( + DataType::Utf8, + offsets, + inner_data, + target_bitmap, + ) + } + .boxed() } }, ], @@ -173,9 +213,51 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["source"]; - crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#source")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() .with_context("rerun.datatypes.GraphEdge#source")? .into_iter() + } }; let target = { if !arrays_by_name.contains_key("target") { @@ -186,9 +268,51 @@ impl ::re_types_core::Loggable for GraphEdge { .with_context("rerun.datatypes.GraphEdge"); } let arrow_data = &**arrays_by_name["target"]; - crate::datatypes::GraphLocation::from_arrow_opt(arrow_data) + { + let arrow_data = arrow_data + .as_any() + .downcast_ref::>() + .ok_or_else(|| { + let expected = DataType::Utf8; + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphEdge#target")?; + let arrow_data_buf = arrow_data.values(); + let offsets = arrow_data.offsets(); + arrow2::bitmap::utils::ZipValidity::new_with_validity( + offsets.iter().zip(offsets.lengths()), + arrow_data.validity(), + ) + .map(|elem| { + elem.map(|(start, len)| { + let start = *start as usize; + let end = start + len; + if end > arrow_data_buf.len() { + return Err(DeserializationError::offset_slice_oob( + (start, end), + arrow_data_buf.len(), + )); + } + + #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] + let data = + unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; + Ok(data) + }) + .transpose() + }) + .map(|res_or_opt| { + res_or_opt.map(|res_or_opt| { + res_or_opt.map(|v| { + crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + }) + }) + }) + .collect::>>>() .with_context("rerun.datatypes.GraphEdge#target")? .into_iter() + } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( ::itertools::izip!(source, target), diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs index d4cd8d4636c1..45687a7441ca 100644 --- a/crates/store/re_types/src/datatypes/graph_edge_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_edge_ext.rs @@ -1,6 +1,6 @@ -use crate::datatypes::{EntityPath, GraphEdge, GraphLocation, GraphNodeId}; +use crate::datatypes::{GraphEdge, GraphNode}; -impl> From<(T, T)> for GraphEdge { +impl> From<(T, T)> for GraphEdge { fn from(value: (T, T)) -> Self { Self { source: value.0.into(), @@ -8,19 +8,3 @@ impl> From<(T, T)> for GraphEdge { } } } - -impl, N: Into> From<(E, N, N)> for GraphEdge { - fn from(value: (E, N, N)) -> Self { - let entity_path = value.0.into(); - Self { - source: GraphLocation { - entity_path: entity_path.clone(), - node_id: value.1.into(), - }, - target: GraphLocation { - entity_path, - node_id: value.2.into(), - }, - } - } -} diff --git a/crates/store/re_types/src/datatypes/graph_location.rs b/crates/store/re_types/src/datatypes/graph_location.rs deleted file mode 100644 index 51954a2c866d..000000000000 --- a/crates/store/re_types/src/datatypes/graph_location.rs +++ /dev/null @@ -1,341 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. -/// -/// We require this because the same node id can be used in multiple entities. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphLocation { - /// The entity path that specifies where to find the node. - pub entity_path: crate::datatypes::EntityPath, - - /// The id of the node. - pub node_id: crate::datatypes::GraphNodeId, -} - -impl ::re_types_core::SizeBytes for GraphLocation { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.entity_path.heap_size_bytes() + self.node_id.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - ::is_pod() && ::is_pod() - } -} - -::re_types_core::macros::impl_into_cow!(GraphLocation); - -impl ::re_types_core::Loggable for GraphLocation { - type Name = ::re_types_core::DatatypeName; - - #[inline] - fn name() -> Self::Name { - "rerun.datatypes.GraphLocation".into() - } - - #[inline] - fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::Struct(std::sync::Arc::new(vec![ - Field::new( - "entity_path", - ::arrow_datatype(), - false, - ), - Field::new( - "node_id", - ::arrow_datatype(), - false, - ), - ])) - } - - fn to_arrow_opt<'a>( - data: impl IntoIterator>>>, - ) -> SerializationResult> - where - Self: Clone + 'a, - { - #![allow(clippy::wildcard_imports)] - #![allow(clippy::manual_is_variant_and)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - (datum.is_some(), datum) - }) - .unzip(); - let bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - StructArray::new( - Self::arrow_datatype(), - vec![ - { - let (somes, entity_path): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.entity_path.clone()); - (datum.is_some(), datum) - }) - .unzip(); - let entity_path_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - entity_path.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = entity_path - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - entity_path_bitmap, - ) - } - .boxed() - } - }, - { - let (somes, node_id): (Vec<_>, Vec<_>) = data - .iter() - .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.node_id.clone()); - (datum.is_some(), datum) - }) - .unzip(); - let node_id_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - node_id.iter().map(|opt| { - opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() - }), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = node_id - .into_iter() - .flatten() - .flat_map(|datum| datum.0 .0) - .collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - DataType::Utf8, - offsets, - inner_data, - node_id_bitmap, - ) - } - .boxed() - } - }, - ], - bitmap, - ) - .boxed() - }) - } - - fn from_arrow_opt( - arrow_data: &dyn arrow2::array::Array, - ) -> DeserializationResult>> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok({ - let arrow_data = arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation")?; - if arrow_data.is_empty() { - Vec::new() - } else { - let (arrow_data_fields, arrow_data_arrays) = - (arrow_data.fields(), arrow_data.values()); - let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields - .iter() - .map(|field| field.name.as_str()) - .zip(arrow_data_arrays) - .collect(); - let entity_path = { - if !arrays_by_name.contains_key("entity_path") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "entity_path", - )) - .with_context("rerun.datatypes.GraphLocation"); - } - let arrow_data = &**arrays_by_name["entity_path"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation#entity_path")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::EntityPath(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphLocation#entity_path")? - .into_iter() - } - }; - let node_id = { - if !arrays_by_name.contains_key("node_id") { - return Err(DeserializationError::missing_struct_field( - Self::arrow_datatype(), - "node_id", - )) - .with_context("rerun.datatypes.GraphLocation"); - } - let arrow_data = &**arrays_by_name["node_id"]; - { - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = DataType::Utf8; - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphLocation#node_id")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = - unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| { - res_or_opt.map(|v| { - crate::datatypes::GraphNodeId(::re_types_core::ArrowString(v)) - }) - }) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphLocation#node_id")? - .into_iter() - } - }; - arrow2::bitmap::utils::ZipValidity::new_with_validity( - ::itertools::izip!(entity_path, node_id), - arrow_data.validity(), - ) - .map(|opt| { - opt.map(|(entity_path, node_id)| { - Ok(Self { - entity_path: entity_path - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphLocation#entity_path")?, - node_id: node_id - .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphLocation#node_id")?, - }) - }) - .transpose() - }) - .collect::>>() - .with_context("rerun.datatypes.GraphLocation")? - } - }) - } -} diff --git a/crates/store/re_types/src/datatypes/graph_location_ext.rs b/crates/store/re_types/src/datatypes/graph_location_ext.rs deleted file mode 100644 index 44a3df63889c..000000000000 --- a/crates/store/re_types/src/datatypes/graph_location_ext.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::datatypes::{EntityPath, GraphNodeId}; - -impl, N: Into> From<(E, N)> for super::GraphLocation { - fn from(value: (E, N)) -> Self { - Self { - entity_path: value.0.into(), - node_id: value.1.into(), - } - } -} - -impl std::fmt::Display for super::GraphLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{:?}", self.node_id, self.entity_path) - } -} diff --git a/crates/store/re_types/src/datatypes/graph_node_id.rs b/crates/store/re_types/src/datatypes/graph_node.rs similarity index 88% rename from crates/store/re_types/src/datatypes/graph_node_id.rs rename to crates/store/re_types/src/datatypes/graph_node.rs index 876da591e151..2ee7ff3defd1 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id.rs +++ b/crates/store/re_types/src/datatypes/graph_node.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,13 +18,13 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: A 32-bit ID representing a node in a graph. +/// **Datatype**: A string-based ID representing a node in a graph. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNodeId(pub ::re_types_core::ArrowString); +pub struct GraphNode(pub ::re_types_core::ArrowString); -impl ::re_types_core::SizeBytes for GraphNodeId { +impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn heap_size_bytes(&self) -> u64 { self.0.heap_size_bytes() @@ -36,28 +36,28 @@ impl ::re_types_core::SizeBytes for GraphNodeId { } } -impl From<::re_types_core::ArrowString> for GraphNodeId { +impl From<::re_types_core::ArrowString> for GraphNode { #[inline] fn from(id: ::re_types_core::ArrowString) -> Self { Self(id) } } -impl From for ::re_types_core::ArrowString { +impl From for ::re_types_core::ArrowString { #[inline] - fn from(value: GraphNodeId) -> Self { + fn from(value: GraphNode) -> Self { value.0 } } -::re_types_core::macros::impl_into_cow!(GraphNodeId); +::re_types_core::macros::impl_into_cow!(GraphNode); -impl ::re_types_core::Loggable for GraphNodeId { +impl ::re_types_core::Loggable for GraphNode { type Name = ::re_types_core::DatatypeName; #[inline] fn name() -> Self::Name { - "rerun.datatypes.GraphNodeId".into() + "rerun.datatypes.GraphNode".into() } #[inline] @@ -132,7 +132,7 @@ impl ::re_types_core::Loggable for GraphNodeId { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphNodeId#id")?; + .with_context("rerun.datatypes.GraphNode#id")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -160,13 +160,13 @@ impl ::re_types_core::Loggable for GraphNodeId { res_or_opt.map(|res_or_opt| res_or_opt.map(|v| ::re_types_core::ArrowString(v))) }) .collect::>>>() - .with_context("rerun.datatypes.GraphNodeId#id")? + .with_context("rerun.datatypes.GraphNode#id")? .into_iter() } .map(|v| v.ok_or_else(DeserializationError::missing_data)) .map(|res| res.map(|v| Some(Self(v)))) .collect::>>>() - .with_context("rerun.datatypes.GraphNodeId#id") - .with_context("rerun.datatypes.GraphNodeId")?) + .with_context("rerun.datatypes.GraphNode#id") + .with_context("rerun.datatypes.GraphNode")?) } } diff --git a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs b/crates/store/re_types/src/datatypes/graph_node_ext.rs similarity index 59% rename from crates/store/re_types/src/datatypes/graph_node_id_ext.rs rename to crates/store/re_types/src/datatypes/graph_node_ext.rs index 4b1d0612c51d..3265bdd535b9 100644 --- a/crates/store/re_types/src/datatypes/graph_node_id_ext.rs +++ b/crates/store/re_types/src/datatypes/graph_node_ext.rs @@ -1,18 +1,18 @@ -use super::GraphNodeId; +use super::GraphNode; -impl std::convert::From<&str> for GraphNodeId { +impl std::convert::From<&str> for GraphNode { fn from(s: &str) -> Self { Self(s.into()) } } -impl std::convert::From for GraphNodeId { +impl std::convert::From for GraphNode { fn from(s: String) -> Self { Self(s.into()) } } -impl std::fmt::Display for GraphNodeId { +impl std::fmt::Display for GraphNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } diff --git a/crates/store/re_types/src/datatypes/graph_type.rs b/crates/store/re_types/src/datatypes/graph_type.rs new file mode 100644 index 000000000000..401ecb99a002 --- /dev/null +++ b/crates/store/re_types/src/datatypes/graph_type.rs @@ -0,0 +1,153 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +#![allow(unused_imports)] +#![allow(unused_parens)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::cloned_instead_of_copied)] +#![allow(clippy::map_flatten)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::new_without_default)] +#![allow(clippy::redundant_closure)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::too_many_lines)] +#![allow(non_camel_case_types)] + +use ::re_types_core::external::arrow2; +use ::re_types_core::ComponentName; +use ::re_types_core::SerializationResult; +use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; +use ::re_types_core::{DeserializationError, DeserializationResult}; + +/// **Datatype**: Specifies if a graph has directed or undirected edges. +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[repr(u8)] +pub enum GraphType { + /// The graph has undirected edges. + #[default] + Undirected = 1, + + /// The graph has directed edges. + Directed = 2, +} + +impl ::re_types_core::reflection::Enum for GraphType { + #[inline] + fn variants() -> &'static [Self] { + &[Self::Undirected, Self::Directed] + } + + #[inline] + fn docstring_md(self) -> &'static str { + match self { + Self::Undirected => "The graph has undirected edges.", + Self::Directed => "The graph has directed edges.", + } + } +} + +impl ::re_types_core::SizeBytes for GraphType { + #[inline] + fn heap_size_bytes(&self) -> u64 { + 0 + } + + #[inline] + fn is_pod() -> bool { + true + } +} + +impl std::fmt::Display for GraphType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Undirected => write!(f, "Undirected"), + Self::Directed => write!(f, "Directed"), + } + } +} + +::re_types_core::macros::impl_into_cow!(GraphType); + +impl ::re_types_core::Loggable for GraphType { + type Name = ::re_types_core::DatatypeName; + + #[inline] + fn name() -> Self::Name { + "rerun.datatypes.GraphType".into() + } + + #[inline] + fn arrow_datatype() -> arrow2::datatypes::DataType { + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::UInt8 + } + + fn to_arrow_opt<'a>( + data: impl IntoIterator>>>, + ) -> SerializationResult> + where + Self: Clone + 'a, + { + #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data0): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + let datum = datum.map(|datum| *datum as u8); + (datum.is_some(), datum) + }) + .unzip(); + let data0_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + PrimitiveArray::new( + Self::arrow_datatype(), + data0.into_iter().map(|v| v.unwrap_or_default()).collect(), + data0_bitmap, + ) + .boxed() + }) + } + + fn from_arrow_opt( + arrow_data: &dyn arrow2::array::Array, + ) -> DeserializationResult>> + where + Self: Sized, + { + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok(arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.datatypes.GraphType#enum")? + .into_iter() + .map(|opt| opt.copied()) + .map(|typ| match typ { + Some(1) => Ok(Some(Self::Undirected)), + Some(2) => Ok(Some(Self::Directed)), + None => Ok(None), + Some(invalid) => Err(DeserializationError::missing_union_arm( + Self::arrow_datatype(), + "", + invalid as _, + )), + }) + .collect::>>>() + .with_context("rerun.datatypes.GraphType")?) + } +} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 2b31d3f54759..0c3e74d77c28 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -18,10 +18,9 @@ mod color_model; mod color_model_ext; mod graph_edge; mod graph_edge_ext; -mod graph_location; -mod graph_location_ext; -mod graph_node_id; -mod graph_node_id_ext; +mod graph_node; +mod graph_node_ext; +mod graph_type; mod image_format; mod image_format_ext; mod keypoint_id; @@ -81,8 +80,8 @@ pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; pub use self::graph_edge::GraphEdge; -pub use self::graph_location::GraphLocation; -pub use self::graph_node_id::GraphNodeId; +pub use self::graph_node::GraphNode; +pub use self::graph_type::GraphType; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; diff --git a/crates/viewer/re_space_view_graph/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs index 1f0d5bbafff8..a35e83504b54 100644 --- a/crates/viewer/re_space_view_graph/src/error.rs +++ b/crates/viewer/re_space_view_graph/src/error.rs @@ -8,7 +8,7 @@ pub enum Error { EdgeUnknownNode, #[error("missing layout information for node `{1}` in entity `{0}`")] - MissingLayoutInformation(EntityPath, datatypes::GraphNodeId), + MissingLayoutInformation(EntityPath, datatypes::GraphNode), } impl From for SpaceViewSystemExecutionError { diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 655a0d4002ff..711f44dde36b 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -3,35 +3,35 @@ use re_types::datatypes; /// A 64 bit hash of [`GraphNodeId`] with very small risk of collision. #[derive(Copy, Clone, Eq, PartialOrd, Ord)] -pub(crate) struct NodeIdHash(Hash64); +pub(crate) struct GraphNodeHash(Hash64); -impl NodeIdHash { +impl GraphNodeHash { #[inline] pub fn hash64(&self) -> u64 { self.0.hash64() } } -impl std::hash::Hash for NodeIdHash { +impl std::hash::Hash for GraphNodeHash { #[inline] fn hash(&self, state: &mut H) { self.0.hash(state); } } -impl std::fmt::Debug for NodeIdHash { +impl std::fmt::Debug for GraphNodeHash { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "NodeIdHash({:016X})", self.hash64()) } } -impl From<&datatypes::GraphNodeId> for NodeIdHash { - fn from(node_id: &datatypes::GraphNodeId) -> Self { +impl From<&datatypes::GraphNode> for GraphNodeHash { + fn from(node_id: &datatypes::GraphNode) -> Self { Self(Hash64::hash(node_id)) } } -impl std::cmp::PartialEq for NodeIdHash { +impl std::cmp::PartialEq for GraphNodeHash { #[inline] fn eq(&self, other: &Self) -> bool { self.0.eq(&other.0) diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index 1bf14bcee2ca..bb3f85991057 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -1,34 +1,25 @@ use re_log_types::{EntityPath, EntityPathHash}; use re_types::datatypes; -use super::NodeIdHash; +use super::GraphNodeHash; #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub(crate) struct NodeIndex { pub entity_hash: EntityPathHash, - pub node_id: NodeIdHash, + pub node_hash: GraphNodeHash, } -impl From for NodeIndex { - fn from(location: datatypes::GraphLocation) -> Self { +impl NodeIndex { + pub fn from_entity_node(entity_path: &EntityPath, node: &datatypes::GraphNode) -> Self { Self { - entity_hash: EntityPath::from(location.entity_path).hash(), - node_id: NodeIdHash::from(&location.node_id), - } - } -} - -impl From<&datatypes::GraphLocation> for NodeIndex { - fn from(location: &datatypes::GraphLocation) -> Self { - Self { - entity_hash: EntityPath::from(location.entity_path.clone()).hash(), - node_id: NodeIdHash::from(&location.node_id), + entity_hash: entity_path.hash(), + node_hash: GraphNodeHash::from(node), } } } impl std::fmt::Debug for NodeIndex { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "NodeIndex({:?}@{:?})", self.node_id, self.entity_hash) + write!(f, "NodeIndex({:?}@{:?})", self.node_hash, self.entity_hash) } } diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 7d9c78ffe7c2..12e36b70e454 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -5,11 +5,11 @@ use re_types::datatypes; use crate::{ types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, - visualizers::{EdgesDirectedData, EdgesUndirectedData, NodeVisualizerData}, + visualizers::{EdgeData, NodeData}, }; mod hash; -pub(crate) use hash::NodeIdHash; +pub(crate) use hash::GraphNodeHash; mod index; pub(crate) use index::NodeIndex; @@ -19,7 +19,7 @@ pub(crate) enum Node<'a> { } impl<'a> From<&Node<'a>> for NodeIndex { - fn from(node: &Node) -> Self { + fn from(node: &Node<'a>) -> Self { match node { Node::Regular(node) => node.into(), Node::Unknown(node) => node.into(), @@ -28,7 +28,7 @@ impl<'a> From<&Node<'a>> for NodeIndex { } impl<'a> From> for NodeIndex { - fn from(node: Node) -> Self { + fn from(node: Node<'a>) -> Self { match node { Node::Regular(node) => node.into(), Node::Unknown(node) => node.into(), @@ -38,65 +38,43 @@ impl<'a> From> for NodeIndex { pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: HashSet<(EntityPath, datatypes::GraphNodeId)>, - nodes: &'a Vec, - directed: &'a Vec, - undirected: &'a Vec, + unknown: HashSet<(&'a EntityPath, datatypes::GraphNode)>, + nodes: &'a Vec, + edges: &'a Vec, } impl<'a> Graph<'a> { - pub fn from_nodes_edges( - nodes: &'a Vec, - directed: &'a Vec, - undirected: &'a Vec, - ) -> Option { - let mut seen: HashSet<(&EntityPath, &datatypes::GraphNodeId)> = nodes + pub fn from_nodes_edges(nodes: &'a Vec, edges: &'a Vec) -> Self { + let seen = nodes .iter() .flat_map(|entity| entity.nodes()) - .map(|n| (n.entity_path, n.node_id)) - .collect(); + .map(NodeIndex::from) + .collect::>(); let mut unknown = HashSet::new(); - for entity in undirected { + for entity in edges { for edge in entity.edges() { for node in edge.nodes() { - let entity_path = EntityPath::from(node.entity_path.clone()); - if seen.contains(&(&entity_path, &node.node_id)) { + if seen.contains(&NodeIndex::from_entity_node(&entity.entity_path, node)) { continue; } - unknown.insert((entity_path, node.node_id)); - } - } - } - for entity in directed { - for edge in entity.edges() { - for node in edge.nodes() { - let entity_path = EntityPath::from(node.entity_path.clone()); - if seen.contains(&(&entity_path, &node.node_id)) { - continue; - } - unknown.insert((entity_path, node.node_id)); + unknown.insert((&entity.entity_path, node.clone())); } } } - if nodes.is_empty() && unknown.is_empty() { - return None; - } - - Some(Self { + Self { unknown, nodes, - directed, - undirected, - }) + edges, + } } - pub fn nodes_by_entity(&self) -> impl Iterator { + pub fn nodes_by_entity(&self) -> impl Iterator { self.nodes.iter() } - pub fn all_nodes(&'a self) -> impl Iterator { + pub fn all_nodes(&'a self) -> impl Iterator> { let nodes = self .nodes .iter() @@ -105,14 +83,12 @@ impl<'a> Graph<'a> { nodes.chain(unknowns) } - pub fn edges_by_entity(&self) -> impl Iterator { - self.undirected.iter() + pub fn edges_by_entity(&self) -> impl Iterator { + self.edges.iter() } - pub fn all_edges(&self) -> impl Iterator { - let undirected = self.undirected.iter().flat_map(|entity| entity.edges()); - let directed = self.directed.iter().flat_map(|entity| entity.edges()); - undirected.chain(directed) + pub fn all_edges(&self) -> impl Iterator> { + self.edges.iter().flat_map(|entity| entity.edges()) } pub fn unknown_nodes(&'a self) -> impl Iterator> { diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 3b2b5ba1a265..7444f1a49905 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -4,8 +4,8 @@ use re_types::{datatypes, ArrowString}; use crate::graph::NodeIndex; impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { - [self.source.clone(), self.target.clone()].into_iter() + pub fn nodes(&'a self) -> impl Iterator { + [self.source, self.target].into_iter() } } @@ -13,7 +13,7 @@ impl<'a> From<&NodeInstance<'a>> for NodeIndex { fn from(node: &NodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.into(), + node_hash: node.node_id.into(), } } } @@ -22,30 +22,41 @@ impl<'a> From> for NodeIndex { fn from(node: NodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.into(), + node_hash: node.node_id.into(), } } } -pub(crate) struct NodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, +pub struct NodeInstance<'a> { + pub node_id: &'a datatypes::GraphNode, pub entity_path: &'a EntityPath, pub instance: Instance, - pub show_labels: bool, pub label: Option<&'a ArrowString>, + pub show_labels: bool, pub color: Option, + pub position: Option<[f32; 2]>, } pub struct EdgeInstance<'a> { - pub source: &'a datatypes::GraphLocation, - pub target: &'a datatypes::GraphLocation, - pub _entity_path: &'a re_log_types::EntityPath, + pub source: &'a datatypes::GraphNode, + pub target: &'a datatypes::GraphNode, + pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, - pub color: Option, + pub edge_type: datatypes::GraphType, +} + +impl<'a> EdgeInstance<'a> { + pub fn source_ix(&self) -> NodeIndex { + NodeIndex::from_entity_node(self.entity_path, self.source) + } + + pub fn target_ix(&self) -> NodeIndex { + NodeIndex::from_entity_node(self.entity_path, self.source) + } } -pub(crate) struct UnknownNodeInstance<'a> { - pub node_id: &'a datatypes::GraphNodeId, +pub struct UnknownNodeInstance<'a> { + pub node_id: &'a datatypes::GraphNode, pub entity_path: &'a EntityPath, } @@ -53,7 +64,7 @@ impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { fn from(node: &UnknownNodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.into(), + node_hash: node.node_id.into(), } } } @@ -62,7 +73,7 @@ impl<'a> From> for NodeIndex { fn from(node: UnknownNodeInstance<'a>) -> Self { Self { entity_hash: node.entity_path.hash(), - node_id: node.node_id.into(), + node_hash: node.node_id.into(), } } } diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index e9ce9521f13e..1d4008bdc678 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -34,7 +34,7 @@ pub struct GraphSpaceViewState { pub should_tick: bool, /// Positions of the nodes in world space. - pub layout: HashMap, egui::Rect)>, + pub layout: HashMap, /// Layout properties. pub layout_config: RadialLayoutConfig, @@ -47,7 +47,7 @@ impl GraphSpaceViewState { ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); if let Some(egui::Rect { min, max }) = - bounding_rect_from_iter(self.layout.values().map(|n| &n.1)) + bounding_rect_from_iter(self.layout.values()) { ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 9cf180038a47..eb1fc497db95 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -16,18 +16,19 @@ use re_viewer_context::{ use crate::{ graph::{Graph, NodeIndex}, ui::{self, GraphSpaceViewState}, - visualizers::{EdgesDirectedVisualizer, EdgesUndirectedVisualizer, NodeVisualizer}, + visualizers::{EdgesVisualizer, NodeVisualizer}, }; #[derive(Default)] pub struct GraphSpaceView; -fn arrange_in_circle(nodes: &mut HashMap, radius: f32) { +fn arrange_in_circle( + nodes: &mut HashMap, + radius: f32, +) { let n = nodes.len(); let center = egui::Pos2::new(0.0, 0.0); - let nodes_by_entity = nodes.iter().map(|(entity, (ix, _))| (entity, ix)).collect::>(); - for (i, (_id, (_, rect))) in nodes.iter_mut().enumerate() { let angle = 2.0 * std::f32::consts::PI * i as f32 / n as f32; let x = center.x + radius * angle.cos(); @@ -61,8 +62,7 @@ impl SpaceViewClass for GraphSpaceView { system_registry: &mut SpaceViewSystemRegistrator<'_>, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_visualizer::()?; - system_registry.register_visualizer::()?; - system_registry.register_visualizer::() + system_registry.register_visualizer::() } fn new_state(&self) -> Box { @@ -125,21 +125,9 @@ impl SpaceViewClass for GraphSpaceView { system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { let node_system = system_output.view_systems.get::()?; - let directed_system = system_output - .view_systems - .get::()?; - let undirected_system = system_output - .view_systems - .get::()?; - - let Some(graph) = Graph::from_nodes_edges( - &node_system.data, - &directed_system.data, - &undirected_system.data, - ) else { - re_log::warn!("No graph data available."); - return Ok(()); - }; + let edge_system = system_output.view_systems.get::()?; + + let graph = Graph::from_nodes_edges(&node_system.data, &edge_system.data); let state = state.downcast_mut::()?; @@ -183,7 +171,7 @@ impl SpaceViewClass for GraphSpaceView { let mut seen: HashSet = HashSet::new(); state.viewer.scene(ui, |mut scene| { - for data in node_system.data.iter() { + for data in &node_system.data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); // We keep track of the size of the current entity. @@ -192,7 +180,11 @@ impl SpaceViewClass for GraphSpaceView { for node in data.nodes() { let ix = NodeIndex::from(&node); seen.insert(ix); - let (_,current) = state.layout.entry(ix).or_insert((node.entity_path.clone().into(), egui::Rect::ZERO)); + let current = state.layout.entry(ix).or_insert( + node.position.map_or(egui::Rect::ZERO, |p| { + Rect::from_center_size(p.into(), egui::Vec2::ZERO) + }), + ); let response = scene.node(current.min, |ui| { ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) @@ -220,58 +212,35 @@ impl SpaceViewClass for GraphSpaceView { for dummy in graph.unknown_nodes() { let ix = NodeIndex::from(&dummy); seen.insert(ix); - let (_, current) = state.layout.entry(ix).or_insert((None, Rect::ZERO)); + let current = state.layout.entry(ix).or_insert(Rect::ZERO); let response = scene.node(current.min, |ui| ui::draw_dummy(ui, &dummy)); *current = response.rect; } - for data in undirected_system.data.iter() { + for data in &edge_system.data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { - if let (Some((_, source_pos)), Some((_,target_pos))) = ( - state.layout.get(&edge.source.into()), - state.layout.get(&edge.target.into()), + if let (Some(source_pos), Some(target_pos)) = ( + state.layout.get(&edge.source_ix()), + state.layout.get(&edge.target_ix()), ) { scene.edge(|ui| { ui::draw_edge( ui, - edge.color, + None, // TODO(grtlr): change this back once we have edge colors source_pos, target_pos, ent_highlight.index_highlight(edge.instance), false, - ) + ); }); }; } } - - // TODO(grtlr): consider reducing this duplication? - for data in directed_system.data.iter() { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); - - for edge in data.edges() { - if let (Some((_,source_pos)), Some((_,target_pos))) = ( - state.layout.get(&edge.source.into()), - state.layout.get(&edge.target.into()), - ) { - let _response = scene.edge(|ui| { - ui::draw_edge( - ui, - edge.color, - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - true, - ) - }); - } - } - } }); - arrange_in_circle(&mut state.layout, state.layout_config.circle_radius); + //arrange_in_circle(&mut state.layout, state.layout_config.circle_radius); // TODO(grtlr): consider improving this! if state.should_fit_to_screen { @@ -280,7 +249,7 @@ impl SpaceViewClass for GraphSpaceView { } // Clean up the layout for nodes that are no longer present. - // state.layout.retain(|k, _| seen.contains(k)); + state.layout.retain(|k, _| seen.contains(k)); // let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); // let links = graph diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs similarity index 61% rename from crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs rename to crates/viewer/re_space_view_graph/src/visualizers/edges.rs index 11d85e49fe52..b6cb9929af89 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_directed.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -1,12 +1,8 @@ use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; -use re_query::{clamped_zip_2x1, range_zip_1x1}; use re_log_types::Instance; +use re_query::{clamped_zip_2x1, range_zip_1x1}; use re_space_view::{DataResultQuery, RangeResultsExt}; -use re_types::{ - self, archetypes, - components::{self}, - Loggable as _, -}; +use re_types::{self, archetypes, components, datatypes, Loggable as _}; use re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, @@ -15,43 +11,44 @@ use re_viewer_context::{ use crate::types::EdgeInstance; #[derive(Default)] -pub struct EdgesDirectedVisualizer { - pub data: Vec, +pub struct EdgesVisualizer { + pub data: Vec, } -pub struct EdgesDirectedData { +pub struct EdgeData { pub entity_path: re_log_types::EntityPath, - edges: ChunkComponentIterItem, - colors: ChunkComponentIterItem, + pub graph_type: datatypes::GraphType, + edges: ChunkComponentIterItem, } -impl EdgesDirectedData { - pub fn edges(&self) -> impl Iterator { +impl EdgeData { + pub fn edges(&self) -> impl Iterator> { clamped_zip_2x1( self.edges.iter(), (0..).map(Instance::from), - self.colors.iter().map(Option::Some), - Option::<&components::Color>::default, + // A placeholder for components that we will add in the future. + std::iter::repeat(None), + Option::<()>::default, ) - .map(|(edge, instance, color)| EdgeInstance { + .map(|(edge, instance, _placeholder)| EdgeInstance { source: &edge.source, target: &edge.target, - _entity_path: &self.entity_path, + entity_path: &self.entity_path, instance, - color: color.map(|c| egui::Color32::from(c.0)), + edge_type: self.graph_type, }) } } -impl IdentifiedViewSystem for EdgesDirectedVisualizer { +impl IdentifiedViewSystem for EdgesVisualizer { fn identifier() -> ViewSystemIdentifier { "GraphEdgesDirected".into() } } -impl VisualizerSystem for EdgesDirectedVisualizer { +impl VisualizerSystem for EdgesVisualizer { fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() + VisualizerQueryInfo::from_archetype::() } /// Populates the scene part with data from the store. @@ -65,25 +62,28 @@ impl VisualizerSystem for EdgesDirectedVisualizer { for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { let results = data_result - .latest_at_with_blueprint_resolved_data::( + .latest_at_with_blueprint_resolved_data::( ctx, &timeline_query, ); - let all_indexed_edges = - results.iter_as(query.timeline, components::GraphEdgeDirected::name()); - let all_colors = results.iter_as(query.timeline, components::Color::name()); + let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdge::name()); + let all_graph_type = results.iter_as(query.timeline, components::GraphType::name()); let data = range_zip_1x1( - all_indexed_edges.component::(), - all_colors.component::(), + all_indexed_edges.component::(), + all_graph_type.component::(), ); - for (_index, edges, colors) in data { - self.data.push(EdgesDirectedData { + for (_index, edges, graph_type) in data { + self.data.push(EdgeData { entity_path: data_result.entity_path.clone(), edges, - colors: colors.unwrap_or_default(), + graph_type: graph_type + .unwrap_or_default() + .first() + .map(|x| x.0) + .unwrap_or_default(), }); } } @@ -102,4 +102,4 @@ impl VisualizerSystem for EdgesDirectedVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(EdgesDirectedVisualizer => []); +re_viewer_context::impl_component_fallback_provider!(EdgesVisualizer => []); diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs deleted file mode 100644 index 7221a6eddd67..000000000000 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges_undirected.rs +++ /dev/null @@ -1,105 +0,0 @@ -use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; -use re_query::{clamped_zip_2x1, range_zip_1x1}; -use re_log_types::Instance; -use re_space_view::{DataResultQuery, RangeResultsExt}; -use re_types::{ - self, archetypes, - components::{self}, - Loggable as _, -}; -use re_viewer_context::{ - self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, - ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, -}; - -use crate::types::EdgeInstance; - -#[derive(Default)] -pub struct EdgesUndirectedVisualizer { - pub data: Vec, -} - -pub struct EdgesUndirectedData { - pub entity_path: re_log_types::EntityPath, - edges: ChunkComponentIterItem, - colors: ChunkComponentIterItem, -} - -impl EdgesUndirectedData { - pub fn edges(&self) -> impl Iterator { - clamped_zip_2x1( - self.edges.iter(), - (0..).map(Instance::from), - self.colors.iter().map(Option::Some), - Option::<&components::Color>::default, - ) - .map(|(edge, instance, color)| EdgeInstance { - source: &edge.source, - target: &edge.target, - _entity_path: &self.entity_path, - instance, - color: color.map(|c| egui::Color32::from(c.0)), - }) - } -} - -impl IdentifiedViewSystem for EdgesUndirectedVisualizer { - fn identifier() -> ViewSystemIdentifier { - "GraphEdgesUndirected".into() - } -} - -impl VisualizerSystem for EdgesUndirectedVisualizer { - fn visualizer_query_info(&self) -> VisualizerQueryInfo { - VisualizerQueryInfo::from_archetype::() - } - - /// Populates the scene part with data from the store. - fn execute( - &mut self, - ctx: &ViewContext<'_>, - query: &ViewQuery<'_>, - _context_systems: &ViewContextCollection, - ) -> Result, SpaceViewSystemExecutionError> { - let timeline_query = LatestAtQuery::new(query.timeline, query.latest_at); - - for data_result in query.iter_visible_data_results(ctx, Self::identifier()) { - let results = data_result - .latest_at_with_blueprint_resolved_data::( - ctx, - &timeline_query, - ); - - let all_indexed_edges = - results.iter_as(query.timeline, components::GraphEdgeUndirected::name()); - let all_colors = results.iter_as(query.timeline, components::Color::name()); - - let data = range_zip_1x1( - all_indexed_edges.component::(), - all_colors.component::(), - ); - - for (_index, edges, colors) in data { - self.data.push(EdgesUndirectedData { - entity_path: data_result.entity_path.clone(), - edges, - colors: colors.unwrap_or_default(), - }); - } - } - - // We're not using `re_renderer` here, so return an empty vector. - // If you want to draw additional primitives here, you can emit re_renderer draw data here directly. - Ok(Vec::new()) - } - - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn fallback_provider(&self) -> &dyn re_viewer_context::ComponentFallbackProvider { - self - } -} - -re_viewer_context::impl_component_fallback_provider!(EdgesUndirectedVisualizer => []); diff --git a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs index 1b28ab06b6f2..4d72ce33a553 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs @@ -1,7 +1,5 @@ -mod edges_directed; -mod edges_undirected; +mod edges; mod nodes; -pub use edges_directed::{EdgesDirectedData, EdgesDirectedVisualizer}; -pub use edges_undirected::{EdgesUndirectedData, EdgesUndirectedVisualizer}; -pub use nodes::{NodeVisualizer, NodeVisualizerData}; +pub use edges::{EdgeData, EdgesVisualizer}; +pub use nodes::{NodeVisualizer, NodeData}; diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 046e03d6449c..7d85d8e5ae9b 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -2,8 +2,8 @@ use egui::Color32; use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; use re_log_types::EntityPath; use re_log_types::Instance; -use re_query::clamped_zip_2x2; -use re_query::range_zip_1x3; +use re_query::clamped_zip_2x3; +use re_query::range_zip_1x4; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::{ self, archetypes, @@ -20,36 +20,40 @@ use crate::types::NodeInstance; /// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct NodeVisualizer { - pub data: Vec, + pub data: Vec, } -pub struct NodeVisualizerData { +pub struct NodeData { pub entity_path: EntityPath, - node_ids: ChunkComponentIterItem, + node_ids: ChunkComponentIterItem, // Clamped colors: ChunkComponentIterItem, labels: Vec, + positions: Vec<[f32; 2]>, // Non-repeated show_labels: Option, } -impl NodeVisualizerData { - pub fn nodes(&self) -> impl Iterator { - clamped_zip_2x2( +impl NodeData { + pub fn nodes(&self) -> impl Iterator> { + clamped_zip_2x3( self.node_ids.iter(), (0..).map(Instance::from), self.colors.iter().map(Option::Some), Option::<&components::Color>::default, + self.positions.iter().copied().map(Option::Some), + Option::<[f32;2]>::default, self.labels.iter().map(Option::Some), Option::<&ArrowString>::default, ) - .map(move |(node_id, instance, color, label)| NodeInstance { + .map(move |(node_id, instance, color, position, label)| NodeInstance { entity_path: &self.entity_path, node_id, instance, color: color.map(|c| Color32::from(c.0)), + position, show_labels: self.show_labels.map_or(true, bool::from), label, }) @@ -83,26 +87,28 @@ impl VisualizerSystem for NodeVisualizer { &timeline_query, ); - let all_indexed_nodes = - results.iter_as(query.timeline, components::GraphNodeId::name()); + let all_indexed_nodes = results.iter_as(query.timeline, components::GraphNode::name()); let all_colors = results.iter_as(query.timeline, components::Color::name()); + let all_positions = results.iter_as(query.timeline, components::Position2D::name()); let all_labels = results.iter_as(query.timeline, components::Text::name()); let all_show_labels = results.iter_as(query.timeline, components::ShowLabels::name()); - let data = range_zip_1x3( - all_indexed_nodes.component::(), + let data = range_zip_1x4( + all_indexed_nodes.component::(), all_colors.component::(), + all_positions.primitive_array::<2, f32>(), all_labels.string(), all_show_labels.component::(), ); - for (_index, node_ids, colors, labels, show_labels) in data { - self.data.push(NodeVisualizerData { + for (_index, node_ids, colors, positions, labels, show_labels) in data { + self.data.push(NodeData { entity_path: data_result.entity_path.clone(), node_ids, colors: colors.unwrap_or_default(), + positions: positions.unwrap_or_default().to_vec(), labels: labels.unwrap_or_default(), - show_labels: show_labels.unwrap_or_default().first().copied(), + show_labels: show_labels.unwrap_or_default().first().copied() }); } } diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index f3fcf65d6910..75ccc166ac67 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -371,24 +371,24 @@ fn generate_component_reflection() -> Result::name(), + ::name(), ComponentReflection { - docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphEdgeDirected::default().to_arrow()?), + docstring_md: "An edge in a graph connecting two nodes.", + placeholder: Some(GraphEdge::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "An undirected edge in a graph connecting two nodes.", - placeholder: Some(GraphEdgeUndirected::default().to_arrow()?), + docstring_md: "A string-based ID representing a node in a graph.", + placeholder: Some(GraphNode::default().to_arrow()?), }, ), ( - ::name(), + ::name(), ComponentReflection { - docstring_md: "A 32-bit ID representing a node in a graph.", - placeholder: Some(GraphNodeId::default().to_arrow()?), + docstring_md: "Specifies if a graph has directed or undirected edges.", + placeholder: Some(GraphType::default().to_arrow()?), }, ), ( @@ -1079,53 +1079,16 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { }, ), ( - ArchetypeName::new("rerun.archetypes.GraphEdgesDirected"), + ArchetypeName::new("rerun.archetypes.GraphEdges"), ArchetypeReflection { - display_name: "Graph edges directed", + display_name: "Graph edges", fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdgeDirected".into(), display_name : "Edges", + "rerun.components.GraphEdge".into(), display_name : "Edges", docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, - ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", - is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", - is_required : false, }, - ], - }, - ), - ( - ArchetypeName::new("rerun.archetypes.GraphEdgesUndirected"), - ArchetypeReflection { - display_name: "Graph edges undirected", - fields: vec![ - ArchetypeFieldReflection { component_name : - "rerun.components.GraphEdgeUndirected".into(), display_name : - "Edges", docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", - is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", + "rerun.components.GraphType".into(), display_name : "Graph type", + docstring_md : "Specifies if the graph is directed or undirected.", is_required : false, }, ], }, @@ -1136,26 +1099,18 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { display_name: "Graph nodes", fields: vec![ ArchetypeFieldReflection { component_name : - "rerun.components.GraphNodeId".into(), display_name : "Node ids", + "rerun.components.GraphNode".into(), display_name : "Node ids", docstring_md : "A list of node IDs.", is_required : true, }, ArchetypeFieldReflection { component_name : "rerun.components.Text" .into(), display_name : "Labels", docstring_md : "Optional text labels for the node.", is_required : false, }, - ArchetypeFieldReflection { component_name : "rerun.components.Color" - .into(), display_name : "Colors", docstring_md : - "Optional colors for the boxes.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.Position2D".into(), display_name : "Centers", + "rerun.components.Position2D".into(), display_name : "Positions", docstring_md : "Optional center positions of the nodes.", is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ShowLabels".into(), display_name : "Show labels", - docstring_md : - "Optional choice of whether the text labels should be shown by default.", - is_required : false, }, ArchetypeFieldReflection { component_name : - "rerun.components.ClassId".into(), display_name : "Class ids", - docstring_md : - "Optional [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id)s for the boxes.\n\nThe [`components.ClassId`](https://rerun.io/docs/reference/types/components/class_id) provides colors and labels if not specified explicitly.", - is_required : false, }, + "rerun.components.Color".into(), display_name : "Colors", + docstring_md : "Optional colors for the boxes.", is_required : false, + }, ], }, ), diff --git a/docs/content/reference/types/archetypes.md b/docs/content/reference/types/archetypes.md index 414d85b78cbc..81b000a37aa2 100644 --- a/docs/content/reference/types/archetypes.md +++ b/docs/content/reference/types/archetypes.md @@ -14,8 +14,7 @@ This page lists all built-in archetypes. ## Graph -* [`GraphEdgesDirected`](archetypes/graph_edges_directed.md): A list of directed edges in a graph with optional labels, colors, etc. -* [`GraphEdgesUndirected`](archetypes/graph_edges_undirected.md): A list of undirected edges in a graph with optional labels, colors, etc. +* [`GraphEdges`](archetypes/graph_edges.md): A list of edges in a graph. * [`GraphNodes`](archetypes/graph_nodes.md): A list of nodes in a graph with optional labels, colors, etc. ## Image & tensor diff --git a/docs/content/reference/types/archetypes/.gitattributes b/docs/content/reference/types/archetypes/.gitattributes index a78b41cb32d0..96cbe96c0299 100644 --- a/docs/content/reference/types/archetypes/.gitattributes +++ b/docs/content/reference/types/archetypes/.gitattributes @@ -14,8 +14,7 @@ depth_image.md linguist-generated=true disconnected_space.md linguist-generated=true ellipsoids3d.md linguist-generated=true encoded_image.md linguist-generated=true -graph_edges_directed.md linguist-generated=true -graph_edges_undirected.md linguist-generated=true +graph_edges.md linguist-generated=true graph_nodes.md linguist-generated=true image.md linguist-generated=true instance_poses3d.md linguist-generated=true diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges.md new file mode 100644 index 000000000000..7a4461545fc7 --- /dev/null +++ b/docs/content/reference/types/archetypes/graph_edges.md @@ -0,0 +1,24 @@ +--- +title: "GraphEdges" +--- + + +A list of edges in a graph. + +By default, edges are undirected. + +## Components + +**Required**: [`GraphEdge`](../components/graph_edge.md) + +**Recommended**: [`GraphType`](../components/graph_type.md) + +## Shown in +* [Graph View](../views/graph_view.md) +* [DataframeView](../views/dataframe_view.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdges`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdges.html) + * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdges) + * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html) + diff --git a/docs/content/reference/types/archetypes/graph_edges_directed.md b/docs/content/reference/types/archetypes/graph_edges_directed.md deleted file mode 100644 index 603d6c1d7c55..000000000000 --- a/docs/content/reference/types/archetypes/graph_edges_directed.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "GraphEdgesDirected" ---- - - -A list of directed edges in a graph with optional labels, colors, etc. - -## Components - -**Required**: [`GraphEdgeDirected`](../components/graph_edge_directed.md) - -**Recommended**: [`Color`](../components/color.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesDirected.html) - * 🐍 [Python API docs for `GraphEdgesDirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesDirected) - * 🦀 [Rust API docs for `GraphEdgesDirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesDirected.html) - diff --git a/docs/content/reference/types/archetypes/graph_edges_undirected.md b/docs/content/reference/types/archetypes/graph_edges_undirected.md deleted file mode 100644 index 1838404ba97e..000000000000 --- a/docs/content/reference/types/archetypes/graph_edges_undirected.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "GraphEdgesUndirected" ---- - - -A list of undirected edges in a graph with optional labels, colors, etc. - -## Components - -**Required**: [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) - -**Recommended**: [`Color`](../components/color.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) - -## Shown in -* [Graph View](../views/graph_view.md) -* [DataframeView](../views/dataframe_view.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdgesUndirected.html) - * 🐍 [Python API docs for `GraphEdgesUndirected`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdgesUndirected) - * 🦀 [Rust API docs for `GraphEdgesUndirected`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdgesUndirected.html) - diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index 0338e5a1657a..e81afacdb8b2 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -7,11 +7,11 @@ A list of nodes in a graph with optional labels, colors, etc. ## Components -**Required**: [`GraphNodeId`](../components/graph_node_id.md) +**Required**: [`GraphNode`](../components/graph_node.md) -**Recommended**: [`Color`](../components/color.md), [`Position2D`](../components/position2d.md) +**Recommended**: [`Position2D`](../components/position2d.md), [`Color`](../components/color.md) -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md), [`ClassId`](../components/class_id.md) +**Optional**: [`Text`](../components/text.md) ## Shown in * [Graph View](../views/graph_view.md) diff --git a/docs/content/reference/types/components.md b/docs/content/reference/types/components.md index 1aa99480f899..ad34c0b8b6d6 100644 --- a/docs/content/reference/types/components.md +++ b/docs/content/reference/types/components.md @@ -29,9 +29,9 @@ on [Entities and Components](../../concepts/entity-component.md). * [`FillMode`](components/fill_mode.md): How a geometric shape is drawn and colored. * [`FillRatio`](components/fill_ratio.md): How much a primitive fills out the available space. * [`GammaCorrection`](components/gamma_correction.md): A gamma correction value to be used with a scalar value or color. -* [`GraphEdgeDirected`](components/graph_edge_directed.md): A directed edge in a graph connecting two nodes. -* [`GraphEdgeUndirected`](components/graph_edge_undirected.md): An undirected edge in a graph connecting two nodes. -* [`GraphNodeId`](components/graph_node_id.md): A 32-bit ID representing a node in a graph. +* [`GraphEdge`](components/graph_edge.md): An edge in a graph connecting two nodes. +* [`GraphNode`](components/graph_node.md): A string-based ID representing a node in a graph. +* [`GraphType`](components/graph_type.md): Specifies if a graph has directed or undirected edges. * [`HalfSize2D`](components/half_size2d.md): Half-size (radius) of a 2D box. * [`HalfSize3D`](components/half_size3d.md): Half-size (radius) of a 3D box. * [`ImageBuffer`](components/image_buffer.md): A buffer that is known to store image data. diff --git a/docs/content/reference/types/components/.gitattributes b/docs/content/reference/types/components/.gitattributes index 9dc8fc370a5c..a4db0dfd448f 100644 --- a/docs/content/reference/types/components/.gitattributes +++ b/docs/content/reference/types/components/.gitattributes @@ -17,9 +17,9 @@ entity_path.md linguist-generated=true fill_mode.md linguist-generated=true fill_ratio.md linguist-generated=true gamma_correction.md linguist-generated=true -graph_edge_directed.md linguist-generated=true -graph_edge_undirected.md linguist-generated=true -graph_node_id.md linguist-generated=true +graph_edge.md linguist-generated=true +graph_node.md linguist-generated=true +graph_type.md linguist-generated=true half_size2d.md linguist-generated=true half_size3d.md linguist-generated=true image_buffer.md linguist-generated=true diff --git a/docs/content/reference/types/components/class_id.md b/docs/content/reference/types/components/class_id.md index cbf7dca8ea68..be0847bc2e4d 100644 --- a/docs/content/reference/types/components/class_id.md +++ b/docs/content/reference/types/components/class_id.md @@ -22,9 +22,6 @@ A 16-bit ID representing a type of semantic class. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index 8be33395fc02..2b44c7449f83 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,8 +26,6 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md new file mode 100644 index 000000000000..1771979ef3ac --- /dev/null +++ b/docs/content/reference/types/components/graph_edge.md @@ -0,0 +1,20 @@ +--- +title: "GraphEdge" +--- + + +An edge in a graph connecting two nodes. + +## Fields + +* edge: [`GraphEdge`](../datatypes/graph_edge.md) + +## API reference links + * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) + * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) + * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) + + +## Used by + +* [`GraphEdges`](../archetypes/graph_edges.md) diff --git a/docs/content/reference/types/components/graph_edge_directed.md b/docs/content/reference/types/components/graph_edge_directed.md deleted file mode 100644 index 0fb3d80ae2c8..000000000000 --- a/docs/content/reference/types/components/graph_edge_directed.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphEdgeDirected" ---- - - -A directed edge in a graph connecting two nodes. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeDirected.html) - * 🐍 [Python API docs for `GraphEdgeDirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeDirected) - * 🦀 [Rust API docs for `GraphEdgeDirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeDirected.html) - - -## Used by - -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) diff --git a/docs/content/reference/types/components/graph_edge_undirected.md b/docs/content/reference/types/components/graph_edge_undirected.md deleted file mode 100644 index b4e3fa0a5523..000000000000 --- a/docs/content/reference/types/components/graph_edge_undirected.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphEdgeUndirected" ---- - - -An undirected edge in a graph connecting two nodes. - -## Fields - -* edge: [`GraphEdge`](../datatypes/graph_edge.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdgeUndirected.html) - * 🐍 [Python API docs for `GraphEdgeUndirected`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdgeUndirected) - * 🦀 [Rust API docs for `GraphEdgeUndirected`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdgeUndirected.html) - - -## Used by - -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) diff --git a/docs/content/reference/types/components/graph_node.md b/docs/content/reference/types/components/graph_node.md new file mode 100644 index 000000000000..2a85374325b7 --- /dev/null +++ b/docs/content/reference/types/components/graph_node.md @@ -0,0 +1,20 @@ +--- +title: "GraphNode" +--- + + +A string-based ID representing a node in a graph. + +## Fields + +* id: [`GraphNode`](../datatypes/graph_node.md) + +## API reference links + * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html) + * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNode) + * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNode.html) + + +## Used by + +* [`GraphNodes`](../archetypes/graph_nodes.md) diff --git a/docs/content/reference/types/components/graph_node_id.md b/docs/content/reference/types/components/graph_node_id.md deleted file mode 100644 index b74c96382c09..000000000000 --- a/docs/content/reference/types/components/graph_node_id.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "GraphNodeId" ---- - - -A 32-bit ID representing a node in a graph. - -## Fields - -* id: [`GraphNodeId`](../datatypes/graph_node_id.md) - -## API reference links - * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNodeId.html) - * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNodeId) - * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNodeId.html) - - -## Used by - -* [`GraphNodes`](../archetypes/graph_nodes.md) diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md new file mode 100644 index 000000000000..4f766b10364a --- /dev/null +++ b/docs/content/reference/types/components/graph_type.md @@ -0,0 +1,20 @@ +--- +title: "GraphType" +--- + + +Specifies if a graph has directed or undirected edges. + +## Fields + +* graph_type: [`GraphType`](../datatypes/graph_type.md) + +## API reference links + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphType.html) + * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphType) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/struct.GraphType.html) + + +## Used by + +* [`GraphEdges`](../archetypes/graph_edges.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index cd2a4d8b19b3..31b40b8a4ae7 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,9 +26,6 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index 2af14a38050b..f04869ef164c 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,8 +22,6 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphEdgesDirected`](../archetypes/graph_edges_directed.md) -* [`GraphEdgesUndirected`](../archetypes/graph_edges_undirected.md) * [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index e1b8010b1f0d..6d28d552d1c4 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -19,9 +19,9 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`EntityPath`](datatypes/entity_path.md): A path to an entity in the `ChunkStore`. * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. -* [`GraphEdge`](datatypes/graph_edge.md): Represents an edge in a graph connecting two nodes (possibly in different entities). -* [`GraphLocation`](datatypes/graph_location.md): Uniquely identifies a node in a graph by its entity path and node id. -* [`GraphNodeId`](datatypes/graph_node_id.md): A 32-bit ID representing a node in a graph. +* [`GraphEdge`](datatypes/graph_edge.md): An edge in a graph connecting two nodes. +* [`GraphNode`](datatypes/graph_node.md): A string-based ID representing a node in a graph. +* [`GraphType`](datatypes/graph_type.md): Specifies if a graph has directed or undirected edges. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index 4a855f2d725d..09255112d119 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -14,8 +14,8 @@ entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true graph_edge.md linguist-generated=true -graph_location.md linguist-generated=true -graph_node_id.md linguist-generated=true +graph_node.md linguist-generated=true +graph_type.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/entity_path.md b/docs/content/reference/types/datatypes/entity_path.md index b4985a4f44bc..5e7a14c35223 100644 --- a/docs/content/reference/types/datatypes/entity_path.md +++ b/docs/content/reference/types/datatypes/entity_path.md @@ -1,21 +1,20 @@ --- title: "EntityPath" --- - A path to an entity in the `ChunkStore`. ## Fields -- path: `string` +* path: `string` ## API reference links + * 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) + * 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) + * 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) -- 🌊 [C++ API docs for `EntityPath`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1EntityPath.html) -- 🐍 [Python API docs for `EntityPath`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.EntityPath) -- 🦀 [Rust API docs for `EntityPath`](https://docs.rs/rerun/latest/rerun/datatypes/struct.EntityPath.html) ## Used by -- [`EntityPath`](../components/entity_path.md) +* [`EntityPath`](../components/entity_path.md) diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md index c739d535bf7d..d28d0a08292f 100644 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ b/docs/content/reference/types/datatypes/graph_edge.md @@ -3,12 +3,12 @@ title: "GraphEdge" --- -Represents an edge in a graph connecting two nodes (possibly in different entities). +An edge in a graph connecting two nodes. ## Fields -* source: [`GraphLocation`](../datatypes/graph_location.md) -* target: [`GraphLocation`](../datatypes/graph_location.md) +* source: [`GraphNode`](../datatypes/graph_node.md) +* target: [`GraphNode`](../datatypes/graph_node.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) @@ -18,5 +18,4 @@ Represents an edge in a graph connecting two nodes (possibly in different entiti ## Used by -* [`GraphEdgeDirected`](../components/graph_edge_directed.md) -* [`GraphEdgeUndirected`](../components/graph_edge_undirected.md) +* [`GraphEdge`](../components/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_location.md b/docs/content/reference/types/datatypes/graph_location.md deleted file mode 100644 index 73c4bb451fc3..000000000000 --- a/docs/content/reference/types/datatypes/graph_location.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "GraphLocation" ---- - - -Uniquely identifies a node in a graph by its entity path and node id. - -We require this because the same node id can be used in multiple entities. - -## Fields - -* entity_path: [`EntityPath`](../datatypes/entity_path.md) -* node_id: [`GraphNodeId`](../datatypes/graph_node_id.md) - -## API reference links - * 🌊 [C++ API docs for `GraphLocation`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphLocation.html) - * 🐍 [Python API docs for `GraphLocation`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphLocation) - * 🦀 [Rust API docs for `GraphLocation`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphLocation.html) - - -## Used by - -* [`GraphEdge`](../datatypes/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node.md b/docs/content/reference/types/datatypes/graph_node.md new file mode 100644 index 000000000000..f46b63970e32 --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_node.md @@ -0,0 +1,21 @@ +--- +title: "GraphNode" +--- + + +A string-based ID representing a node in a graph. + +## Fields + +* id: `string` + +## API reference links + * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNode.html) + * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNode) + * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNode.html) + + +## Used by + +* [`GraphEdge`](../datatypes/graph_edge.md) +* [`GraphNode`](../components/graph_node.md) diff --git a/docs/content/reference/types/datatypes/graph_node_id.md b/docs/content/reference/types/datatypes/graph_node_id.md deleted file mode 100644 index 960ff2c6617c..000000000000 --- a/docs/content/reference/types/datatypes/graph_node_id.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphNodeId" ---- - - -A 32-bit ID representing a node in a graph. - -## Fields - -* id: `string` - -## API reference links - * 🌊 [C++ API docs for `GraphNodeId`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNodeId.html) - * 🐍 [Python API docs for `GraphNodeId`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNodeId) - * 🦀 [Rust API docs for `GraphNodeId`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNodeId.html) - - -## Used by - -* [`GraphLocation`](../datatypes/graph_location.md) -* [`GraphNodeId`](../components/graph_node_id.md) diff --git a/docs/content/reference/types/datatypes/graph_type.md b/docs/content/reference/types/datatypes/graph_type.md new file mode 100644 index 000000000000..ec44318856dd --- /dev/null +++ b/docs/content/reference/types/datatypes/graph_type.md @@ -0,0 +1,21 @@ +--- +title: "GraphType" +--- + + +Specifies if a graph has directed or undirected edges. + +## Variants + +* Undirected +* Directed + +## API reference links + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1datatypes.html) + * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphType) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/datatypes/enum.GraphType.html) + + +## Used by + +* [`GraphType`](../components/graph_type.md) diff --git a/rerun_cpp/src/rerun/archetypes.hpp b/rerun_cpp/src/rerun/archetypes.hpp index 8465c54b56c3..a5a700e7808b 100644 --- a/rerun_cpp/src/rerun/archetypes.hpp +++ b/rerun_cpp/src/rerun/archetypes.hpp @@ -15,8 +15,7 @@ #include "archetypes/disconnected_space.hpp" #include "archetypes/ellipsoids3d.hpp" #include "archetypes/encoded_image.hpp" -#include "archetypes/graph_edges_directed.hpp" -#include "archetypes/graph_edges_undirected.hpp" +#include "archetypes/graph_edges.hpp" #include "archetypes/graph_nodes.hpp" #include "archetypes/image.hpp" #include "archetypes/instance_poses3d.hpp" diff --git a/rerun_cpp/src/rerun/archetypes/.gitattributes b/rerun_cpp/src/rerun/archetypes/.gitattributes index 98c0e80d8418..dd9503d9a9a0 100644 --- a/rerun_cpp/src/rerun/archetypes/.gitattributes +++ b/rerun_cpp/src/rerun/archetypes/.gitattributes @@ -27,10 +27,8 @@ ellipsoids3d.cpp linguist-generated=true ellipsoids3d.hpp linguist-generated=true encoded_image.cpp linguist-generated=true encoded_image.hpp linguist-generated=true -graph_edges_directed.cpp linguist-generated=true -graph_edges_directed.hpp linguist-generated=true -graph_edges_undirected.cpp linguist-generated=true -graph_edges_undirected.hpp linguist-generated=true +graph_edges.cpp linguist-generated=true +graph_edges.hpp linguist-generated=true graph_nodes.cpp linguist-generated=true graph_nodes.hpp linguist-generated=true image.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges.cpp new file mode 100644 index 000000000000..92b09a1b20f6 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.cpp @@ -0,0 +1,38 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#include "graph_edges.hpp" + +#include "../collection_adapter_builtins.hpp" + +namespace rerun::archetypes {} + +namespace rerun { + + Result> AsComponents::serialize( + const archetypes::GraphEdges& archetype + ) { + using namespace archetypes; + std::vector cells; + cells.reserve(3); + + { + auto result = ComponentBatch::from_loggable(archetype.edges); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.graph_type.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.graph_type.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + { + auto indicator = GraphEdges::IndicatorComponent(); + auto result = ComponentBatch::from_loggable(indicator); + RR_RETURN_NOT_OK(result.error); + cells.emplace_back(std::move(result.value)); + } + + return cells; + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp new file mode 100644 index 000000000000..d4384c68dc14 --- /dev/null +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp @@ -0,0 +1,66 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +#pragma once + +#include "../collection.hpp" +#include "../compiler_utils.hpp" +#include "../component_batch.hpp" +#include "../components/graph_edge.hpp" +#include "../components/graph_type.hpp" +#include "../indicator_component.hpp" +#include "../result.hpp" + +#include +#include +#include +#include + +namespace rerun::archetypes { + /// **Archetype**: A list of edges in a graph. + /// + /// By default, edges are undirected. + struct GraphEdges { + /// A list of node IDs. + Collection edges; + + /// Specifies if the graph is directed or undirected. + std::optional> graph_type; + + public: + static constexpr const char IndicatorComponentName[] = + "rerun.components.GraphEdgesIndicator"; + + /// Indicator component, used to identify the archetype when converting to a list of components. + using IndicatorComponent = rerun::components::IndicatorComponent; + + public: + GraphEdges() = default; + GraphEdges(GraphEdges&& other) = default; + + explicit GraphEdges(Collection _edges) + : edges(std::move(_edges)) {} + + /// Specifies if the graph is directed or undirected. + GraphEdges with_graph_type(Collection _graph_type) && { + graph_type = std::move(_graph_type); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + }; + +} // namespace rerun::archetypes + +namespace rerun { + /// \private + template + struct AsComponents; + + /// \private + template <> + struct AsComponents { + /// Serialize all set component batches. + static Result> serialize(const archetypes::GraphEdges& archetype + ); + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp deleted file mode 100644 index c528d1db50a7..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -#include "graph_edges_directed.hpp" - -#include "../collection_adapter_builtins.hpp" - -namespace rerun::archetypes {} - -namespace rerun { - - Result> AsComponents::serialize( - const archetypes::GraphEdgesDirected& archetype - ) { - using namespace archetypes; - std::vector cells; - cells.reserve(6); - - { - auto result = ComponentBatch::from_loggable(archetype.edges); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - { - auto indicator = GraphEdgesDirected::IndicatorComponent(); - auto result = ComponentBatch::from_loggable(indicator); - RR_RETURN_NOT_OK(result.error); - cells.emplace_back(std::move(result.value)); - } - - return cells; - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp deleted file mode 100644 index 25287f28ce3e..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_directed.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/class_id.hpp" -#include "../components/color.hpp" -#include "../components/graph_edge_directed.hpp" -#include "../components/show_labels.hpp" -#include "../components/text.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphEdgesDirected { - /// A list of node IDs. - Collection edges; - - /// Optional colors for the boxes. - std::optional> colors; - - /// Optional text labels for the node. - std::optional> labels; - - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; - - public: - static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphEdgesDirectedIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - GraphEdgesDirected() = default; - GraphEdgesDirected(GraphEdgesDirected&& other) = default; - - explicit GraphEdgesDirected(Collection _edges) - : edges(std::move(_edges)) {} - - /// Optional colors for the boxes. - GraphEdgesDirected with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional text labels for the node. - GraphEdgesDirected with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphEdgesDirected with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphEdgesDirected with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize( - const archetypes::GraphEdgesDirected& archetype - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp deleted file mode 100644 index 01a9a49ea1da..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#include "graph_edges_undirected.hpp" - -#include "../collection_adapter_builtins.hpp" - -namespace rerun::archetypes {} - -namespace rerun { - - Result> AsComponents::serialize( - const archetypes::GraphEdgesUndirected& archetype - ) { - using namespace archetypes; - std::vector cells; - cells.reserve(6); - - { - auto result = ComponentBatch::from_loggable(archetype.edges); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - { - auto indicator = GraphEdgesUndirected::IndicatorComponent(); - auto result = ComponentBatch::from_loggable(indicator); - RR_RETURN_NOT_OK(result.error); - cells.emplace_back(std::move(result.value)); - } - - return cells; - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp deleted file mode 100644 index 1ba357558f00..000000000000 --- a/rerun_cpp/src/rerun/archetypes/graph_edges_undirected.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -#pragma once - -#include "../collection.hpp" -#include "../compiler_utils.hpp" -#include "../component_batch.hpp" -#include "../components/class_id.hpp" -#include "../components/color.hpp" -#include "../components/graph_edge_undirected.hpp" -#include "../components/show_labels.hpp" -#include "../components/text.hpp" -#include "../indicator_component.hpp" -#include "../result.hpp" - -#include -#include -#include -#include - -namespace rerun::archetypes { - /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. - struct GraphEdgesUndirected { - /// A list of node IDs. - Collection edges; - - /// Optional colors for the boxes. - std::optional> colors; - - /// Optional text labels for the node. - std::optional> labels; - - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; - - public: - static constexpr const char IndicatorComponentName[] = - "rerun.components.GraphEdgesUndirectedIndicator"; - - /// Indicator component, used to identify the archetype when converting to a list of components. - using IndicatorComponent = rerun::components::IndicatorComponent; - - public: - GraphEdgesUndirected() = default; - GraphEdgesUndirected(GraphEdgesUndirected&& other) = default; - - explicit GraphEdgesUndirected(Collection _edges) - : edges(std::move(_edges)) {} - - /// Optional colors for the boxes. - GraphEdgesUndirected with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional text labels for the node. - GraphEdgesUndirected with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphEdgesUndirected with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphEdgesUndirected with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - }; - -} // namespace rerun::archetypes - -namespace rerun { - /// \private - template - struct AsComponents; - - /// \private - template <> - struct AsComponents { - /// Serialize all set component batches. - static Result> serialize( - const archetypes::GraphEdgesUndirected& archetype - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp index 2e1febe0fbca..328b645688c2 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp @@ -14,7 +14,7 @@ namespace rerun { ) { using namespace archetypes; std::vector cells; - cells.reserve(7); + cells.reserve(5); { auto result = ComponentBatch::from_loggable(archetype.node_ids); @@ -26,23 +26,13 @@ namespace rerun { RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.colors.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.colors.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.centers.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.centers.value()); + if (archetype.positions.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.positions.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.show_labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } - if (archetype.class_ids.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.class_ids.value()); + if (archetype.colors.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.colors.value()); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp index e97b80461f2b..1157f82ba4d2 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp @@ -6,11 +6,9 @@ #include "../collection.hpp" #include "../compiler_utils.hpp" #include "../component_batch.hpp" -#include "../components/class_id.hpp" #include "../components/color.hpp" -#include "../components/graph_node_id.hpp" +#include "../components/graph_node.hpp" #include "../components/position2d.hpp" -#include "../components/show_labels.hpp" #include "../components/text.hpp" #include "../indicator_component.hpp" #include "../result.hpp" @@ -24,24 +22,16 @@ namespace rerun::archetypes { /// **Archetype**: A list of nodes in a graph with optional labels, colors, etc. struct GraphNodes { /// A list of node IDs. - Collection node_ids; + Collection node_ids; /// Optional text labels for the node. std::optional> labels; - /// Optional colors for the boxes. - std::optional> colors; - /// Optional center positions of the nodes. - std::optional> centers; + std::optional> positions; - /// Optional choice of whether the text labels should be shown by default. - std::optional show_labels; - - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - std::optional> class_ids; + /// Optional colors for the boxes. + std::optional> colors; public: static constexpr const char IndicatorComponentName[] = @@ -54,7 +44,7 @@ namespace rerun::archetypes { GraphNodes() = default; GraphNodes(GraphNodes&& other) = default; - explicit GraphNodes(Collection _node_ids) + explicit GraphNodes(Collection _node_ids) : node_ids(std::move(_node_ids)) {} /// Optional text labels for the node. @@ -64,32 +54,16 @@ namespace rerun::archetypes { RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } - /// Optional colors for the boxes. - GraphNodes with_colors(Collection _colors) && { - colors = std::move(_colors); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - /// Optional center positions of the nodes. - GraphNodes with_centers(Collection _centers) && { - centers = std::move(_centers); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - - /// Optional choice of whether the text labels should be shown by default. - GraphNodes with_show_labels(rerun::components::ShowLabels _show_labels) && { - show_labels = std::move(_show_labels); + GraphNodes with_positions(Collection _positions) && { + positions = std::move(_positions); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } - /// Optional `components::ClassId`s for the boxes. - /// - /// The `components::ClassId` provides colors and labels if not specified explicitly. - GraphNodes with_class_ids(Collection _class_ids) && { - class_ids = std::move(_class_ids); + /// Optional colors for the boxes. + GraphNodes with_colors(Collection _colors) && { + colors = std::move(_colors); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } diff --git a/rerun_cpp/src/rerun/components.hpp b/rerun_cpp/src/rerun/components.hpp index 33653f4e4020..68687fda028a 100644 --- a/rerun_cpp/src/rerun/components.hpp +++ b/rerun_cpp/src/rerun/components.hpp @@ -18,9 +18,9 @@ #include "components/fill_mode.hpp" #include "components/fill_ratio.hpp" #include "components/gamma_correction.hpp" -#include "components/graph_edge_directed.hpp" -#include "components/graph_edge_undirected.hpp" -#include "components/graph_node_id.hpp" +#include "components/graph_edge.hpp" +#include "components/graph_node.hpp" +#include "components/graph_type.hpp" #include "components/half_size2d.hpp" #include "components/half_size3d.hpp" #include "components/image_buffer.hpp" diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 370edb1baa02..6c5adccb600e 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -21,9 +21,9 @@ fill_mode.cpp linguist-generated=true fill_mode.hpp linguist-generated=true fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true -graph_edge_directed.hpp linguist-generated=true -graph_edge_undirected.hpp linguist-generated=true -graph_node_id.hpp linguist-generated=true +graph_edge.hpp linguist-generated=true +graph_node.hpp linguist-generated=true +graph_type.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true image_buffer.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/components/graph_edge_directed.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp similarity index 76% rename from rerun_cpp/src/rerun/components/graph_edge_directed.hpp rename to rerun_cpp/src/rerun/components/graph_edge.hpp index 83cbe1e40020..08925f2aaf77 100644 --- a/rerun_cpp/src/rerun/components/graph_edge_directed.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". #pragma once @@ -11,16 +11,16 @@ #include namespace rerun::components { - /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphEdgeDirected { + /// **Component**: An edge in a graph connecting two nodes. + struct GraphEdge { rerun::datatypes::GraphEdge edge; public: - GraphEdgeDirected() = default; + GraphEdge() = default; - GraphEdgeDirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - GraphEdgeDirected& operator=(rerun::datatypes::GraphEdge edge_) { + GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { edge = std::move(edge_); return *this; } @@ -33,21 +33,21 @@ namespace rerun::components { } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeDirected)); + static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdgeDirected"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphEdge"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphEdgeDirected` into an arrow array. + /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. static Result> to_arrow( - const components::GraphEdgeDirected* instances, size_t num_instances + const components::GraphEdge* instances, size_t num_instances ) { if (num_instances == 0) { return Loggable::to_arrow(nullptr, 0); diff --git a/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp b/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp deleted file mode 100644 index f949d4040277..000000000000 --- a/rerun_cpp/src/rerun/components/graph_edge_undirected.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". - -#pragma once - -#include "../datatypes/graph_edge.hpp" -#include "../result.hpp" - -#include -#include -#include - -namespace rerun::components { - /// **Component**: An undirected edge in a graph connecting two nodes. - struct GraphEdgeUndirected { - rerun::datatypes::GraphEdge edge; - - public: - GraphEdgeUndirected() = default; - - GraphEdgeUndirected(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} - - GraphEdgeUndirected& operator=(rerun::datatypes::GraphEdge edge_) { - edge = std::move(edge_); - return *this; - } - - /// Cast to the underlying GraphEdge datatype - operator rerun::datatypes::GraphEdge() const { - return edge; - } - }; -} // namespace rerun::components - -namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdgeUndirected)); - - /// \private - template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphEdgeUndirected"; - - /// Returns the arrow data type this type corresponds to. - static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); - } - - /// Serializes an array of `rerun::components::GraphEdgeUndirected` into an arrow array. - static Result> to_arrow( - const components::GraphEdgeUndirected* instances, size_t num_instances - ) { - if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); - } else if (instances == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Passed array instances is null when num_elements> 0." - ); - } else { - return Loggable::to_arrow( - &instances->edge, - num_instances - ); - } - } - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/components/graph_node_id.hpp b/rerun_cpp/src/rerun/components/graph_node.hpp similarity index 55% rename from rerun_cpp/src/rerun/components/graph_node_id.hpp rename to rerun_cpp/src/rerun/components/graph_node.hpp index d63ad98bda84..1b2f6fc5b3e9 100644 --- a/rerun_cpp/src/rerun/components/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/components/graph_node.hpp @@ -1,9 +1,9 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". #pragma once -#include "../datatypes/graph_node_id.hpp" +#include "../datatypes/graph_node.hpp" #include "../result.hpp" #include @@ -12,60 +12,60 @@ #include namespace rerun::components { - /// **Component**: A 32-bit ID representing a node in a graph. - struct GraphNodeId { - rerun::datatypes::GraphNodeId id; + /// **Component**: A string-based ID representing a node in a graph. + struct GraphNode { + rerun::datatypes::GraphNode id; public: - GraphNodeId() = default; + GraphNode() = default; - GraphNodeId(rerun::datatypes::GraphNodeId id_) : id(std::move(id_)) {} + GraphNode(rerun::datatypes::GraphNode id_) : id(std::move(id_)) {} - GraphNodeId& operator=(rerun::datatypes::GraphNodeId id_) { + GraphNode& operator=(rerun::datatypes::GraphNode id_) { id = std::move(id_); return *this; } - GraphNodeId(std::string id_) : id(std::move(id_)) {} + GraphNode(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(std::string id_) { + GraphNode& operator=(std::string id_) { id = std::move(id_); return *this; } - /// Cast to the underlying GraphNodeId datatype - operator rerun::datatypes::GraphNodeId() const { + /// Cast to the underlying GraphNode datatype + operator rerun::datatypes::GraphNode() const { return id; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphNodeId) == sizeof(components::GraphNodeId)); + static_assert(sizeof(rerun::datatypes::GraphNode) == sizeof(components::GraphNode)); /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.components.GraphNodeId"; + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphNode"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } - /// Serializes an array of `rerun::components::GraphNodeId` into an arrow array. + /// Serializes an array of `rerun::components::GraphNode` into an arrow array. static Result> to_arrow( - const components::GraphNodeId* instances, size_t num_instances + const components::GraphNode* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( + return Loggable::to_arrow( &instances->id, num_instances ); diff --git a/rerun_cpp/src/rerun/components/graph_type.hpp b/rerun_cpp/src/rerun/components/graph_type.hpp new file mode 100644 index 000000000000..860b6945b78e --- /dev/null +++ b/rerun_cpp/src/rerun/components/graph_type.hpp @@ -0,0 +1,66 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". + +#pragma once + +#include "../datatypes/graph_type.hpp" +#include "../result.hpp" + +#include +#include + +namespace rerun::components { + /// **Component**: Specifies if a graph has directed or undirected edges. + struct GraphType { + rerun::datatypes::GraphType graph_type; + + public: + GraphType() = default; + + GraphType(rerun::datatypes::GraphType graph_type_) : graph_type(graph_type_) {} + + GraphType& operator=(rerun::datatypes::GraphType graph_type_) { + graph_type = graph_type_; + return *this; + } + + /// Cast to the underlying GraphType datatype + operator rerun::datatypes::GraphType() const { + return graph_type; + } + }; +} // namespace rerun::components + +namespace rerun { + static_assert(sizeof(rerun::datatypes::GraphType) == sizeof(components::GraphType)); + + /// \private + template <> + struct Loggable { + static constexpr const char Name[] = "rerun.components.GraphType"; + + /// Returns the arrow data type this type corresponds to. + static const std::shared_ptr& arrow_datatype() { + return Loggable::arrow_datatype(); + } + + /// Serializes an array of `rerun::components::GraphType` into an arrow array. + static Result> to_arrow( + const components::GraphType* instances, size_t num_instances + ) { + if (num_instances == 0) { + return Loggable::to_arrow(nullptr, 0); + } else if (instances == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Passed array instances is null when num_elements> 0." + ); + } else { + return Loggable::to_arrow( + &instances->graph_type, + num_instances + ); + } + } + }; +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index de1b06885622..4be967809c3a 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -15,8 +15,8 @@ #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" #include "datatypes/graph_edge.hpp" -#include "datatypes/graph_location.hpp" -#include "datatypes/graph_node_id.hpp" +#include "datatypes/graph_node.hpp" +#include "datatypes/graph_type.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 923a0a15924f..3b6db9b9e234 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -27,10 +27,10 @@ float64.cpp linguist-generated=true float64.hpp linguist-generated=true graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true -graph_location.cpp linguist-generated=true -graph_location.hpp linguist-generated=true -graph_node_id.cpp linguist-generated=true -graph_node_id.hpp linguist-generated=true +graph_node.cpp linguist-generated=true +graph_node.hpp linguist-generated=true +graph_type.cpp linguist-generated=true +graph_type.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp index 28f4e9286da8..1e4134b5873c 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.cpp @@ -3,7 +3,7 @@ #include "graph_edge.hpp" -#include "graph_location.hpp" +#include "graph_node.hpp" #include #include @@ -13,16 +13,8 @@ namespace rerun::datatypes {} namespace rerun { const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::struct_({ - arrow::field( - "source", - Loggable::arrow_datatype(), - false - ), - arrow::field( - "target", - Loggable::arrow_datatype(), - false - ), + arrow::field("source", Loggable::arrow_datatype(), false), + arrow::field("target", Loggable::arrow_datatype(), false), }); return datatype; } @@ -61,29 +53,25 @@ namespace rerun { } { - auto field_builder = static_cast(builder->field_builder(0)); + auto field_builder = static_cast(builder->field_builder(0)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].source, - 1 - ) - ); + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].source, + 1 + )); } } { - auto field_builder = static_cast(builder->field_builder(1)); + auto field_builder = static_cast(builder->field_builder(1)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK( - Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].target, - 1 - ) - ); + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + field_builder, + &elements[elem_idx].target, + 1 + )); } } ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp index eec468dc4e75..edaf93bb6737 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_edge.hpp @@ -4,7 +4,7 @@ #pragma once #include "../result.hpp" -#include "graph_location.hpp" +#include "graph_node.hpp" #include #include @@ -16,13 +16,13 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities). + /// **Datatype**: An edge in a graph connecting two nodes. struct GraphEdge { /// The id of the source node. - rerun::datatypes::GraphLocation source; + rerun::datatypes::GraphNode source; /// The id of the target node. - rerun::datatypes::GraphLocation target; + rerun::datatypes::GraphNode target; public: GraphEdge() = default; diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.cpp b/rerun_cpp/src/rerun/datatypes/graph_location.cpp deleted file mode 100644 index 5d7620f53c3e..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_location.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -#include "graph_location.hpp" - -#include "entity_path.hpp" -#include "graph_node_id.hpp" - -#include -#include - -namespace rerun::datatypes {} - -namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::struct_({ - arrow::field( - "entity_path", - Loggable::arrow_datatype(), - false - ), - arrow::field( - "node_id", - Loggable::arrow_datatype(), - false - ), - }); - return datatype; - } - - Result> Loggable::to_arrow( - const datatypes::GraphLocation* instances, size_t num_instances - ) { - // TODO(andreas): Allow configuring the memory pool. - arrow::MemoryPool* pool = arrow::default_memory_pool(); - auto datatype = arrow_datatype(); - - ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) - if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), - instances, - num_instances - )); - } - std::shared_ptr array; - ARROW_RETURN_NOT_OK(builder->Finish(&array)); - return array; - } - - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, size_t num_elements - ) { - if (builder == nullptr) { - return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); - } - if (elements == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Cannot serialize null pointer to arrow array." - ); - } - - { - auto field_builder = static_cast(builder->field_builder(0)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].entity_path, - 1 - )); - } - } - { - auto field_builder = static_cast(builder->field_builder(1)); - ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - field_builder, - &elements[elem_idx].node_id, - 1 - )); - } - } - ARROW_RETURN_NOT_OK(builder->AppendValues(static_cast(num_elements), nullptr)); - - return Error::ok(); - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp b/rerun_cpp/src/rerun/datatypes/graph_node.cpp similarity index 82% rename from rerun_cpp/src/rerun/datatypes/graph_node_id.cpp rename to rerun_cpp/src/rerun/datatypes/graph_node.cpp index 3fc45d4d8926..bd40260590f0 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.cpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node.cpp @@ -1,7 +1,7 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". -#include "graph_node_id.hpp" +#include "graph_node.hpp" #include #include @@ -9,13 +9,13 @@ namespace rerun::datatypes {} namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { + const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::utf8(); return datatype; } - Result> Loggable::to_arrow( - const datatypes::GraphNodeId* instances, size_t num_instances + Result> Loggable::to_arrow( + const datatypes::GraphNode* instances, size_t num_instances ) { // TODO(andreas): Allow configuring the memory pool. arrow::MemoryPool* pool = arrow::default_memory_pool(); @@ -23,7 +23,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( static_cast(builder.get()), instances, num_instances @@ -34,8 +34,8 @@ namespace rerun { return array; } - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, size_t num_elements + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); diff --git a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp b/rerun_cpp/src/rerun/datatypes/graph_node.hpp similarity index 68% rename from rerun_cpp/src/rerun/datatypes/graph_node_id.hpp rename to rerun_cpp/src/rerun/datatypes/graph_node.hpp index 3a29ab76e9cd..109a872dd06c 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_node_id.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_node.hpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". #pragma once @@ -17,16 +17,16 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: A 32-bit ID representing a node in a graph. - struct GraphNodeId { + /// **Datatype**: A string-based ID representing a node in a graph. + struct GraphNode { std::string id; public: - GraphNodeId() = default; + GraphNode() = default; - GraphNodeId(std::string id_) : id(std::move(id_)) {} + GraphNode(std::string id_) : id(std::move(id_)) {} - GraphNodeId& operator=(std::string id_) { + GraphNode& operator=(std::string id_) { id = std::move(id_); return *this; } @@ -39,21 +39,20 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphNodeId"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphNode"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphNodeId` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphNode` into an arrow array. static Result> to_arrow( - const datatypes::GraphNodeId* instances, size_t num_instances + const datatypes::GraphNode* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNodeId* elements, - size_t num_elements + arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.cpp b/rerun_cpp/src/rerun/datatypes/graph_type.cpp new file mode 100644 index 000000000000..678579db8df6 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/graph_type.cpp @@ -0,0 +1,56 @@ +// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +#include "graph_type.hpp" + +#include +#include + +namespace rerun { + const std::shared_ptr& Loggable::arrow_datatype() { + static const auto datatype = arrow::uint8(); + return datatype; + } + + Result> Loggable::to_arrow( + const datatypes::GraphType* instances, size_t num_instances + ) { + // TODO(andreas): Allow configuring the memory pool. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + auto datatype = arrow_datatype(); + + ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) + if (instances && num_instances > 0) { + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + static_cast(builder.get()), + instances, + num_instances + )); + } + std::shared_ptr array; + ARROW_RETURN_NOT_OK(builder->Finish(&array)); + return array; + } + + rerun::Error Loggable::fill_arrow_array_builder( + arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements + ) { + if (builder == nullptr) { + return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); + } + if (elements == nullptr) { + return rerun::Error( + ErrorCode::UnexpectedNullArgument, + "Cannot serialize null pointer to arrow array." + ); + } + + ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); + for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { + const auto variant = elements[elem_idx]; + ARROW_RETURN_NOT_OK(builder->Append(static_cast(variant))); + } + + return Error::ok(); + } +} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_location.hpp b/rerun_cpp/src/rerun/datatypes/graph_type.hpp similarity index 50% rename from rerun_cpp/src/rerun/datatypes/graph_location.hpp rename to rerun_cpp/src/rerun/datatypes/graph_type.hpp index 6bb821a792f2..bd9293bb27ac 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_location.hpp +++ b/rerun_cpp/src/rerun/datatypes/graph_type.hpp @@ -1,34 +1,33 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". #pragma once #include "../result.hpp" -#include "entity_path.hpp" -#include "graph_node_id.hpp" #include #include namespace arrow { + /// \private + template + class NumericBuilder; + class Array; class DataType; - class StructBuilder; + class UInt8Type; + using UInt8Builder = NumericBuilder; } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. - /// - /// We require this because the same node id can be used in multiple entities. - struct GraphLocation { - /// The entity path that specifies where to find the node. - rerun::datatypes::EntityPath entity_path; - - /// The id of the node. - rerun::datatypes::GraphNodeId node_id; - - public: - GraphLocation() = default; + /// **Datatype**: Specifies if a graph has directed or undirected edges. + enum class GraphType : uint8_t { + + /// The graph has undirected edges. + Undirected = 1, + + /// The graph has directed edges. + Directed = 2, }; } // namespace rerun::datatypes @@ -38,21 +37,20 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphLocation"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.GraphType"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphLocation` into an arrow array. + /// Serializes an array of `rerun::datatypes::GraphType` into an arrow array. static Result> to_arrow( - const datatypes::GraphLocation* instances, size_t num_instances + const datatypes::GraphType* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphLocation* elements, - size_t num_elements + arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes index 7f2f7f651e9d..09937336c43a 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/archetypes/.gitattributes @@ -15,8 +15,7 @@ depth_image.py linguist-generated=true disconnected_space.py linguist-generated=true ellipsoids3d.py linguist-generated=true encoded_image.py linguist-generated=true -graph_edges_directed.py linguist-generated=true -graph_edges_undirected.py linguist-generated=true +graph_edges.py linguist-generated=true graph_nodes.py linguist-generated=true image.py linguist-generated=true instance_poses3d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py index e10bef316177..5ed9e4b83586 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/__init__.py @@ -15,8 +15,7 @@ from .disconnected_space import DisconnectedSpace from .ellipsoids3d import Ellipsoids3D from .encoded_image import EncodedImage -from .graph_edges_directed import GraphEdgesDirected -from .graph_edges_undirected import GraphEdgesUndirected +from .graph_edges import GraphEdges from .graph_nodes import GraphNodes from .image import Image from .instance_poses3d import InstancePoses3D @@ -51,8 +50,7 @@ "DisconnectedSpace", "Ellipsoids3D", "EncodedImage", - "GraphEdgesDirected", - "GraphEdgesUndirected", + "GraphEdges", "GraphNodes", "Image", "InstancePoses3D", diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py new file mode 100644 index 000000000000..cd7d06673108 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -0,0 +1,82 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs". + +# You can extend this class by creating a "GraphEdgesExt" class in "graph_edges_ext.py". + +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from .. import components, datatypes +from .._baseclasses import ( + Archetype, +) +from ..error_utils import catch_and_log_exceptions + +__all__ = ["GraphEdges"] + + +@define(str=False, repr=False, init=False) +class GraphEdges(Archetype): + """ + **Archetype**: A list of edges in a graph. + + By default, edges are undirected. + """ + + def __init__( + self: Any, edges: datatypes.GraphEdgeArrayLike, *, graph_type: datatypes.GraphTypeArrayLike | None = None + ): + """ + Create a new instance of the GraphEdges archetype. + + Parameters + ---------- + edges: + A list of node IDs. + graph_type: + Specifies if the graph is directed or undirected. + + """ + + # You can define your own __init__ function as a member of GraphEdgesExt in graph_edges_ext.py + with catch_and_log_exceptions(context=self.__class__.__name__): + self.__attrs_init__(edges=edges, graph_type=graph_type) + return + self.__attrs_clear__() + + def __attrs_clear__(self) -> None: + """Convenience method for calling `__attrs_init__` with all `None`s.""" + self.__attrs_init__( + edges=None, # type: ignore[arg-type] + graph_type=None, # type: ignore[arg-type] + ) + + @classmethod + def _clear(cls) -> GraphEdges: + """Produce an empty GraphEdges, bypassing `__init__`.""" + inst = cls.__new__(cls) + inst.__attrs_clear__() + return inst + + edges: components.GraphEdgeBatch = field( + metadata={"component": "required"}, + converter=components.GraphEdgeBatch._required, # type: ignore[misc] + ) + # A list of node IDs. + # + # (Docstring intentionally commented out to hide this field from the docs) + + graph_type: components.GraphTypeBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.GraphTypeBatch._optional, # type: ignore[misc] + ) + # Specifies if the graph is directed or undirected. + # + # (Docstring intentionally commented out to hide this field from the docs) + + __str__ = Archetype.__str__ + __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py deleted file mode 100644 index 8fd3b6349d38..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_directed.py +++ /dev/null @@ -1,124 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_directed.fbs". - -# You can extend this class by creating a "GraphEdgesDirectedExt" class in "graph_edges_directed_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["GraphEdgesDirected"] - - -@define(str=False, repr=False, init=False) -class GraphEdgesDirected(Archetype): - """**Archetype**: A list of directed edges in a graph with optional labels, colors, etc.""" - - def __init__( - self: Any, - edges: datatypes.GraphEdgeArrayLike, - *, - colors: datatypes.Rgba32ArrayLike | None = None, - labels: datatypes.Utf8ArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, - ): - """ - Create a new instance of the GraphEdgesDirected archetype. - - Parameters - ---------- - edges: - A list of node IDs. - colors: - Optional colors for the boxes. - labels: - Optional text labels for the node. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - - """ - - # You can define your own __init__ function as a member of GraphEdgesDirectedExt in graph_edges_directed_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - edges=None, # type: ignore[arg-type] - colors=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> GraphEdgesDirected: - """Produce an empty GraphEdgesDirected, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - edges: components.GraphEdgeDirectedBatch = field( - metadata={"component": "required"}, - converter=components.GraphEdgeDirectedBatch._required, # type: ignore[misc] - ) - # A list of node IDs. - # - # (Docstring intentionally commented out to hide this field from the docs) - - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] - ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py deleted file mode 100644 index 347c4f0b645d..000000000000 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges_undirected.py +++ /dev/null @@ -1,124 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/archetypes/graph_edges_undirected.fbs". - -# You can extend this class by creating a "GraphEdgesUndirectedExt" class in "graph_edges_undirected_ext.py". - -from __future__ import annotations - -from typing import Any - -from attrs import define, field - -from .. import components, datatypes -from .._baseclasses import ( - Archetype, -) -from ..error_utils import catch_and_log_exceptions - -__all__ = ["GraphEdgesUndirected"] - - -@define(str=False, repr=False, init=False) -class GraphEdgesUndirected(Archetype): - """**Archetype**: A list of undirected edges in a graph with optional labels, colors, etc.""" - - def __init__( - self: Any, - edges: datatypes.GraphEdgeArrayLike, - *, - colors: datatypes.Rgba32ArrayLike | None = None, - labels: datatypes.Utf8ArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, - ): - """ - Create a new instance of the GraphEdgesUndirected archetype. - - Parameters - ---------- - edges: - A list of node IDs. - colors: - Optional colors for the boxes. - labels: - Optional text labels for the node. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - - """ - - # You can define your own __init__ function as a member of GraphEdgesUndirectedExt in graph_edges_undirected_ext.py - with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(edges=edges, colors=colors, labels=labels, show_labels=show_labels, class_ids=class_ids) - return - self.__attrs_clear__() - - def __attrs_clear__(self) -> None: - """Convenience method for calling `__attrs_init__` with all `None`s.""" - self.__attrs_init__( - edges=None, # type: ignore[arg-type] - colors=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] - ) - - @classmethod - def _clear(cls) -> GraphEdgesUndirected: - """Produce an empty GraphEdgesUndirected, bypassing `__init__`.""" - inst = cls.__new__(cls) - inst.__attrs_clear__() - return inst - - edges: components.GraphEdgeUndirectedBatch = field( - metadata={"component": "required"}, - converter=components.GraphEdgeUndirectedBatch._required, # type: ignore[misc] - ) - # A list of node IDs. - # - # (Docstring intentionally commented out to hide this field from the docs) - - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] - ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. - # - # (Docstring intentionally commented out to hide this field from the docs) - - __str__ = Archetype.__str__ - __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py index ad6fb9244bc5..f3c48d6a5483 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py @@ -24,13 +24,11 @@ class GraphNodes(Archetype): def __init__( self: Any, - node_ids: datatypes.GraphNodeIdArrayLike, + node_ids: datatypes.GraphNodeArrayLike, *, labels: datatypes.Utf8ArrayLike | None = None, + positions: datatypes.Vec2DArrayLike | None = None, colors: datatypes.Rgba32ArrayLike | None = None, - centers: datatypes.Vec2DArrayLike | None = None, - show_labels: datatypes.BoolLike | None = None, - class_ids: datatypes.ClassIdArrayLike | None = None, ): """ Create a new instance of the GraphNodes archetype. @@ -41,29 +39,16 @@ def __init__( A list of node IDs. labels: Optional text labels for the node. + positions: + Optional center positions of the nodes. colors: Optional colors for the boxes. - centers: - Optional center positions of the nodes. - show_labels: - Optional choice of whether the text labels should be shown by default. - class_ids: - Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - - The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. """ # You can define your own __init__ function as a member of GraphNodesExt in graph_nodes_ext.py with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__( - node_ids=node_ids, - labels=labels, - colors=colors, - centers=centers, - show_labels=show_labels, - class_ids=class_ids, - ) + self.__attrs_init__(node_ids=node_ids, labels=labels, positions=positions, colors=colors) return self.__attrs_clear__() @@ -72,10 +57,8 @@ def __attrs_clear__(self) -> None: self.__attrs_init__( node_ids=None, # type: ignore[arg-type] labels=None, # type: ignore[arg-type] + positions=None, # type: ignore[arg-type] colors=None, # type: ignore[arg-type] - centers=None, # type: ignore[arg-type] - show_labels=None, # type: ignore[arg-type] - class_ids=None, # type: ignore[arg-type] ) @classmethod @@ -85,9 +68,9 @@ def _clear(cls) -> GraphNodes: inst.__attrs_clear__() return inst - node_ids: components.GraphNodeIdBatch = field( + node_ids: components.GraphNodeBatch = field( metadata={"component": "required"}, - converter=components.GraphNodeIdBatch._required, # type: ignore[misc] + converter=components.GraphNodeBatch._required, # type: ignore[misc] ) # A list of node IDs. # @@ -102,16 +85,7 @@ def _clear(cls) -> GraphNodes: # # (Docstring intentionally commented out to hide this field from the docs) - colors: components.ColorBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ColorBatch._optional, # type: ignore[misc] - ) - # Optional colors for the boxes. - # - # (Docstring intentionally commented out to hide this field from the docs) - - centers: components.Position2DBatch | None = field( + positions: components.Position2DBatch | None = field( metadata={"component": "optional"}, default=None, converter=components.Position2DBatch._optional, # type: ignore[misc] @@ -120,23 +94,12 @@ def _clear(cls) -> GraphNodes: # # (Docstring intentionally commented out to hide this field from the docs) - show_labels: components.ShowLabelsBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.ShowLabelsBatch._optional, # type: ignore[misc] - ) - # Optional choice of whether the text labels should be shown by default. - # - # (Docstring intentionally commented out to hide this field from the docs) - - class_ids: components.ClassIdBatch | None = field( + colors: components.ColorBatch | None = field( metadata={"component": "optional"}, default=None, - converter=components.ClassIdBatch._optional, # type: ignore[misc] + converter=components.ColorBatch._optional, # type: ignore[misc] ) - # Optional [`components.ClassId`][rerun.components.ClassId]s for the boxes. - # - # The [`components.ClassId`][rerun.components.ClassId] provides colors and labels if not specified explicitly. + # Optional colors for the boxes. # # (Docstring intentionally commented out to hide this field from the docs) diff --git a/rerun_py/rerun_sdk/rerun/components/.gitattributes b/rerun_py/rerun_sdk/rerun/components/.gitattributes index e23a94f9df5d..b58a29ae3dac 100644 --- a/rerun_py/rerun_sdk/rerun/components/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/components/.gitattributes @@ -18,9 +18,9 @@ entity_path.py linguist-generated=true fill_mode.py linguist-generated=true fill_ratio.py linguist-generated=true gamma_correction.py linguist-generated=true -graph_edge_directed.py linguist-generated=true -graph_edge_undirected.py linguist-generated=true -graph_node_id.py linguist-generated=true +graph_edge.py linguist-generated=true +graph_node.py linguist-generated=true +graph_type.py linguist-generated=true half_size2d.py linguist-generated=true half_size3d.py linguist-generated=true image_buffer.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index f4c280e724bc..4c07d684c17f 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -30,9 +30,9 @@ from .fill_mode import FillMode, FillModeArrayLike, FillModeBatch, FillModeLike, FillModeType from .fill_ratio import FillRatio, FillRatioBatch, FillRatioType from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType -from .graph_edge_directed import GraphEdgeDirected, GraphEdgeDirectedBatch, GraphEdgeDirectedType -from .graph_edge_undirected import GraphEdgeUndirected, GraphEdgeUndirectedBatch, GraphEdgeUndirectedType -from .graph_node_id import GraphNodeId, GraphNodeIdBatch, GraphNodeIdType +from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType +from .graph_node import GraphNode, GraphNodeBatch, GraphNodeType +from .graph_type import GraphType, GraphTypeBatch, GraphTypeType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType from .image_buffer import ImageBuffer, ImageBufferBatch, ImageBufferType @@ -154,15 +154,15 @@ "GammaCorrection", "GammaCorrectionBatch", "GammaCorrectionType", - "GraphEdgeDirected", - "GraphEdgeDirectedBatch", - "GraphEdgeDirectedType", - "GraphEdgeUndirected", - "GraphEdgeUndirectedBatch", - "GraphEdgeUndirectedType", - "GraphNodeId", - "GraphNodeIdBatch", - "GraphNodeIdType", + "GraphEdge", + "GraphEdgeBatch", + "GraphEdgeType", + "GraphNode", + "GraphNodeBatch", + "GraphNodeType", + "GraphType", + "GraphTypeBatch", + "GraphTypeType", "HalfSize2D", "HalfSize2DBatch", "HalfSize2DType", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py new file mode 100644 index 000000000000..62f0bded664e --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_edge.fbs". + +# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] + + +class GraphEdge(datatypes.GraphEdge, ComponentMixin): + """**Component**: An edge in a graph connecting two nodes.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py + + # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge + pass + + +class GraphEdgeType(datatypes.GraphEdgeType): + _TYPE_NAME: str = "rerun.components.GraphEdge" + + +class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphEdgeType() + + +# This is patched in late to avoid circular dependencies. +GraphEdge._BATCH_TYPE = GraphEdgeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py deleted file mode 100644 index 590596f6755e..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge_directed.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_directed.fbs". - -# You can extend this class by creating a "GraphEdgeDirectedExt" class in "graph_edge_directed_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdgeDirected", "GraphEdgeDirectedBatch", "GraphEdgeDirectedType"] - - -class GraphEdgeDirected(datatypes.GraphEdge, ComponentMixin): - """**Component**: A directed edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeDirectedExt in graph_edge_directed_ext.py - - # Note: there are no fields here because GraphEdgeDirected delegates to datatypes.GraphEdge - pass - - -class GraphEdgeDirectedType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdgeDirected" - - -class GraphEdgeDirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeDirectedType() - - -# This is patched in late to avoid circular dependencies. -GraphEdgeDirected._BATCH_TYPE = GraphEdgeDirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py b/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py deleted file mode 100644 index 0519c78ebaae..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge_undirected.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_edge_undirected.fbs". - -# You can extend this class by creating a "GraphEdgeUndirectedExt" class in "graph_edge_undirected_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphEdgeUndirected", "GraphEdgeUndirectedBatch", "GraphEdgeUndirectedType"] - - -class GraphEdgeUndirected(datatypes.GraphEdge, ComponentMixin): - """**Component**: An undirected edge in a graph connecting two nodes.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphEdgeUndirectedExt in graph_edge_undirected_ext.py - - # Note: there are no fields here because GraphEdgeUndirected delegates to datatypes.GraphEdge - pass - - -class GraphEdgeUndirectedType(datatypes.GraphEdgeType): - _TYPE_NAME: str = "rerun.components.GraphEdgeUndirected" - - -class GraphEdgeUndirectedBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphEdgeUndirectedType() - - -# This is patched in late to avoid circular dependencies. -GraphEdgeUndirected._BATCH_TYPE = GraphEdgeUndirectedBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node.py b/rerun_py/rerun_sdk/rerun/components/graph_node.py new file mode 100644 index 000000000000..89bdfcb71fc2 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_node.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_node.fbs". + +# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphNode", "GraphNodeBatch", "GraphNodeType"] + + +class GraphNode(datatypes.GraphNode, ComponentMixin): + """**Component**: A string-based ID representing a node in a graph.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py + + # Note: there are no fields here because GraphNode delegates to datatypes.GraphNode + pass + + +class GraphNodeType(datatypes.GraphNodeType): + _TYPE_NAME: str = "rerun.components.GraphNode" + + +class GraphNodeBatch(datatypes.GraphNodeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphNodeType() + + +# This is patched in late to avoid circular dependencies. +GraphNode._BATCH_TYPE = GraphNodeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py b/rerun_py/rerun_sdk/rerun/components/graph_node_id.py deleted file mode 100644 index 4ff668e9281c..000000000000 --- a/rerun_py/rerun_sdk/rerun/components/graph_node_id.py +++ /dev/null @@ -1,36 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/components/graph_node_id.fbs". - -# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". - -from __future__ import annotations - -from .. import datatypes -from .._baseclasses import ( - ComponentBatchMixin, - ComponentMixin, -) - -__all__ = ["GraphNodeId", "GraphNodeIdBatch", "GraphNodeIdType"] - - -class GraphNodeId(datatypes.GraphNodeId, ComponentMixin): - """**Component**: A 32-bit ID representing a node in a graph.""" - - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py - - # Note: there are no fields here because GraphNodeId delegates to datatypes.GraphNodeId - pass - - -class GraphNodeIdType(datatypes.GraphNodeIdType): - _TYPE_NAME: str = "rerun.components.GraphNodeId" - - -class GraphNodeIdBatch(datatypes.GraphNodeIdBatch, ComponentBatchMixin): - _ARROW_TYPE = GraphNodeIdType() - - -# This is patched in late to avoid circular dependencies. -GraphNodeId._BATCH_TYPE = GraphNodeIdBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/components/graph_type.py b/rerun_py/rerun_sdk/rerun/components/graph_type.py new file mode 100644 index 000000000000..b832efe7886a --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/components/graph_type.py @@ -0,0 +1,36 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". + +# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". + +from __future__ import annotations + +from .. import datatypes +from .._baseclasses import ( + ComponentBatchMixin, + ComponentMixin, +) + +__all__ = ["GraphType", "GraphTypeBatch", "GraphTypeType"] + + +class GraphType(datatypes.GraphType, ComponentMixin): + """**Component**: Specifies if a graph has directed or undirected edges.""" + + _BATCH_TYPE = None + # You can define your own __init__ function as a member of GraphTypeExt in graph_type_ext.py + + # Note: there are no fields here because GraphType delegates to datatypes.GraphType + pass + + +class GraphTypeType(datatypes.GraphTypeType): + _TYPE_NAME: str = "rerun.components.GraphType" + + +class GraphTypeBatch(datatypes.GraphTypeBatch, ComponentBatchMixin): + _ARROW_TYPE = GraphTypeType() + + +# This is patched in late to avoid circular dependencies. +GraphType._BATCH_TYPE = GraphTypeBatch # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index af6b5ed76347..95631c93b9f7 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -15,8 +15,8 @@ entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true graph_edge.py linguist-generated=true -graph_location.py linguist-generated=true -graph_node_id.py linguist-generated=true +graph_node.py linguist-generated=true +graph_type.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 5428717d75c0..91e7977ca4fa 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -39,14 +39,8 @@ from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType -from .graph_location import ( - GraphLocation, - GraphLocationArrayLike, - GraphLocationBatch, - GraphLocationLike, - GraphLocationType, -) -from .graph_node_id import GraphNodeId, GraphNodeIdArrayLike, GraphNodeIdBatch, GraphNodeIdLike, GraphNodeIdType +from .graph_node import GraphNode, GraphNodeArrayLike, GraphNodeBatch, GraphNodeLike, GraphNodeType +from .graph_type import GraphType, GraphTypeArrayLike, GraphTypeBatch, GraphTypeLike, GraphTypeType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -195,16 +189,16 @@ "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType", - "GraphLocation", - "GraphLocationArrayLike", - "GraphLocationBatch", - "GraphLocationLike", - "GraphLocationType", - "GraphNodeId", - "GraphNodeIdArrayLike", - "GraphNodeIdBatch", - "GraphNodeIdLike", - "GraphNodeIdType", + "GraphNode", + "GraphNodeArrayLike", + "GraphNodeBatch", + "GraphNodeLike", + "GraphNodeType", + "GraphType", + "GraphTypeArrayLike", + "GraphTypeBatch", + "GraphTypeLike", + "GraphTypeType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py index 3fc8c8953901..600b8feaab3f 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py @@ -19,11 +19,25 @@ __all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] +def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: + if isinstance(x, datatypes.GraphNode): + return x + else: + return datatypes.GraphNode(x) + + +def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: + if isinstance(x, datatypes.GraphNode): + return x + else: + return datatypes.GraphNode(x) + + @define(init=False) class GraphEdge: - """**Datatype**: Represents an edge in a graph connecting two nodes (possibly in different entities).""" + """**Datatype**: An edge in a graph connecting two nodes.""" - def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.GraphLocationLike): + def __init__(self: Any, source: datatypes.GraphNodeLike, target: datatypes.GraphNodeLike): """ Create a new instance of the GraphEdge datatype. @@ -39,12 +53,12 @@ def __init__(self: Any, source: datatypes.GraphLocationLike, target: datatypes.G # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py self.__attrs_init__(source=source, target=target) - source: datatypes.GraphLocation = field() + source: datatypes.GraphNode = field(converter=_graph_edge__source__special_field_converter_override) # The id of the source node. # # (Docstring intentionally commented out to hide this field from the docs) - target: datatypes.GraphLocation = field() + target: datatypes.GraphNode = field(converter=_graph_edge__target__special_field_converter_override) # The id of the target node. # # (Docstring intentionally commented out to hide this field from the docs) @@ -64,24 +78,8 @@ def __init__(self) -> None: pa.ExtensionType.__init__( self, pa.struct([ - pa.field( - "source", - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - nullable=False, - metadata={}, - ), - pa.field( - "target", - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - nullable=False, - metadata={}, - ), + pa.field("source", pa.utf8(), nullable=False, metadata={}), + pa.field("target", pa.utf8(), nullable=False, metadata={}), ]), self._TYPE_NAME, ) @@ -92,15 +90,15 @@ class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): @staticmethod def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import GraphLocationBatch + from rerun.datatypes import GraphNodeBatch if isinstance(data, GraphEdge): data = [data] return pa.StructArray.from_arrays( [ - GraphLocationBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphLocationBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + GraphNodeBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] ], fields=list(data_type), ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py deleted file mode 100644 index 1925f78eb0ef..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_location.py +++ /dev/null @@ -1,108 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_location.fbs". - -# You can extend this class by creating a "GraphLocationExt" class in "graph_location_ext.py". - -from __future__ import annotations - -from typing import Any, Sequence, Union - -import pyarrow as pa -from attrs import define, field - -from .. import datatypes -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphLocation", "GraphLocationArrayLike", "GraphLocationBatch", "GraphLocationLike", "GraphLocationType"] - - -def _graph_location__entity_path__special_field_converter_override(x: datatypes.EntityPathLike) -> datatypes.EntityPath: - if isinstance(x, datatypes.EntityPath): - return x - else: - return datatypes.EntityPath(x) - - -def _graph_location__node_id__special_field_converter_override(x: datatypes.GraphNodeIdLike) -> datatypes.GraphNodeId: - if isinstance(x, datatypes.GraphNodeId): - return x - else: - return datatypes.GraphNodeId(x) - - -@define(init=False) -class GraphLocation: - """ - **Datatype**: Uniquely identifies a node in a graph by its entity path and node id. - - We require this because the same node id can be used in multiple entities. - """ - - def __init__(self: Any, entity_path: datatypes.EntityPathLike, node_id: datatypes.GraphNodeIdLike): - """ - Create a new instance of the GraphLocation datatype. - - Parameters - ---------- - entity_path: - The entity path that specifies where to find the node. - node_id: - The id of the node. - - """ - - # You can define your own __init__ function as a member of GraphLocationExt in graph_location_ext.py - self.__attrs_init__(entity_path=entity_path, node_id=node_id) - - entity_path: datatypes.EntityPath = field(converter=_graph_location__entity_path__special_field_converter_override) - # The entity path that specifies where to find the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - node_id: datatypes.GraphNodeId = field(converter=_graph_location__node_id__special_field_converter_override) - # The id of the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - -GraphLocationLike = GraphLocation -GraphLocationArrayLike = Union[ - GraphLocation, - Sequence[GraphLocationLike], -] - - -class GraphLocationType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphLocation" - - def __init__(self) -> None: - pa.ExtensionType.__init__( - self, - pa.struct([ - pa.field("entity_path", pa.utf8(), nullable=False, metadata={}), - pa.field("node_id", pa.utf8(), nullable=False, metadata={}), - ]), - self._TYPE_NAME, - ) - - -class GraphLocationBatch(BaseBatch[GraphLocationArrayLike]): - _ARROW_TYPE = GraphLocationType() - - @staticmethod - def _native_to_pa_array(data: GraphLocationArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import EntityPathBatch, GraphNodeIdBatch - - if isinstance(data, GraphLocation): - data = [data] - - return pa.StructArray.from_arrays( - [ - EntityPathBatch([x.entity_path for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeIdBatch([x.node_id for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - ], - fields=list(data_type), - ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py similarity index 50% rename from rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py rename to rerun_py/rerun_sdk/rerun/datatypes/graph_node.py index 68af8f033bbe..5d11311ecb0d 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_node_id.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py @@ -1,12 +1,14 @@ # DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node_id.fbs". +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". -# You can extend this class by creating a "GraphNodeIdExt" class in "graph_node_id_ext.py". +# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". from __future__ import annotations from typing import TYPE_CHECKING, Any, Sequence, Union +import numpy as np +import numpy.typing as npt import pyarrow as pa from attrs import define, field @@ -15,17 +17,17 @@ BaseExtensionType, ) -__all__ = ["GraphNodeId", "GraphNodeIdArrayLike", "GraphNodeIdBatch", "GraphNodeIdLike", "GraphNodeIdType"] +__all__ = ["GraphNode", "GraphNodeArrayLike", "GraphNodeBatch", "GraphNodeLike", "GraphNodeType"] @define(init=False) -class GraphNodeId: - """**Datatype**: A 32-bit ID representing a node in a graph.""" +class GraphNode: + """**Datatype**: A string-based ID representing a node in a graph.""" - def __init__(self: Any, id: GraphNodeIdLike): - """Create a new instance of the GraphNodeId datatype.""" + def __init__(self: Any, id: GraphNodeLike): + """Create a new instance of the GraphNode datatype.""" - # You can define your own __init__ function as a member of GraphNodeIdExt in graph_node_id_ext.py + # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py self.__attrs_init__(id=id) id: str = field(converter=str) @@ -38,29 +40,31 @@ def __hash__(self) -> int: if TYPE_CHECKING: - GraphNodeIdLike = Union[GraphNodeId, str] + GraphNodeLike = Union[GraphNode, str] else: - GraphNodeIdLike = Any + GraphNodeLike = Any -GraphNodeIdArrayLike = Union[GraphNodeId, Sequence[GraphNodeIdLike], Sequence[str]] +GraphNodeArrayLike = Union[GraphNode, Sequence[GraphNodeLike], Sequence[str]] -class GraphNodeIdType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphNodeId" +class GraphNodeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphNode" def __init__(self) -> None: pa.ExtensionType.__init__(self, pa.utf8(), self._TYPE_NAME) -class GraphNodeIdBatch(BaseBatch[GraphNodeIdArrayLike]): - _ARROW_TYPE = GraphNodeIdType() +class GraphNodeBatch(BaseBatch[GraphNodeArrayLike]): + _ARROW_TYPE = GraphNodeType() @staticmethod - def _native_to_pa_array(data: GraphNodeIdArrayLike, data_type: pa.DataType) -> pa.Array: + def _native_to_pa_array(data: GraphNodeArrayLike, data_type: pa.DataType) -> pa.Array: if isinstance(data, str): - array = [data] + array: Union[list[str], npt.ArrayLike] = [data] elif isinstance(data, Sequence): array = [str(datum) for datum in data] + elif isinstance(data, np.ndarray): + array = data else: array = [str(data)] diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py new file mode 100644 index 000000000000..4f59e2cd3996 --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py @@ -0,0 +1,74 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". + +# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". + +from __future__ import annotations + +from typing import Literal, Sequence, Union + +import pyarrow as pa + +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["GraphType", "GraphTypeArrayLike", "GraphTypeBatch", "GraphTypeLike", "GraphTypeType"] + + +from enum import Enum + + +class GraphType(Enum): + """**Datatype**: Specifies if a graph has directed or undirected edges.""" + + Undirected = 1 + """The graph has undirected edges.""" + + Directed = 2 + """The graph has directed edges.""" + + @classmethod + def auto(cls, val: str | int | GraphType) -> GraphType: + """Best-effort converter, including a case-insensitive string matcher.""" + if isinstance(val, GraphType): + return val + if isinstance(val, int): + return cls(val) + try: + return cls[val] + except KeyError: + val_lower = val.lower() + for variant in cls: + if variant.name.lower() == val_lower: + return variant + raise ValueError(f"Cannot convert {val} to {cls.__name__}") + + def __str__(self) -> str: + """Returns the variant name.""" + return self.name + + +GraphTypeLike = Union[GraphType, Literal["Directed", "Undirected", "directed", "undirected"], int] +GraphTypeArrayLike = Union[GraphTypeLike, Sequence[GraphTypeLike]] + + +class GraphTypeType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.GraphType" + + def __init__(self) -> None: + pa.ExtensionType.__init__(self, pa.uint8(), self._TYPE_NAME) + + +class GraphTypeBatch(BaseBatch[GraphTypeArrayLike]): + _ARROW_TYPE = GraphTypeType() + + @staticmethod + def _native_to_pa_array(data: GraphTypeArrayLike, data_type: pa.DataType) -> pa.Array: + if isinstance(data, (GraphType, int, str)): + data = [data] + + pa_data = [GraphType.auto(v).value if v is not None else None for v in data] # type: ignore[redundant-expr] + + return pa.array(pa_data, type=data_type) From 49e8277d87509910cd3942ff3c6c4c256209cbe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 10:50:15 +0200 Subject: [PATCH 097/159] WIP: improve examples --- .../re_space_view_graph/src/ui/state.rs | 4 +- crates/viewer/re_space_view_graph/src/view.rs | 7 ++-- .../src/visualizers/mod.rs | 2 +- .../src/visualizers/nodes.rs | 24 ++++++------ .../node_link_graph/src/examples/lattice.rs | 19 +++++++--- .../node_link_graph/src/examples/simple.rs | 37 ++++++++----------- .../src/examples/social/mod.rs | 22 ++++------- 7 files changed, 57 insertions(+), 58 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index 1d4008bdc678..18172dfb871d 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -46,9 +46,7 @@ impl GraphSpaceViewState { .on_hover_text("The bounding box encompassing all Entities in the view right now"); ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(egui::Rect { min, max }) = - bounding_rect_from_iter(self.layout.values()) - { + if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(self.layout.values()) { ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); } diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index eb1fc497db95..2d77354797c3 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -2,8 +2,9 @@ use std::collections::{HashMap, HashSet}; use std::hash::Hash; use egui::{self, Rect}; +use re_log::external::log; use re_log_types::EntityPath; -use re_types::SpaceViewClassIdentifier; +use re_types::{datatypes, SpaceViewClassIdentifier}; use re_ui::{self, UiExt}; use re_viewer_context::{ external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, @@ -232,10 +233,10 @@ impl SpaceViewClass for GraphSpaceView { source_pos, target_pos, ent_highlight.index_highlight(edge.instance), - false, + edge.edge_type == datatypes::GraphType::Directed, ); }); - }; + } } } }); diff --git a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs index 4d72ce33a553..2d96d709c41a 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs @@ -2,4 +2,4 @@ mod edges; mod nodes; pub use edges::{EdgeData, EdgesVisualizer}; -pub use nodes::{NodeVisualizer, NodeData}; +pub use nodes::{NodeData, NodeVisualizer}; diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 7d85d8e5ae9b..df9828296207 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -44,19 +44,21 @@ impl NodeData { self.colors.iter().map(Option::Some), Option::<&components::Color>::default, self.positions.iter().copied().map(Option::Some), - Option::<[f32;2]>::default, + Option::<[f32; 2]>::default, self.labels.iter().map(Option::Some), Option::<&ArrowString>::default, ) - .map(move |(node_id, instance, color, position, label)| NodeInstance { - entity_path: &self.entity_path, - node_id, - instance, - color: color.map(|c| Color32::from(c.0)), - position, - show_labels: self.show_labels.map_or(true, bool::from), - label, - }) + .map( + move |(node_id, instance, color, position, label)| NodeInstance { + entity_path: &self.entity_path, + node_id, + instance, + color: color.map(|c| Color32::from(c.0)), + position, + show_labels: self.show_labels.map_or(true, bool::from), + label, + }, + ) } } @@ -108,7 +110,7 @@ impl VisualizerSystem for NodeVisualizer { colors: colors.unwrap_or_default(), positions: positions.unwrap_or_default().to_vec(), labels: labels.unwrap_or_default(), - show_labels: show_labels.unwrap_or_default().first().copied() + show_labels: show_labels.unwrap_or_default().first().copied(), }); } } diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link_graph/src/examples/lattice.rs index 36dd80b3769c..7f69648cf487 100644 --- a/examples/rust/node_link_graph/src/examples/lattice.rs +++ b/examples/rust/node_link_graph/src/examples/lattice.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use rerun::{Color, GraphEdgesUndirected, GraphNodes}; +use rerun::{Color, GraphEdges, GraphNodes}; use crate::Args; @@ -18,22 +18,31 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { (i.to_string(), Color::from_rgb(r, g, 0)) }) .unzip(); - rec.log_static("/nodes", &GraphNodes::new(nodes).with_colors(colors))?; + rec.log_static( + "/lattice", + &GraphNodes::new(nodes) + .with_colors(colors) + .with_positions(coordinates.clone().map(|(x, y)| { + let x_scaling = 100.0; + let y_scaling = 75.0; + [x as f32 * x_scaling, y as f32 * y_scaling] + })), + )?; let mut edges = Vec::new(); for (x, y) in coordinates { if y > 0 { let source = (y - 1) * num_nodes + x; let target = y * num_nodes + x; - edges.push(("/nodes", source.to_string(), target.to_string())); + edges.push((source.to_string(), target.to_string())); } if x > 0 { let source = y * num_nodes + (x - 1); let target = y * num_nodes + x; - edges.push(("/nodes", source.to_string(), target.to_string())); + edges.push((source.to_string(), target.to_string())); } } - rec.log_static("/edges", &GraphEdgesUndirected::new(edges))?; + rec.log_static("/lattice", &GraphEdges::new(edges))?; Ok(()) } diff --git a/examples/rust/node_link_graph/src/examples/simple.rs b/examples/rust/node_link_graph/src/examples/simple.rs index d08fca76b94f..c342c7c6ef69 100644 --- a/examples/rust/node_link_graph/src/examples/simple.rs +++ b/examples/rust/node_link_graph/src/examples/simple.rs @@ -1,4 +1,4 @@ -use rerun::{Color, GraphEdgesDirected, GraphEdgesUndirected, GraphNodes}; +use rerun::{datatypes::GraphType, Color, GraphEdges, GraphNodes}; use crate::Args; @@ -13,11 +13,8 @@ pub fn run(args: &Args) -> anyhow::Result<()> { .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), )?; - rec.log("kitchen/nodes", &GraphNodes::new(["area0", "area1"]))?; - rec.log( - "kitchen/edges", - &GraphEdgesDirected::new([("kitchen/nodes", "area0", "area1")]), - )?; + rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; + rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; rec.set_time_sequence("frame", 1); rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; @@ -27,34 +24,32 @@ pub fn run(args: &Args) -> anyhow::Result<()> { "living/objects", &GraphNodes::new(["table"]).with_labels(["Table"]), )?; + rec.log( - "living/nodes", + "living/areas", &GraphNodes::new(["area0", "area1", "area2"]), )?; rec.log( - "living/edges", - &GraphEdgesDirected::new([ - ("living/nodes", "area0", "area1"), - ("living/nodes", "area0", "area2"), - ("living/nodes", "area1", "area2"), - ]), + "living/areas", + &GraphEdges::new([("area0", "area1"), ("area0", "area2"), ("area1", "area2")]), )?; rec.log( "doors/edges", - &GraphEdgesDirected::new([ - (("kitchen/nodes", "area0"), ("hallway/nodes", "area0")), - (("hallway/nodes", "area0"), ("living/nodes", "area2")), + &GraphEdges::new([ + (("kitchen/nodes#area0"), ("hallway/nodes#area0")), + (("hallway/nodes#area0"), ("living/nodes#area2")), ]), )?; rec.log( "edges", - &GraphEdgesUndirected::new([ - (("kitchen/nodes", "area0"), ("kitchen/objects", "sink")), - (("kitchen/nodes", "area1"), ("kitchen/objects", "fridge")), - (("living/nodes", "area1"), ("living/objects", "table")), - ]), + &GraphEdges::new([ + (("kitchen/nodes#area0"), ("kitchen/objects#sink")), + (("kitchen/nodes#area1"), ("kitchen/objects#fridge")), + (("living/nodes#area1"), ("living/objects#table")), + ]) + .with_graph_type([GraphType::Directed]), )?; Ok(()) } diff --git a/examples/rust/node_link_graph/src/examples/social/mod.rs b/examples/rust/node_link_graph/src/examples/social/mod.rs index 0c1fb5357421..cc3233512c46 100644 --- a/examples/rust/node_link_graph/src/examples/social/mod.rs +++ b/examples/rust/node_link_graph/src/examples/social/mod.rs @@ -1,9 +1,7 @@ use itertools::Itertools; use rerun::{ components::{self}, - datatypes, - external::log, - GraphEdgesUndirected, GraphNodes, + datatypes, GraphEdges, GraphNodes, }; use crate::Args; @@ -14,8 +12,8 @@ use std::{ struct Interaction { timestamp: u32, - person_a: datatypes::GraphNodeId, - person_b: datatypes::GraphNodeId, + person_a: datatypes::GraphNode, + person_b: datatypes::GraphNode, } fn parse_data_file() -> anyhow::Result> { @@ -59,9 +57,9 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.log_static( "/persons", &GraphNodes::new( - nodes.iter().map(|n| { - components::GraphNodeId::from(datatypes::GraphNodeId(n.to_string().into())) - }), + nodes + .iter() + .map(|n| components::GraphNode::from(datatypes::GraphNode(n.to_string().into()))), ), )?; @@ -70,12 +68,8 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.set_time_sequence("frame", timestamp); rec.log( - "/interactions", - &GraphEdgesUndirected::new( - interactions - .into_iter() - .map(|i| ("/persons", i.person_a, i.person_b)), - ), + "/persons", + &GraphEdges::new(interactions.into_iter().map(|i| (i.person_a, i.person_b))), )?; } Ok(()) From 3aa50ac37971611ca0ec461b85519bee84c1e58e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 11:46:14 +0200 Subject: [PATCH 098/159] WIP: cleanup and feedback --- Cargo.lock | 1 + crates/viewer/re_space_view_graph/Cargo.toml | 1 + .../viewer/re_space_view_graph/src/error.rs | 2 +- .../re_space_view_graph/src/graph/mod.rs | 12 ++- .../viewer/re_space_view_graph/src/types.rs | 2 +- .../viewer/re_space_view_graph/src/ui/edge.rs | 4 +- .../viewer/re_space_view_graph/src/ui/mod.rs | 4 +- .../viewer/re_space_view_graph/src/ui/node.rs | 2 +- .../re_space_view_graph/src/ui/scene.rs | 75 ++++++++++++------- .../re_space_view_graph/src/ui/state.rs | 17 ----- crates/viewer/re_space_view_graph/src/view.rs | 24 +----- .../node_link_graph/src/examples/lattice.rs | 11 ++- 12 files changed, 74 insertions(+), 81 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 272a140d73ee..635a6baff63c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5888,6 +5888,7 @@ dependencies = [ name = "re_space_view_graph" version = "0.20.0-alpha.1+dev" dependencies = [ + "ahash", "bytemuck", "egui", "re_chunk", diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 0e76a103f18f..6e48802f1ff2 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -37,3 +37,4 @@ egui.workspace = true #TODO(grtlr): check if all of these are still needed bytemuck = "1.18" thiserror = "1.0" +ahash = "0.8" diff --git a/crates/viewer/re_space_view_graph/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs index a35e83504b54..98395bde37b2 100644 --- a/crates/viewer/re_space_view_graph/src/error.rs +++ b/crates/viewer/re_space_view_graph/src/error.rs @@ -14,6 +14,6 @@ pub enum Error { impl From for SpaceViewSystemExecutionError { fn from(val: Error) -> Self { // TODO(grtlr): Ensure that this is the correct error type. - SpaceViewSystemExecutionError::DrawDataCreationError(Box::new(val)) + Self::DrawDataCreationError(Box::new(val)) } } diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 12e36b70e454..e2558d8c679b 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,5 +1,3 @@ -use std::collections::HashSet; - use re_log_types::EntityPath; use re_types::datatypes; @@ -38,9 +36,9 @@ impl<'a> From> for NodeIndex { pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: HashSet<(&'a EntityPath, datatypes::GraphNode)>, - nodes: &'a Vec, - edges: &'a Vec, + unknown: ahash::HashSet<(&'a EntityPath, datatypes::GraphNode)>, + nodes: &'a [NodeData], + edges: &'a [EdgeData], } impl<'a> Graph<'a> { @@ -49,9 +47,9 @@ impl<'a> Graph<'a> { .iter() .flat_map(|entity| entity.nodes()) .map(NodeIndex::from) - .collect::>(); + .collect::>(); - let mut unknown = HashSet::new(); + let mut unknown = ahash::HashSet::default(); for entity in edges { for edge in entity.edges() { for node in edge.nodes() { diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 7444f1a49905..19aedad21690 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -51,7 +51,7 @@ impl<'a> EdgeInstance<'a> { } pub fn target_ix(&self) -> NodeIndex { - NodeIndex::from_entity_node(self.entity_path, self.source) + NodeIndex::from_entity_node(self.entity_path, self.target) } } diff --git a/crates/viewer/re_space_view_graph/src/ui/edge.rs b/crates/viewer/re_space_view_graph/src/ui/edge.rs index 8238174c4c53..bd30e2c6988d 100644 --- a/crates/viewer/re_space_view_graph/src/ui/edge.rs +++ b/crates/viewer/re_space_view_graph/src/ui/edge.rs @@ -7,7 +7,7 @@ pub fn draw_edge( target: &egui::Rect, highlight: InteractionHighlight, show_arrow: bool, -) { +) -> egui::Response { let hcolor = match ( highlight.hover, highlight.selection != SelectionHighlight::None, @@ -40,7 +40,7 @@ pub fn draw_edge( if show_arrow { draw_arrow(painter, target_point, direction, color); } - }); + }).response } // Helper function to find the point where the line intersects the border of a rectangle diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 36a1f7384f56..6fbbad6a9ca4 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -17,7 +17,7 @@ use crate::{ types::UnknownNodeInstance, }; -pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { +pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance<'_>) -> egui::Response { let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); @@ -59,6 +59,8 @@ pub fn draw_entity( response } +// TODO(grtlr): We might need to come back to this for implementing layouts. +#[allow(unused)] pub fn measure_node_sizes<'a>( ui: &mut egui::Ui, nodes: impl Iterator>, diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index cc644bf24a39..aaaca650a224 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -4,7 +4,7 @@ use crate::types::NodeInstance; pub fn draw_node( ui: &mut egui::Ui, - instance: &NodeInstance, + instance: &NodeInstance<'_>, highlight: InteractionHighlight, ) -> egui::Response { let hcolor = match ( diff --git a/crates/viewer/re_space_view_graph/src/ui/scene.rs b/crates/viewer/re_space_view_graph/src/ui/scene.rs index 770868046634..6abeeb5376f3 100644 --- a/crates/viewer/re_space_view_graph/src/ui/scene.rs +++ b/crates/viewer/re_space_view_graph/src/ui/scene.rs @@ -157,15 +157,22 @@ impl<'a> Scene<'a> { where F: for<'b> FnOnce(&'b mut Ui) -> Response, { - let response = Area::new(self.id.with(("__node", self.counter.next().unwrap()))) - .current_pos(pos) - .order(Order::Foreground) - .constrain(false) - .show(self.ui.ctx(), |ui| { - ui.set_clip_rect(self.clip_rect_world); - add_node_contents(ui) - }) - .response; + let response = Area::new( + self.id.with(( + "__node", + self.counter + .next() + .expect("The counter should never run out."), + )), + ) + .current_pos(pos) + .order(Order::Foreground) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_node_contents(ui) + }) + .response; let id = response.layer_id; self.ui.ctx().set_transform_layer(id, self.world_to_window); @@ -180,15 +187,22 @@ impl<'a> Scene<'a> { where F: for<'b> FnOnce(&'b mut Ui) -> Response, { - let response = Area::new(self.id.with(("__entity", self.counter.next().unwrap()))) - .fixed_pos(pos) - .order(Order::Background) - .constrain(false) - .show(self.ui.ctx(), |ui| { - ui.set_clip_rect(self.clip_rect_world); - add_entity_contents(ui) - }) - .response; + let response = Area::new( + self.id.with(( + "__entity", + self.counter + .next() + .expect("The counter should never run out."), + )), + ) + .fixed_pos(pos) + .order(Order::Background) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_entity_contents(ui) + }) + .response; let id = response.layer_id; self.ui.ctx().set_transform_layer(id, self.world_to_window); @@ -199,16 +213,23 @@ impl<'a> Scene<'a> { pub fn edge(&mut self, add_edge_contents: F) -> Response where - F: for<'b> FnOnce(&'b mut Ui), + F: for<'b> FnOnce(&'b mut Ui) -> Response, { - let response = Area::new(self.id.with(("edge", self.counter.next().unwrap()))) - .order(Order::Middle) - .constrain(false) - .show(self.ui.ctx(), |ui| { - ui.set_clip_rect(self.clip_rect_world); - add_edge_contents(ui) - }) - .response; + let response = Area::new( + self.id.with(( + "edge", + self.counter + .next() + .expect("The counter should never run out."), + )), + ) + .order(Order::Middle) + .constrain(false) + .show(self.ui.ctx(), |ui| { + ui.set_clip_rect(self.clip_rect_world); + add_edge_contents(ui) + }) + .response; let id = response.layer_id; self.ui.ctx().set_transform_layer(id, self.world_to_window); diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index 18172dfb871d..d05564773778 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use re_chunk::EntityPath; use re_format::format_f32; use re_ui::UiExt; use re_viewer_context::SpaceViewState; @@ -9,19 +8,6 @@ use crate::graph::NodeIndex; use super::{bounding_rect_from_iter, scene::ViewBuilder}; -#[derive(Debug)] -pub struct RadialLayoutConfig { - pub circle_radius: f32, -} - -impl Default for RadialLayoutConfig { - fn default() -> Self { - Self { - circle_radius: 400.0, - } - } -} - /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. @@ -35,9 +21,6 @@ pub struct GraphSpaceViewState { /// Positions of the nodes in world space. pub layout: HashMap, - - /// Layout properties. - pub layout_config: RadialLayoutConfig, } impl GraphSpaceViewState { diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 2d77354797c3..fdc519045c2c 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,8 +1,7 @@ -use std::collections::{HashMap, HashSet}; -use std::hash::Hash; +use std::collections::HashSet; use egui::{self, Rect}; -use re_log::external::log; + use re_log_types::EntityPath; use re_types::{datatypes, SpaceViewClassIdentifier}; use re_ui::{self, UiExt}; @@ -23,21 +22,6 @@ use crate::{ #[derive(Default)] pub struct GraphSpaceView; -fn arrange_in_circle( - nodes: &mut HashMap, - radius: f32, -) { - let n = nodes.len(); - let center = egui::Pos2::new(0.0, 0.0); - - for (i, (_id, (_, rect))) in nodes.iter_mut().enumerate() { - let angle = 2.0 * std::f32::consts::PI * i as f32 / n as f32; - let x = center.x + radius * angle.cos(); - let y = center.y + radius * angle.sin(); - rect.set_center(egui::Pos2::new(x, y)); - } -} - impl SpaceViewClass for GraphSpaceView { // State type as described above. @@ -234,15 +218,13 @@ impl SpaceViewClass for GraphSpaceView { target_pos, ent_highlight.index_highlight(edge.instance), edge.edge_type == datatypes::GraphType::Directed, - ); + ) }); } } } }); - //arrange_in_circle(&mut state.layout, state.layout_config.circle_radius); - // TODO(grtlr): consider improving this! if state.should_fit_to_screen { state.viewer.fit_to_screen(); diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link_graph/src/examples/lattice.rs index 7f69648cf487..77fa0e06a105 100644 --- a/examples/rust/node_link_graph/src/examples/lattice.rs +++ b/examples/rust/node_link_graph/src/examples/lattice.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use rerun::{Color, GraphEdges, GraphNodes}; +use rerun::{datatypes, Color, GraphEdges, GraphNodes}; use crate::Args; @@ -18,6 +18,7 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { (i.to_string(), Color::from_rgb(r, g, 0)) }) .unzip(); + rec.log_static( "/lattice", &GraphNodes::new(nodes) @@ -26,7 +27,8 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { let x_scaling = 100.0; let y_scaling = 75.0; [x as f32 * x_scaling, y as f32 * y_scaling] - })), + })) + .with_labels(coordinates.clone().map(|(x, y)| format!("({}, {})", x, y))), )?; let mut edges = Vec::new(); @@ -43,6 +45,9 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { } } - rec.log_static("/lattice", &GraphEdges::new(edges))?; + rec.log_static( + "/lattice", + &GraphEdges::new(edges).with_graph_type([datatypes::GraphType::Directed]), + )?; Ok(()) } From 181d6a458ed1ee6fd326972b4cc119be2409ff2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 11:49:27 +0200 Subject: [PATCH 099/159] WIP: fix --- .../viewer/re_space_view_graph/src/ui/edge.rs | 40 +++++++++-------- .../reference/types/archetypes/graph_nodes.md | 2 +- .../reference/types/components/show_labels.md | 1 + .../rerun_sdk/rerun/archetypes/graph_nodes.py | 43 +++++++++++++------ 4 files changed, 52 insertions(+), 34 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/edge.rs b/crates/viewer/re_space_view_graph/src/ui/edge.rs index bd30e2c6988d..fec65818db5e 100644 --- a/crates/viewer/re_space_view_graph/src/ui/edge.rs +++ b/crates/viewer/re_space_view_graph/src/ui/edge.rs @@ -17,30 +17,32 @@ pub fn draw_edge( (HoverHighlight::Hovered, ..) => Some(ui.style().visuals.widgets.hovered.bg_fill), }; - egui::Frame::default().show(ui, |ui| { - let source_center = source.center(); - let target_center = target.center(); + egui::Frame::default() + .show(ui, |ui| { + let source_center = source.center(); + let target_center = target.center(); - // Calculate direction vector from source to target - let direction = (target_center - source_center).normalized(); + // Calculate direction vector from source to target + let direction = (target_center - source_center).normalized(); - // Find the border points on both rectangles - let source_point = find_border_point(source, -direction); // Reverse direction for target - let target_point = find_border_point(target, direction); + // Find the border points on both rectangles + let source_point = find_border_point(source, -direction); // Reverse direction for target + let target_point = find_border_point(target, direction); - let painter = ui.painter(); - if let Some(hcolor) = hcolor { - painter.line_segment([source_point, target_point], egui::Stroke::new(4.0, hcolor)); - } + let painter = ui.painter(); + if let Some(hcolor) = hcolor { + painter.line_segment([source_point, target_point], egui::Stroke::new(4.0, hcolor)); + } - let color = color.unwrap_or(ui.style().visuals.text_color()); - painter.line_segment([source_point, target_point], egui::Stroke::new(1.0, color)); + let color = color.unwrap_or(ui.style().visuals.text_color()); + painter.line_segment([source_point, target_point], egui::Stroke::new(1.0, color)); - // Conditionally draw an arrow at the target point - if show_arrow { - draw_arrow(painter, target_point, direction, color); - } - }).response + // Conditionally draw an arrow at the target point + if show_arrow { + draw_arrow(painter, target_point, direction, color); + } + }) + .response } // Helper function to find the point where the line intersects the border of a rectangle diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index e81afacdb8b2..f6116ec57129 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -11,7 +11,7 @@ A list of nodes in a graph with optional labels, colors, etc. **Recommended**: [`Position2D`](../components/position2d.md), [`Color`](../components/color.md) -**Optional**: [`Text`](../components/text.md) +**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md) ## Shown in * [Graph View](../views/graph_view.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index 31b40b8a4ae7..f6e6534dae61 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,6 +26,7 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) +* [`GraphNodes`](../archetypes/graph_nodes.md) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py index f3c48d6a5483..e3d494b7bcc3 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py @@ -26,9 +26,10 @@ def __init__( self: Any, node_ids: datatypes.GraphNodeArrayLike, *, - labels: datatypes.Utf8ArrayLike | None = None, positions: datatypes.Vec2DArrayLike | None = None, colors: datatypes.Rgba32ArrayLike | None = None, + labels: datatypes.Utf8ArrayLike | None = None, + show_labels: datatypes.BoolLike | None = None, ): """ Create a new instance of the GraphNodes archetype. @@ -37,18 +38,22 @@ def __init__( ---------- node_ids: A list of node IDs. - labels: - Optional text labels for the node. positions: Optional center positions of the nodes. colors: Optional colors for the boxes. + labels: + Optional text labels for the node. + show_labels: + Optional choice of whether the text labels should be shown by default. """ # You can define your own __init__ function as a member of GraphNodesExt in graph_nodes_ext.py with catch_and_log_exceptions(context=self.__class__.__name__): - self.__attrs_init__(node_ids=node_ids, labels=labels, positions=positions, colors=colors) + self.__attrs_init__( + node_ids=node_ids, positions=positions, colors=colors, labels=labels, show_labels=show_labels + ) return self.__attrs_clear__() @@ -56,9 +61,10 @@ def __attrs_clear__(self) -> None: """Convenience method for calling `__attrs_init__` with all `None`s.""" self.__attrs_init__( node_ids=None, # type: ignore[arg-type] - labels=None, # type: ignore[arg-type] positions=None, # type: ignore[arg-type] colors=None, # type: ignore[arg-type] + labels=None, # type: ignore[arg-type] + show_labels=None, # type: ignore[arg-type] ) @classmethod @@ -76,15 +82,6 @@ def _clear(cls) -> GraphNodes: # # (Docstring intentionally commented out to hide this field from the docs) - labels: components.TextBatch | None = field( - metadata={"component": "optional"}, - default=None, - converter=components.TextBatch._optional, # type: ignore[misc] - ) - # Optional text labels for the node. - # - # (Docstring intentionally commented out to hide this field from the docs) - positions: components.Position2DBatch | None = field( metadata={"component": "optional"}, default=None, @@ -103,5 +100,23 @@ def _clear(cls) -> GraphNodes: # # (Docstring intentionally commented out to hide this field from the docs) + labels: components.TextBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.TextBatch._optional, # type: ignore[misc] + ) + # Optional text labels for the node. + # + # (Docstring intentionally commented out to hide this field from the docs) + + show_labels: components.ShowLabelsBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.ShowLabelsBatch._optional, # type: ignore[misc] + ) + # Optional choice of whether the text labels should be shown by default. + # + # (Docstring intentionally commented out to hide this field from the docs) + __str__ = Archetype.__str__ __repr__ = Archetype.__repr__ # type: ignore[assignment] From 68e9435fd1fe78022b3aa4272fe681112646cfbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 11:49:35 +0200 Subject: [PATCH 100/159] WIP: codegen --- .../re_types/src/archetypes/graph_nodes.rs | 109 ++++++++++++------ crates/viewer/re_viewer/src/reflection/mod.rs | 12 +- .../src/rerun/archetypes/graph_nodes.cpp | 17 ++- .../src/rerun/archetypes/graph_nodes.hpp | 31 +++-- 4 files changed, 112 insertions(+), 57 deletions(-) diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs index 053bb8e681c6..f0a2b2c61290 100644 --- a/crates/store/re_types/src/archetypes/graph_nodes.rs +++ b/crates/store/re_types/src/archetypes/graph_nodes.rs @@ -24,31 +24,36 @@ pub struct GraphNodes { /// A list of node IDs. pub node_ids: Vec, - /// Optional text labels for the node. - pub labels: Option>, - /// Optional center positions of the nodes. pub positions: Option>, /// Optional colors for the boxes. pub colors: Option>, + + /// Optional text labels for the node. + pub labels: Option>, + + /// Optional choice of whether the text labels should be shown by default. + pub show_labels: Option, } impl ::re_types_core::SizeBytes for GraphNodes { #[inline] fn heap_size_bytes(&self) -> u64 { self.node_ids.heap_size_bytes() - + self.labels.heap_size_bytes() + self.positions.heap_size_bytes() + self.colors.heap_size_bytes() + + self.labels.heap_size_bytes() + + self.show_labels.heap_size_bytes() } #[inline] fn is_pod() -> bool { >::is_pod() - && >>::is_pod() && >>::is_pod() && >>::is_pod() + && >>::is_pod() + && >::is_pod() } } @@ -64,10 +69,15 @@ static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = ] }); -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = - once_cell::sync::Lazy::new(|| ["rerun.components.Text".into()]); +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = + once_cell::sync::Lazy::new(|| { + [ + "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), + ] + }); -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 5usize]> = +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = once_cell::sync::Lazy::new(|| { [ "rerun.components.GraphNode".into(), @@ -75,12 +85,13 @@ static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 5usize]> = "rerun.components.Color".into(), "rerun.components.GraphNodesIndicator".into(), "rerun.components.Text".into(), + "rerun.components.ShowLabels".into(), ] }); impl GraphNodes { - /// The total number of components in the archetype: 1 required, 3 recommended, 1 optional - pub const NUM_COMPONENTS: usize = 5usize; + /// The total number of components in the archetype: 1 required, 3 recommended, 2 optional + pub const NUM_COMPONENTS: usize = 6usize; } /// Indicator component for the [`GraphNodes`] [`::re_types_core::Archetype`] @@ -147,18 +158,6 @@ impl ::re_types_core::Archetype for GraphNodes { .collect::>>() .with_context("rerun.archetypes.GraphNodes#node_ids")? }; - let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphNodes#labels")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphNodes#labels")? - }) - } else { - None - }; let positions = if let Some(array) = arrays_by_name.get("rerun.components.Position2D") { Some({ ::from_arrow_opt(&**array) @@ -183,11 +182,33 @@ impl ::re_types_core::Archetype for GraphNodes { } else { None }; + let labels = if let Some(array) = arrays_by_name.get("rerun.components.Text") { + Some({ + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#labels")? + .into_iter() + .map(|v| v.ok_or_else(DeserializationError::missing_data)) + .collect::>>() + .with_context("rerun.archetypes.GraphNodes#labels")? + }) + } else { + None + }; + let show_labels = if let Some(array) = arrays_by_name.get("rerun.components.ShowLabels") { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphNodes#show_labels")? + .into_iter() + .next() + .flatten() + } else { + None + }; Ok(Self { node_ids, - labels, positions, colors, + labels, + show_labels, }) } } @@ -199,15 +220,18 @@ impl ::re_types_core::AsComponents for GraphNodes { [ Some(Self::indicator()), Some((&self.node_ids as &dyn ComponentBatch).into()), - self.labels - .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), self.positions .as_ref() .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), self.colors .as_ref() .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.labels + .as_ref() + .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + self.show_labels + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), ] .into_iter() .flatten() @@ -225,22 +249,13 @@ impl GraphNodes { ) -> Self { Self { node_ids: node_ids.into_iter().map(Into::into).collect(), - labels: None, positions: None, colors: None, + labels: None, + show_labels: None, } } - /// Optional text labels for the node. - #[inline] - pub fn with_labels( - mut self, - labels: impl IntoIterator>, - ) -> Self { - self.labels = Some(labels.into_iter().map(Into::into).collect()); - self - } - /// Optional center positions of the nodes. #[inline] pub fn with_positions( @@ -260,4 +275,24 @@ impl GraphNodes { self.colors = Some(colors.into_iter().map(Into::into).collect()); self } + + /// Optional text labels for the node. + #[inline] + pub fn with_labels( + mut self, + labels: impl IntoIterator>, + ) -> Self { + self.labels = Some(labels.into_iter().map(Into::into).collect()); + self + } + + /// Optional choice of whether the text labels should be shown by default. + #[inline] + pub fn with_show_labels( + mut self, + show_labels: impl Into, + ) -> Self { + self.show_labels = Some(show_labels.into()); + self + } } diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 75ccc166ac67..621b6f3bb497 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -1101,16 +1101,20 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { ArchetypeFieldReflection { component_name : "rerun.components.GraphNode".into(), display_name : "Node ids", docstring_md : "A list of node IDs.", is_required : true, }, - ArchetypeFieldReflection { component_name : "rerun.components.Text" - .into(), display_name : "Labels", docstring_md : - "Optional text labels for the node.", is_required : false, }, ArchetypeFieldReflection { component_name : "rerun.components.Position2D".into(), display_name : "Positions", docstring_md : "Optional center positions of the nodes.", is_required : false, }, ArchetypeFieldReflection { component_name : "rerun.components.Color".into(), display_name : "Colors", docstring_md : "Optional colors for the boxes.", is_required : false, - }, + }, ArchetypeFieldReflection { component_name : + "rerun.components.Text".into(), display_name : "Labels", docstring_md + : "Optional text labels for the node.", is_required : false, }, + ArchetypeFieldReflection { component_name : + "rerun.components.ShowLabels".into(), display_name : "Show labels", + docstring_md : + "Optional choice of whether the text labels should be shown by default.", + is_required : false, }, ], }, ), diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp index 328b645688c2..f98f7fd26ed1 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.cpp @@ -14,18 +14,13 @@ namespace rerun { ) { using namespace archetypes; std::vector cells; - cells.reserve(5); + cells.reserve(6); { auto result = ComponentBatch::from_loggable(archetype.node_ids); RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } - if (archetype.labels.has_value()) { - auto result = ComponentBatch::from_loggable(archetype.labels.value()); - RR_RETURN_NOT_OK(result.error); - cells.push_back(std::move(result.value)); - } if (archetype.positions.has_value()) { auto result = ComponentBatch::from_loggable(archetype.positions.value()); RR_RETURN_NOT_OK(result.error); @@ -36,6 +31,16 @@ namespace rerun { RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } + if (archetype.labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } + if (archetype.show_labels.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.show_labels.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } { auto indicator = GraphNodes::IndicatorComponent(); auto result = ComponentBatch::from_loggable(indicator); diff --git a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp index 1157f82ba4d2..9808250686c9 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_nodes.hpp @@ -9,6 +9,7 @@ #include "../components/color.hpp" #include "../components/graph_node.hpp" #include "../components/position2d.hpp" +#include "../components/show_labels.hpp" #include "../components/text.hpp" #include "../indicator_component.hpp" #include "../result.hpp" @@ -24,15 +25,18 @@ namespace rerun::archetypes { /// A list of node IDs. Collection node_ids; - /// Optional text labels for the node. - std::optional> labels; - /// Optional center positions of the nodes. std::optional> positions; /// Optional colors for the boxes. std::optional> colors; + /// Optional text labels for the node. + std::optional> labels; + + /// Optional choice of whether the text labels should be shown by default. + std::optional show_labels; + public: static constexpr const char IndicatorComponentName[] = "rerun.components.GraphNodesIndicator"; @@ -47,13 +51,6 @@ namespace rerun::archetypes { explicit GraphNodes(Collection _node_ids) : node_ids(std::move(_node_ids)) {} - /// Optional text labels for the node. - GraphNodes with_labels(Collection _labels) && { - labels = std::move(_labels); - // See: https://github.com/rerun-io/rerun/issues/4027 - RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) - } - /// Optional center positions of the nodes. GraphNodes with_positions(Collection _positions) && { positions = std::move(_positions); @@ -67,6 +64,20 @@ namespace rerun::archetypes { // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } + + /// Optional text labels for the node. + GraphNodes with_labels(Collection _labels) && { + labels = std::move(_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } + + /// Optional choice of whether the text labels should be shown by default. + GraphNodes with_show_labels(rerun::components::ShowLabels _show_labels) && { + show_labels = std::move(_show_labels); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } }; } // namespace rerun::archetypes From 111b0f58fb50b25d6c282f3453762724855fe795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 12:14:06 +0200 Subject: [PATCH 101/159] WIP: implement `nohash_hasher::IsEnabled` --- Cargo.lock | 1 + crates/viewer/re_space_view_graph/Cargo.toml | 1 + crates/viewer/re_space_view_graph/src/graph/hash.rs | 2 ++ crates/viewer/re_space_view_graph/src/graph/index.rs | 12 +++++++++++- crates/viewer/re_space_view_graph/src/graph/mod.rs | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 635a6baff63c..8ae9ce33bc9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5891,6 +5891,7 @@ dependencies = [ "ahash", "bytemuck", "egui", + "nohash-hasher", "re_chunk", "re_format", "re_log", diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 6e48802f1ff2..bc201cac3636 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -38,3 +38,4 @@ egui.workspace = true bytemuck = "1.18" thiserror = "1.0" ahash = "0.8" +nohash-hasher = "0.2" diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 711f44dde36b..472cc20229a9 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -5,6 +5,8 @@ use re_types::datatypes; #[derive(Copy, Clone, Eq, PartialOrd, Ord)] pub(crate) struct GraphNodeHash(Hash64); +impl nohash_hasher::IsEnabled for GraphNodeHash {} + impl GraphNodeHash { #[inline] pub fn hash64(&self) -> u64 { diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index bb3f85991057..8418d838b01f 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -3,12 +3,22 @@ use re_types::datatypes; use super::GraphNodeHash; -#[derive(Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Clone, Copy, PartialEq, Eq)] pub(crate) struct NodeIndex { pub entity_hash: EntityPathHash, pub node_hash: GraphNodeHash, } +impl nohash_hasher::IsEnabled for NodeIndex {} + +impl std::hash::Hash for NodeIndex { + fn hash(&self, state: &mut H) { + // TODO(grtlr): Consider using `write_usize` here, to further decrease the risk of collision. + let combined = self.entity_hash.hash64() << 32 | self.node_hash.hash64(); + state.write_u64(combined); + } +} + impl NodeIndex { pub fn from_entity_node(entity_path: &EntityPath, node: &datatypes::GraphNode) -> Self { Self { diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index e2558d8c679b..701935cce52e 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -47,7 +47,7 @@ impl<'a> Graph<'a> { .iter() .flat_map(|entity| entity.nodes()) .map(NodeIndex::from) - .collect::>(); + .collect::>(); let mut unknown = ahash::HashSet::default(); for entity in edges { From 64c09f19ee0b6a5be05d6acc92c3b4a4f5e371e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 14:21:51 +0200 Subject: [PATCH 102/159] WIP: doc --- crates/viewer/re_space_view_graph/src/graph/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 701935cce52e..b66b89756b3a 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -34,6 +34,8 @@ impl<'a> From> for NodeIndex { } } +// TODO(grtlr): This struct is not used much currently. It might be worth considering to remove +// it, if we don't require it for the layout algorithms nor the user interactions. pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list unknown: ahash::HashSet<(&'a EntityPath, datatypes::GraphNode)>, From cdae2799742ebf9a85ee09585e91a8c531abbb2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 16:39:54 +0200 Subject: [PATCH 103/159] WIP: Remove `social` example files --- .../rust/node_link_graph/src/examples/mod.rs | 1 - .../src/examples/social/README.md | 1 - .../src/examples/social/mod.rs | 76 - .../src/examples/social/tij_SFHH.dat_ | 70261 ---------------- examples/rust/node_link_graph/src/main.rs | 2 - 5 files changed, 70341 deletions(-) delete mode 100644 examples/rust/node_link_graph/src/examples/social/README.md delete mode 100644 examples/rust/node_link_graph/src/examples/social/mod.rs delete mode 100644 examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs index 18b4f95543db..6f464054f3e5 100644 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -1,4 +1,3 @@ pub mod disjoint; pub mod lattice; pub mod simple; -pub mod social; diff --git a/examples/rust/node_link_graph/src/examples/social/README.md b/examples/rust/node_link_graph/src/examples/social/README.md deleted file mode 100644 index 3c84974ac7c9..000000000000 --- a/examples/rust/node_link_graph/src/examples/social/README.md +++ /dev/null @@ -1 +0,0 @@ -Data from http://www.sociopatterns.org/datasets/sfhh-conference-data-set/. diff --git a/examples/rust/node_link_graph/src/examples/social/mod.rs b/examples/rust/node_link_graph/src/examples/social/mod.rs deleted file mode 100644 index cc3233512c46..000000000000 --- a/examples/rust/node_link_graph/src/examples/social/mod.rs +++ /dev/null @@ -1,76 +0,0 @@ -use itertools::Itertools; -use rerun::{ - components::{self}, - datatypes, GraphEdges, GraphNodes, -}; - -use crate::Args; -use std::{ - collections::HashSet, - io::{BufRead, BufReader}, -}; - -struct Interaction { - timestamp: u32, - person_a: datatypes::GraphNode, - person_b: datatypes::GraphNode, -} - -fn parse_data_file() -> anyhow::Result> { - let contents = include_str!("tij_SFHH.dat_"); - let cursor = std::io::Cursor::new(contents.as_bytes()); - let reader = BufReader::new(cursor); - - let mut entries = Vec::new(); - for line in reader.lines() { - let line = line?; - let parts: Vec = line - .split_whitespace() - .map(|s| s.parse().unwrap()) - .collect(); - - let t = parts[0].as_str(); - let i = parts[1].as_str(); - let j = parts[2].as_str(); - - entries.push(Interaction { - timestamp: t.parse::()?, - person_a: i.into(), - person_b: j.into(), - }); - } - - Ok(entries) -} - -pub fn run(args: &Args) -> anyhow::Result<()> { - let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_social")?; - - // rec.set_time_sequence("frame", 0); - let entries = parse_data_file()?; - - let nodes = entries - .iter() - .flat_map(|i| [i.person_a.clone(), i.person_b.clone()]) - .collect::>(); - - rec.log_static( - "/persons", - &GraphNodes::new( - nodes - .iter() - .map(|n| components::GraphNode::from(datatypes::GraphNode(n.to_string().into()))), - ), - )?; - - for (timestamp, chunk) in &entries.into_iter().chunk_by(|t| t.timestamp) { - let interactions = chunk.collect::>(); - - rec.set_time_sequence("frame", timestamp); - rec.log( - "/persons", - &GraphEdges::new(interactions.into_iter().map(|i| (i.person_a, i.person_b))), - )?; - } - Ok(()) -} diff --git a/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ b/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ deleted file mode 100644 index 6b01b0c138e7..000000000000 --- a/examples/rust/node_link_graph/src/examples/social/tij_SFHH.dat_ +++ /dev/null @@ -1,70261 +0,0 @@ -32520 1467 1591 -32560 1513 1591 -32700 1591 1467 -32720 1591 1467 -32740 1591 1467 -32760 1591 1467 -32820 1467 1591 -32840 1467 1591 -32860 1467 1591 -32960 1568 1591 -32980 1568 1591 -33000 1568 1591 -33020 1568 1591 -33080 1562 1467 -33180 1524 1562 -33220 1524 1562 -33260 1771 1428 -33400 1600 1523 -33400 1525 1529 -33400 1600 1544 -33400 1600 1529 -33400 1600 1519 -33400 1544 1529 -33400 1544 1519 -33400 1600 1525 -33400 1600 1583 -33400 1510 1519 -33400 1544 1525 -33400 1519 1583 -33400 1519 1525 -33400 1519 1529 -33400 1549 1525 -33400 1583 1529 -33400 1510 1525 -33400 1583 1525 -33400 1553 1525 -33400 1583 1510 -33420 1606 1523 -33420 1600 1510 -33420 1600 1544 -33420 1600 1549 -33420 1600 1529 -33420 1600 1519 -33420 1510 1544 -33420 1544 1583 -33420 1544 1529 -33420 1544 1519 -33420 1549 1529 -33420 1519 1553 -33420 1523 1525 -33420 1600 1553 -33420 1600 1525 -33420 1600 1583 -33420 1510 1549 -33420 1510 1529 -33420 1510 1519 -33420 1544 1553 -33420 1544 1549 -33420 1544 1525 -33420 1519 1549 -33420 1519 1583 -33420 1519 1525 -33420 1519 1529 -33420 1549 1553 -33420 1549 1525 -33420 1549 1583 -33420 1583 1529 -33420 1553 1523 -33420 1510 1525 -33420 1583 1553 -33420 1583 1525 -33420 1553 1525 -33420 1510 1553 -33420 1583 1510 -33440 1600 1510 -33440 1600 1544 -33440 1600 1549 -33440 1600 1529 -33440 1600 1519 -33440 1510 1544 -33440 1544 1583 -33440 1544 1529 -33440 1544 1519 -33440 1549 1529 -33440 1519 1553 -33440 1523 1525 -33440 1600 1553 -33440 1600 1525 -33440 1600 1583 -33440 1510 1549 -33440 1510 1529 -33440 1510 1519 -33440 1544 1553 -33440 1544 1523 -33440 1544 1549 -33440 1544 1525 -33440 1519 1549 -33440 1519 1583 -33440 1519 1523 -33440 1519 1525 -33440 1519 1529 -33440 1549 1553 -33440 1549 1525 -33440 1549 1583 -33440 1583 1529 -33440 1553 1523 -33440 1529 1525 -33440 1510 1525 -33440 1583 1553 -33440 1583 1525 -33440 1553 1525 -33440 1510 1553 -33440 1583 1510 -33460 1600 1553 -33460 1600 1523 -33460 1600 1525 -33460 1600 1583 -33460 1510 1549 -33460 1510 1529 -33460 1510 1519 -33460 1544 1553 -33460 1544 1523 -33460 1544 1549 -33460 1544 1525 -33460 1519 1549 -33460 1519 1583 -33460 1519 1523 -33460 1519 1525 -33460 1519 1529 -33460 1549 1553 -33460 1549 1523 -33460 1549 1525 -33460 1549 1583 -33460 1583 1529 -33460 1553 1523 -33460 1523 1529 -33460 1529 1525 -33460 1510 1525 -33460 1583 1553 -33460 1583 1525 -33460 1553 1525 -33460 1510 1553 -33460 1583 1510 -33480 1510 1525 -33480 1583 1553 -33480 1583 1525 -33480 1553 1525 -33480 1510 1553 -33480 1583 1510 -33500 1519 1549 -33500 1510 1525 -33500 1583 1553 -33500 1583 1525 -33500 1553 1525 -33500 1510 1553 -33500 1583 1510 -33520 1622 1529 -33520 1510 1525 -33520 1583 1553 -33520 1583 1525 -33520 1553 1525 -33520 1510 1553 -33520 1583 1510 -33540 1510 1525 -33540 1583 1553 -33540 1583 1525 -33540 1553 1525 -33540 1510 1553 -33540 1583 1510 -33560 1510 1525 -33560 1583 1553 -33560 1583 1525 -33560 1553 1523 -33560 1553 1525 -33560 1510 1553 -33560 1583 1510 -33580 1510 1525 -33580 1583 1553 -33580 1583 1525 -33580 1553 1523 -33580 1553 1525 -33580 1523 1525 -33580 1510 1553 -33580 1583 1523 -33580 1583 1510 -33600 1510 1553 -33600 1510 1599 -33600 1583 1523 -33600 1513 1560 -33600 1523 1599 -33600 1525 1599 -33600 1510 1523 -33600 1583 1510 -33620 1553 1525 -33620 1523 1525 -33620 1513 1560 -33620 1523 1599 -33620 1525 1599 -33620 1510 1523 -33620 1583 1510 -33640 1513 1560 -33640 1523 1599 -33640 1525 1599 -33640 1510 1523 -33640 1583 1510 -33660 1602 1631 -33660 1583 1553 -33660 1525 1599 -33660 1510 1553 -33660 1510 1523 -33660 1583 1523 -33660 1553 1523 -33660 1583 1510 -33680 1510 1553 -33680 1510 1523 -33680 1583 1523 -33680 1553 1523 -33680 1553 1525 -33680 1553 1599 -33680 1523 1599 -33680 1523 1525 -33680 1583 1510 -33700 1510 1599 -33700 1583 1599 -33700 1602 1631 -33700 1583 1510 -33720 1583 1525 -33720 1583 1599 -33720 1599 1525 -33720 1602 1631 -33720 1510 1525 -33720 1523 1525 -33720 1573 1519 -33720 1537 1560 -33720 1599 1523 -33720 1583 1510 -33740 1573 1519 -33740 1537 1560 -33740 1599 1523 -33740 1583 1510 -33760 1537 1560 -33760 1599 1523 -33760 1583 1510 -33780 1602 1631 -33780 1599 1523 -33780 1583 1510 -33800 1583 1599 -33800 1599 1510 -33800 1583 1519 -33800 1602 1631 -33800 1599 1523 -33800 1583 1510 -33820 1583 1519 -33820 1519 1525 -33820 1602 1631 -33820 1599 1523 -33820 1583 1510 -33840 1602 1631 -33840 1599 1523 -33840 1583 1510 -33860 1560 1531 -33860 1602 1631 -33860 1599 1523 -33860 1583 1510 -33880 1602 1631 -33880 1523 1531 -33880 1599 1523 -33880 1583 1510 -33900 1539 1568 -33900 1599 1604 -33900 1602 1631 -33900 1599 1531 -33900 1523 1531 -33900 1604 1531 -33900 1599 1523 -33900 1583 1510 -33920 1599 1531 -33920 1523 1531 -33920 1604 1531 -33920 1599 1523 -33920 1583 1510 -33940 1599 1529 -33940 1599 1510 -33940 1604 1531 -33940 1599 1525 -33940 1599 1523 -33940 1602 1631 -33940 1583 1510 -33960 1529 1523 -33960 1510 1523 -33960 1583 1599 -33960 1599 1529 -33960 1599 1510 -33960 1604 1531 -33960 1599 1525 -33960 1599 1523 -33960 1602 1631 -33960 1583 1510 -33980 1583 1599 -33980 1599 1529 -33980 1599 1510 -33980 1604 1531 -33980 1599 1525 -33980 1549 1525 -33980 1599 1523 -33980 1602 1631 -33980 1583 1510 -34000 1543 1513 -34000 1544 1573 -34000 1599 1525 -34000 1549 1525 -34000 1599 1523 -34000 1602 1631 -34000 1583 1510 -34020 1583 1599 -34020 1599 1529 -34020 1599 1510 -34020 1549 1525 -34020 1599 1523 -34020 1602 1631 -34020 1583 1510 -34040 1543 1513 -34040 1599 1529 -34040 1599 1510 -34040 1549 1525 -34040 1599 1523 -34040 1602 1631 -34040 1583 1510 -34060 1583 1599 -34060 1599 1529 -34060 1599 1510 -34060 1544 1573 -34060 1549 1525 -34060 1599 1523 -34060 1602 1631 -34060 1583 1510 -34080 1599 1529 -34080 1599 1510 -34080 1604 1531 -34080 1519 1523 -34080 1544 1573 -34080 1549 1525 -34080 1599 1523 -34080 1602 1631 -34080 1583 1510 -34100 1544 1573 -34100 1549 1525 -34100 1599 1523 -34100 1602 1631 -34100 1583 1510 -34120 1544 1549 -34120 1544 1525 -34120 1544 1599 -34120 1549 1525 -34120 1599 1525 -34120 1599 1523 -34120 1544 1523 -34120 1602 1631 -34120 1604 1531 -34120 1583 1510 -34140 1544 1583 -34140 1544 1525 -34140 1544 1599 -34140 1549 1525 -34140 1599 1525 -34140 1599 1523 -34140 1544 1523 -34140 1544 1510 -34140 1602 1631 -34140 1604 1531 -34140 1583 1510 -34160 1599 1523 -34160 1525 1529 -34160 1544 1523 -34160 1544 1510 -34160 1602 1631 -34160 1604 1531 -34160 1583 1510 -34180 1544 1523 -34180 1544 1510 -34180 1523 1525 -34180 1544 1599 -34180 1602 1631 -34180 1583 1525 -34180 1544 1525 -34180 1604 1531 -34180 1583 1510 -34200 1544 1599 -34200 1602 1631 -34200 1526 1531 -34200 1583 1525 -34200 1544 1525 -34200 1604 1531 -34200 1599 1523 -34200 1583 1510 -34220 1602 1631 -34220 1526 1531 -34220 1510 1525 -34220 1583 1525 -34220 1544 1525 -34220 1604 1531 -34220 1599 1523 -34220 1583 1510 -34240 1510 1525 -34240 1583 1525 -34240 1544 1525 -34240 1604 1531 -34240 1582 1523 -34240 1582 1599 -34240 1599 1523 -34240 1583 1510 -34260 1549 1525 -34260 1583 1525 -34260 1602 1631 -34260 1544 1525 -34260 1604 1531 -34260 1582 1523 -34260 1582 1599 -34260 1599 1523 -34260 1583 1510 -34280 1544 1525 -34280 1551 1269 -34280 1604 1531 -34280 1582 1523 -34280 1582 1599 -34280 1599 1523 -34280 1583 1510 -34300 1463 1628 -34300 1604 1531 -34300 1519 1523 -34300 1582 1523 -34300 1582 1599 -34300 1599 1523 -34300 1549 1525 -34300 1583 1510 -34320 1552 1600 -34320 1582 1523 -34320 1582 1599 -34320 1602 1631 -34320 1599 1523 -34320 1549 1525 -34320 1583 1510 -34340 1551 1269 -34340 1599 1523 -34340 1549 1525 -34340 1604 1531 -34340 1583 1510 -34360 1544 1523 -34360 1551 1514 -34360 1551 1269 -34360 1591 1531 -34360 1544 1599 -34360 1599 1523 -34360 1549 1525 -34360 1604 1531 -34360 1583 1510 -34380 1591 1604 -34380 1551 1514 -34380 1551 1269 -34380 1591 1531 -34380 1602 1631 -34380 1544 1599 -34380 1599 1523 -34380 1549 1525 -34380 1604 1531 -34380 1583 1510 -34400 1544 1523 -34400 1547 1504 -34400 1551 1514 -34400 1551 1269 -34400 1552 1600 -34400 1591 1531 -34400 1602 1631 -34400 1523 1529 -34400 1544 1599 -34400 1599 1523 -34400 1549 1525 -34400 1604 1531 -34400 1583 1510 -34420 1544 1599 -34420 1599 1523 -34420 1510 1529 -34420 1523 1525 -34420 1599 1529 -34420 1549 1525 -34420 1604 1531 -34420 1583 1510 -34440 1544 1525 -34440 1544 1510 -34440 1599 1529 -34440 1600 1523 -34440 1601 1604 -34440 1510 1525 -34440 1549 1525 -34440 1463 1628 -34440 1604 1531 -34440 1583 1510 -34460 1544 1600 -34460 1544 1523 -34460 1549 1525 -34460 1599 1510 -34460 1519 1523 -34460 1463 1628 -34460 1599 1523 -34460 1602 1631 -34460 1604 1531 -34460 1583 1510 -34480 1463 1628 -34480 1599 1523 -34480 1601 1629 -34480 1599 1529 -34480 1602 1631 -34480 1604 1531 -34480 1583 1510 -34500 1544 1529 -34500 1549 1523 -34500 1601 1629 -34500 1616 1518 -34500 1547 1504 -34500 1599 1529 -34500 1544 1599 -34500 1549 1519 -34500 1602 1631 -34500 1604 1531 -34500 1583 1510 -34520 1547 1504 -34520 1599 1529 -34520 1523 1529 -34520 1544 1599 -34520 1549 1519 -34520 1602 1631 -34520 1604 1531 -34520 1583 1510 -34540 1544 1529 -34540 1544 1599 -34540 1549 1519 -34540 1600 1519 -34540 1602 1631 -34540 1604 1531 -34540 1551 1269 -34540 1583 1510 -34560 1544 1523 -34560 1600 1519 -34560 1602 1631 -34560 1604 1531 -34560 1463 1628 -34560 1551 1269 -34560 1616 1518 -34560 1599 1523 -34560 1583 1510 -34580 1544 1529 -34580 1551 1514 -34580 1551 1269 -34580 1616 1518 -34580 1547 1504 -34580 1599 1523 -34580 1583 1510 -34600 1544 1599 -34600 1547 1504 -34600 1691 1518 -34600 1600 1519 -34600 1599 1523 -34600 1604 1531 -34600 1583 1510 -34620 1544 1529 -34620 1599 1523 -34620 1604 1531 -34620 1551 1514 -34620 1602 1631 -34620 1583 1510 -34640 1544 1529 -34640 1545 1580 -34640 1549 1523 -34640 1616 1518 -34640 1549 1599 -34640 1599 1523 -34640 1604 1531 -34640 1551 1514 -34640 1602 1631 -34640 1583 1510 -34660 1549 1599 -34660 1599 1523 -34660 1604 1531 -34660 1544 1599 -34660 1551 1514 -34660 1602 1631 -34660 1583 1510 -34680 1544 1529 -34680 1544 1599 -34680 1544 1523 -34680 1551 1514 -34680 1616 1518 -34680 1600 1519 -34680 1602 1631 -34680 1583 1510 -34700 1523 1529 -34700 1544 1523 -34700 1551 1514 -34700 1616 1518 -34700 1600 1519 -34700 1602 1631 -34700 1583 1510 -34720 1544 1523 -34720 1551 1514 -34720 1616 1518 -34720 1600 1519 -34720 1602 1631 -34720 1604 1531 -34720 1583 1510 -34740 1544 1523 -34740 1549 1529 -34740 1551 1514 -34740 1616 1518 -34740 1600 1519 -34740 1602 1631 -34740 1604 1531 -34740 1583 1510 -34760 1539 1549 -34760 1600 1523 -34760 1600 1519 -34760 1601 1629 -34760 1602 1631 -34760 1544 1529 -34760 1604 1531 -34760 1519 1523 -34760 1583 1510 -34780 1544 1529 -34780 1544 1583 -34780 1604 1531 -34780 1616 1518 -34780 1544 1510 -34780 1519 1523 -34780 1583 1510 -34800 1544 1510 -34800 1600 1523 -34800 1539 1544 -34800 1600 1519 -34800 1519 1523 -34800 1539 1529 -34800 1583 1510 -34820 1600 1523 -34820 1604 1531 -34820 1539 1544 -34820 1600 1519 -34820 1602 1631 -34820 1519 1523 -34820 1539 1529 -34820 1583 1510 -34840 1539 1544 -34840 1539 1600 -34840 1600 1519 -34840 1544 1523 -34840 1463 1628 -34840 1602 1631 -34840 1519 1523 -34840 1539 1529 -34840 1544 1529 -34840 1583 1510 -34860 1539 1599 -34860 1539 1519 -34860 1544 1523 -34860 1463 1628 -34860 1600 1523 -34860 1602 1631 -34860 1519 1523 -34860 1539 1529 -34860 1544 1529 -34860 1583 1510 -34880 1539 1544 -34880 1599 1600 -34880 1599 1519 -34880 1600 1523 -34880 1602 1631 -34880 1519 1529 -34880 1519 1523 -34880 1539 1529 -34880 1539 1523 -34880 1544 1529 -34880 1599 1523 -34880 1600 1519 -34880 1544 1599 -34880 1583 1510 -34900 1539 1529 -34900 1539 1631 -34900 1539 1523 -34900 1539 1771 -34900 1544 1529 -34900 1599 1523 -34900 1599 1529 -34900 1599 1631 -34900 1539 1599 -34900 1599 1510 -34900 1600 1519 -34900 1544 1599 -34900 1604 1531 -34900 1583 1510 -34920 1539 1544 -34920 1539 1599 -34920 1583 1599 -34920 1599 1600 -34920 1599 1510 -34920 1600 1523 -34920 1602 1631 -34920 1519 1523 -34920 1600 1519 -34920 1544 1599 -34920 1604 1531 -34920 1583 1510 -34940 1549 1631 -34940 1600 1523 -34940 1602 1631 -34940 1519 1523 -34940 1600 1519 -34940 1544 1599 -34940 1544 1523 -34940 1604 1531 -34940 1583 1510 -34960 1600 1519 -34960 1599 1529 -34960 1523 1529 -34960 1544 1529 -34960 1544 1599 -34960 1544 1523 -34960 1604 1531 -34960 1569 1520 -34960 1583 1510 -34980 1599 1529 -34980 1600 1628 -34980 1602 1631 -34980 1523 1529 -34980 1616 1518 -34980 1544 1529 -34980 1463 1628 -34980 1544 1599 -34980 1599 1523 -34980 1544 1523 -34980 1604 1531 -34980 1539 1547 -34980 1569 1520 -34980 1583 1510 -35000 1463 1600 -35000 1616 1518 -35000 1544 1529 -35000 1463 1628 -35000 1544 1599 -35000 1599 1523 -35000 1544 1523 -35000 1604 1531 -35000 1539 1547 -35000 1569 1520 -35000 1583 1510 -35020 1544 1529 -35020 1545 1616 -35020 1569 1742 -35020 1463 1628 -35020 1599 1529 -35020 1544 1599 -35020 1599 1523 -35020 1544 1523 -35020 1604 1531 -35020 1539 1547 -35020 1569 1520 -35020 1583 1510 -35040 1599 1529 -35040 1544 1599 -35040 1599 1523 -35040 1601 1629 -35040 1523 1529 -35040 1544 1523 -35040 1545 1430 -35040 1430 1453 -35040 1604 1531 -35040 1539 1547 -35040 1569 1520 -35040 1583 1510 -35060 1544 1599 -35060 1599 1523 -35060 1600 1529 -35060 1601 1629 -35060 1523 1529 -35060 1544 1523 -35060 1545 1453 -35060 1545 1430 -35060 1430 1453 -35060 1563 1618 -35060 1742 1520 -35060 1604 1531 -35060 1539 1547 -35060 1569 1520 -35060 1569 1742 -35060 1583 1510 -35080 1544 1529 -35080 1544 1523 -35080 1545 1453 -35080 1545 1430 -35080 1430 1453 -35080 1434 1448 -35080 1563 1618 -35080 1463 1599 -35080 1463 1628 -35080 1742 1520 -35080 1604 1531 -35080 1539 1547 -35080 1569 1520 -35080 1569 1742 -35080 1549 1523 -35080 1583 1510 -35100 1448 1600 -35100 1463 1628 -35100 1601 1629 -35100 1742 1520 -35100 1604 1531 -35100 1539 1547 -35100 1569 1520 -35100 1569 1742 -35100 1549 1523 -35100 1583 1510 -35120 1563 1618 -35120 1604 1531 -35120 1539 1547 -35120 1569 1520 -35120 1569 1742 -35120 1549 1523 -35120 1583 1510 -35140 1604 1531 -35140 1539 1547 -35140 1742 1520 -35140 1569 1520 -35140 1569 1742 -35140 1549 1523 -35140 1583 1510 -35160 1539 1547 -35160 1569 1448 -35160 1742 1520 -35160 1569 1520 -35160 1569 1742 -35160 1549 1523 -35160 1583 1510 -35180 1448 1487 -35180 1529 1531 -35180 1583 1531 -35180 1463 1628 -35180 1742 1520 -35180 1510 1531 -35180 1523 1531 -35180 1569 1520 -35180 1569 1742 -35180 1602 1631 -35180 1549 1523 -35180 1583 1510 -35200 1539 1448 -35200 1544 1531 -35200 1583 1531 -35200 1463 1628 -35200 1742 1520 -35200 1510 1531 -35200 1523 1531 -35200 1569 1520 -35200 1604 1518 -35200 1569 1742 -35200 1602 1631 -35200 1549 1523 -35200 1583 1510 -35220 1434 1602 -35220 1434 1631 -35220 1523 1531 -35220 1569 1520 -35220 1604 1518 -35220 1569 1742 -35220 1602 1631 -35220 1549 1523 -35220 1583 1510 -35240 1569 1520 -35240 1604 1616 -35240 1604 1518 -35240 1569 1742 -35240 1602 1631 -35240 1549 1523 -35240 1583 1510 -35260 1569 1742 -35260 1602 1631 -35260 1549 1523 -35260 1583 1510 -35280 1563 1618 -35280 1463 1628 -35280 1602 1631 -35280 1616 1518 -35280 1604 1616 -35280 1549 1523 -35280 1583 1510 -35300 1604 1616 -35300 1569 1742 -35300 1742 1520 -35300 1549 1523 -35300 1583 1510 -35320 1569 1520 -35320 1569 1742 -35320 1742 1520 -35320 1549 1523 -35320 1616 1518 -35320 1583 1510 -35340 1563 1618 -35340 1569 1520 -35340 1569 1626 -35340 1569 1742 -35340 1742 1520 -35340 1742 1626 -35340 1626 1520 -35340 1549 1523 -35340 1616 1518 -35340 1583 1510 -35360 1549 1523 -35360 1616 1518 -35360 1583 1510 -35380 1563 1618 -35380 1549 1523 -35380 1616 1518 -35380 1583 1510 -35400 1549 1523 -35400 1616 1518 -35400 1583 1510 -35420 1549 1523 -35420 1434 1629 -35420 1616 1518 -35420 1742 1520 -35420 1563 1618 -35420 1599 1512 -35420 1583 1510 -35440 1742 1520 -35440 1563 1618 -35440 1599 1512 -35440 1583 1510 -35460 1563 1618 -35460 1604 1616 -35460 1604 1527 -35460 1549 1523 -35460 1599 1512 -35460 1583 1510 -35480 1592 1618 -35480 1549 1523 -35480 1616 1518 -35480 1604 1518 -35480 1599 1512 -35480 1583 1510 -35500 1549 1523 -35500 1563 1618 -35500 1616 1518 -35500 1604 1518 -35500 1604 1616 -35500 1599 1512 -35500 1583 1510 -35520 1616 1518 -35520 1604 1518 -35520 1604 1616 -35520 1599 1512 -35520 1583 1510 -35540 1592 1618 -35540 1616 1518 -35540 1563 1618 -35540 1604 1518 -35540 1519 1529 -35540 1604 1616 -35540 1549 1523 -35540 1599 1512 -35540 1583 1510 -35560 1563 1618 -35560 1604 1518 -35560 1519 1529 -35560 1604 1616 -35560 1549 1523 -35560 1563 1592 -35560 1599 1512 -35560 1583 1510 -35580 1592 1618 -35580 1604 1616 -35580 1549 1523 -35580 1563 1592 -35580 1601 1629 -35580 1599 1512 -35580 1583 1510 -35600 1549 1523 -35600 1563 1592 -35600 1604 1518 -35600 1601 1629 -35600 1628 1527 -35600 1599 1512 -35600 1519 1529 -35600 1583 1510 -35620 1563 1618 -35620 1592 1520 -35620 1601 1629 -35620 1628 1527 -35620 1599 1512 -35620 1604 1616 -35620 1519 1529 -35620 1583 1510 -35640 1549 1523 -35640 1549 1525 -35640 1601 1629 -35640 1604 1518 -35640 1628 1527 -35640 1599 1512 -35640 1604 1616 -35640 1519 1529 -35640 1583 1510 -35660 1563 1618 -35660 1628 1527 -35660 1599 1512 -35660 1592 1626 -35660 1604 1616 -35660 1519 1529 -35660 1616 1518 -35660 1583 1510 -35680 1599 1512 -35680 1604 1518 -35680 1592 1520 -35680 1592 1626 -35680 1604 1616 -35680 1519 1529 -35680 1616 1518 -35680 1583 1510 -35700 1563 1618 -35700 1592 1520 -35700 1592 1626 -35700 1604 1616 -35700 1519 1529 -35700 1616 1518 -35700 1628 1527 -35700 1549 1523 -35700 1583 1510 -35720 1616 1518 -35720 1628 1527 -35720 1600 1626 -35720 1549 1523 -35720 1600 1520 -35720 1626 1520 -35720 1604 1518 -35720 1583 1510 -35740 1600 1626 -35740 1549 1523 -35740 1600 1520 -35740 1626 1520 -35740 1601 1629 -35740 1604 1518 -35740 1583 1510 -35760 1549 1523 -35760 1600 1520 -35760 1626 1520 -35760 1563 1618 -35760 1601 1629 -35760 1604 1616 -35760 1604 1518 -35760 1512 1525 -35760 1583 1510 -35780 1544 1529 -35780 1544 1525 -35780 1616 1518 -35780 1563 1618 -35780 1601 1629 -35780 1604 1616 -35780 1604 1518 -35780 1512 1525 -35780 1583 1510 -35800 1563 1618 -35800 1437 1599 -35800 1601 1629 -35800 1604 1616 -35800 1549 1523 -35800 1604 1518 -35800 1512 1525 -35800 1583 1510 -35820 1549 1523 -35820 1599 1527 -35820 1604 1518 -35820 1512 1525 -35820 1616 1518 -35820 1583 1510 -35840 1437 1527 -35840 1604 1518 -35840 1544 1529 -35840 1463 1628 -35840 1563 1618 -35840 1512 1525 -35840 1437 1599 -35840 1616 1518 -35840 1583 1510 -35860 1544 1529 -35860 1463 1628 -35860 1592 1527 -35860 1601 1629 -35860 1549 1523 -35860 1463 1518 -35860 1563 1618 -35860 1512 1525 -35860 1437 1599 -35860 1616 1518 -35860 1583 1510 -35880 1549 1523 -35880 1463 1518 -35880 1592 1525 -35880 1563 1618 -35880 1512 1525 -35880 1437 1599 -35880 1592 1600 -35880 1616 1518 -35880 1583 1510 -35900 1563 1618 -35900 1512 1525 -35900 1437 1599 -35900 1592 1600 -35900 1616 1518 -35900 1583 1510 -35920 1549 1523 -35920 1592 1525 -35920 1437 1599 -35920 1592 1600 -35920 1616 1518 -35920 1549 1525 -35920 1583 1510 -35940 1592 1523 -35940 1523 1525 -35940 1563 1618 -35940 1437 1599 -35940 1592 1600 -35940 1616 1518 -35940 1549 1525 -35940 1583 1510 -35960 1544 1592 -35960 1544 1604 -35960 1463 1518 -35960 1592 1525 -35960 1563 1618 -35960 1437 1599 -35960 1592 1600 -35960 1616 1518 -35960 1549 1525 -35960 1583 1510 -35980 1544 1525 -35980 1563 1618 -35980 1437 1599 -35980 1592 1600 -35980 1616 1518 -35980 1604 1523 -35980 1549 1525 -35980 1583 1510 -36000 1542 1599 -36000 1437 1599 -36000 1592 1600 -36000 1616 1518 -36000 1604 1523 -36000 1549 1525 -36000 1583 1510 -36020 1544 1525 -36020 1463 1628 -36020 1616 1518 -36020 1563 1592 -36020 1604 1523 -36020 1549 1525 -36020 1583 1510 -36040 1563 1592 -36040 1604 1523 -36040 1616 1527 -36040 1518 1527 -36040 1549 1525 -36040 1583 1510 -36060 1549 1525 -36060 1583 1510 -36080 1544 1549 -36080 1448 1629 -36080 1463 1628 -36080 1549 1525 -36080 1583 1510 -36100 1544 1604 -36100 1463 1628 -36100 1549 1525 -36100 1583 1510 -36120 1544 1529 -36120 1553 1523 -36120 1544 1604 -36120 1463 1628 -36120 1549 1525 -36120 1583 1510 -36140 1544 1529 -36140 1553 1523 -36140 1563 1618 -36140 1544 1604 -36140 1463 1628 -36140 1549 1525 -36140 1583 1510 -36160 1544 1604 -36160 1600 1529 -36160 1523 1525 -36160 1463 1628 -36160 1549 1525 -36160 1583 1510 -36180 1544 1525 -36180 1549 1523 -36180 1523 1525 -36180 1600 1519 -36180 1544 1523 -36180 1463 1628 -36180 1549 1525 -36180 1583 1510 -36200 1563 1592 -36200 1600 1519 -36200 1544 1523 -36200 1463 1628 -36200 1549 1525 -36200 1583 1510 -36220 1600 1529 -36220 1600 1519 -36220 1519 1529 -36220 1544 1523 -36220 1437 1604 -36220 1463 1628 -36220 1544 1525 -36220 1523 1525 -36220 1549 1525 -36220 1583 1510 -36240 1544 1523 -36240 1437 1604 -36240 1463 1628 -36240 1544 1525 -36240 1523 1525 -36240 1549 1525 -36240 1583 1510 -36260 1463 1628 -36260 1600 1519 -36260 1519 1529 -36260 1544 1525 -36260 1523 1525 -36260 1549 1525 -36260 1583 1510 -36280 1600 1519 -36280 1519 1529 -36280 1544 1523 -36280 1544 1525 -36280 1523 1525 -36280 1549 1525 -36280 1583 1510 -36300 1448 1487 -36300 1544 1523 -36300 1544 1525 -36300 1523 1525 -36300 1549 1525 -36300 1583 1510 -36320 1544 1523 -36320 1544 1525 -36320 1523 1525 -36320 1549 1525 -36320 1600 1519 -36320 1583 1510 -36340 1523 1525 -36340 1549 1525 -36340 1519 1529 -36340 1600 1519 -36340 1601 1629 -36340 1583 1510 -36360 1544 1525 -36360 1523 1525 -36360 1549 1525 -36360 1544 1523 -36360 1519 1529 -36360 1600 1519 -36360 1601 1629 -36360 1583 1510 -36380 1549 1525 -36380 1600 1529 -36380 1544 1523 -36380 1519 1529 -36380 1600 1519 -36380 1601 1629 -36380 1583 1510 -36400 1544 1600 -36400 1544 1523 -36400 1519 1529 -36400 1600 1519 -36400 1601 1629 -36400 1523 1525 -36400 1583 1510 -36420 1600 1519 -36420 1601 1629 -36420 1523 1525 -36420 1583 1510 -36440 1523 1525 -36440 1583 1510 -36460 1601 1629 -36460 1523 1525 -36460 1583 1510 -36480 1601 1629 -36480 1600 1519 -36480 1523 1525 -36480 1583 1510 -36500 1600 1529 -36500 1600 1519 -36500 1523 1525 -36500 1583 1510 -36520 1463 1628 -36520 1601 1629 -36520 1600 1529 -36520 1600 1519 -36520 1523 1525 -36520 1583 1510 -36540 1601 1629 -36540 1600 1529 -36540 1600 1519 -36540 1523 1525 -36540 1583 1510 -36560 1463 1628 -36560 1601 1629 -36560 1600 1529 -36560 1600 1519 -36560 1523 1525 -36560 1583 1510 -36580 1601 1629 -36580 1600 1529 -36580 1600 1519 -36580 1523 1525 -36580 1583 1510 -36600 1601 1629 -36600 1600 1529 -36600 1600 1519 -36600 1523 1525 -36600 1583 1510 -36620 1601 1629 -36620 1519 1529 -36620 1600 1529 -36620 1600 1519 -36620 1523 1525 -36620 1583 1510 -36640 1600 1529 -36640 1600 1519 -36640 1523 1525 -36640 1583 1510 -36660 1461 1627 -36660 1600 1519 -36660 1523 1525 -36660 1583 1510 -36680 1600 1519 -36680 1523 1525 -36680 1583 1510 -36700 1600 1519 -36700 1549 1523 -36700 1549 1525 -36700 1523 1525 -36700 1583 1510 -36720 1549 1523 -36720 1461 1627 -36720 1549 1525 -36720 1523 1525 -36720 1583 1510 -36740 1553 1519 -36740 1549 1525 -36740 1523 1525 -36740 1583 1510 -36760 1549 1523 -36760 1553 1519 -36760 1549 1525 -36760 1600 1519 -36760 1523 1525 -36760 1583 1510 -36780 1549 1525 -36780 1600 1519 -36780 1523 1525 -36780 1583 1510 -36800 1600 1519 -36800 1523 1525 -36800 1583 1510 -36820 1549 1599 -36820 1600 1519 -36820 1523 1525 -36820 1583 1510 -36840 1600 1519 -36840 1523 1525 -36840 1583 1510 -36860 1600 1523 -36860 1523 1525 -36860 1601 1629 -36860 1583 1510 -36880 1601 1629 -36880 1519 1523 -36880 1583 1510 -36900 1600 1519 -36900 1601 1629 -36900 1519 1523 -36900 1583 1510 -36920 1583 1510 -36940 1600 1529 -36940 1600 1519 -36940 1583 1510 -36960 1583 1510 -36980 1600 1529 -36980 1583 1510 -37000 1600 1529 -37000 1600 1519 -37000 1583 1510 -37020 1583 1510 -37040 1600 1529 -37040 1583 1510 -37060 1629 1599 -37060 1600 1529 -37060 1583 1510 -37080 1600 1519 -37080 1600 1529 -37080 1463 1628 -37080 1583 1510 -37100 1600 1519 -37100 1600 1529 -37100 1463 1628 -37100 1583 1510 -37120 1600 1519 -37120 1600 1529 -37120 1463 1628 -37120 1583 1510 -37140 1549 1525 -37140 1600 1529 -37140 1463 1628 -37140 1583 1510 -37160 1600 1529 -37160 1463 1628 -37160 1583 1510 -37180 1549 1525 -37180 1463 1628 -37180 1592 1563 -37180 1600 1519 -37180 1583 1510 -37200 1600 1519 -37200 1583 1510 -37220 1600 1523 -37220 1583 1510 -37240 1578 1519 -37240 1549 1525 -37240 1519 1523 -37240 1618 1592 -37240 1583 1510 -37260 1463 1628 -37260 1600 1519 -37260 1583 1510 -37280 1618 1592 -37280 1463 1628 -37280 1600 1519 -37280 1583 1510 -37300 1600 1519 -37300 1583 1510 -37320 1600 1519 -37320 1583 1510 -37340 1600 1523 -37340 1510 1549 -37340 1463 1628 -37340 1600 1519 -37340 1583 1510 -37360 1549 1525 -37360 1463 1628 -37360 1600 1519 -37360 1583 1510 -37380 1600 1523 -37380 1600 1519 -37380 1510 1549 -37380 1583 1510 -37400 1510 1549 -37400 1549 1525 -37400 1583 1510 -37420 1544 1523 -37420 1549 1525 -37420 1583 1510 -37440 1600 1523 -37440 1583 1510 -37460 1549 1525 -37460 1592 1563 -37460 1600 1523 -37460 1583 1510 -37480 1463 1628 -37480 1600 1523 -37480 1600 1519 -37480 1583 1510 -37500 1544 1519 -37500 1592 1563 -37500 1600 1544 -37500 1600 1523 -37500 1600 1519 -37500 1583 1510 -37520 1592 1563 -37520 1600 1544 -37520 1600 1523 -37520 1600 1519 -37520 1583 1510 -37540 1549 1525 -37540 1600 1544 -37540 1544 1523 -37540 1600 1523 -37540 1600 1519 -37540 1583 1510 -37560 1600 1544 -37560 1544 1523 -37560 1600 1523 -37560 1600 1519 -37560 1583 1510 -37580 1600 1544 -37580 1544 1523 -37580 1600 1523 -37580 1600 1519 -37580 1549 1525 -37580 1583 1510 -37600 1544 1523 -37600 1600 1523 -37600 1600 1519 -37600 1549 1525 -37600 1583 1510 -37620 1600 1523 -37620 1600 1544 -37620 1600 1519 -37620 1549 1525 -37620 1583 1510 -37640 1600 1544 -37640 1600 1519 -37640 1544 1519 -37640 1549 1525 -37640 1583 1510 -37660 1600 1544 -37660 1600 1519 -37660 1544 1519 -37660 1549 1525 -37660 1583 1510 -37680 1523 1519 -37680 1583 1510 -37700 1600 1544 -37700 1519 1594 -37700 1583 1510 -37720 1544 1519 -37720 1583 1510 -37740 1544 1519 -37740 1521 1593 -37740 1549 1525 -37740 1583 1510 -37760 1549 1525 -37760 1583 1510 -37780 1549 1525 -37780 1583 1510 -37800 1549 1525 -37800 1583 1510 -37820 1549 1525 -37820 1583 1510 -37840 1519 1594 -37840 1463 1628 -37840 1549 1525 -37840 1583 1510 -37860 1600 1544 -37860 1549 1525 -37860 1583 1510 -37880 1549 1525 -37880 1583 1510 -37900 1549 1525 -37900 1583 1510 -37920 1600 1544 -37920 1549 1525 -37920 1583 1510 -37940 1549 1525 -37940 1583 1510 -37960 1523 1553 -37960 1521 1593 -37960 1544 1600 -37960 1549 1525 -37960 1583 1510 -37980 1600 1523 -37980 1521 1593 -37980 1463 1628 -37980 1544 1600 -37980 1549 1525 -37980 1583 1510 -38000 1523 1544 -38000 1544 1600 -38000 1549 1525 -38000 1583 1510 -38020 1600 1523 -38020 1544 1600 -38020 1549 1525 -38020 1583 1510 -38040 1523 1544 -38040 1544 1600 -38040 1549 1525 -38040 1594 1519 -38040 1583 1510 -38060 1544 1600 -38060 1549 1525 -38060 1600 1523 -38060 1593 1521 -38060 1594 1519 -38060 1583 1510 -38080 1593 1521 -38080 1523 1544 -38080 1594 1519 -38080 1583 1510 -38100 1523 1544 -38100 1549 1525 -38100 1594 1519 -38100 1523 1463 -38100 1583 1510 -38120 1521 1593 -38120 1594 1519 -38120 1523 1463 -38120 1463 1628 -38120 1583 1510 -38140 1793 1523 -38140 1521 1593 -38140 1594 1519 -38140 1793 1463 -38140 1523 1463 -38140 1463 1628 -38140 1583 1510 -38160 1793 1463 -38160 1523 1628 -38160 1523 1463 -38160 1463 1628 -38160 1583 1510 -38180 1519 1594 -38180 1463 1628 -38180 1583 1510 -38200 1549 1523 -38200 1583 1510 -38220 1463 1628 -38220 1583 1510 -38240 1544 1523 -38240 1544 1519 -38240 1519 1553 -38240 1463 1628 -38240 1583 1510 -38260 1544 1583 -38260 1519 1600 -38260 1463 1628 -38260 1583 1510 -38280 1523 1544 -38280 1583 1510 -38300 1463 1628 -38300 1600 1519 -38300 1583 1510 -38320 1600 1519 -38320 1583 1510 -38340 1600 1519 -38340 1463 1628 -38340 1583 1510 -38360 1600 1519 -38360 1463 1628 -38360 1583 1510 -38380 1523 1549 -38380 1583 1510 -38400 1523 1549 -38400 1583 1510 -38420 1583 1510 -38440 1600 1519 -38440 1523 1549 -38440 1583 1510 -38460 1523 1549 -38460 1583 1510 -38480 1523 1549 -38480 1600 1519 -38480 1583 1510 -38500 1523 1549 -38500 1593 1521 -38500 1463 1628 -38500 1600 1519 -38500 1583 1510 -38520 1553 1600 -38520 1463 1628 -38520 1600 1519 -38520 1583 1510 -38540 1549 1523 -38540 1600 1519 -38540 1583 1510 -38560 1463 1628 -38560 1583 1510 -38580 1463 1628 -38580 1583 1510 -38600 1523 1549 -38600 1600 1519 -38600 1583 1510 -38620 1598 1655 -38620 1600 1529 -38620 1600 1519 -38620 1436 1724 -38620 1436 1598 -38620 1724 1469 -38620 1724 1489 -38620 1598 1489 -38620 1724 1598 -38620 1853 1436 -38620 1853 1915 -38620 1915 1436 -38620 1583 1510 -38640 1853 1469 -38640 1600 1519 -38640 1436 1724 -38640 1436 1598 -38640 1724 1469 -38640 1598 1469 -38640 1489 1469 -38640 1463 1628 -38640 1724 1489 -38640 1598 1489 -38640 1724 1598 -38640 1853 1436 -38640 1853 1915 -38640 1915 1436 -38640 1583 1510 -38660 1436 1600 -38660 1724 1600 -38660 1600 1519 -38660 1436 1724 -38660 1436 1598 -38660 1724 1469 -38660 1598 1469 -38660 1489 1469 -38660 1463 1628 -38660 1724 1489 -38660 1598 1489 -38660 1724 1598 -38660 1853 1436 -38660 1853 1915 -38660 1915 1436 -38660 1583 1510 -38680 1436 1463 -38680 1463 1724 -38680 1436 1724 -38680 1436 1598 -38680 1724 1469 -38680 1598 1469 -38680 1489 1469 -38680 1463 1628 -38680 1724 1489 -38680 1598 1489 -38680 1724 1598 -38680 1853 1436 -38680 1853 1915 -38680 1915 1436 -38680 1583 1510 -38700 1549 1523 -38700 1628 1655 -38700 1436 1724 -38700 1436 1598 -38700 1598 1628 -38700 1724 1628 -38700 1724 1469 -38700 1598 1469 -38700 1489 1469 -38700 1436 1628 -38700 1463 1628 -38700 1724 1489 -38700 1598 1489 -38700 1724 1598 -38700 1853 1436 -38700 1853 1915 -38700 1915 1436 -38700 1583 1510 -38720 1436 1469 -38720 1436 1724 -38720 1436 1463 -38720 1436 1598 -38720 1598 1628 -38720 1724 1628 -38720 1724 1469 -38720 1598 1469 -38720 1489 1469 -38720 1436 1628 -38720 1463 1628 -38720 1724 1489 -38720 1598 1489 -38720 1724 1598 -38720 1853 1436 -38720 1853 1915 -38720 1915 1436 -38720 1583 1510 -38740 1436 1724 -38740 1436 1463 -38740 1436 1598 -38740 1451 1459 -38740 1469 1853 -38740 1598 1655 -38740 1598 1628 -38740 1489 1655 -38740 1463 1724 -38740 1724 1628 -38740 1724 1469 -38740 1598 1469 -38740 1489 1469 -38740 1436 1628 -38740 1463 1628 -38740 1724 1489 -38740 1598 1489 -38740 1724 1598 -38740 1853 1436 -38740 1853 1915 -38740 1915 1436 -38740 1583 1510 -38760 1436 1489 -38760 1463 1724 -38760 1463 1655 -38760 1724 1655 -38760 1724 1628 -38760 1724 1469 -38760 1598 1469 -38760 1489 1469 -38760 1463 1489 -38760 1436 1628 -38760 1463 1628 -38760 1724 1489 -38760 1436 1469 -38760 1598 1489 -38760 1724 1598 -38760 1853 1436 -38760 1853 1915 -38760 1915 1436 -38760 1583 1510 -38780 1544 1523 -38780 1463 1489 -38780 1853 1628 -38780 1436 1628 -38780 1436 1463 -38780 1463 1628 -38780 1724 1489 -38780 1436 1469 -38780 1598 1489 -38780 1724 1598 -38780 1853 1436 -38780 1853 1915 -38780 1915 1436 -38780 1583 1510 -38800 1436 1628 -38800 1436 1463 -38800 1441 1592 -38800 1463 1628 -38800 1523 1655 -38800 1544 1489 -38800 1544 1724 -38800 1724 1489 -38800 1436 1469 -38800 1519 1525 -38800 1853 1469 -38800 1598 1489 -38800 1724 1598 -38800 1853 1436 -38800 1853 1915 -38800 1915 1436 -38800 1583 1510 -38820 1544 1489 -38820 1544 1724 -38820 1544 1628 -38820 1544 1598 -38820 1724 1489 -38820 1724 1628 -38820 1598 1628 -38820 1489 1628 -38820 1436 1469 -38820 1519 1525 -38820 1853 1469 -38820 1598 1489 -38820 1724 1598 -38820 1853 1436 -38820 1853 1915 -38820 1915 1436 -38820 1583 1510 -38840 1469 1655 -38840 1436 1469 -38840 1519 1525 -38840 1853 1469 -38840 1598 1489 -38840 1724 1598 -38840 1853 1436 -38840 1853 1915 -38840 1915 1436 -38840 1583 1510 -38860 1600 1529 -38860 1469 1915 -38860 1469 1655 -38860 1436 1469 -38860 1519 1525 -38860 1853 1469 -38860 1598 1489 -38860 1724 1598 -38860 1853 1436 -38860 1853 1915 -38860 1915 1436 -38860 1583 1510 -38880 1553 1600 -38880 1853 1789 -38880 1853 1523 -38880 1853 1655 -38880 1469 1655 -38880 1519 1789 -38880 1655 1915 -38880 1655 1789 -38880 1436 1469 -38880 1519 1525 -38880 1853 1469 -38880 1598 1489 -38880 1724 1598 -38880 1789 1469 -38880 1853 1436 -38880 1853 1915 -38880 1789 1915 -38880 1915 1436 -38880 1583 1510 -38900 1544 1553 -38900 1549 1510 -38900 1436 1469 -38900 1523 1789 -38900 1544 1549 -38900 1519 1525 -38900 1853 1469 -38900 1598 1489 -38900 1724 1598 -38900 1789 1469 -38900 1915 1469 -38900 1853 1436 -38900 1853 1915 -38900 1789 1915 -38900 1789 1436 -38900 1915 1436 -38900 1583 1510 -38920 1544 1549 -38920 1469 1523 -38920 1920 1600 -38920 1724 1628 -38920 1598 1628 -38920 1489 1628 -38920 1529 1915 -38920 1853 1529 -38920 1563 1592 -38920 1519 1525 -38920 1853 1469 -38920 1598 1489 -38920 1724 1598 -38920 1789 1469 -38920 1915 1469 -38920 1853 1436 -38920 1853 1915 -38920 1789 1915 -38920 1789 1436 -38920 1915 1436 -38920 1583 1510 -38940 1920 1600 -38940 1463 1628 -38940 1469 1519 -38940 1436 1529 -38940 1724 1628 -38940 1598 1628 -38940 1489 1628 -38940 1529 1915 -38940 1549 1510 -38940 1724 1489 -38940 1853 1529 -38940 1563 1592 -38940 1436 1469 -38940 1519 1525 -38940 1853 1469 -38940 1598 1489 -38940 1724 1598 -38940 1789 1469 -38940 1915 1469 -38940 1853 1436 -38940 1853 1915 -38940 1789 1915 -38940 1789 1436 -38940 1915 1436 -38940 1583 1510 -38960 1544 1436 -38960 1436 1529 -38960 1463 1598 -38960 1724 1628 -38960 1598 1628 -38960 1489 1628 -38960 1529 1915 -38960 1544 1915 -38960 1544 1469 -38960 1549 1510 -38960 1724 1489 -38960 1853 1529 -38960 1563 1592 -38960 1436 1469 -38960 1519 1525 -38960 1853 1469 -38960 1598 1489 -38960 1724 1598 -38960 1789 1469 -38960 1915 1469 -38960 1853 1436 -38960 1853 1915 -38960 1789 1915 -38960 1789 1436 -38960 1915 1436 -38960 1583 1510 -38980 1544 1915 -38980 1544 1469 -38980 1544 1789 -38980 1549 1510 -38980 1549 1583 -38980 1724 1489 -38980 1853 1529 -38980 1463 1489 -38980 1563 1592 -38980 1436 1469 -38980 1519 1525 -38980 1853 1469 -38980 1598 1489 -38980 1724 1598 -38980 1789 1469 -38980 1915 1469 -38980 1853 1436 -38980 1853 1915 -38980 1789 1915 -38980 1789 1436 -38980 1915 1436 -38980 1583 1510 -39000 1920 1600 -39000 1463 1489 -39000 1529 1915 -39000 1563 1592 -39000 1436 1469 -39000 1525 1529 -39000 1519 1525 -39000 1853 1469 -39000 1598 1489 -39000 1724 1598 -39000 1789 1469 -39000 1915 1469 -39000 1853 1436 -39000 1853 1915 -39000 1789 1915 -39000 1789 1436 -39000 1915 1436 -39000 1583 1510 -39020 1563 1592 -39020 1436 1525 -39020 1525 1915 -39020 1519 1529 -39020 1436 1469 -39020 1525 1529 -39020 1519 1525 -39020 1549 1510 -39020 1853 1469 -39020 1598 1489 -39020 1724 1598 -39020 1789 1469 -39020 1915 1469 -39020 1853 1436 -39020 1853 1915 -39020 1789 1915 -39020 1789 1436 -39020 1915 1436 -39020 1583 1510 -39040 1519 1529 -39040 1436 1469 -39040 1525 1529 -39040 1724 1489 -39040 1519 1525 -39040 1549 1510 -39040 1853 1469 -39040 1593 1521 -39040 1598 1489 -39040 1724 1598 -39040 1789 1469 -39040 1915 1469 -39040 1853 1436 -39040 1853 1915 -39040 1789 1915 -39040 1789 1436 -39040 1915 1436 -39040 1583 1510 -39060 1724 1489 -39060 1519 1525 -39060 1563 1592 -39060 1549 1510 -39060 1853 1469 -39060 1593 1521 -39060 1598 1489 -39060 1724 1598 -39060 1789 1469 -39060 1915 1469 -39060 1853 1436 -39060 1853 1915 -39060 1789 1915 -39060 1789 1436 -39060 1915 1436 -39060 1583 1510 -39080 1563 1592 -39080 1549 1510 -39080 1853 1469 -39080 1593 1521 -39080 1598 1489 -39080 1724 1598 -39080 1789 1469 -39080 1436 1469 -39080 1915 1469 -39080 1853 1436 -39080 1853 1915 -39080 1789 1915 -39080 1789 1436 -39080 1915 1436 -39080 1583 1510 -39100 1549 1510 -39100 1519 1525 -39100 1724 1489 -39100 1853 1469 -39100 1593 1521 -39100 1598 1489 -39100 1724 1598 -39100 1789 1469 -39100 1436 1469 -39100 1915 1469 -39100 1853 1436 -39100 1853 1915 -39100 1789 1915 -39100 1789 1436 -39100 1915 1436 -39100 1583 1510 -39120 1563 1592 -39120 1724 1489 -39120 1853 1469 -39120 1593 1521 -39120 1598 1489 -39120 1724 1598 -39120 1789 1469 -39120 1436 1469 -39120 1915 1469 -39120 1853 1436 -39120 1853 1915 -39120 1789 1915 -39120 1789 1436 -39120 1915 1436 -39120 1583 1510 -39140 1519 1525 -39140 1853 1469 -39140 1593 1521 -39140 1598 1489 -39140 1724 1598 -39140 1789 1469 -39140 1436 1469 -39140 1915 1469 -39140 1853 1436 -39140 1853 1915 -39140 1789 1915 -39140 1789 1436 -39140 1915 1436 -39140 1583 1510 -39160 1519 1525 -39160 1853 1469 -39160 1593 1521 -39160 1598 1489 -39160 1724 1598 -39160 1789 1469 -39160 1436 1469 -39160 1915 1469 -39160 1853 1436 -39160 1853 1915 -39160 1789 1915 -39160 1789 1436 -39160 1915 1436 -39160 1583 1510 -39180 1519 1525 -39180 1724 1489 -39180 1853 1469 -39180 1593 1521 -39180 1598 1489 -39180 1724 1598 -39180 1789 1469 -39180 1436 1469 -39180 1915 1469 -39180 1853 1436 -39180 1853 1915 -39180 1789 1915 -39180 1789 1436 -39180 1915 1436 -39180 1583 1510 -39200 1519 1525 -39200 1724 1489 -39200 1853 1469 -39200 1593 1521 -39200 1598 1489 -39200 1724 1598 -39200 1789 1469 -39200 1436 1469 -39200 1915 1469 -39200 1853 1436 -39200 1853 1915 -39200 1789 1915 -39200 1789 1436 -39200 1915 1436 -39200 1583 1510 -39220 1519 1525 -39220 1724 1489 -39220 1853 1469 -39220 1593 1521 -39220 1598 1489 -39220 1724 1598 -39220 1789 1469 -39220 1436 1469 -39220 1915 1469 -39220 1853 1436 -39220 1853 1915 -39220 1789 1915 -39220 1789 1436 -39220 1915 1436 -39220 1583 1510 -39240 1519 1525 -39240 1463 1724 -39240 1463 1598 -39240 1724 1489 -39240 1853 1469 -39240 1463 1489 -39240 1593 1521 -39240 1598 1489 -39240 1724 1598 -39240 1789 1469 -39240 1436 1469 -39240 1915 1469 -39240 1853 1436 -39240 1853 1915 -39240 1789 1915 -39240 1789 1436 -39240 1915 1436 -39240 1583 1510 -39260 1549 1510 -39260 1853 1469 -39260 1599 1655 -39260 1463 1489 -39260 1593 1521 -39260 1598 1489 -39260 1724 1598 -39260 1789 1469 -39260 1436 1469 -39260 1915 1469 -39260 1853 1436 -39260 1853 1915 -39260 1789 1915 -39260 1789 1436 -39260 1915 1436 -39260 1583 1510 -39280 1519 1525 -39280 1463 1489 -39280 1593 1521 -39280 1598 1489 -39280 1724 1598 -39280 1789 1469 -39280 1436 1469 -39280 1915 1469 -39280 1853 1436 -39280 1853 1915 -39280 1789 1915 -39280 1789 1436 -39280 1915 1436 -39280 1583 1510 -39300 1538 1874 -39300 1574 1532 -39300 1599 1655 -39300 1617 1779 -39300 1874 1522 -39300 1774 1779 -39300 1463 1489 -39300 1825 1903 -39300 1825 1779 -39300 1825 1874 -39300 1825 1791 -39300 1903 1779 -39300 1469 1853 -39300 1593 1521 -39300 1598 1489 -39300 1724 1598 -39300 1574 1778 -39300 1903 1874 -39300 1778 1532 -39300 1789 1469 -39300 1436 1469 -39300 1779 1874 -39300 1791 1874 -39300 1791 1903 -39300 1903 1522 -39300 1915 1469 -39300 1825 1522 -39300 1853 1436 -39300 1779 1791 -39300 1791 1522 -39300 1779 1522 -39300 1853 1915 -39300 1789 1915 -39300 1789 1436 -39300 1915 1436 -39300 1583 1510 -39320 1463 1489 -39320 1857 1617 -39320 1825 1903 -39320 1825 1779 -39320 1825 1874 -39320 1825 1791 -39320 1853 1529 -39320 1903 1779 -39320 1469 1853 -39320 1593 1521 -39320 1519 1525 -39320 1598 1489 -39320 1724 1598 -39320 1574 1778 -39320 1903 1874 -39320 1778 1532 -39320 1789 1469 -39320 1436 1469 -39320 1779 1874 -39320 1791 1874 -39320 1791 1903 -39320 1903 1522 -39320 1915 1469 -39320 1825 1522 -39320 1853 1436 -39320 1779 1791 -39320 1791 1522 -39320 1779 1522 -39320 1853 1915 -39320 1789 1915 -39320 1789 1436 -39320 1915 1436 -39320 1583 1510 -39340 1549 1525 -39340 1678 1599 -39340 1774 1791 -39340 1437 1441 -39340 1774 1779 -39340 1903 1779 -39340 1469 1853 -39340 1593 1521 -39340 1519 1525 -39340 1598 1489 -39340 1724 1598 -39340 1574 1778 -39340 1903 1874 -39340 1778 1532 -39340 1789 1469 -39340 1436 1469 -39340 1779 1874 -39340 1791 1874 -39340 1791 1903 -39340 1903 1522 -39340 1915 1469 -39340 1825 1522 -39340 1853 1436 -39340 1779 1791 -39340 1791 1522 -39340 1779 1522 -39340 1853 1915 -39340 1789 1915 -39340 1789 1436 -39340 1915 1436 -39340 1583 1510 -39360 1853 1529 -39360 1437 1441 -39360 1774 1779 -39360 1903 1779 -39360 1469 1853 -39360 1593 1521 -39360 1519 1525 -39360 1825 1791 -39360 1598 1489 -39360 1724 1598 -39360 1574 1778 -39360 1903 1874 -39360 1778 1532 -39360 1789 1469 -39360 1436 1469 -39360 1779 1874 -39360 1791 1874 -39360 1791 1903 -39360 1903 1522 -39360 1915 1469 -39360 1825 1522 -39360 1779 1825 -39360 1853 1436 -39360 1779 1791 -39360 1791 1522 -39360 1779 1522 -39360 1853 1915 -39360 1789 1915 -39360 1789 1436 -39360 1915 1436 -39360 1583 1510 -39380 1678 1655 -39380 1437 1441 -39380 1449 1531 -39380 1774 1779 -39380 1903 1779 -39380 1678 1599 -39380 1574 1532 -39380 1469 1853 -39380 1593 1521 -39380 1519 1525 -39380 1825 1791 -39380 1598 1489 -39380 1724 1598 -39380 1574 1778 -39380 1903 1874 -39380 1778 1532 -39380 1825 1903 -39380 1789 1469 -39380 1436 1469 -39380 1779 1874 -39380 1791 1874 -39380 1791 1903 -39380 1903 1522 -39380 1915 1469 -39380 1825 1522 -39380 1779 1825 -39380 1853 1436 -39380 1779 1791 -39380 1791 1522 -39380 1779 1522 -39380 1853 1915 -39380 1789 1915 -39380 1789 1436 -39380 1915 1436 -39380 1583 1510 -39400 1678 1599 -39400 1574 1532 -39400 1469 1529 -39400 1469 1853 -39400 1853 1529 -39400 1436 1529 -39400 1593 1521 -39400 1825 1874 -39400 1519 1525 -39400 1825 1791 -39400 1598 1489 -39400 1724 1598 -39400 1574 1778 -39400 1903 1874 -39400 1778 1532 -39400 1825 1903 -39400 1789 1469 -39400 1436 1469 -39400 1779 1874 -39400 1791 1874 -39400 1789 1853 -39400 1791 1903 -39400 1903 1522 -39400 1915 1469 -39400 1825 1522 -39400 1779 1825 -39400 1853 1436 -39400 1779 1791 -39400 1791 1522 -39400 1779 1522 -39400 1853 1915 -39400 1789 1915 -39400 1789 1436 -39400 1915 1436 -39400 1583 1510 -39420 1544 1600 -39420 1544 1519 -39420 1469 1529 -39420 1469 1853 -39420 1853 1529 -39420 1529 1915 -39420 1436 1529 -39420 1593 1521 -39420 1600 1525 -39420 1774 1779 -39420 1825 1874 -39420 1463 1598 -39420 1600 1519 -39420 1519 1525 -39420 1825 1791 -39420 1598 1489 -39420 1724 1489 -39420 1724 1598 -39420 1574 1778 -39420 1903 1874 -39420 1778 1532 -39420 1825 1903 -39420 1789 1469 -39420 1436 1469 -39420 1779 1874 -39420 1791 1874 -39420 1789 1853 -39420 1791 1903 -39420 1903 1522 -39420 1915 1469 -39420 1825 1522 -39420 1779 1825 -39420 1853 1436 -39420 1779 1791 -39420 1791 1522 -39420 1779 1522 -39420 1779 1903 -39420 1853 1915 -39420 1789 1915 -39420 1789 1436 -39420 1915 1436 -39420 1583 1510 -39440 1538 1874 -39440 1544 1529 -39440 1544 1789 -39440 1544 1469 -39440 1549 1519 -39440 1436 1529 -39440 1574 1532 -39440 1593 1521 -39440 1600 1525 -39440 1774 1779 -39440 1553 1600 -39440 1825 1874 -39440 1463 1489 -39440 1463 1724 -39440 1463 1598 -39440 1600 1519 -39440 1519 1525 -39440 1549 1525 -39440 1825 1791 -39440 1598 1489 -39440 1724 1489 -39440 1724 1598 -39440 1574 1778 -39440 1903 1874 -39440 1778 1532 -39440 1825 1903 -39440 1789 1469 -39440 1436 1469 -39440 1779 1874 -39440 1791 1874 -39440 1789 1853 -39440 1791 1903 -39440 1903 1522 -39440 1915 1469 -39440 1825 1522 -39440 1779 1825 -39440 1853 1436 -39440 1779 1791 -39440 1791 1522 -39440 1779 1522 -39440 1779 1903 -39440 1853 1915 -39440 1789 1915 -39440 1789 1436 -39440 1915 1436 -39440 1583 1510 -39460 1553 1600 -39460 1825 1874 -39460 1463 1489 -39460 1463 1724 -39460 1463 1598 -39460 1600 1519 -39460 1857 1617 -39460 1519 1525 -39460 1544 1600 -39460 1874 1522 -39460 1549 1525 -39460 1825 1791 -39460 1598 1489 -39460 1724 1489 -39460 1724 1598 -39460 1853 1469 -39460 1574 1778 -39460 1903 1874 -39460 1778 1532 -39460 1825 1903 -39460 1789 1469 -39460 1436 1469 -39460 1779 1874 -39460 1791 1874 -39460 1789 1853 -39460 1791 1903 -39460 1903 1522 -39460 1915 1469 -39460 1825 1522 -39460 1779 1825 -39460 1853 1436 -39460 1779 1791 -39460 1791 1522 -39460 1779 1522 -39460 1779 1903 -39460 1853 1915 -39460 1789 1915 -39460 1789 1436 -39460 1915 1436 -39460 1583 1510 -39480 1544 1600 -39480 1544 1525 -39480 1853 1600 -39480 1600 1469 -39480 1874 1522 -39480 1549 1525 -39480 1825 1791 -39480 1598 1489 -39480 1724 1489 -39480 1724 1598 -39480 1716 1599 -39480 1574 1532 -39480 1853 1469 -39480 1574 1778 -39480 1903 1874 -39480 1778 1532 -39480 1825 1903 -39480 1789 1469 -39480 1436 1469 -39480 1779 1874 -39480 1791 1874 -39480 1789 1853 -39480 1791 1903 -39480 1903 1522 -39480 1915 1469 -39480 1825 1522 -39480 1779 1825 -39480 1853 1436 -39480 1779 1791 -39480 1791 1522 -39480 1779 1522 -39480 1779 1903 -39480 1853 1915 -39480 1789 1915 -39480 1789 1436 -39480 1915 1436 -39480 1583 1510 -39500 1544 1469 -39500 1463 1489 -39500 1463 1724 -39500 1463 1598 -39500 1857 1617 -39500 1874 1522 -39500 1549 1525 -39500 1825 1791 -39500 1598 1489 -39500 1724 1489 -39500 1724 1598 -39500 1716 1599 -39500 1574 1532 -39500 1853 1469 -39500 1574 1778 -39500 1903 1874 -39500 1778 1532 -39500 1825 1903 -39500 1789 1469 -39500 1436 1469 -39500 1779 1874 -39500 1791 1874 -39500 1789 1853 -39500 1791 1903 -39500 1903 1522 -39500 1915 1469 -39500 1825 1522 -39500 1779 1825 -39500 1853 1436 -39500 1779 1791 -39500 1791 1522 -39500 1779 1522 -39500 1779 1903 -39500 1853 1915 -39500 1789 1915 -39500 1789 1436 -39500 1915 1436 -39500 1583 1510 -39520 1544 1525 -39520 1544 1519 -39520 1549 1525 -39520 1519 1525 -39520 1825 1874 -39520 1825 1791 -39520 1598 1489 -39520 1724 1489 -39520 1724 1598 -39520 1808 1599 -39520 1716 1599 -39520 1574 1532 -39520 1853 1469 -39520 1574 1778 -39520 1903 1874 -39520 1778 1532 -39520 1825 1903 -39520 1789 1469 -39520 1436 1469 -39520 1779 1874 -39520 1791 1874 -39520 1789 1853 -39520 1791 1903 -39520 1903 1522 -39520 1915 1469 -39520 1825 1522 -39520 1779 1825 -39520 1853 1436 -39520 1779 1791 -39520 1791 1522 -39520 1779 1522 -39520 1779 1903 -39520 1853 1915 -39520 1789 1915 -39520 1789 1436 -39520 1915 1436 -39520 1583 1510 -39540 1519 1600 -39540 1825 1874 -39540 1857 1617 -39540 1874 1522 -39540 1825 1791 -39540 1598 1489 -39540 1724 1489 -39540 1724 1598 -39540 1808 1599 -39540 1716 1599 -39540 1574 1532 -39540 1853 1469 -39540 1574 1778 -39540 1903 1874 -39540 1778 1532 -39540 1825 1903 -39540 1789 1469 -39540 1436 1469 -39540 1779 1874 -39540 1791 1874 -39540 1789 1853 -39540 1791 1903 -39540 1903 1522 -39540 1915 1469 -39540 1825 1522 -39540 1779 1825 -39540 1853 1436 -39540 1779 1791 -39540 1791 1522 -39540 1779 1522 -39540 1779 1903 -39540 1853 1915 -39540 1789 1915 -39540 1789 1436 -39540 1915 1436 -39540 1583 1510 -39560 1544 1915 -39560 1549 1519 -39560 1600 1529 -39560 1874 1522 -39560 1825 1791 -39560 1598 1489 -39560 1463 1724 -39560 1724 1489 -39560 1724 1598 -39560 1808 1599 -39560 1716 1599 -39560 1574 1532 -39560 1853 1469 -39560 1574 1778 -39560 1903 1874 -39560 1778 1532 -39560 1825 1903 -39560 1789 1469 -39560 1436 1469 -39560 1779 1874 -39560 1791 1874 -39560 1789 1853 -39560 1791 1903 -39560 1903 1522 -39560 1915 1469 -39560 1825 1522 -39560 1779 1825 -39560 1853 1436 -39560 1779 1791 -39560 1791 1522 -39560 1779 1522 -39560 1779 1903 -39560 1853 1915 -39560 1789 1915 -39560 1789 1436 -39560 1915 1436 -39560 1583 1510 -39580 1825 1874 -39580 1774 1779 -39580 1519 1600 -39580 1716 1655 -39580 1463 1489 -39580 1463 1598 -39580 1825 1791 -39580 1598 1489 -39580 1463 1724 -39580 1724 1489 -39580 1724 1598 -39580 1808 1599 -39580 1716 1599 -39580 1574 1532 -39580 1853 1469 -39580 1574 1778 -39580 1903 1874 -39580 1778 1532 -39580 1825 1903 -39580 1789 1469 -39580 1436 1469 -39580 1779 1874 -39580 1791 1874 -39580 1789 1853 -39580 1791 1903 -39580 1903 1522 -39580 1915 1469 -39580 1825 1522 -39580 1779 1825 -39580 1853 1436 -39580 1779 1791 -39580 1791 1522 -39580 1779 1522 -39580 1779 1903 -39580 1853 1915 -39580 1789 1915 -39580 1789 1436 -39580 1915 1436 -39580 1583 1510 -39600 1544 1915 -39600 1549 1600 -39600 1593 1521 -39600 1525 1915 -39600 1519 1600 -39600 1716 1655 -39600 1463 1489 -39600 1463 1598 -39600 1825 1791 -39600 1598 1489 -39600 1463 1724 -39600 1724 1489 -39600 1724 1598 -39600 1544 1853 -39600 1808 1599 -39600 1716 1599 -39600 1574 1532 -39600 1853 1469 -39600 1574 1778 -39600 1903 1874 -39600 1778 1532 -39600 1825 1903 -39600 1789 1469 -39600 1436 1469 -39600 1779 1874 -39600 1791 1874 -39600 1789 1853 -39600 1791 1903 -39600 1903 1522 -39600 1915 1469 -39600 1825 1522 -39600 1779 1825 -39600 1853 1436 -39600 1779 1791 -39600 1791 1522 -39600 1779 1522 -39600 1779 1903 -39600 1853 1915 -39600 1789 1915 -39600 1789 1436 -39600 1915 1436 -39600 1583 1510 -39620 1519 1600 -39620 1716 1655 -39620 1463 1489 -39620 1463 1598 -39620 1600 1529 -39620 1874 1522 -39620 1544 1789 -39620 1825 1791 -39620 1598 1489 -39620 1463 1724 -39620 1724 1489 -39620 1724 1598 -39620 1544 1853 -39620 1808 1599 -39620 1716 1599 -39620 1523 1525 -39620 1574 1532 -39620 1853 1469 -39620 1574 1778 -39620 1903 1874 -39620 1778 1532 -39620 1825 1903 -39620 1789 1469 -39620 1436 1469 -39620 1779 1874 -39620 1791 1874 -39620 1789 1853 -39620 1791 1903 -39620 1903 1522 -39620 1915 1469 -39620 1825 1522 -39620 1779 1825 -39620 1853 1436 -39620 1779 1791 -39620 1791 1522 -39620 1779 1522 -39620 1779 1903 -39620 1853 1915 -39620 1789 1915 -39620 1789 1436 -39620 1915 1436 -39620 1583 1510 -39640 1544 1789 -39640 1825 1791 -39640 1598 1489 -39640 1463 1724 -39640 1724 1489 -39640 1724 1598 -39640 1544 1853 -39640 1808 1599 -39640 1716 1599 -39640 1523 1525 -39640 1574 1532 -39640 1853 1469 -39640 1574 1778 -39640 1903 1874 -39640 1778 1532 -39640 1825 1903 -39640 1789 1469 -39640 1436 1469 -39640 1779 1874 -39640 1791 1874 -39640 1789 1853 -39640 1791 1903 -39640 1903 1522 -39640 1915 1469 -39640 1825 1522 -39640 1779 1825 -39640 1853 1436 -39640 1779 1791 -39640 1791 1522 -39640 1779 1522 -39640 1779 1903 -39640 1853 1915 -39640 1789 1915 -39640 1789 1436 -39640 1915 1436 -39640 1583 1510 -39660 1463 1724 -39660 1724 1489 -39660 1724 1598 -39660 1544 1853 -39660 1808 1599 -39660 1716 1599 -39660 1523 1525 -39660 1574 1532 -39660 1853 1469 -39660 1574 1778 -39660 1903 1874 -39660 1778 1532 -39660 1825 1903 -39660 1789 1469 -39660 1436 1469 -39660 1779 1874 -39660 1791 1874 -39660 1789 1853 -39660 1791 1903 -39660 1903 1522 -39660 1915 1469 -39660 1825 1522 -39660 1779 1825 -39660 1853 1436 -39660 1779 1791 -39660 1791 1522 -39660 1779 1522 -39660 1779 1903 -39660 1853 1915 -39660 1789 1915 -39660 1789 1436 -39660 1915 1436 -39660 1583 1510 -39680 1544 1853 -39680 1808 1599 -39680 1716 1599 -39680 1463 1489 -39680 1531 1512 -39680 1523 1525 -39680 1808 1716 -39680 1774 1779 -39680 1574 1532 -39680 1463 1598 -39680 1549 1523 -39680 1853 1469 -39680 1574 1778 -39680 1903 1874 -39680 1778 1532 -39680 1825 1903 -39680 1789 1469 -39680 1436 1469 -39680 1779 1874 -39680 1791 1874 -39680 1789 1853 -39680 1791 1825 -39680 1791 1903 -39680 1903 1522 -39680 1915 1469 -39680 1825 1522 -39680 1779 1825 -39680 1853 1436 -39680 1779 1791 -39680 1791 1522 -39680 1779 1522 -39680 1779 1903 -39680 1853 1915 -39680 1789 1915 -39680 1789 1436 -39680 1915 1436 -39680 1583 1510 -39700 1920 1544 -39700 1808 1716 -39700 1463 1724 -39700 1774 1779 -39700 1549 1525 -39700 1574 1532 -39700 1519 1529 -39700 1463 1598 -39700 1549 1523 -39700 1600 1519 -39700 1853 1469 -39700 1574 1778 -39700 1903 1874 -39700 1778 1532 -39700 1825 1903 -39700 1789 1469 -39700 1436 1469 -39700 1779 1874 -39700 1791 1874 -39700 1789 1853 -39700 1791 1825 -39700 1791 1903 -39700 1903 1522 -39700 1915 1469 -39700 1825 1522 -39700 1779 1825 -39700 1853 1436 -39700 1779 1791 -39700 1791 1522 -39700 1779 1522 -39700 1779 1903 -39700 1853 1915 -39700 1789 1915 -39700 1789 1436 -39700 1915 1436 -39700 1583 1510 -39720 1549 1525 -39720 1574 1532 -39720 1724 1598 -39720 1519 1529 -39720 1463 1598 -39720 1600 1529 -39720 1549 1523 -39720 1600 1519 -39720 1853 1469 -39720 1574 1778 -39720 1903 1874 -39720 1778 1532 -39720 1825 1903 -39720 1789 1469 -39720 1436 1469 -39720 1779 1874 -39720 1791 1874 -39720 1789 1853 -39720 1791 1825 -39720 1791 1903 -39720 1903 1522 -39720 1915 1469 -39720 1825 1522 -39720 1779 1825 -39720 1853 1436 -39720 1779 1791 -39720 1791 1522 -39720 1779 1522 -39720 1779 1903 -39720 1853 1915 -39720 1789 1915 -39720 1789 1436 -39720 1915 1436 -39720 1583 1510 -39740 1459 1503 -39740 1523 1525 -39740 1724 1598 -39740 1874 1522 -39740 1519 1529 -39740 1463 1598 -39740 1600 1529 -39740 1549 1523 -39740 1600 1519 -39740 1853 1469 -39740 1574 1778 -39740 1903 1874 -39740 1778 1532 -39740 1825 1903 -39740 1789 1469 -39740 1436 1469 -39740 1779 1874 -39740 1791 1874 -39740 1789 1853 -39740 1791 1825 -39740 1791 1903 -39740 1903 1522 -39740 1915 1469 -39740 1825 1522 -39740 1779 1825 -39740 1853 1436 -39740 1779 1791 -39740 1791 1522 -39740 1779 1522 -39740 1779 1903 -39740 1853 1915 -39740 1789 1915 -39740 1789 1436 -39740 1915 1436 -39740 1583 1510 -39760 1574 1532 -39760 1724 1598 -39760 1825 1874 -39760 1874 1522 -39760 1779 1774 -39760 1549 1525 -39760 1519 1529 -39760 1463 1598 -39760 1724 1489 -39760 1600 1529 -39760 1598 1489 -39760 1549 1523 -39760 1600 1519 -39760 1853 1469 -39760 1574 1778 -39760 1903 1874 -39760 1778 1532 -39760 1825 1903 -39760 1789 1469 -39760 1436 1469 -39760 1779 1874 -39760 1791 1874 -39760 1789 1853 -39760 1791 1825 -39760 1791 1903 -39760 1903 1522 -39760 1915 1469 -39760 1825 1522 -39760 1779 1825 -39760 1853 1436 -39760 1779 1791 -39760 1791 1522 -39760 1779 1522 -39760 1779 1903 -39760 1853 1915 -39760 1789 1915 -39760 1789 1436 -39760 1915 1436 -39760 1583 1510 -39780 1549 1553 -39780 1549 1525 -39780 1519 1529 -39780 1463 1598 -39780 1724 1489 -39780 1600 1529 -39780 1915 1525 -39780 1598 1489 -39780 1549 1523 -39780 1600 1519 -39780 1853 1469 -39780 1574 1778 -39780 1903 1874 -39780 1778 1532 -39780 1825 1903 -39780 1789 1469 -39780 1436 1469 -39780 1779 1874 -39780 1791 1874 -39780 1789 1853 -39780 1791 1825 -39780 1791 1903 -39780 1903 1522 -39780 1915 1469 -39780 1825 1522 -39780 1779 1825 -39780 1853 1436 -39780 1779 1791 -39780 1791 1522 -39780 1779 1522 -39780 1779 1903 -39780 1853 1915 -39780 1789 1915 -39780 1789 1436 -39780 1915 1436 -39780 1583 1510 -39800 1463 1598 -39800 1724 1489 -39800 1600 1529 -39800 1915 1525 -39800 1574 1532 -39800 1598 1489 -39800 1549 1523 -39800 1599 1839 -39800 1600 1519 -39800 1853 1469 -39800 1599 1641 -39800 1574 1778 -39800 1903 1874 -39800 1778 1532 -39800 1825 1903 -39800 1789 1469 -39800 1436 1469 -39800 1779 1874 -39800 1791 1874 -39800 1789 1853 -39800 1791 1825 -39800 1791 1903 -39800 1903 1522 -39800 1915 1469 -39800 1825 1522 -39800 1779 1825 -39800 1853 1436 -39800 1779 1791 -39800 1791 1522 -39800 1779 1522 -39800 1779 1903 -39800 1853 1915 -39800 1789 1915 -39800 1789 1436 -39800 1915 1436 -39800 1583 1510 -39820 1808 1716 -39820 1574 1532 -39820 1598 1489 -39820 1549 1523 -39820 1857 1617 -39820 1519 1529 -39820 1599 1839 -39820 1600 1519 -39820 1853 1469 -39820 1599 1641 -39820 1574 1778 -39820 1903 1874 -39820 1778 1532 -39820 1825 1903 -39820 1789 1469 -39820 1436 1469 -39820 1779 1874 -39820 1791 1874 -39820 1789 1853 -39820 1791 1825 -39820 1791 1903 -39820 1903 1522 -39820 1915 1469 -39820 1825 1522 -39820 1779 1825 -39820 1853 1436 -39820 1779 1791 -39820 1791 1522 -39820 1779 1522 -39820 1779 1903 -39820 1853 1915 -39820 1789 1915 -39820 1789 1436 -39820 1915 1436 -39820 1583 1510 -39840 1549 1523 -39840 1449 1531 -39840 1463 1489 -39840 1857 1617 -39840 1724 1598 -39840 1519 1529 -39840 1599 1839 -39840 1600 1529 -39840 1600 1519 -39840 1853 1469 -39840 1599 1641 -39840 1574 1778 -39840 1903 1874 -39840 1778 1532 -39840 1825 1903 -39840 1789 1469 -39840 1436 1469 -39840 1779 1874 -39840 1791 1874 -39840 1789 1853 -39840 1791 1825 -39840 1791 1903 -39840 1903 1522 -39840 1915 1469 -39840 1825 1522 -39840 1779 1825 -39840 1853 1436 -39840 1779 1791 -39840 1791 1522 -39840 1779 1522 -39840 1779 1903 -39840 1853 1915 -39840 1789 1915 -39840 1789 1436 -39840 1915 1436 -39840 1583 1510 -39860 1825 1874 -39860 1724 1598 -39860 1874 1522 -39860 1523 1789 -39860 1519 1529 -39860 1599 1655 -39860 1599 1839 -39860 1600 1529 -39860 1641 1655 -39860 1779 1774 -39860 1600 1523 -39860 1600 1519 -39860 1519 1523 -39860 1574 1532 -39860 1853 1469 -39860 1599 1641 -39860 1574 1778 -39860 1903 1874 -39860 1778 1532 -39860 1825 1903 -39860 1789 1469 -39860 1436 1469 -39860 1779 1874 -39860 1791 1874 -39860 1789 1853 -39860 1791 1825 -39860 1791 1903 -39860 1903 1522 -39860 1915 1469 -39860 1825 1522 -39860 1779 1825 -39860 1853 1436 -39860 1779 1791 -39860 1791 1522 -39860 1779 1522 -39860 1779 1903 -39860 1853 1915 -39860 1789 1915 -39860 1789 1436 -39860 1915 1436 -39860 1583 1510 -39880 1544 1549 -39880 1519 1529 -39880 1599 1655 -39880 1599 1839 -39880 1600 1529 -39880 1531 1512 -39880 1641 1655 -39880 1779 1774 -39880 1525 1915 -39880 1600 1523 -39880 1600 1519 -39880 1519 1523 -39880 1574 1532 -39880 1544 1519 -39880 1853 1469 -39880 1599 1641 -39880 1574 1778 -39880 1903 1874 -39880 1778 1532 -39880 1825 1903 -39880 1549 1525 -39880 1789 1469 -39880 1436 1469 -39880 1779 1874 -39880 1791 1874 -39880 1789 1853 -39880 1791 1825 -39880 1791 1903 -39880 1903 1522 -39880 1915 1469 -39880 1825 1522 -39880 1779 1825 -39880 1853 1436 -39880 1779 1791 -39880 1791 1522 -39880 1779 1522 -39880 1779 1903 -39880 1853 1915 -39880 1789 1915 -39880 1789 1436 -39880 1915 1436 -39880 1583 1510 -39900 1825 1874 -39900 1531 1512 -39900 1641 1655 -39900 1779 1774 -39900 1525 1915 -39900 1544 1523 -39900 1600 1523 -39900 1600 1519 -39900 1519 1523 -39900 1574 1532 -39900 1544 1519 -39900 1853 1469 -39900 1599 1641 -39900 1574 1778 -39900 1903 1874 -39900 1778 1532 -39900 1825 1903 -39900 1549 1525 -39900 1789 1469 -39900 1436 1469 -39900 1779 1874 -39900 1791 1874 -39900 1789 1853 -39900 1791 1825 -39900 1791 1903 -39900 1903 1522 -39900 1915 1469 -39900 1825 1522 -39900 1779 1825 -39900 1853 1436 -39900 1779 1791 -39900 1791 1522 -39900 1779 1522 -39900 1779 1903 -39900 1853 1915 -39900 1789 1915 -39900 1789 1436 -39900 1915 1436 -39900 1583 1510 -39920 1544 1523 -39920 1839 1599 -39920 1600 1523 -39920 1600 1519 -39920 1874 1522 -39920 1519 1523 -39920 1574 1532 -39920 1544 1519 -39920 1724 1598 -39920 1853 1469 -39920 1599 1641 -39920 1574 1778 -39920 1903 1874 -39920 1778 1532 -39920 1825 1903 -39920 1549 1525 -39920 1789 1469 -39920 1436 1469 -39920 1779 1874 -39920 1791 1874 -39920 1789 1853 -39920 1791 1825 -39920 1791 1903 -39920 1903 1522 -39920 1915 1469 -39920 1825 1522 -39920 1779 1825 -39920 1853 1436 -39920 1779 1791 -39920 1791 1522 -39920 1779 1522 -39920 1779 1903 -39920 1853 1915 -39920 1789 1915 -39920 1789 1436 -39920 1915 1436 -39920 1583 1510 -39940 1779 1774 -39940 1523 1915 -39940 1544 1600 -39940 1574 1532 -39940 1544 1519 -39940 1724 1598 -39940 1853 1469 -39940 1599 1641 -39940 1574 1778 -39940 1903 1874 -39940 1778 1532 -39940 1825 1903 -39940 1549 1525 -39940 1789 1469 -39940 1436 1469 -39940 1779 1874 -39940 1791 1874 -39940 1789 1853 -39940 1791 1825 -39940 1791 1903 -39940 1903 1522 -39940 1915 1469 -39940 1825 1522 -39940 1779 1825 -39940 1853 1436 -39940 1779 1791 -39940 1791 1522 -39940 1779 1522 -39940 1779 1903 -39940 1853 1915 -39940 1789 1915 -39940 1789 1436 -39940 1915 1436 -39940 1583 1510 -39960 1544 1600 -39960 1574 1532 -39960 1449 1531 -39960 1544 1529 -39960 1544 1519 -39960 1724 1598 -39960 1853 1469 -39960 1599 1641 -39960 1574 1778 -39960 1903 1874 -39960 1778 1532 -39960 1825 1903 -39960 1549 1525 -39960 1789 1469 -39960 1436 1469 -39960 1779 1874 -39960 1791 1874 -39960 1789 1853 -39960 1791 1825 -39960 1791 1903 -39960 1903 1522 -39960 1915 1469 -39960 1825 1522 -39960 1779 1825 -39960 1853 1436 -39960 1779 1791 -39960 1791 1522 -39960 1779 1522 -39960 1779 1903 -39960 1853 1915 -39960 1789 1915 -39960 1789 1436 -39960 1915 1436 -39960 1583 1510 -39980 1544 1529 -39980 1544 1519 -39980 1724 1598 -39980 1853 1469 -39980 1523 1915 -39980 1519 1529 -39980 1599 1641 -39980 1779 1774 -39980 1574 1778 -39980 1903 1874 -39980 1778 1532 -39980 1825 1903 -39980 1549 1525 -39980 1789 1469 -39980 1436 1469 -39980 1779 1874 -39980 1791 1874 -39980 1789 1853 -39980 1791 1825 -39980 1791 1903 -39980 1903 1522 -39980 1915 1469 -39980 1825 1522 -39980 1779 1825 -39980 1853 1436 -39980 1779 1791 -39980 1791 1522 -39980 1779 1522 -39980 1779 1903 -39980 1853 1915 -39980 1789 1915 -39980 1789 1436 -39980 1915 1436 -39980 1583 1510 -40000 1519 1529 -40000 1599 1641 -40000 1779 1774 -40000 1574 1778 -40000 1574 1532 -40000 1903 1874 -40000 1778 1532 -40000 1825 1903 -40000 1874 1522 -40000 1549 1525 -40000 1789 1469 -40000 1436 1469 -40000 1779 1874 -40000 1791 1874 -40000 1789 1853 -40000 1791 1825 -40000 1791 1903 -40000 1903 1522 -40000 1915 1469 -40000 1825 1522 -40000 1779 1825 -40000 1853 1436 -40000 1779 1791 -40000 1791 1522 -40000 1779 1522 -40000 1779 1903 -40000 1853 1915 -40000 1789 1915 -40000 1789 1436 -40000 1915 1436 -40000 1583 1510 -40020 1574 1778 -40020 1574 1532 -40020 1469 1853 -40020 1903 1874 -40020 1628 1521 -40020 1778 1532 -40020 1825 1903 -40020 1874 1522 -40020 1724 1598 -40020 1463 1489 -40020 1549 1525 -40020 1789 1469 -40020 1436 1469 -40020 1779 1874 -40020 1791 1874 -40020 1789 1853 -40020 1791 1825 -40020 1791 1903 -40020 1903 1522 -40020 1915 1469 -40020 1825 1522 -40020 1779 1825 -40020 1853 1436 -40020 1779 1791 -40020 1791 1522 -40020 1779 1522 -40020 1779 1903 -40020 1853 1915 -40020 1789 1915 -40020 1789 1436 -40020 1915 1436 -40020 1583 1510 -40040 1825 1874 -40040 1778 1532 -40040 1599 1641 -40040 1825 1903 -40040 1874 1522 -40040 1724 1598 -40040 1463 1489 -40040 1549 1525 -40040 1789 1469 -40040 1436 1469 -40040 1779 1874 -40040 1791 1874 -40040 1789 1853 -40040 1791 1825 -40040 1791 1903 -40040 1903 1522 -40040 1915 1469 -40040 1825 1522 -40040 1779 1825 -40040 1853 1436 -40040 1779 1791 -40040 1791 1522 -40040 1779 1522 -40040 1779 1903 -40040 1853 1915 -40040 1789 1915 -40040 1789 1436 -40040 1915 1436 -40040 1583 1510 -40060 1825 1903 -40060 1874 1522 -40060 1724 1598 -40060 1544 1523 -40060 1463 1489 -40060 1857 1617 -40060 1574 1778 -40060 1574 1532 -40060 1549 1525 -40060 1789 1469 -40060 1436 1469 -40060 1779 1874 -40060 1791 1874 -40060 1874 1903 -40060 1789 1853 -40060 1791 1825 -40060 1791 1903 -40060 1903 1522 -40060 1915 1469 -40060 1825 1522 -40060 1779 1825 -40060 1853 1436 -40060 1779 1791 -40060 1791 1522 -40060 1779 1522 -40060 1779 1903 -40060 1853 1915 -40060 1789 1915 -40060 1789 1436 -40060 1915 1436 -40060 1583 1510 -40080 1724 1598 -40080 1544 1523 -40080 1469 1853 -40080 1641 1655 -40080 1463 1489 -40080 1599 1641 -40080 1857 1617 -40080 1778 1532 -40080 1574 1778 -40080 1574 1532 -40080 1549 1525 -40080 1789 1469 -40080 1436 1469 -40080 1779 1874 -40080 1791 1874 -40080 1874 1903 -40080 1789 1853 -40080 1791 1825 -40080 1791 1903 -40080 1903 1522 -40080 1915 1469 -40080 1825 1522 -40080 1779 1825 -40080 1853 1436 -40080 1779 1791 -40080 1791 1522 -40080 1779 1522 -40080 1779 1903 -40080 1853 1915 -40080 1789 1915 -40080 1789 1436 -40080 1915 1436 -40080 1583 1510 -40100 1544 1523 -40100 1469 1853 -40100 1599 1773 -40100 1874 1522 -40100 1544 1519 -40100 1641 1655 -40100 1463 1489 -40100 1599 1641 -40100 1857 1617 -40100 1778 1532 -40100 1574 1778 -40100 1574 1532 -40100 1549 1525 -40100 1789 1469 -40100 1436 1469 -40100 1779 1874 -40100 1791 1874 -40100 1874 1903 -40100 1789 1853 -40100 1791 1825 -40100 1791 1903 -40100 1825 1903 -40100 1903 1522 -40100 1915 1469 -40100 1825 1522 -40100 1779 1825 -40100 1853 1436 -40100 1779 1791 -40100 1791 1522 -40100 1779 1522 -40100 1779 1903 -40100 1853 1915 -40100 1789 1915 -40100 1789 1436 -40100 1915 1436 -40100 1583 1510 -40120 1544 1519 -40120 1641 1655 -40120 1463 1489 -40120 1599 1641 -40120 1724 1598 -40120 1857 1617 -40120 1778 1532 -40120 1574 1778 -40120 1574 1532 -40120 1808 1716 -40120 1549 1525 -40120 1789 1469 -40120 1436 1469 -40120 1779 1874 -40120 1791 1874 -40120 1874 1903 -40120 1789 1853 -40120 1791 1825 -40120 1791 1903 -40120 1825 1903 -40120 1903 1522 -40120 1915 1469 -40120 1825 1522 -40120 1779 1825 -40120 1853 1436 -40120 1779 1791 -40120 1791 1522 -40120 1779 1522 -40120 1779 1903 -40120 1853 1915 -40120 1789 1915 -40120 1789 1436 -40120 1915 1436 -40120 1583 1510 -40140 1463 1489 -40140 1599 1641 -40140 1724 1598 -40140 1857 1617 -40140 1774 1779 -40140 1544 1529 -40140 1778 1532 -40140 1574 1778 -40140 1574 1532 -40140 1808 1716 -40140 1549 1525 -40140 1678 1459 -40140 1789 1469 -40140 1853 1469 -40140 1436 1469 -40140 1779 1874 -40140 1791 1874 -40140 1874 1903 -40140 1789 1853 -40140 1791 1825 -40140 1791 1903 -40140 1825 1903 -40140 1903 1522 -40140 1915 1469 -40140 1825 1522 -40140 1779 1825 -40140 1853 1436 -40140 1779 1791 -40140 1791 1522 -40140 1779 1522 -40140 1779 1903 -40140 1853 1915 -40140 1789 1915 -40140 1789 1436 -40140 1915 1436 -40140 1583 1510 -40160 1519 1600 -40160 1724 1598 -40160 1857 1441 -40160 1773 1641 -40160 1857 1617 -40160 1774 1779 -40160 1544 1529 -40160 1778 1532 -40160 1574 1778 -40160 1574 1532 -40160 1808 1716 -40160 1549 1525 -40160 1678 1459 -40160 1789 1469 -40160 1853 1469 -40160 1436 1469 -40160 1779 1874 -40160 1791 1874 -40160 1874 1903 -40160 1789 1853 -40160 1791 1825 -40160 1791 1903 -40160 1825 1903 -40160 1903 1522 -40160 1915 1469 -40160 1825 1522 -40160 1779 1825 -40160 1853 1436 -40160 1779 1791 -40160 1791 1522 -40160 1779 1522 -40160 1779 1903 -40160 1853 1915 -40160 1789 1915 -40160 1789 1436 -40160 1915 1436 -40160 1583 1510 -40180 1544 1519 -40180 1773 1641 -40180 1857 1617 -40180 1874 1522 -40180 1774 1779 -40180 1525 1915 -40180 1441 1617 -40180 1599 1655 -40180 1544 1529 -40180 1778 1532 -40180 1574 1778 -40180 1574 1532 -40180 1808 1716 -40180 1549 1525 -40180 1678 1459 -40180 1789 1469 -40180 1853 1469 -40180 1436 1469 -40180 1779 1874 -40180 1791 1874 -40180 1874 1903 -40180 1789 1853 -40180 1791 1825 -40180 1791 1903 -40180 1825 1903 -40180 1903 1522 -40180 1915 1469 -40180 1825 1522 -40180 1779 1825 -40180 1853 1436 -40180 1779 1791 -40180 1791 1522 -40180 1779 1522 -40180 1779 1903 -40180 1853 1915 -40180 1789 1915 -40180 1789 1436 -40180 1915 1436 -40180 1583 1510 -40200 1441 1617 -40200 1441 1857 -40200 1599 1655 -40200 1544 1529 -40200 1544 1523 -40200 1778 1532 -40200 1574 1778 -40200 1574 1532 -40200 1808 1716 -40200 1549 1525 -40200 1678 1459 -40200 1789 1469 -40200 1853 1469 -40200 1436 1469 -40200 1779 1874 -40200 1791 1874 -40200 1874 1903 -40200 1789 1853 -40200 1791 1825 -40200 1791 1903 -40200 1825 1903 -40200 1903 1522 -40200 1915 1469 -40200 1825 1522 -40200 1779 1825 -40200 1853 1436 -40200 1779 1791 -40200 1791 1522 -40200 1779 1522 -40200 1779 1903 -40200 1853 1915 -40200 1789 1915 -40200 1789 1436 -40200 1915 1436 -40200 1583 1510 -40220 1544 1529 -40220 1544 1523 -40220 1778 1532 -40220 1463 1489 -40220 1463 1599 -40220 1574 1778 -40220 1574 1532 -40220 1808 1716 -40220 1599 1489 -40220 1549 1525 -40220 1600 1529 -40220 1678 1459 -40220 1789 1469 -40220 1853 1469 -40220 1436 1469 -40220 1779 1874 -40220 1791 1874 -40220 1874 1903 -40220 1789 1853 -40220 1791 1825 -40220 1791 1903 -40220 1825 1903 -40220 1903 1522 -40220 1915 1469 -40220 1825 1522 -40220 1779 1825 -40220 1853 1436 -40220 1779 1791 -40220 1791 1522 -40220 1779 1522 -40220 1779 1903 -40220 1853 1915 -40220 1789 1915 -40220 1789 1436 -40220 1915 1436 -40220 1583 1510 -40240 1544 1519 -40240 1773 1441 -40240 1574 1778 -40240 1574 1532 -40240 1489 1655 -40240 1808 1716 -40240 1463 1628 -40240 1599 1489 -40240 1441 1617 -40240 1549 1525 -40240 1600 1529 -40240 1678 1459 -40240 1857 1617 -40240 1779 1774 -40240 1789 1469 -40240 1853 1469 -40240 1436 1469 -40240 1779 1874 -40240 1791 1874 -40240 1874 1903 -40240 1789 1853 -40240 1791 1825 -40240 1791 1903 -40240 1825 1903 -40240 1903 1522 -40240 1915 1469 -40240 1825 1522 -40240 1779 1825 -40240 1853 1436 -40240 1779 1791 -40240 1791 1522 -40240 1779 1522 -40240 1779 1903 -40240 1853 1915 -40240 1789 1915 -40240 1789 1436 -40240 1915 1436 -40240 1583 1510 -40260 1808 1716 -40260 1463 1628 -40260 1724 1598 -40260 1599 1489 -40260 1857 1441 -40260 1441 1617 -40260 1874 1522 -40260 1549 1525 -40260 1600 1529 -40260 1678 1459 -40260 1857 1617 -40260 1779 1774 -40260 1789 1469 -40260 1853 1469 -40260 1436 1469 -40260 1779 1874 -40260 1791 1874 -40260 1874 1903 -40260 1789 1853 -40260 1791 1825 -40260 1791 1903 -40260 1825 1903 -40260 1903 1522 -40260 1915 1469 -40260 1825 1522 -40260 1779 1825 -40260 1853 1436 -40260 1779 1791 -40260 1791 1522 -40260 1779 1522 -40260 1779 1903 -40260 1853 1915 -40260 1789 1915 -40260 1789 1436 -40260 1915 1436 -40260 1778 1532 -40260 1583 1510 -40280 1544 1600 -40280 1549 1525 -40280 1563 1592 -40280 1600 1529 -40280 1678 1459 -40280 1437 1458 -40280 1857 1617 -40280 1779 1774 -40280 1789 1469 -40280 1853 1469 -40280 1436 1469 -40280 1779 1874 -40280 1791 1874 -40280 1874 1903 -40280 1789 1853 -40280 1791 1825 -40280 1791 1903 -40280 1825 1903 -40280 1903 1522 -40280 1915 1469 -40280 1825 1522 -40280 1779 1825 -40280 1853 1436 -40280 1779 1791 -40280 1791 1522 -40280 1779 1522 -40280 1779 1903 -40280 1853 1915 -40280 1789 1915 -40280 1789 1436 -40280 1574 1778 -40280 1915 1436 -40280 1778 1532 -40280 1583 1510 -40300 1546 1468 -40300 1546 1558 -40300 1678 1459 -40300 1808 1463 -40300 1558 1468 -40300 1437 1458 -40300 1441 1857 -40300 1857 1617 -40300 1871 1572 -40300 1489 1915 -40300 1779 1774 -40300 1920 1598 -40300 1825 1874 -40300 1598 1724 -40300 1617 1441 -40300 1789 1469 -40300 1853 1469 -40300 1436 1469 -40300 1779 1874 -40300 1791 1874 -40300 1874 1903 -40300 1574 1532 -40300 1724 1920 -40300 1599 1767 -40300 1789 1853 -40300 1791 1825 -40300 1791 1903 -40300 1825 1903 -40300 1903 1522 -40300 1915 1469 -40300 1825 1522 -40300 1779 1825 -40300 1853 1436 -40300 1779 1791 -40300 1791 1522 -40300 1779 1522 -40300 1779 1903 -40300 1853 1915 -40300 1789 1915 -40300 1789 1436 -40300 1574 1778 -40300 1915 1436 -40300 1778 1532 -40300 1583 1510 -40320 1920 1598 -40320 1641 1857 -40320 1544 1523 -40320 1825 1874 -40320 1874 1522 -40320 1523 1529 -40320 1598 1724 -40320 1617 1441 -40320 1600 1529 -40320 1789 1469 -40320 1853 1469 -40320 1436 1469 -40320 1779 1874 -40320 1791 1874 -40320 1874 1903 -40320 1574 1532 -40320 1724 1920 -40320 1599 1767 -40320 1789 1853 -40320 1791 1825 -40320 1791 1903 -40320 1825 1903 -40320 1903 1522 -40320 1915 1469 -40320 1825 1522 -40320 1779 1825 -40320 1853 1436 -40320 1779 1791 -40320 1791 1522 -40320 1779 1522 -40320 1779 1903 -40320 1853 1915 -40320 1789 1915 -40320 1789 1436 -40320 1574 1778 -40320 1915 1436 -40320 1778 1532 -40320 1583 1510 -40340 1549 1583 -40340 1591 1872 -40340 1598 1724 -40340 1617 1441 -40340 1655 1767 -40340 1544 1600 -40340 1600 1529 -40340 1789 1469 -40340 1853 1469 -40340 1436 1469 -40340 1779 1874 -40340 1791 1874 -40340 1874 1903 -40340 1574 1532 -40340 1593 1463 -40340 1724 1920 -40340 1599 1767 -40340 1678 1459 -40340 1789 1853 -40340 1791 1825 -40340 1791 1903 -40340 1825 1903 -40340 1903 1522 -40340 1915 1469 -40340 1825 1522 -40340 1779 1825 -40340 1853 1436 -40340 1779 1791 -40340 1791 1522 -40340 1779 1522 -40340 1779 1903 -40340 1853 1915 -40340 1789 1915 -40340 1789 1436 -40340 1574 1778 -40340 1915 1436 -40340 1778 1532 -40340 1583 1510 -40360 1574 1874 -40360 1599 1655 -40360 1774 1779 -40360 1879 1441 -40360 1544 1600 -40360 1593 1628 -40360 1600 1529 -40360 1789 1469 -40360 1853 1469 -40360 1436 1469 -40360 1538 1874 -40360 1779 1874 -40360 1791 1874 -40360 1825 1874 -40360 1874 1903 -40360 1574 1532 -40360 1593 1463 -40360 1724 1920 -40360 1599 1767 -40360 1678 1459 -40360 1789 1853 -40360 1791 1825 -40360 1791 1903 -40360 1825 1903 -40360 1903 1522 -40360 1915 1469 -40360 1825 1522 -40360 1779 1825 -40360 1853 1436 -40360 1779 1791 -40360 1791 1522 -40360 1779 1522 -40360 1779 1903 -40360 1853 1915 -40360 1789 1915 -40360 1789 1436 -40360 1574 1778 -40360 1915 1436 -40360 1778 1532 -40360 1583 1510 -40380 1544 1600 -40380 1549 1915 -40380 1549 1525 -40380 1593 1628 -40380 1600 1529 -40380 1655 1767 -40380 1789 1469 -40380 1853 1469 -40380 1436 1469 -40380 1441 1489 -40380 1538 1874 -40380 1602 1631 -40380 1779 1874 -40380 1791 1874 -40380 1825 1874 -40380 1874 1903 -40380 1874 1522 -40380 1512 1531 -40380 1574 1532 -40380 1593 1463 -40380 1724 1920 -40380 1599 1767 -40380 1678 1459 -40380 1789 1853 -40380 1791 1825 -40380 1791 1903 -40380 1825 1903 -40380 1903 1522 -40380 1915 1469 -40380 1825 1522 -40380 1779 1825 -40380 1853 1436 -40380 1779 1791 -40380 1791 1522 -40380 1779 1522 -40380 1779 1903 -40380 1853 1915 -40380 1789 1915 -40380 1789 1436 -40380 1574 1778 -40380 1915 1436 -40380 1778 1532 -40380 1583 1510 -40400 1538 1874 -40400 1602 1631 -40400 1613 1489 -40400 1613 1767 -40400 1641 1444 -40400 1774 1874 -40400 1779 1874 -40400 1791 1874 -40400 1825 1874 -40400 1874 1903 -40400 1874 1522 -40400 1512 1531 -40400 1574 1532 -40400 1593 1463 -40400 1600 1469 -40400 1724 1920 -40400 1469 1523 -40400 1538 1825 -40400 1599 1767 -40400 1678 1459 -40400 1789 1853 -40400 1791 1825 -40400 1791 1903 -40400 1825 1903 -40400 1903 1522 -40400 1915 1469 -40400 1825 1522 -40400 1779 1825 -40400 1853 1436 -40400 1767 1489 -40400 1779 1791 -40400 1791 1522 -40400 1599 1489 -40400 1779 1522 -40400 1779 1903 -40400 1853 1915 -40400 1544 1525 -40400 1789 1915 -40400 1789 1436 -40400 1574 1778 -40400 1915 1436 -40400 1778 1532 -40400 1583 1510 -40420 1538 1779 -40420 1538 1791 -40420 1554 1871 -40420 1574 1532 -40420 1591 1872 -40420 1593 1463 -40420 1600 1853 -40420 1600 1436 -40420 1600 1469 -40420 1600 1789 -40420 1613 1441 -40420 1623 1716 -40420 1724 1920 -40420 1469 1523 -40420 1538 1825 -40420 1599 1767 -40420 1655 1489 -40420 1436 1469 -40420 1678 1459 -40420 1789 1853 -40420 1791 1825 -40420 1791 1903 -40420 1825 1903 -40420 1903 1522 -40420 1915 1469 -40420 1825 1522 -40420 1779 1825 -40420 1853 1436 -40420 1767 1489 -40420 1779 1791 -40420 1791 1522 -40420 1599 1489 -40420 1779 1522 -40420 1779 1903 -40420 1853 1915 -40420 1544 1525 -40420 1789 1915 -40420 1789 1436 -40420 1574 1778 -40420 1915 1436 -40420 1778 1532 -40420 1583 1510 -40440 1538 1825 -40440 1538 1874 -40440 1538 1903 -40440 1544 1549 -40440 1549 1525 -40440 1549 1510 -40440 1549 1583 -40440 1568 1598 -40440 1599 1767 -40440 1613 1773 -40440 1655 1489 -40440 1825 1874 -40440 1436 1469 -40440 1573 1452 -40440 1623 1808 -40440 1678 1459 -40440 1779 1874 -40440 1789 1853 -40440 1791 1825 -40440 1791 1903 -40440 1825 1903 -40440 1874 1522 -40440 1874 1903 -40440 1903 1522 -40440 1915 1469 -40440 1825 1522 -40440 1779 1825 -40440 1853 1436 -40440 1767 1489 -40440 1779 1791 -40440 1791 1522 -40440 1599 1489 -40440 1779 1522 -40440 1779 1903 -40440 1853 1915 -40440 1544 1525 -40440 1789 1915 -40440 1789 1436 -40440 1574 1778 -40440 1915 1436 -40440 1778 1532 -40440 1583 1510 -40460 1549 1600 -40460 1568 1920 -40460 1573 1452 -40460 1623 1808 -40460 1678 1459 -40460 1774 1779 -40460 1779 1874 -40460 1789 1853 -40460 1791 1825 -40460 1791 1903 -40460 1825 1903 -40460 1857 1441 -40460 1874 1522 -40460 1874 1903 -40460 1903 1522 -40460 1915 1469 -40460 1458 1519 -40460 1512 1531 -40460 1825 1522 -40460 1779 1825 -40460 1789 1529 -40460 1915 1529 -40460 1436 1529 -40460 1724 1920 -40460 1853 1436 -40460 1767 1489 -40460 1779 1791 -40460 1791 1522 -40460 1599 1489 -40460 1779 1522 -40460 1779 1903 -40460 1853 1915 -40460 1544 1525 -40460 1789 1915 -40460 1789 1436 -40460 1574 1778 -40460 1574 1532 -40460 1915 1436 -40460 1778 1532 -40460 1583 1510 -40480 1539 1858 -40480 1554 1678 -40480 1600 1915 -40480 1631 1448 -40480 1634 1487 -40480 1678 1497 -40480 1771 1920 -40480 1825 1522 -40480 1500 1511 -40480 1546 1558 -40480 1599 1767 -40480 1779 1825 -40480 1789 1529 -40480 1915 1529 -40480 1436 1529 -40480 1724 1920 -40480 1853 1436 -40480 1767 1489 -40480 1779 1791 -40480 1791 1522 -40480 1599 1489 -40480 1779 1522 -40480 1600 1458 -40480 1779 1903 -40480 1853 1915 -40480 1459 1468 -40480 1546 1459 -40480 1558 1459 -40480 1558 1468 -40480 1544 1525 -40480 1789 1915 -40480 1789 1436 -40480 1574 1778 -40480 1574 1532 -40480 1915 1436 -40480 1778 1532 -40480 1583 1510 -40500 1539 1920 -40500 1543 1434 -40500 1546 1558 -40500 1546 1606 -40500 1554 1623 -40500 1556 1716 -40500 1590 1530 -40500 1591 1872 -40500 1599 1767 -40500 1604 1616 -40500 1631 1678 -40500 1779 1825 -40500 1789 1529 -40500 1915 1529 -40500 1436 1529 -40500 1623 1716 -40500 1774 1779 -40500 1858 1872 -40500 1568 1771 -40500 1572 1871 -40500 1724 1920 -40500 1853 1436 -40500 1543 1518 -40500 1767 1489 -40500 1779 1791 -40500 1791 1522 -40500 1791 1903 -40500 1599 1489 -40500 1779 1522 -40500 1600 1458 -40500 1779 1903 -40500 1903 1522 -40500 1546 1468 -40500 1853 1915 -40500 1459 1468 -40500 1546 1459 -40500 1558 1459 -40500 1558 1468 -40500 1544 1525 -40500 1789 1915 -40500 1789 1436 -40500 1554 1716 -40500 1574 1778 -40500 1574 1532 -40500 1915 1436 -40500 1778 1532 -40500 1583 1510 -40520 1543 1604 -40520 1559 1487 -40520 1563 1596 -40520 1598 1920 -40520 1606 1459 -40520 1623 1716 -40520 1628 1526 -40520 1774 1779 -40520 1853 1519 -40520 1858 1872 -40520 1463 1526 -40520 1512 1531 -40520 1568 1771 -40520 1572 1871 -40520 1623 1808 -40520 1857 1441 -40520 1604 1518 -40520 1724 1920 -40520 1853 1436 -40520 1543 1518 -40520 1767 1489 -40520 1779 1791 -40520 1791 1522 -40520 1791 1903 -40520 1599 1489 -40520 1779 1522 -40520 1600 1458 -40520 1779 1903 -40520 1903 1522 -40520 1546 1468 -40520 1853 1915 -40520 1459 1468 -40520 1546 1459 -40520 1558 1459 -40520 1558 1468 -40520 1544 1525 -40520 1789 1915 -40520 1789 1436 -40520 1554 1716 -40520 1574 1778 -40520 1574 1532 -40520 1915 1436 -40520 1778 1532 -40520 1583 1510 -40540 1556 1716 -40540 1559 1463 -40540 1568 1872 -40540 1568 1771 -40540 1572 1871 -40540 1591 1858 -40540 1599 1767 -40540 1600 1853 -40540 1613 1626 -40540 1622 1464 -40540 1623 1808 -40540 1631 1497 -40540 1771 1872 -40540 1853 1458 -40540 1857 1441 -40540 1915 1458 -40540 1538 1825 -40540 1602 1619 -40540 1604 1518 -40540 1904 1517 -40540 1436 1458 -40540 1724 1920 -40540 1853 1436 -40540 1543 1518 -40540 1767 1489 -40540 1779 1791 -40540 1791 1522 -40540 1791 1903 -40540 1599 1489 -40540 1779 1522 -40540 1546 1558 -40540 1600 1458 -40540 1779 1903 -40540 1903 1522 -40540 1546 1468 -40540 1853 1915 -40540 1459 1468 -40540 1546 1459 -40540 1558 1459 -40540 1558 1468 -40540 1544 1525 -40540 1789 1915 -40540 1789 1436 -40540 1554 1716 -40540 1574 1778 -40540 1574 1532 -40540 1915 1436 -40540 1778 1532 -40540 1583 1510 -40560 1538 1825 -40560 1538 1779 -40560 1539 1517 -40560 1557 1606 -40560 1602 1619 -40560 1604 1518 -40560 1619 1631 -40560 1623 1631 -40560 1904 1517 -40560 1436 1458 -40560 1602 1631 -40560 1604 1616 -40560 1617 1857 -40560 1724 1920 -40560 1853 1436 -40560 1543 1518 -40560 1563 1592 -40560 1767 1489 -40560 1779 1791 -40560 1791 1522 -40560 1791 1903 -40560 1599 1489 -40560 1779 1522 -40560 1546 1558 -40560 1600 1458 -40560 1779 1903 -40560 1903 1522 -40560 1546 1468 -40560 1853 1915 -40560 1459 1468 -40560 1546 1459 -40560 1558 1459 -40560 1558 1468 -40560 1544 1525 -40560 1789 1915 -40560 1789 1436 -40560 1554 1716 -40560 1574 1778 -40560 1574 1532 -40560 1915 1436 -40560 1778 1532 -40560 1583 1510 -40580 1539 1771 -40580 1559 1858 -40580 1602 1631 -40580 1604 1616 -40580 1617 1857 -40580 1623 1441 -40580 1724 1920 -40580 1789 1523 -40580 1853 1458 -40580 1853 1436 -40580 1915 1458 -40580 1458 1523 -40580 1537 1517 -40580 1543 1604 -40580 1543 1518 -40580 1563 1592 -40580 1617 1441 -40580 1591 1858 -40580 1767 1489 -40580 1779 1791 -40580 1791 1522 -40580 1791 1903 -40580 1853 1523 -40580 1599 1489 -40580 1779 1522 -40580 1546 1558 -40580 1600 1458 -40580 1779 1903 -40580 1903 1522 -40580 1546 1468 -40580 1853 1915 -40580 1459 1468 -40580 1546 1459 -40580 1558 1459 -40580 1558 1468 -40580 1460 1499 -40580 1544 1525 -40580 1789 1853 -40580 1789 1915 -40580 1789 1436 -40580 1554 1716 -40580 1574 1778 -40580 1574 1532 -40580 1915 1436 -40580 1778 1532 -40580 1583 1510 -40600 1537 1568 -40600 1537 1517 -40600 1537 1559 -40600 1538 1779 -40600 1543 1604 -40600 1543 1518 -40600 1563 1592 -40600 1617 1441 -40600 1622 1460 -40600 1628 1463 -40600 1904 1448 -40600 1464 1497 -40600 1512 1531 -40600 1591 1858 -40600 1767 1489 -40600 1779 1791 -40600 1791 1522 -40600 1791 1903 -40600 1853 1523 -40600 1915 1523 -40600 1538 1522 -40600 1541 1555 -40600 1541 1533 -40600 1599 1489 -40600 1779 1522 -40600 1546 1558 -40600 1600 1458 -40600 1779 1903 -40600 1903 1522 -40600 1546 1468 -40600 1853 1915 -40600 1459 1468 -40600 1546 1459 -40600 1558 1459 -40600 1558 1468 -40600 1460 1499 -40600 1544 1525 -40600 1572 1871 -40600 1789 1853 -40600 1789 1915 -40600 1789 1436 -40600 1573 1452 -40600 1617 1623 -40600 1554 1716 -40600 1574 1778 -40600 1574 1532 -40600 1915 1436 -40600 1599 1840 -40600 1778 1532 -40600 1583 1510 -40620 1537 1469 -40620 1555 1533 -40620 1562 1612 -40620 1568 1465 -40620 1579 1426 -40620 1579 1590 -40620 1590 1601 -40620 1590 1470 -40620 1591 1858 -40620 1596 1441 -40620 1596 1613 -40620 1596 1622 -40620 1641 1460 -40620 1767 1489 -40620 1779 1791 -40620 1791 1522 -40620 1791 1903 -40620 1853 1523 -40620 1858 1466 -40620 1915 1523 -40620 1538 1522 -40620 1541 1555 -40620 1541 1533 -40620 1599 1489 -40620 1773 1464 -40620 1779 1522 -40620 1436 1458 -40620 1500 1511 -40620 1546 1558 -40620 1599 1767 -40620 1600 1458 -40620 1779 1903 -40620 1903 1522 -40620 1546 1468 -40620 1623 1441 -40620 1853 1915 -40620 1459 1468 -40620 1546 1459 -40620 1558 1459 -40620 1558 1468 -40620 1460 1499 -40620 1544 1525 -40620 1572 1871 -40620 1724 1920 -40620 1789 1853 -40620 1789 1915 -40620 1789 1436 -40620 1573 1452 -40620 1617 1623 -40620 1554 1716 -40620 1574 1778 -40620 1574 1532 -40620 1915 1436 -40620 1599 1840 -40620 1778 1532 -40620 1583 1510 -40640 1538 1522 -40640 1541 1555 -40640 1541 1533 -40640 1541 1527 -40640 1590 1530 -40640 1593 1622 -40640 1599 1489 -40640 1600 1436 -40640 1600 1463 -40640 1608 1825 -40640 1617 1441 -40640 1617 1857 -40640 1773 1464 -40640 1779 1522 -40640 1857 1441 -40640 1436 1458 -40640 1469 1517 -40640 1470 1530 -40640 1500 1511 -40640 1504 1517 -40640 1546 1558 -40640 1599 1767 -40640 1600 1458 -40640 1600 1853 -40640 1716 1904 -40640 1779 1903 -40640 1840 1489 -40640 1903 1522 -40640 1546 1468 -40640 1623 1441 -40640 1853 1915 -40640 1459 1468 -40640 1546 1459 -40640 1558 1459 -40640 1558 1468 -40640 1619 1497 -40640 1460 1499 -40640 1544 1525 -40640 1572 1871 -40640 1724 1920 -40640 1789 1853 -40640 1789 1915 -40640 1789 1436 -40640 1573 1452 -40640 1617 1623 -40640 1554 1716 -40640 1574 1778 -40640 1574 1532 -40640 1915 1436 -40640 1599 1840 -40640 1778 1532 -40640 1583 1510 -40660 1538 1779 -40660 1538 1903 -40660 1546 1558 -40660 1555 1533 -40660 1590 1470 -40660 1599 1767 -40660 1600 1458 -40660 1600 1853 -40660 1604 1518 -40660 1608 1530 -40660 1619 1528 -40660 1655 1463 -40660 1716 1904 -40660 1771 1525 -40660 1774 1903 -40660 1779 1903 -40660 1840 1489 -40660 1903 1522 -40660 1546 1468 -40660 1574 1903 -40660 1623 1441 -40660 1650 1655 -40660 1742 1520 -40660 1778 1903 -40660 1853 1915 -40660 1853 1523 -40660 1459 1468 -40660 1546 1459 -40660 1558 1459 -40660 1558 1468 -40660 1590 1608 -40660 1619 1497 -40660 1441 1464 -40660 1460 1499 -40660 1544 1525 -40660 1572 1871 -40660 1724 1920 -40660 1789 1853 -40660 1789 1915 -40660 1789 1436 -40660 1573 1452 -40660 1617 1623 -40660 1554 1716 -40660 1574 1778 -40660 1574 1532 -40660 1915 1436 -40660 1599 1840 -40660 1778 1532 -40660 1583 1510 -40660 1767 1489 -40680 1538 1778 -40680 1541 1533 -40680 1546 1468 -40680 1554 1457 -40680 1574 1903 -40680 1579 1590 -40680 1593 1437 -40680 1596 1623 -40680 1623 1441 -40680 1650 1655 -40680 1655 1668 -40680 1655 1762 -40680 1742 1520 -40680 1743 1762 -40680 1778 1903 -40680 1808 1904 -40680 1853 1915 -40680 1853 1523 -40680 1903 1532 -40680 1915 1523 -40680 1452 1470 -40680 1459 1468 -40680 1497 1528 -40680 1546 1459 -40680 1558 1459 -40680 1558 1468 -40680 1590 1608 -40680 1593 1526 -40680 1619 1497 -40680 1436 1523 -40680 1441 1464 -40680 1460 1499 -40680 1500 1511 -40680 1501 1524 -40680 1544 1525 -40680 1572 1871 -40680 1724 1920 -40680 1789 1853 -40680 1650 1668 -40680 1650 1743 -40680 1789 1915 -40680 1789 1436 -40680 1573 1452 -40680 1617 1623 -40680 1668 1743 -40680 1554 1716 -40680 1668 1762 -40680 1574 1778 -40680 1574 1532 -40680 1915 1436 -40680 1599 1840 -40680 1778 1532 -40680 1583 1510 -40680 1767 1489 -40680 1650 1762 -40700 1546 1459 -40700 1558 1426 -40700 1558 1459 -40700 1558 1468 -40700 1590 1608 -40700 1590 1920 -40700 1590 1470 -40700 1593 1526 -40700 1608 1470 -40700 1612 1466 -40700 1619 1497 -40700 1825 1436 -40700 1853 1436 -40700 1436 1523 -40700 1441 1464 -40700 1460 1499 -40700 1500 1511 -40700 1501 1524 -40700 1544 1525 -40700 1572 1871 -40700 1678 1459 -40700 1724 1920 -40700 1789 1853 -40700 1825 1915 -40700 1582 1593 -40700 1650 1668 -40700 1650 1743 -40700 1789 1915 -40700 1789 1436 -40700 1573 1452 -40700 1617 1623 -40700 1668 1743 -40700 1554 1716 -40700 1668 1762 -40700 1574 1778 -40700 1574 1532 -40700 1915 1436 -40700 1599 1840 -40700 1778 1532 -40700 1583 1510 -40700 1767 1489 -40700 1650 1762 -40720 1542 1598 -40720 1544 1525 -40720 1572 1871 -40720 1582 1619 -40720 1582 1437 -40720 1593 1599 -40720 1678 1426 -40720 1678 1459 -40720 1724 1920 -40720 1789 1519 -40720 1789 1853 -40720 1789 1523 -40720 1825 1915 -40720 1853 1915 -40720 1853 1519 -40720 1554 1457 -40720 1582 1593 -40720 1650 1668 -40720 1650 1743 -40720 1789 1915 -40720 1789 1436 -40720 1426 1459 -40720 1573 1452 -40720 1617 1623 -40720 1668 1743 -40720 1742 1520 -40720 1915 1523 -40720 1608 1530 -40720 1554 1716 -40720 1668 1762 -40720 1574 1778 -40720 1574 1532 -40720 1915 1436 -40720 1436 1519 -40720 1599 1840 -40720 1778 1532 -40720 1915 1519 -40720 1583 1510 -40720 1767 1489 -40720 1650 1762 -40740 1538 1903 -40740 1540 1641 -40740 1541 1533 -40740 1546 1468 -40740 1554 1457 -40740 1557 1487 -40740 1569 1520 -40740 1582 1593 -40740 1650 1668 -40740 1650 1743 -40740 1789 1915 -40740 1789 1436 -40740 1426 1459 -40740 1497 1526 -40740 1554 1629 -40740 1573 1452 -40740 1617 1623 -40740 1668 1743 -40740 1742 1520 -40740 1915 1523 -40740 1436 1523 -40740 1441 1464 -40740 1512 1531 -40740 1608 1530 -40740 1629 1716 -40740 1650 1463 -40740 1668 1463 -40740 1762 1463 -40740 1554 1716 -40740 1563 1592 -40740 1668 1762 -40740 1574 1778 -40740 1574 1532 -40740 1915 1436 -40740 1436 1519 -40740 1599 1840 -40740 1778 1532 -40740 1915 1519 -40740 1587 1535 -40740 1500 1511 -40740 1583 1510 -40740 1767 1489 -40740 1650 1762 -40760 1538 1574 -40760 1554 1629 -40760 1557 1606 -40760 1573 1452 -40760 1604 1518 -40760 1617 1623 -40760 1668 1743 -40760 1678 1527 -40760 1742 1520 -40760 1789 1525 -40760 1915 1523 -40760 1431 1468 -40760 1436 1523 -40760 1438 1501 -40760 1441 1464 -40760 1468 1516 -40760 1512 1531 -40760 1544 1529 -40760 1572 1871 -40760 1608 1530 -40760 1629 1716 -40760 1650 1463 -40760 1668 1463 -40760 1762 1463 -40760 1554 1716 -40760 1563 1592 -40760 1668 1762 -40760 1574 1778 -40760 1574 1532 -40760 1915 1436 -40760 1436 1519 -40760 1599 1840 -40760 1778 1532 -40760 1915 1519 -40760 1587 1535 -40760 1500 1511 -40760 1583 1510 -40760 1767 1489 -40760 1650 1762 -40780 1540 1641 -40780 1541 1847 -40780 1544 1529 -40780 1572 1871 -40780 1600 1825 -40780 1608 1530 -40780 1623 1464 -40780 1628 1668 -40780 1629 1716 -40780 1650 1463 -40780 1668 1463 -40780 1762 1463 -40780 1825 1499 -40780 1554 1716 -40780 1563 1592 -40780 1668 1762 -40780 1507 1522 -40780 1525 1529 -40780 1541 1533 -40780 1574 1778 -40780 1574 1532 -40780 1915 1436 -40780 1436 1519 -40780 1599 1840 -40780 1778 1532 -40780 1915 1519 -40780 1587 1535 -40780 1500 1511 -40780 1583 1510 -40780 1459 1503 -40780 1767 1489 -40780 1623 1441 -40780 1650 1762 -40800 1538 1604 -40800 1538 1574 -40800 1542 1598 -40800 1546 1468 -40800 1554 1716 -40800 1563 1592 -40800 1574 1604 -40800 1587 1598 -40800 1600 1519 -40800 1604 1778 -40800 1655 1743 -40800 1668 1762 -40800 1742 1520 -40800 1789 1529 -40800 1879 1527 -40800 1425 1433 -40800 1441 1527 -40800 1460 1499 -40800 1507 1522 -40800 1525 1529 -40800 1541 1533 -40800 1544 1525 -40800 1549 1600 -40800 1574 1778 -40800 1574 1532 -40800 1582 1593 -40800 1915 1436 -40800 1436 1519 -40800 1599 1840 -40800 1778 1532 -40800 1915 1519 -40800 1587 1535 -40800 1613 1622 -40800 1500 1511 -40800 1583 1510 -40800 1459 1503 -40800 1767 1489 -40800 1623 1441 -40800 1650 1762 -40820 1541 1533 -40820 1544 1525 -40820 1549 1600 -40820 1558 1608 -40820 1574 1778 -40820 1574 1532 -40820 1582 1593 -40820 1582 1527 -40820 1604 1532 -40820 1628 1650 -40820 1825 1915 -40820 1915 1436 -40820 1436 1519 -40820 1599 1840 -40820 1778 1532 -40820 1915 1519 -40820 1572 1871 -40820 1587 1535 -40820 1613 1622 -40820 1500 1511 -40820 1583 1510 -40820 1436 1525 -40820 1459 1503 -40820 1608 1530 -40820 1767 1489 -40820 1623 1441 -40820 1573 1452 -40820 1650 1762 -40840 1554 1444 -40840 1599 1840 -40840 1778 1532 -40840 1789 1879 -40840 1879 1487 -40840 1915 1519 -40840 1572 1871 -40840 1587 1535 -40840 1613 1622 -40840 1773 1520 -40840 1500 1511 -40840 1668 1762 -40840 1840 1489 -40840 1583 1510 -40840 1436 1525 -40840 1459 1503 -40840 1608 1530 -40840 1767 1489 -40840 1623 1441 -40840 1573 1452 -40840 1650 1762 -40860 1546 1468 -40860 1549 1525 -40860 1554 1623 -40860 1557 1606 -40860 1572 1871 -40860 1582 1593 -40860 1587 1535 -40860 1600 1879 -40860 1613 1622 -40860 1773 1520 -40860 1789 1915 -40860 1789 1525 -40860 1469 1527 -40860 1500 1511 -40860 1668 1762 -40860 1742 1520 -40860 1840 1489 -40860 1583 1510 -40860 1879 1436 -40860 1436 1525 -40860 1544 1915 -40860 1459 1503 -40860 1608 1530 -40860 1767 1840 -40860 1767 1489 -40860 1460 1499 -40860 1623 1441 -40860 1573 1452 -40860 1650 1762 -40880 1542 1598 -40880 1544 1519 -40880 1554 1602 -40880 1668 1762 -40880 1742 1520 -40880 1789 1523 -40880 1840 1489 -40880 1425 1535 -40880 1507 1522 -40880 1583 1510 -40880 1617 1623 -40880 1879 1436 -40880 1879 1525 -40880 1436 1525 -40880 1544 1915 -40880 1459 1503 -40880 1608 1530 -40880 1767 1840 -40880 1767 1489 -40880 1460 1499 -40880 1623 1441 -40880 1573 1452 -40880 1650 1762 -40900 1544 1523 -40900 1546 1468 -40900 1549 1879 -40900 1568 1634 -40900 1583 1510 -40900 1617 1441 -40900 1617 1623 -40900 1915 1519 -40900 1920 1466 -40900 1549 1436 -40900 1879 1436 -40900 1879 1525 -40900 1436 1525 -40900 1544 1915 -40900 1557 1606 -40900 1459 1503 -40900 1608 1530 -40900 1767 1840 -40900 1510 1523 -40900 1549 1525 -40900 1599 1652 -40900 1716 1469 -40900 1767 1489 -40900 1460 1499 -40900 1623 1441 -40900 1573 1452 -40900 1650 1762 -40920 1549 1436 -40920 1552 1453 -40920 1572 1871 -40920 1629 1535 -40920 1742 1520 -40920 1879 1436 -40920 1879 1525 -40920 1879 1510 -40920 1436 1525 -40920 1436 1460 -40920 1512 1531 -40920 1544 1915 -40920 1557 1606 -40920 1582 1593 -40920 1652 1655 -40920 1459 1503 -40920 1608 1920 -40920 1608 1530 -40920 1613 1622 -40920 1767 1840 -40920 1840 1489 -40920 1426 1459 -40920 1469 1514 -40920 1510 1523 -40920 1549 1525 -40920 1716 1900 -40920 1773 1527 -40920 1599 1747 -40920 1599 1652 -40920 1716 1469 -40920 1716 1514 -40920 1767 1489 -40920 1460 1499 -40920 1623 1441 -40920 1500 1511 -40920 1573 1452 -40920 1650 1762 -40940 1544 1915 -40940 1544 1519 -40940 1557 1606 -40940 1558 1465 -40940 1562 1436 -40940 1562 1879 -40940 1569 1520 -40940 1582 1593 -40940 1598 1920 -40940 1617 1441 -40940 1650 1463 -40940 1652 1655 -40940 1655 1747 -40940 1762 1463 -40940 1879 1917 -40940 1917 1436 -40940 1459 1503 -40940 1499 1510 -40940 1541 1533 -40940 1546 1468 -40940 1591 1872 -40940 1608 1920 -40940 1608 1530 -40940 1613 1622 -40940 1767 1840 -40940 1840 1489 -40940 1426 1459 -40940 1469 1514 -40940 1510 1523 -40940 1549 1525 -40940 1563 1592 -40940 1716 1900 -40940 1773 1527 -40940 1599 1747 -40940 1599 1652 -40940 1716 1469 -40940 1716 1514 -40940 1452 1522 -40940 1767 1489 -40940 1460 1499 -40940 1623 1441 -40940 1500 1511 -40940 1573 1452 -40940 1652 1747 -40940 1650 1762 -40960 1541 1533 -40960 1544 1789 -40960 1546 1468 -40960 1548 1516 -40960 1548 1431 -40960 1582 1773 -40960 1582 1527 -40960 1591 1872 -40960 1608 1920 -40960 1608 1530 -40960 1613 1622 -40960 1767 1840 -40960 1840 1489 -40960 1900 1469 -40960 1426 1459 -40960 1461 1495 -40960 1469 1514 -40960 1510 1523 -40960 1549 1525 -40960 1563 1592 -40960 1572 1871 -40960 1716 1900 -40960 1773 1527 -40960 1599 1747 -40960 1599 1652 -40960 1716 1469 -40960 1493 1532 -40960 1512 1531 -40960 1716 1514 -40960 1452 1522 -40960 1617 1623 -40960 1767 1489 -40960 1790 1493 -40960 1460 1499 -40960 1623 1441 -40960 1500 1511 -40960 1573 1452 -40960 1652 1747 -40960 1507 1522 -40960 1912 1493 -40960 1912 1532 -40960 1790 1912 -40960 1650 1762 -40980 1538 1912 -40980 1538 1790 -40980 1539 1558 -40980 1549 1525 -40980 1563 1592 -40980 1572 1871 -40980 1596 1520 -40980 1596 1617 -40980 1600 1825 -40980 1628 1463 -40980 1668 1762 -40980 1716 1900 -40980 1731 1912 -40980 1773 1527 -40980 1872 1879 -40980 1888 1916 -40980 1904 1459 -40980 1915 1523 -40980 1538 1916 -40980 1562 1593 -40980 1569 1520 -40980 1599 1747 -40980 1599 1652 -40980 1613 1626 -40980 1716 1469 -40980 1790 1532 -40980 1828 1493 -40980 1493 1532 -40980 1512 1531 -40980 1716 1514 -40980 1452 1522 -40980 1617 1623 -40980 1767 1489 -40980 1790 1493 -40980 1460 1499 -40980 1828 1532 -40980 1623 1441 -40980 1500 1511 -40980 1790 1916 -40980 1573 1452 -40980 1652 1747 -40980 1507 1522 -40980 1912 1493 -40980 1916 1493 -40980 1828 1912 -40980 1912 1532 -40980 1912 1916 -40980 1916 1532 -40980 1790 1828 -40980 1790 1912 -40980 1828 1916 -40980 1650 1762 -41000 1538 1916 -41000 1538 1532 -41000 1542 1920 -41000 1562 1593 -41000 1562 1525 -41000 1568 1535 -41000 1569 1520 -41000 1574 1513 -41000 1579 1591 -41000 1582 1527 -41000 1587 1535 -41000 1591 1872 -41000 1593 1525 -41000 1599 1747 -41000 1599 1652 -41000 1613 1626 -41000 1716 1469 -41000 1731 1805 -41000 1789 1433 -41000 1790 1532 -41000 1828 1493 -41000 1493 1532 -41000 1512 1531 -41000 1544 1523 -41000 1617 1441 -41000 1716 1514 -41000 1863 1493 -41000 1452 1522 -41000 1617 1623 -41000 1461 1495 -41000 1767 1489 -41000 1790 1493 -41000 1460 1499 -41000 1499 1510 -41000 1828 1532 -41000 1623 1441 -41000 1500 1511 -41000 1790 1916 -41000 1573 1452 -41000 1652 1747 -41000 1608 1530 -41000 1507 1522 -41000 1888 1493 -41000 1912 1493 -41000 1916 1493 -41000 1888 1532 -41000 1828 1912 -41000 1912 1532 -41000 1805 1532 -41000 1912 1916 -41000 1916 1532 -41000 1790 1828 -41000 1731 1863 -41000 1790 1912 -41000 1805 1888 -41000 1731 1888 -41000 1828 1916 -41000 1863 1888 -41000 1650 1762 -41020 1538 1828 -41020 1544 1915 -41020 1544 1523 -41020 1552 1593 -41020 1559 1458 -41020 1596 1617 -41020 1597 1528 -41020 1617 1441 -41020 1716 1848 -41020 1716 1514 -41020 1771 1437 -41020 1828 1863 -41020 1863 1493 -41020 1428 1520 -41020 1452 1522 -41020 1460 1510 -41020 1549 1525 -41020 1617 1623 -41020 1863 1912 -41020 1426 1459 -41020 1461 1495 -41020 1790 1805 -41020 1767 1489 -41020 1790 1493 -41020 1805 1912 -41020 1828 1888 -41020 1460 1499 -41020 1499 1510 -41020 1828 1532 -41020 1510 1523 -41020 1548 1431 -41020 1623 1441 -41020 1500 1511 -41020 1863 1532 -41020 1790 1916 -41020 1573 1452 -41020 1652 1747 -41020 1557 1606 -41020 1731 1532 -41020 1608 1530 -41020 1507 1522 -41020 1863 1916 -41020 1731 1912 -41020 1805 1493 -41020 1888 1493 -41020 1912 1493 -41020 1916 1493 -41020 1888 1532 -41020 1828 1912 -41020 1912 1532 -41020 1805 1828 -41020 1805 1532 -41020 1912 1916 -41020 1916 1532 -41020 1790 1828 -41020 1731 1863 -41020 1805 1863 -41020 1790 1912 -41020 1805 1888 -41020 1888 1912 -41020 1790 1888 -41020 1731 1888 -41020 1805 1916 -41020 1828 1916 -41020 1863 1888 -41020 1650 1762 -41040 1538 1888 -41040 1549 1525 -41040 1549 1919 -41040 1562 1903 -41040 1568 1599 -41040 1599 1612 -41040 1599 1655 -41040 1613 1871 -41040 1617 1623 -41040 1668 1762 -41040 1731 1493 -41040 1767 1840 -41040 1790 1863 -41040 1863 1912 -41040 1426 1459 -41040 1461 1495 -41040 1546 1468 -41040 1582 1449 -41040 1790 1805 -41040 1587 1535 -41040 1767 1489 -41040 1790 1493 -41040 1790 1532 -41040 1805 1912 -41040 1828 1888 -41040 1460 1499 -41040 1499 1510 -41040 1563 1592 -41040 1572 1871 -41040 1828 1532 -41040 1510 1523 -41040 1548 1431 -41040 1623 1441 -41040 1500 1511 -41040 1863 1532 -41040 1790 1916 -41040 1573 1452 -41040 1652 1747 -41040 1557 1606 -41040 1731 1532 -41040 1608 1530 -41040 1629 1519 -41040 1507 1522 -41040 1863 1916 -41040 1731 1912 -41040 1731 1790 -41040 1805 1493 -41040 1888 1493 -41040 1912 1493 -41040 1916 1493 -41040 1493 1532 -41040 1888 1532 -41040 1828 1912 -41040 1912 1532 -41040 1805 1828 -41040 1805 1532 -41040 1731 1828 -41040 1888 1916 -41040 1912 1916 -41040 1916 1532 -41040 1790 1828 -41040 1731 1863 -41040 1805 1863 -41040 1790 1912 -41040 1805 1888 -41040 1888 1912 -41040 1790 1888 -41040 1731 1888 -41040 1731 1805 -41040 1805 1916 -41040 1828 1916 -41040 1863 1888 -41040 1650 1762 -41040 1731 1916 -41060 1541 1555 -41060 1543 1521 -41060 1546 1468 -41060 1548 1516 -41060 1552 1527 -41060 1581 1847 -41060 1582 1449 -41060 1641 1900 -41060 1790 1805 -41060 1435 1535 -41060 1587 1535 -41060 1767 1489 -41060 1790 1493 -41060 1790 1532 -41060 1805 1912 -41060 1828 1888 -41060 1828 1493 -41060 1425 1431 -41060 1460 1499 -41060 1499 1510 -41060 1563 1592 -41060 1572 1871 -41060 1828 1532 -41060 1510 1523 -41060 1510 1525 -41060 1548 1431 -41060 1623 1441 -41060 1500 1511 -41060 1863 1532 -41060 1790 1916 -41060 1573 1452 -41060 1652 1747 -41060 1557 1606 -41060 1731 1532 -41060 1608 1530 -41060 1629 1519 -41060 1507 1522 -41060 1863 1916 -41060 1731 1912 -41060 1731 1790 -41060 1805 1493 -41060 1863 1493 -41060 1888 1493 -41060 1912 1493 -41060 1916 1493 -41060 1493 1532 -41060 1888 1532 -41060 1828 1912 -41060 1912 1532 -41060 1805 1828 -41060 1805 1532 -41060 1731 1828 -41060 1888 1916 -41060 1912 1916 -41060 1916 1532 -41060 1790 1828 -41060 1731 1863 -41060 1805 1863 -41060 1790 1912 -41060 1805 1888 -41060 1888 1912 -41060 1790 1888 -41060 1731 1888 -41060 1731 1805 -41060 1805 1916 -41060 1828 1916 -41060 1863 1888 -41060 1650 1762 -41060 1731 1916 -41080 1549 1460 -41080 1587 1535 -41080 1590 1465 -41080 1596 1617 -41080 1628 1428 -41080 1628 1463 -41080 1641 1459 -41080 1668 1762 -41080 1716 1514 -41080 1767 1489 -41080 1773 1527 -41080 1790 1493 -41080 1790 1532 -41080 1805 1912 -41080 1828 1888 -41080 1828 1493 -41080 1425 1431 -41080 1460 1499 -41080 1495 1501 -41080 1499 1510 -41080 1512 1531 -41080 1563 1592 -41080 1572 1871 -41080 1652 1498 -41080 1716 1848 -41080 1828 1532 -41080 1452 1522 -41080 1510 1523 -41080 1510 1525 -41080 1548 1431 -41080 1623 1441 -41080 1431 1516 -41080 1500 1511 -41080 1549 1525 -41080 1840 1489 -41080 1863 1532 -41080 1790 1916 -41080 1573 1452 -41080 1652 1747 -41080 1579 1919 -41080 1557 1606 -41080 1731 1532 -41080 1608 1530 -41080 1629 1519 -41080 1507 1522 -41080 1863 1916 -41080 1731 1912 -41080 1731 1790 -41080 1805 1493 -41080 1863 1493 -41080 1888 1493 -41080 1912 1493 -41080 1916 1493 -41080 1493 1532 -41080 1888 1532 -41080 1828 1912 -41080 1912 1532 -41080 1805 1828 -41080 1805 1532 -41080 1731 1828 -41080 1888 1916 -41080 1912 1916 -41080 1916 1532 -41080 1790 1828 -41080 1731 1863 -41080 1805 1863 -41080 1790 1912 -41080 1805 1888 -41080 1888 1912 -41080 1790 1888 -41080 1863 1912 -41080 1731 1888 -41080 1731 1805 -41080 1805 1916 -41080 1828 1916 -41080 1863 1888 -41080 1650 1762 -41080 1731 1916 -41100 1543 1521 -41100 1546 1468 -41100 1549 1499 -41100 1552 1527 -41100 1555 1533 -41100 1563 1592 -41100 1572 1871 -41100 1603 1495 -41100 1652 1498 -41100 1716 1848 -41100 1747 1498 -41100 1828 1532 -41100 1452 1522 -41100 1499 1525 -41100 1510 1523 -41100 1510 1525 -41100 1541 1555 -41100 1548 1431 -41100 1623 1441 -41100 1716 1771 -41100 1920 1530 -41100 1431 1516 -41100 1500 1511 -41100 1549 1525 -41100 1790 1863 -41100 1840 1489 -41100 1863 1532 -41100 1790 1916 -41100 1573 1452 -41100 1652 1747 -41100 1579 1919 -41100 1557 1606 -41100 1731 1532 -41100 1608 1530 -41100 1629 1519 -41100 1507 1522 -41100 1863 1916 -41100 1731 1912 -41100 1731 1790 -41100 1731 1493 -41100 1805 1493 -41100 1863 1493 -41100 1888 1493 -41100 1912 1493 -41100 1916 1493 -41100 1493 1532 -41100 1888 1532 -41100 1828 1912 -41100 1912 1532 -41100 1790 1805 -41100 1805 1828 -41100 1805 1532 -41100 1731 1828 -41100 1888 1916 -41100 1912 1916 -41100 1916 1532 -41100 1790 1828 -41100 1731 1863 -41100 1805 1863 -41100 1790 1912 -41100 1805 1888 -41100 1888 1912 -41100 1790 1888 -41100 1863 1912 -41100 1731 1888 -41100 1731 1805 -41100 1805 1916 -41100 1828 1916 -41100 1863 1888 -41100 1650 1762 -41100 1731 1916 -41120 1541 1555 -41120 1548 1431 -41120 1599 1449 -41120 1604 1616 -41120 1623 1441 -41120 1650 1428 -41120 1655 1842 -41120 1716 1771 -41120 1920 1530 -41120 1431 1516 -41120 1435 1535 -41120 1500 1511 -41120 1541 1533 -41120 1549 1525 -41120 1599 1842 -41120 1628 1428 -41120 1790 1863 -41120 1790 1532 -41120 1790 1493 -41120 1840 1489 -41120 1858 1522 -41120 1863 1532 -41120 1628 1668 -41120 1790 1916 -41120 1828 1888 -41120 1543 1808 -41120 1573 1452 -41120 1652 1747 -41120 1773 1527 -41120 1579 1919 -41120 1557 1606 -41120 1731 1532 -41120 1828 1493 -41120 1608 1530 -41120 1629 1519 -41120 1507 1522 -41120 1863 1916 -41120 1731 1912 -41120 1731 1790 -41120 1731 1493 -41120 1805 1493 -41120 1863 1493 -41120 1888 1493 -41120 1912 1493 -41120 1916 1493 -41120 1493 1532 -41120 1888 1532 -41120 1805 1912 -41120 1828 1912 -41120 1912 1532 -41120 1790 1805 -41120 1805 1828 -41120 1805 1532 -41120 1731 1828 -41120 1888 1916 -41120 1912 1916 -41120 1770 1842 -41120 1916 1532 -41120 1790 1828 -41120 1731 1863 -41120 1805 1863 -41120 1790 1912 -41120 1805 1888 -41120 1888 1912 -41120 1790 1888 -41120 1863 1912 -41120 1731 1888 -41120 1731 1805 -41120 1805 1916 -41120 1828 1916 -41120 1863 1888 -41120 1650 1762 -41120 1731 1916 -41120 1650 1668 -41140 1541 1533 -41140 1544 1599 -41140 1546 1468 -41140 1549 1523 -41140 1549 1525 -41140 1555 1533 -41140 1581 1789 -41140 1596 1520 -41140 1599 1770 -41140 1599 1842 -41140 1599 1460 -41140 1599 1525 -41140 1599 1655 -41140 1617 1495 -41140 1619 1436 -41140 1628 1428 -41140 1628 1762 -41140 1790 1863 -41140 1790 1532 -41140 1790 1493 -41140 1839 1495 -41140 1840 1489 -41140 1858 1522 -41140 1858 1452 -41140 1863 1532 -41140 1425 1431 -41140 1427 1495 -41140 1452 1522 -41140 1460 1499 -41140 1572 1871 -41140 1581 1510 -41140 1587 1535 -41140 1628 1650 -41140 1628 1668 -41140 1790 1916 -41140 1828 1888 -41140 1523 1525 -41140 1543 1808 -41140 1573 1452 -41140 1652 1747 -41140 1773 1527 -41140 1426 1459 -41140 1579 1919 -41140 1441 1464 -41140 1557 1606 -41140 1731 1532 -41140 1828 1493 -41140 1608 1530 -41140 1629 1519 -41140 1507 1522 -41140 1863 1916 -41140 1460 1525 -41140 1731 1912 -41140 1731 1790 -41140 1731 1493 -41140 1805 1493 -41140 1863 1493 -41140 1888 1493 -41140 1912 1493 -41140 1916 1493 -41140 1493 1532 -41140 1888 1532 -41140 1805 1912 -41140 1828 1912 -41140 1912 1532 -41140 1790 1805 -41140 1805 1828 -41140 1805 1532 -41140 1828 1532 -41140 1731 1828 -41140 1716 1848 -41140 1888 1916 -41140 1912 1916 -41140 1770 1842 -41140 1916 1532 -41140 1790 1828 -41140 1731 1863 -41140 1805 1863 -41140 1790 1912 -41140 1805 1888 -41140 1888 1912 -41140 1790 1888 -41140 1863 1912 -41140 1731 1888 -41140 1731 1805 -41140 1805 1916 -41140 1828 1916 -41140 1863 1888 -41140 1650 1762 -41140 1731 1916 -41140 1650 1668 -41160 1537 1568 -41160 1541 1555 -41160 1554 1581 -41160 1572 1871 -41160 1581 1510 -41160 1587 1535 -41160 1599 1523 -41160 1623 1495 -41160 1628 1650 -41160 1628 1668 -41160 1641 1900 -41160 1655 1770 -41160 1668 1428 -41160 1668 1463 -41160 1762 1428 -41160 1762 1463 -41160 1789 1842 -41160 1790 1916 -41160 1828 1888 -41160 1858 1496 -41160 1858 1505 -41160 1428 1463 -41160 1436 1441 -41160 1496 1505 -41160 1523 1525 -41160 1543 1808 -41160 1563 1469 -41160 1573 1452 -41160 1652 1747 -41160 1773 1527 -41160 1426 1459 -41160 1467 1513 -41160 1579 1919 -41160 1441 1464 -41160 1557 1606 -41160 1731 1532 -41160 1828 1493 -41160 1608 1530 -41160 1629 1519 -41160 1507 1522 -41160 1863 1916 -41160 1431 1516 -41160 1460 1525 -41160 1731 1912 -41160 1731 1790 -41160 1731 1493 -41160 1805 1493 -41160 1863 1493 -41160 1888 1493 -41160 1912 1493 -41160 1916 1493 -41160 1493 1532 -41160 1888 1532 -41160 1805 1912 -41160 1828 1912 -41160 1912 1532 -41160 1790 1805 -41160 1805 1828 -41160 1805 1532 -41160 1828 1532 -41160 1731 1828 -41160 1716 1848 -41160 1888 1916 -41160 1912 1916 -41160 1770 1842 -41160 1916 1532 -41160 1790 1828 -41160 1731 1863 -41160 1805 1863 -41160 1790 1912 -41160 1805 1888 -41160 1888 1912 -41160 1790 1888 -41160 1863 1912 -41160 1731 1888 -41160 1731 1805 -41160 1805 1916 -41160 1828 1916 -41160 1863 1888 -41160 1650 1762 -41160 1668 1762 -41160 1731 1916 -41160 1650 1668 -41180 1541 1533 -41180 1543 1808 -41180 1552 1513 -41180 1555 1533 -41180 1559 1469 -41180 1562 1603 -41180 1563 1469 -41180 1573 1452 -41180 1599 1600 -41180 1604 1616 -41180 1652 1747 -41180 1767 1489 -41180 1770 1789 -41180 1773 1527 -41180 1920 1530 -41180 1426 1459 -41180 1427 1526 -41180 1460 1523 -41180 1467 1513 -41180 1467 1527 -41180 1500 1511 -41180 1553 1599 -41180 1579 1919 -41180 1599 1761 -41180 1740 1761 -41180 1452 1522 -41180 1441 1464 -41180 1557 1606 -41180 1731 1532 -41180 1790 1863 -41180 1828 1493 -41180 1549 1825 -41180 1608 1530 -41180 1629 1519 -41180 1507 1522 -41180 1863 1916 -41180 1431 1516 -41180 1460 1525 -41180 1548 1431 -41180 1554 1568 -41180 1731 1912 -41180 1731 1790 -41180 1731 1493 -41180 1790 1493 -41180 1805 1493 -41180 1863 1493 -41180 1888 1493 -41180 1912 1493 -41180 1916 1493 -41180 1493 1532 -41180 1888 1532 -41180 1863 1532 -41180 1805 1912 -41180 1828 1912 -41180 1912 1532 -41180 1790 1532 -41180 1790 1805 -41180 1805 1828 -41180 1805 1532 -41180 1828 1532 -41180 1731 1828 -41180 1716 1848 -41180 1888 1916 -41180 1912 1916 -41180 1770 1842 -41180 1916 1532 -41180 1790 1828 -41180 1731 1863 -41180 1805 1863 -41180 1790 1912 -41180 1805 1888 -41180 1888 1912 -41180 1790 1888 -41180 1863 1912 -41180 1731 1888 -41180 1731 1805 -41180 1805 1916 -41180 1828 1916 -41180 1863 1888 -41180 1650 1762 -41180 1668 1762 -41180 1731 1916 -41180 1650 1668 -41200 1552 1773 -41200 1553 1599 -41200 1559 1563 -41200 1562 1436 -41200 1563 1581 -41200 1579 1919 -41200 1599 1740 -41200 1599 1761 -41200 1617 1441 -41200 1628 1463 -41200 1641 1773 -41200 1655 1761 -41200 1655 1676 -41200 1676 1761 -41200 1740 1761 -41200 1779 1505 -41200 1828 1888 -41200 1452 1522 -41200 1513 1527 -41200 1523 1525 -41200 1563 1592 -41200 1603 1443 -41200 1641 1871 -41200 1441 1464 -41200 1538 1774 -41200 1557 1606 -41200 1628 1428 -41200 1628 1650 -41200 1731 1532 -41200 1790 1863 -41200 1828 1493 -41200 1460 1499 -41200 1496 1505 -41200 1549 1825 -41200 1608 1530 -41200 1629 1519 -41200 1507 1522 -41200 1548 1516 -41200 1863 1916 -41200 1431 1516 -41200 1460 1525 -41200 1548 1431 -41200 1554 1568 -41200 1541 1555 -41200 1587 1535 -41200 1731 1912 -41200 1731 1790 -41200 1731 1493 -41200 1790 1493 -41200 1805 1493 -41200 1863 1493 -41200 1888 1493 -41200 1912 1493 -41200 1916 1493 -41200 1493 1532 -41200 1628 1762 -41200 1628 1668 -41200 1888 1532 -41200 1863 1532 -41200 1805 1912 -41200 1828 1912 -41200 1912 1532 -41200 1790 1532 -41200 1790 1805 -41200 1805 1828 -41200 1805 1532 -41200 1828 1532 -41200 1617 1464 -41200 1731 1828 -41200 1716 1848 -41200 1888 1916 -41200 1912 1916 -41200 1770 1842 -41200 1916 1532 -41200 1790 1828 -41200 1731 1863 -41200 1805 1863 -41200 1790 1912 -41200 1805 1888 -41200 1888 1912 -41200 1790 1888 -41200 1863 1912 -41200 1731 1888 -41200 1731 1805 -41200 1805 1916 -41200 1828 1916 -41200 1863 1888 -41200 1650 1762 -41200 1668 1762 -41200 1790 1916 -41200 1731 1916 -41200 1650 1668 -41220 1544 1762 -41220 1544 1599 -41220 1558 1441 -41220 1563 1592 -41220 1578 1779 -41220 1600 1659 -41220 1603 1443 -41220 1641 1871 -41220 1773 1527 -41220 1920 1530 -41220 1435 1496 -41220 1441 1464 -41220 1458 1510 -41220 1500 1511 -41220 1538 1774 -41220 1543 1808 -41220 1557 1606 -41220 1599 1700 -41220 1604 1616 -41220 1628 1428 -41220 1628 1650 -41220 1659 1700 -41220 1700 1757 -41220 1731 1532 -41220 1790 1863 -41220 1828 1493 -41220 1460 1499 -41220 1496 1505 -41220 1549 1825 -41220 1608 1530 -41220 1629 1519 -41220 1507 1522 -41220 1548 1516 -41220 1863 1916 -41220 1431 1516 -41220 1460 1525 -41220 1548 1431 -41220 1599 1757 -41220 1554 1568 -41220 1573 1522 -41220 1599 1659 -41220 1659 1757 -41220 1541 1555 -41220 1587 1535 -41220 1731 1912 -41220 1731 1790 -41220 1731 1493 -41220 1790 1493 -41220 1805 1493 -41220 1863 1493 -41220 1888 1493 -41220 1912 1493 -41220 1916 1493 -41220 1493 1532 -41220 1628 1762 -41220 1628 1668 -41220 1888 1532 -41220 1863 1532 -41220 1805 1912 -41220 1828 1912 -41220 1912 1532 -41220 1790 1532 -41220 1790 1805 -41220 1805 1828 -41220 1805 1532 -41220 1828 1532 -41220 1617 1464 -41220 1731 1828 -41220 1716 1848 -41220 1888 1916 -41220 1912 1916 -41220 1770 1842 -41220 1916 1532 -41220 1790 1828 -41220 1731 1863 -41220 1805 1863 -41220 1790 1912 -41220 1805 1888 -41220 1888 1912 -41220 1790 1888 -41220 1863 1912 -41220 1731 1888 -41220 1731 1805 -41220 1805 1916 -41220 1828 1916 -41220 1863 1888 -41220 1650 1762 -41220 1668 1762 -41220 1790 1916 -41220 1731 1916 -41220 1650 1668 -41240 1538 1774 -41240 1539 1500 -41240 1543 1808 -41240 1557 1606 -41240 1558 1840 -41240 1558 1489 -41240 1581 1465 -41240 1599 1700 -41240 1604 1616 -41240 1617 1441 -41240 1628 1428 -41240 1628 1650 -41240 1655 1740 -41240 1659 1700 -41240 1688 1700 -41240 1696 1700 -41240 1696 1523 -41240 1700 1831 -41240 1700 1523 -41240 1700 1757 -41240 1731 1532 -41240 1790 1863 -41240 1828 1493 -41240 1831 1523 -41240 1425 1431 -41240 1435 1505 -41240 1460 1499 -41240 1496 1505 -41240 1545 1430 -41240 1549 1825 -41240 1599 1628 -41240 1608 1530 -41240 1629 1519 -41240 1676 1740 -41240 1825 1525 -41240 1507 1522 -41240 1548 1516 -41240 1553 1599 -41240 1573 1452 -41240 1597 1857 -41240 1863 1916 -41240 1431 1516 -41240 1460 1525 -41240 1548 1431 -41240 1599 1757 -41240 1554 1568 -41240 1573 1522 -41240 1599 1696 -41240 1599 1688 -41240 1599 1659 -41240 1659 1696 -41240 1659 1688 -41240 1659 1757 -41240 1541 1555 -41240 1541 1533 -41240 1587 1535 -41240 1731 1912 -41240 1731 1790 -41240 1564 1470 -41240 1652 1747 -41240 1731 1493 -41240 1790 1493 -41240 1805 1493 -41240 1863 1493 -41240 1888 1493 -41240 1912 1493 -41240 1916 1493 -41240 1493 1532 -41240 1628 1762 -41240 1628 1668 -41240 1888 1532 -41240 1863 1532 -41240 1805 1912 -41240 1828 1912 -41240 1912 1532 -41240 1688 1696 -41240 1740 1761 -41240 1790 1532 -41240 1790 1805 -41240 1805 1828 -41240 1805 1532 -41240 1828 1532 -41240 1617 1464 -41240 1731 1828 -41240 1688 1757 -41240 1716 1848 -41240 1742 1513 -41240 1888 1916 -41240 1912 1916 -41240 1696 1757 -41240 1770 1842 -41240 1916 1532 -41240 1790 1828 -41240 1731 1863 -41240 1805 1863 -41240 1790 1912 -41240 1805 1888 -41240 1888 1912 -41240 1790 1888 -41240 1863 1912 -41240 1731 1888 -41240 1731 1805 -41240 1805 1916 -41240 1828 1916 -41240 1863 1888 -41240 1650 1762 -41240 1668 1762 -41240 1790 1916 -41240 1731 1916 -41240 1650 1668 -41260 1545 1430 -41260 1549 1696 -41260 1549 1825 -41260 1549 1688 -41260 1549 1757 -41260 1553 1688 -41260 1557 1425 -41260 1562 1449 -41260 1563 1590 -41260 1598 1427 -41260 1599 1628 -41260 1600 1659 -41260 1602 1469 -41260 1608 1530 -41260 1629 1519 -41260 1676 1740 -41260 1825 1529 -41260 1825 1525 -41260 1828 1888 -41260 1840 1489 -41260 1426 1459 -41260 1507 1522 -41260 1548 1516 -41260 1553 1599 -41260 1569 1513 -41260 1573 1452 -41260 1597 1857 -41260 1599 1600 -41260 1773 1527 -41260 1863 1916 -41260 1431 1516 -41260 1452 1522 -41260 1460 1525 -41260 1548 1431 -41260 1557 1431 -41260 1562 1603 -41260 1599 1757 -41260 1554 1568 -41260 1557 1516 -41260 1573 1522 -41260 1599 1696 -41260 1599 1688 -41260 1599 1659 -41260 1659 1696 -41260 1659 1688 -41260 1659 1757 -41260 1900 1519 -41260 1541 1555 -41260 1541 1533 -41260 1587 1535 -41260 1676 1761 -41260 1731 1912 -41260 1731 1790 -41260 1564 1470 -41260 1652 1747 -41260 1731 1493 -41260 1790 1493 -41260 1805 1493 -41260 1863 1493 -41260 1888 1493 -41260 1912 1493 -41260 1916 1493 -41260 1493 1532 -41260 1628 1762 -41260 1628 1668 -41260 1888 1532 -41260 1863 1532 -41260 1805 1912 -41260 1828 1912 -41260 1912 1532 -41260 1688 1696 -41260 1740 1761 -41260 1790 1532 -41260 1790 1805 -41260 1805 1828 -41260 1805 1532 -41260 1828 1532 -41260 1617 1464 -41260 1731 1828 -41260 1688 1757 -41260 1716 1848 -41260 1742 1513 -41260 1888 1916 -41260 1912 1916 -41260 1696 1757 -41260 1770 1842 -41260 1916 1532 -41260 1790 1828 -41260 1731 1863 -41260 1805 1863 -41260 1790 1912 -41260 1805 1888 -41260 1888 1912 -41260 1790 1888 -41260 1863 1912 -41260 1731 1888 -41260 1731 1805 -41260 1805 1916 -41260 1828 1916 -41260 1863 1888 -41260 1650 1762 -41260 1668 1762 -41260 1790 1916 -41260 1731 1916 -41260 1650 1668 -41280 1543 1808 -41280 1548 1516 -41280 1549 1529 -41280 1552 1773 -41280 1553 1599 -41280 1562 1443 -41280 1563 1592 -41280 1569 1513 -41280 1569 1742 -41280 1573 1452 -41280 1597 1857 -41280 1599 1600 -41280 1767 1489 -41280 1773 1527 -41280 1863 1916 -41280 1425 1516 -41280 1431 1516 -41280 1441 1489 -41280 1452 1522 -41280 1460 1525 -41280 1496 1505 -41280 1523 1525 -41280 1539 1581 -41280 1548 1431 -41280 1549 1525 -41280 1557 1606 -41280 1557 1431 -41280 1562 1603 -41280 1599 1757 -41280 1601 1920 -41280 1825 1523 -41280 1500 1511 -41280 1554 1568 -41280 1557 1516 -41280 1573 1522 -41280 1599 1696 -41280 1599 1688 -41280 1599 1659 -41280 1606 1516 -41280 1659 1696 -41280 1659 1688 -41280 1659 1757 -41280 1700 1525 -41280 1900 1519 -41280 1541 1555 -41280 1541 1533 -41280 1587 1535 -41280 1603 1443 -41280 1676 1761 -41280 1731 1912 -41280 1731 1790 -41280 1546 1468 -41280 1603 1449 -41280 1767 1840 -41280 1564 1470 -41280 1652 1747 -41280 1731 1493 -41280 1790 1493 -41280 1805 1493 -41280 1828 1493 -41280 1863 1493 -41280 1888 1493 -41280 1912 1493 -41280 1916 1493 -41280 1493 1532 -41280 1628 1428 -41280 1628 1762 -41280 1628 1668 -41280 1888 1532 -41280 1863 1532 -41280 1460 1499 -41280 1805 1912 -41280 1828 1912 -41280 1912 1532 -41280 1688 1696 -41280 1740 1761 -41280 1790 1532 -41280 1790 1805 -41280 1805 1828 -41280 1805 1532 -41280 1828 1532 -41280 1617 1464 -41280 1731 1828 -41280 1688 1757 -41280 1716 1848 -41280 1742 1513 -41280 1888 1916 -41280 1912 1916 -41280 1696 1757 -41280 1770 1842 -41280 1916 1532 -41280 1790 1828 -41280 1731 1863 -41280 1805 1863 -41280 1790 1912 -41280 1790 1863 -41280 1805 1888 -41280 1888 1912 -41280 1790 1888 -41280 1863 1912 -41280 1731 1888 -41280 1731 1805 -41280 1805 1916 -41280 1828 1916 -41280 1863 1888 -41280 1731 1532 -41280 1650 1762 -41280 1668 1762 -41280 1790 1916 -41280 1731 1916 -41280 1650 1668 -41300 1539 1581 -41300 1546 1558 -41300 1548 1557 -41300 1548 1431 -41300 1549 1688 -41300 1549 1525 -41300 1549 1583 -41300 1557 1606 -41300 1557 1431 -41300 1558 1596 -41300 1562 1603 -41300 1568 1578 -41300 1599 1757 -41300 1601 1920 -41300 1655 1676 -41300 1825 1523 -41300 1828 1888 -41300 1840 1489 -41300 1500 1511 -41300 1554 1568 -41300 1557 1516 -41300 1558 1468 -41300 1573 1522 -41300 1599 1696 -41300 1599 1688 -41300 1599 1659 -41300 1606 1516 -41300 1617 1441 -41300 1655 1740 -41300 1659 1696 -41300 1659 1688 -41300 1659 1757 -41300 1676 1740 -41300 1700 1825 -41300 1700 1523 -41300 1700 1525 -41300 1900 1519 -41300 1441 1464 -41300 1541 1555 -41300 1541 1533 -41300 1562 1449 -41300 1587 1535 -41300 1603 1443 -41300 1676 1761 -41300 1731 1912 -41300 1731 1790 -41300 1825 1525 -41300 1546 1468 -41300 1603 1449 -41300 1767 1840 -41300 1564 1470 -41300 1652 1747 -41300 1731 1493 -41300 1790 1493 -41300 1805 1493 -41300 1828 1493 -41300 1863 1493 -41300 1888 1493 -41300 1912 1493 -41300 1916 1493 -41300 1493 1532 -41300 1628 1428 -41300 1628 1762 -41300 1628 1668 -41300 1888 1532 -41300 1863 1532 -41300 1460 1499 -41300 1805 1912 -41300 1828 1912 -41300 1912 1532 -41300 1688 1696 -41300 1740 1761 -41300 1790 1532 -41300 1790 1805 -41300 1805 1828 -41300 1805 1532 -41300 1828 1532 -41300 1617 1464 -41300 1731 1828 -41300 1688 1757 -41300 1716 1848 -41300 1742 1513 -41300 1888 1916 -41300 1912 1916 -41300 1696 1757 -41300 1770 1842 -41300 1916 1532 -41300 1790 1828 -41300 1731 1863 -41300 1805 1863 -41300 1790 1912 -41300 1790 1863 -41300 1805 1888 -41300 1888 1912 -41300 1790 1888 -41300 1863 1912 -41300 1731 1888 -41300 1731 1805 -41300 1805 1916 -41300 1828 1916 -41300 1863 1888 -41300 1731 1532 -41300 1650 1762 -41300 1668 1762 -41300 1790 1916 -41300 1731 1916 -41300 1650 1668 -41320 1537 1463 -41320 1546 1470 -41320 1549 1700 -41320 1554 1568 -41320 1555 1533 -41320 1557 1516 -41320 1558 1468 -41320 1563 1592 -41320 1573 1522 -41320 1582 1455 -41320 1599 1696 -41320 1599 1688 -41320 1599 1659 -41320 1599 1700 -41320 1606 1516 -41320 1606 1431 -41320 1608 1530 -41320 1617 1441 -41320 1623 1857 -41320 1655 1761 -41320 1655 1740 -41320 1659 1696 -41320 1659 1688 -41320 1659 1757 -41320 1676 1740 -41320 1700 1825 -41320 1700 1523 -41320 1700 1525 -41320 1773 1527 -41320 1900 1519 -41320 1425 1516 -41320 1441 1464 -41320 1452 1522 -41320 1460 1525 -41320 1468 1470 -41320 1541 1555 -41320 1541 1533 -41320 1560 1580 -41320 1562 1449 -41320 1573 1452 -41320 1587 1535 -41320 1599 1600 -41320 1600 1831 -41320 1603 1443 -41320 1676 1761 -41320 1731 1912 -41320 1731 1790 -41320 1825 1525 -41320 1431 1516 -41320 1546 1468 -41320 1549 1523 -41320 1603 1449 -41320 1767 1840 -41320 1548 1516 -41320 1564 1470 -41320 1652 1747 -41320 1731 1493 -41320 1743 1441 -41320 1790 1493 -41320 1805 1493 -41320 1828 1493 -41320 1863 1493 -41320 1888 1493 -41320 1912 1493 -41320 1916 1493 -41320 1493 1532 -41320 1628 1428 -41320 1628 1762 -41320 1628 1668 -41320 1888 1532 -41320 1863 1532 -41320 1460 1499 -41320 1552 1527 -41320 1805 1912 -41320 1828 1912 -41320 1912 1532 -41320 1688 1696 -41320 1740 1761 -41320 1790 1532 -41320 1790 1805 -41320 1805 1828 -41320 1805 1532 -41320 1828 1532 -41320 1617 1464 -41320 1731 1828 -41320 1688 1757 -41320 1716 1848 -41320 1742 1513 -41320 1888 1916 -41320 1912 1916 -41320 1604 1616 -41320 1696 1757 -41320 1770 1842 -41320 1916 1532 -41320 1790 1828 -41320 1731 1863 -41320 1805 1863 -41320 1790 1912 -41320 1790 1863 -41320 1805 1888 -41320 1888 1912 -41320 1863 1916 -41320 1790 1888 -41320 1863 1912 -41320 1731 1888 -41320 1731 1805 -41320 1805 1916 -41320 1828 1916 -41320 1863 1888 -41320 1731 1532 -41320 1650 1762 -41320 1668 1762 -41320 1790 1916 -41320 1731 1916 -41320 1650 1668 -41340 1541 1555 -41340 1541 1533 -41340 1546 1558 -41340 1549 1599 -41340 1558 1470 -41340 1560 1580 -41340 1562 1449 -41340 1562 1603 -41340 1573 1452 -41340 1573 1598 -41340 1587 1535 -41340 1591 1858 -41340 1598 1452 -41340 1599 1600 -41340 1599 1523 -41340 1600 1831 -41340 1603 1443 -41340 1676 1761 -41340 1731 1912 -41340 1731 1790 -41340 1825 1525 -41340 1840 1489 -41340 1431 1516 -41340 1500 1511 -41340 1523 1525 -41340 1546 1468 -41340 1549 1523 -41340 1549 1525 -41340 1556 1700 -41340 1597 1857 -41340 1599 1757 -41340 1603 1449 -41340 1767 1840 -41340 1452 1465 -41340 1548 1516 -41340 1564 1470 -41340 1652 1747 -41340 1731 1493 -41340 1743 1441 -41340 1790 1493 -41340 1805 1493 -41340 1828 1493 -41340 1863 1493 -41340 1888 1493 -41340 1912 1493 -41340 1916 1493 -41340 1493 1532 -41340 1628 1428 -41340 1628 1762 -41340 1628 1668 -41340 1655 1676 -41340 1888 1532 -41340 1863 1532 -41340 1460 1499 -41340 1552 1527 -41340 1659 1523 -41340 1805 1912 -41340 1828 1912 -41340 1912 1532 -41340 1688 1696 -41340 1740 1761 -41340 1790 1532 -41340 1790 1805 -41340 1805 1828 -41340 1805 1532 -41340 1828 1532 -41340 1601 1920 -41340 1617 1464 -41340 1731 1828 -41340 1688 1757 -41340 1716 1848 -41340 1742 1513 -41340 1888 1916 -41340 1912 1916 -41340 1604 1616 -41340 1696 1757 -41340 1770 1842 -41340 1916 1532 -41340 1790 1828 -41340 1731 1863 -41340 1805 1863 -41340 1790 1912 -41340 1790 1863 -41340 1805 1888 -41340 1888 1912 -41340 1863 1916 -41340 1790 1888 -41340 1863 1912 -41340 1731 1888 -41340 1731 1805 -41340 1805 1916 -41340 1828 1916 -41340 1863 1888 -41340 1731 1532 -41340 1650 1762 -41340 1668 1762 -41340 1790 1916 -41340 1731 1916 -41340 1650 1668 -41360 1537 1463 -41360 1546 1468 -41360 1548 1431 -41360 1549 1523 -41360 1549 1525 -41360 1554 1535 -41360 1556 1700 -41360 1583 1831 -41360 1596 1700 -41360 1596 1831 -41360 1597 1857 -41360 1599 1688 -41360 1599 1696 -41360 1599 1757 -41360 1603 1449 -41360 1655 1761 -41360 1659 1825 -41360 1700 1525 -41360 1767 1840 -41360 1831 1529 -41360 1452 1465 -41360 1496 1505 -41360 1499 1525 -41360 1548 1516 -41360 1549 1825 -41360 1564 1470 -41360 1628 1650 -41360 1652 1747 -41360 1731 1493 -41360 1743 1441 -41360 1773 1527 -41360 1790 1493 -41360 1805 1493 -41360 1828 1493 -41360 1831 1523 -41360 1863 1493 -41360 1888 1493 -41360 1912 1493 -41360 1916 1493 -41360 1426 1459 -41360 1493 1532 -41360 1628 1428 -41360 1628 1762 -41360 1628 1668 -41360 1655 1676 -41360 1888 1532 -41360 1900 1519 -41360 1863 1532 -41360 1460 1499 -41360 1552 1527 -41360 1659 1523 -41360 1805 1912 -41360 1828 1912 -41360 1912 1532 -41360 1688 1696 -41360 1740 1761 -41360 1790 1532 -41360 1790 1805 -41360 1805 1828 -41360 1805 1532 -41360 1828 1532 -41360 1601 1920 -41360 1617 1464 -41360 1731 1828 -41360 1688 1757 -41360 1716 1848 -41360 1742 1513 -41360 1888 1916 -41360 1912 1916 -41360 1604 1616 -41360 1696 1757 -41360 1770 1842 -41360 1916 1532 -41360 1790 1828 -41360 1731 1863 -41360 1805 1863 -41360 1790 1912 -41360 1790 1863 -41360 1805 1888 -41360 1888 1912 -41360 1863 1916 -41360 1790 1888 -41360 1863 1912 -41360 1731 1888 -41360 1731 1805 -41360 1805 1916 -41360 1828 1916 -41360 1863 1888 -41360 1731 1532 -41360 1650 1762 -41360 1668 1762 -41360 1790 1916 -41360 1731 1916 -41360 1650 1668 -41380 1537 1428 -41380 1548 1516 -41380 1549 1825 -41380 1549 1599 -41380 1550 1501 -41380 1564 1470 -41380 1573 1452 -41380 1583 1523 -41380 1599 1761 -41380 1617 1857 -41380 1628 1650 -41380 1652 1747 -41380 1700 1497 -41380 1716 1871 -41380 1731 1493 -41380 1743 1857 -41380 1743 1441 -41380 1773 1527 -41380 1790 1493 -41380 1805 1493 -41380 1828 1493 -41380 1831 1523 -41380 1863 1493 -41380 1888 1493 -41380 1912 1493 -41380 1916 1493 -41380 1426 1459 -41380 1431 1516 -41380 1493 1532 -41380 1538 1493 -41380 1543 1634 -41380 1549 1696 -41380 1549 1553 -41380 1549 1688 -41380 1549 1757 -41380 1613 1437 -41380 1628 1428 -41380 1628 1762 -41380 1628 1668 -41380 1655 1676 -41380 1655 1740 -41380 1888 1532 -41380 1900 1519 -41380 1460 1525 -41380 1500 1511 -41380 1512 1531 -41380 1591 1858 -41380 1825 1525 -41380 1863 1532 -41380 1460 1499 -41380 1552 1527 -41380 1659 1523 -41380 1805 1912 -41380 1558 1468 -41380 1828 1912 -41380 1912 1532 -41380 1676 1740 -41380 1688 1696 -41380 1740 1761 -41380 1790 1532 -41380 1790 1805 -41380 1805 1828 -41380 1805 1532 -41380 1828 1532 -41380 1601 1920 -41380 1617 1464 -41380 1676 1761 -41380 1731 1828 -41380 1828 1888 -41380 1688 1757 -41380 1716 1848 -41380 1742 1513 -41380 1731 1912 -41380 1888 1916 -41380 1912 1916 -41380 1604 1616 -41380 1696 1757 -41380 1770 1842 -41380 1916 1532 -41380 1790 1828 -41380 1731 1863 -41380 1805 1863 -41380 1790 1912 -41380 1731 1790 -41380 1790 1863 -41380 1805 1888 -41380 1888 1912 -41380 1863 1916 -41380 1790 1888 -41380 1863 1912 -41380 1731 1888 -41380 1731 1805 -41380 1805 1916 -41380 1828 1916 -41380 1863 1888 -41380 1731 1532 -41380 1650 1762 -41380 1668 1762 -41380 1790 1916 -41380 1731 1916 -41380 1650 1668 -41400 1537 1688 -41400 1538 1493 -41400 1543 1634 -41400 1549 1696 -41400 1549 1553 -41400 1549 1688 -41400 1549 1757 -41400 1568 1535 -41400 1592 1458 -41400 1599 1688 -41400 1599 1523 -41400 1608 1530 -41400 1613 1437 -41400 1628 1428 -41400 1628 1762 -41400 1628 1668 -41400 1641 1858 -41400 1655 1676 -41400 1655 1740 -41400 1700 1452 -41400 1767 1840 -41400 1831 1529 -41400 1888 1532 -41400 1900 1519 -41400 1460 1525 -41400 1465 1501 -41400 1499 1525 -41400 1500 1511 -41400 1512 1531 -41400 1537 1668 -41400 1555 1533 -41400 1556 1523 -41400 1569 1520 -41400 1591 1858 -41400 1603 1449 -41400 1700 1528 -41400 1825 1525 -41400 1863 1532 -41400 1460 1499 -41400 1541 1555 -41400 1552 1527 -41400 1573 1523 -41400 1587 1535 -41400 1659 1523 -41400 1805 1912 -41400 1831 1499 -41400 1496 1505 -41400 1537 1628 -41400 1558 1468 -41400 1828 1912 -41400 1912 1532 -41400 1676 1740 -41400 1688 1696 -41400 1740 1761 -41400 1790 1532 -41400 1790 1805 -41400 1805 1828 -41400 1805 1532 -41400 1828 1532 -41400 1563 1592 -41400 1601 1920 -41400 1617 1464 -41400 1676 1761 -41400 1731 1828 -41400 1828 1888 -41400 1688 1757 -41400 1716 1848 -41400 1742 1513 -41400 1731 1912 -41400 1888 1916 -41400 1912 1916 -41400 1604 1616 -41400 1696 1757 -41400 1770 1842 -41400 1916 1532 -41400 1790 1828 -41400 1731 1863 -41400 1805 1863 -41400 1790 1912 -41400 1731 1790 -41400 1790 1863 -41400 1805 1888 -41400 1888 1912 -41400 1863 1916 -41400 1790 1888 -41400 1863 1912 -41400 1731 1888 -41400 1731 1805 -41400 1805 1916 -41400 1828 1916 -41400 1863 1888 -41400 1731 1532 -41400 1650 1762 -41400 1668 1762 -41400 1790 1916 -41400 1731 1916 -41400 1650 1668 -41420 1537 1668 -41420 1544 1573 -41420 1546 1779 -41420 1552 1562 -41420 1555 1533 -41420 1556 1523 -41420 1569 1520 -41420 1587 1458 -41420 1591 1858 -41420 1603 1449 -41420 1606 1496 -41420 1700 1528 -41420 1743 1441 -41420 1761 1770 -41420 1825 1525 -41420 1831 1460 -41420 1863 1532 -41420 1458 1535 -41420 1459 1520 -41420 1460 1499 -41420 1470 1513 -41420 1523 1525 -41420 1541 1555 -41420 1552 1527 -41420 1573 1523 -41420 1587 1535 -41420 1659 1523 -41420 1805 1912 -41420 1828 1863 -41420 1831 1499 -41420 1496 1505 -41420 1537 1628 -41420 1537 1762 -41420 1558 1468 -41420 1828 1912 -41420 1912 1532 -41420 1676 1740 -41420 1688 1696 -41420 1740 1761 -41420 1790 1532 -41420 1790 1805 -41420 1805 1828 -41420 1805 1532 -41420 1828 1532 -41420 1563 1592 -41420 1601 1920 -41420 1617 1464 -41420 1676 1761 -41420 1731 1828 -41420 1828 1888 -41420 1688 1757 -41420 1716 1848 -41420 1603 1531 -41420 1742 1513 -41420 1731 1912 -41420 1888 1916 -41420 1912 1916 -41420 1604 1616 -41420 1696 1757 -41420 1770 1842 -41420 1916 1532 -41420 1790 1828 -41420 1731 1863 -41420 1805 1863 -41420 1790 1912 -41420 1731 1790 -41420 1790 1863 -41420 1805 1888 -41420 1888 1912 -41420 1863 1916 -41420 1790 1888 -41420 1863 1912 -41420 1731 1888 -41420 1731 1805 -41420 1805 1916 -41420 1828 1916 -41420 1863 1888 -41420 1731 1532 -41420 1650 1762 -41420 1668 1762 -41420 1790 1916 -41420 1731 1916 -41420 1650 1668 -41440 1537 1757 -41440 1538 1888 -41440 1538 1916 -41440 1538 1805 -41440 1541 1555 -41440 1544 1831 -41440 1549 1757 -41440 1550 1630 -41440 1552 1527 -41440 1553 1599 -41440 1554 1528 -41440 1554 1700 -41440 1554 1463 -41440 1559 1700 -41440 1573 1523 -41440 1587 1535 -41440 1599 1696 -41440 1599 1688 -41440 1599 1757 -41440 1613 1700 -41440 1626 1857 -41440 1655 1688 -41440 1655 1831 -41440 1659 1523 -41440 1757 1499 -41440 1761 1831 -41440 1805 1912 -41440 1828 1863 -41440 1831 1499 -41440 1900 1519 -41440 1496 1505 -41440 1537 1628 -41440 1543 1634 -41440 1544 1583 -41440 1568 1596 -41440 1613 1459 -41440 1767 1489 -41440 1431 1516 -41440 1470 1527 -41440 1537 1762 -41440 1558 1468 -41440 1562 1641 -41440 1562 1470 -41440 1828 1912 -41440 1912 1532 -41440 1676 1740 -41440 1688 1696 -41440 1740 1761 -41440 1790 1532 -41440 1790 1805 -41440 1805 1828 -41440 1805 1532 -41440 1828 1532 -41440 1512 1531 -41440 1563 1592 -41440 1601 1920 -41440 1617 1464 -41440 1676 1761 -41440 1731 1828 -41440 1828 1888 -41440 1688 1757 -41440 1716 1848 -41440 1603 1531 -41440 1742 1513 -41440 1731 1912 -41440 1888 1916 -41440 1912 1916 -41440 1604 1616 -41440 1696 1757 -41440 1770 1842 -41440 1460 1525 -41440 1916 1532 -41440 1499 1525 -41440 1790 1828 -41440 1731 1863 -41440 1805 1863 -41440 1790 1912 -41440 1731 1790 -41440 1790 1863 -41440 1805 1888 -41440 1888 1912 -41440 1863 1916 -41440 1790 1888 -41440 1863 1912 -41440 1731 1888 -41440 1731 1805 -41440 1805 1916 -41440 1828 1916 -41440 1863 1888 -41440 1731 1532 -41440 1650 1762 -41440 1668 1762 -41440 1790 1916 -41440 1731 1916 -41440 1650 1668 -41460 1537 1628 -41460 1539 1469 -41460 1543 1634 -41460 1544 1583 -41460 1548 1590 -41460 1548 1431 -41460 1554 1448 -41460 1554 1452 -41460 1568 1596 -41460 1582 1688 -41460 1582 1676 -41460 1591 1858 -41460 1596 1879 -41460 1603 1512 -41460 1613 1459 -41460 1747 1514 -41460 1747 1871 -41460 1767 1840 -41460 1767 1489 -41460 1431 1516 -41460 1470 1527 -41460 1537 1762 -41460 1549 1553 -41460 1555 1533 -41460 1556 1825 -41460 1558 1468 -41460 1562 1641 -41460 1562 1470 -41460 1582 1761 -41460 1603 1449 -41460 1773 1527 -41460 1828 1912 -41460 1863 1532 -41460 1888 1532 -41460 1912 1532 -41460 1449 1531 -41460 1628 1762 -41460 1676 1740 -41460 1688 1696 -41460 1740 1761 -41460 1790 1532 -41460 1790 1805 -41460 1805 1828 -41460 1805 1532 -41460 1828 1532 -41460 1512 1531 -41460 1563 1592 -41460 1601 1920 -41460 1617 1464 -41460 1676 1761 -41460 1731 1828 -41460 1828 1888 -41460 1434 1469 -41460 1628 1668 -41460 1688 1757 -41460 1716 1848 -41460 1460 1499 -41460 1603 1531 -41460 1742 1513 -41460 1731 1912 -41460 1840 1489 -41460 1888 1916 -41460 1912 1916 -41460 1604 1616 -41460 1696 1757 -41460 1770 1842 -41460 1460 1525 -41460 1916 1532 -41460 1499 1525 -41460 1790 1828 -41460 1443 1523 -41460 1731 1863 -41460 1805 1863 -41460 1790 1912 -41460 1731 1790 -41460 1790 1863 -41460 1805 1888 -41460 1888 1912 -41460 1863 1916 -41460 1790 1888 -41460 1863 1912 -41460 1731 1888 -41460 1731 1805 -41460 1805 1916 -41460 1828 1916 -41460 1863 1888 -41460 1731 1532 -41460 1650 1762 -41460 1668 1762 -41460 1790 1916 -41460 1731 1916 -41460 1650 1668 -41480 1537 1762 -41480 1537 1650 -41480 1549 1553 -41480 1555 1533 -41480 1556 1825 -41480 1558 1468 -41480 1559 1840 -41480 1559 1489 -41480 1562 1641 -41480 1562 1470 -41480 1573 1443 -41480 1573 1523 -41480 1582 1761 -41480 1582 1740 -41480 1582 1500 -41480 1603 1449 -41480 1617 1441 -41480 1619 1496 -41480 1619 1505 -41480 1655 1688 -41480 1678 1847 -41480 1773 1527 -41480 1828 1863 -41480 1828 1912 -41480 1858 1470 -41480 1863 1532 -41480 1888 1532 -41480 1900 1519 -41480 1912 1532 -41480 1449 1531 -41480 1569 1520 -41480 1590 1602 -41480 1628 1762 -41480 1628 1650 -41480 1676 1740 -41480 1688 1696 -41480 1740 1761 -41480 1790 1532 -41480 1790 1805 -41480 1805 1828 -41480 1805 1532 -41480 1825 1443 -41480 1828 1532 -41480 1512 1531 -41480 1541 1555 -41480 1541 1533 -41480 1563 1592 -41480 1601 1920 -41480 1617 1464 -41480 1676 1761 -41480 1731 1828 -41480 1828 1888 -41480 1434 1469 -41480 1544 1599 -41480 1599 1659 -41480 1628 1668 -41480 1688 1757 -41480 1716 1848 -41480 1460 1499 -41480 1603 1531 -41480 1742 1513 -41480 1731 1912 -41480 1840 1489 -41480 1888 1916 -41480 1912 1916 -41480 1604 1616 -41480 1696 1757 -41480 1770 1842 -41480 1460 1525 -41480 1916 1532 -41480 1499 1525 -41480 1544 1659 -41480 1790 1828 -41480 1443 1523 -41480 1731 1863 -41480 1805 1863 -41480 1790 1912 -41480 1731 1790 -41480 1790 1863 -41480 1805 1888 -41480 1888 1912 -41480 1863 1916 -41480 1790 1888 -41480 1863 1912 -41480 1731 1888 -41480 1731 1805 -41480 1805 1916 -41480 1828 1916 -41480 1863 1888 -41480 1731 1532 -41480 1650 1762 -41480 1668 1762 -41480 1790 1916 -41480 1731 1916 -41480 1650 1668 -41500 1537 1628 -41500 1543 1634 -41500 1569 1520 -41500 1578 1501 -41500 1590 1602 -41500 1628 1762 -41500 1628 1650 -41500 1676 1740 -41500 1688 1696 -41500 1740 1761 -41500 1774 1888 -41500 1790 1532 -41500 1790 1805 -41500 1805 1828 -41500 1805 1532 -41500 1825 1443 -41500 1828 1532 -41500 1500 1511 -41500 1512 1531 -41500 1523 1529 -41500 1541 1555 -41500 1541 1533 -41500 1563 1592 -41500 1583 1825 -41500 1601 1920 -41500 1617 1464 -41500 1676 1761 -41500 1731 1828 -41500 1828 1888 -41500 1431 1516 -41500 1434 1469 -41500 1496 1505 -41500 1544 1599 -41500 1599 1659 -41500 1628 1668 -41500 1688 1757 -41500 1716 1848 -41500 1919 1510 -41500 1460 1499 -41500 1603 1531 -41500 1742 1513 -41500 1805 1912 -41500 1546 1468 -41500 1587 1535 -41500 1731 1912 -41500 1840 1489 -41500 1888 1524 -41500 1888 1916 -41500 1912 1916 -41500 1549 1443 -41500 1604 1616 -41500 1696 1757 -41500 1770 1842 -41500 1460 1525 -41500 1591 1858 -41500 1916 1532 -41500 1499 1525 -41500 1544 1659 -41500 1790 1828 -41500 1443 1523 -41500 1549 1523 -41500 1731 1863 -41500 1805 1863 -41500 1790 1912 -41500 1731 1790 -41500 1790 1863 -41500 1805 1888 -41500 1888 1912 -41500 1863 1916 -41500 1790 1888 -41500 1863 1912 -41500 1731 1888 -41500 1731 1805 -41500 1805 1916 -41500 1828 1916 -41500 1863 1888 -41500 1731 1532 -41500 1650 1762 -41500 1668 1762 -41500 1790 1916 -41500 1731 1916 -41500 1650 1668 -41520 1537 1762 -41520 1541 1555 -41520 1541 1533 -41520 1555 1533 -41520 1562 1678 -41520 1563 1592 -41520 1583 1825 -41520 1599 1825 -41520 1599 1770 -41520 1601 1920 -41520 1606 1516 -41520 1606 1431 -41520 1617 1464 -41520 1676 1761 -41520 1731 1828 -41520 1828 1888 -41520 1828 1863 -41520 1900 1519 -41520 1431 1516 -41520 1434 1469 -41520 1442 1455 -41520 1449 1531 -41520 1496 1505 -41520 1524 1532 -41520 1539 1599 -41520 1544 1599 -41520 1599 1659 -41520 1613 1495 -41520 1628 1668 -41520 1655 1688 -41520 1688 1757 -41520 1716 1848 -41520 1773 1527 -41520 1919 1510 -41520 1460 1499 -41520 1603 1531 -41520 1742 1513 -41520 1805 1912 -41520 1857 1470 -41520 1912 1524 -41520 1916 1524 -41520 1546 1468 -41520 1587 1535 -41520 1731 1524 -41520 1731 1912 -41520 1805 1524 -41520 1828 1912 -41520 1840 1489 -41520 1888 1524 -41520 1888 1916 -41520 1912 1916 -41520 1549 1443 -41520 1604 1616 -41520 1696 1757 -41520 1770 1842 -41520 1912 1532 -41520 1460 1525 -41520 1591 1858 -41520 1863 1524 -41520 1916 1532 -41520 1499 1525 -41520 1538 1524 -41520 1544 1659 -41520 1790 1828 -41520 1443 1523 -41520 1549 1523 -41520 1731 1863 -41520 1805 1863 -41520 1790 1912 -41520 1731 1790 -41520 1790 1863 -41520 1805 1888 -41520 1888 1912 -41520 1863 1916 -41520 1790 1888 -41520 1863 1912 -41520 1731 1888 -41520 1731 1805 -41520 1805 1916 -41520 1828 1916 -41520 1863 1888 -41520 1731 1532 -41520 1650 1762 -41520 1668 1762 -41520 1790 1916 -41520 1731 1916 -41520 1650 1668 -41540 1537 1463 -41540 1539 1599 -41540 1544 1599 -41540 1553 1706 -41540 1569 1596 -41540 1582 1535 -41540 1596 1469 -41540 1599 1659 -41540 1603 1449 -41540 1613 1495 -41540 1628 1668 -41540 1655 1688 -41540 1688 1757 -41540 1716 1848 -41540 1767 1489 -41540 1773 1527 -41540 1919 1510 -41540 1460 1499 -41540 1487 1500 -41540 1552 1527 -41540 1603 1531 -41540 1609 1471 -41540 1742 1513 -41540 1774 1888 -41540 1805 1912 -41540 1857 1470 -41540 1912 1524 -41540 1916 1524 -41540 1546 1468 -41540 1583 1599 -41540 1587 1535 -41540 1599 1529 -41540 1731 1524 -41540 1731 1912 -41540 1805 1524 -41540 1828 1912 -41540 1828 1532 -41540 1840 1489 -41540 1888 1524 -41540 1888 1916 -41540 1912 1916 -41540 1539 1544 -41540 1549 1443 -41540 1604 1616 -41540 1696 1757 -41540 1706 1766 -41540 1770 1842 -41540 1912 1532 -41540 1460 1525 -41540 1591 1858 -41540 1863 1524 -41540 1916 1532 -41540 1499 1525 -41540 1538 1524 -41540 1544 1659 -41540 1790 1828 -41540 1443 1523 -41540 1549 1523 -41540 1731 1863 -41540 1805 1863 -41540 1790 1805 -41540 1790 1912 -41540 1731 1790 -41540 1790 1532 -41540 1888 1532 -41540 1790 1863 -41540 1805 1888 -41540 1888 1912 -41540 1863 1916 -41540 1790 1888 -41540 1805 1828 -41540 1863 1912 -41540 1731 1888 -41540 1731 1805 -41540 1805 1532 -41540 1805 1916 -41540 1828 1916 -41540 1863 1888 -41540 1731 1532 -41540 1650 1762 -41540 1668 1762 -41540 1790 1916 -41540 1731 1916 -41540 1650 1668 -41560 1552 1527 -41560 1582 1496 -41560 1596 1441 -41560 1603 1531 -41560 1609 1471 -41560 1700 1504 -41560 1742 1513 -41560 1767 1840 -41560 1770 1501 -41560 1774 1888 -41560 1805 1912 -41560 1857 1470 -41560 1912 1524 -41560 1916 1524 -41560 1431 1516 -41560 1455 1487 -41560 1539 1659 -41560 1546 1468 -41560 1563 1592 -41560 1583 1599 -41560 1587 1535 -41560 1648 1706 -41560 1498 1526 -41560 1599 1529 -41560 1648 1766 -41560 1731 1524 -41560 1731 1912 -41560 1805 1524 -41560 1828 1912 -41560 1828 1532 -41560 1840 1489 -41560 1888 1524 -41560 1888 1916 -41560 1912 1916 -41560 1539 1544 -41560 1549 1443 -41560 1559 1604 -41560 1604 1616 -41560 1696 1757 -41560 1706 1766 -41560 1770 1842 -41560 1912 1532 -41560 1460 1525 -41560 1591 1858 -41560 1863 1524 -41560 1916 1532 -41560 1499 1525 -41560 1731 1828 -41560 1538 1524 -41560 1541 1555 -41560 1544 1659 -41560 1578 1920 -41560 1790 1828 -41560 1443 1523 -41560 1549 1523 -41560 1688 1457 -41560 1900 1519 -41560 1731 1863 -41560 1805 1863 -41560 1790 1805 -41560 1790 1912 -41560 1731 1790 -41560 1790 1532 -41560 1888 1532 -41560 1541 1533 -41560 1790 1863 -41560 1805 1888 -41560 1863 1532 -41560 1888 1912 -41560 1863 1916 -41560 1617 1464 -41560 1790 1888 -41560 1805 1828 -41560 1863 1912 -41560 1731 1888 -41560 1731 1805 -41560 1805 1532 -41560 1805 1916 -41560 1828 1916 -41560 1863 1888 -41560 1731 1532 -41560 1650 1762 -41560 1668 1762 -41560 1790 1916 -41560 1731 1916 -41560 1650 1668 -41580 1539 1659 -41580 1543 1634 -41580 1546 1468 -41580 1546 1558 -41580 1563 1592 -41580 1583 1599 -41580 1587 1535 -41580 1596 1773 -41580 1601 1920 -41580 1648 1706 -41580 1740 1431 -41580 1783 1461 -41580 1426 1459 -41580 1498 1526 -41580 1596 1641 -41580 1599 1529 -41580 1648 1766 -41580 1731 1524 -41580 1731 1912 -41580 1805 1524 -41580 1828 1912 -41580 1828 1532 -41580 1840 1489 -41580 1888 1524 -41580 1888 1916 -41580 1912 1916 -41580 1539 1544 -41580 1549 1443 -41580 1559 1604 -41580 1604 1616 -41580 1696 1757 -41580 1706 1766 -41580 1770 1842 -41580 1912 1532 -41580 1460 1525 -41580 1591 1858 -41580 1863 1524 -41580 1916 1532 -41580 1499 1525 -41580 1731 1828 -41580 1538 1524 -41580 1541 1555 -41580 1544 1659 -41580 1578 1920 -41580 1790 1828 -41580 1443 1523 -41580 1549 1523 -41580 1688 1457 -41580 1900 1519 -41580 1731 1863 -41580 1805 1863 -41580 1790 1805 -41580 1790 1912 -41580 1731 1790 -41580 1790 1532 -41580 1888 1532 -41580 1541 1533 -41580 1919 1510 -41580 1790 1863 -41580 1805 1888 -41580 1863 1532 -41580 1888 1912 -41580 1863 1916 -41580 1617 1464 -41580 1790 1888 -41580 1805 1828 -41580 1863 1912 -41580 1731 1888 -41580 1731 1805 -41580 1805 1532 -41580 1805 1916 -41580 1828 1916 -41580 1863 1888 -41580 1731 1532 -41580 1650 1762 -41580 1668 1762 -41580 1790 1916 -41580 1731 1916 -41580 1650 1668 -41600 1539 1501 -41600 1539 1599 -41600 1556 1825 -41600 1569 1520 -41600 1596 1641 -41600 1599 1529 -41600 1641 1773 -41600 1648 1766 -41600 1655 1757 -41600 1696 1706 -41600 1706 1757 -41600 1731 1524 -41600 1731 1912 -41600 1757 1520 -41600 1757 1766 -41600 1805 1524 -41600 1805 1912 -41600 1828 1912 -41600 1828 1532 -41600 1840 1489 -41600 1857 1470 -41600 1888 1524 -41600 1888 1916 -41600 1912 1524 -41600 1912 1916 -41600 1916 1524 -41600 1460 1499 -41600 1500 1511 -41600 1539 1544 -41600 1539 1499 -41600 1549 1443 -41600 1559 1604 -41600 1604 1616 -41600 1655 1706 -41600 1696 1757 -41600 1706 1766 -41600 1770 1842 -41600 1912 1532 -41600 1460 1525 -41600 1463 1527 -41600 1591 1858 -41600 1648 1757 -41600 1767 1489 -41600 1863 1524 -41600 1916 1532 -41600 1499 1525 -41600 1655 1696 -41600 1731 1828 -41600 1538 1524 -41600 1541 1555 -41600 1544 1659 -41600 1578 1920 -41600 1648 1696 -41600 1790 1828 -41600 1443 1523 -41600 1549 1523 -41600 1688 1457 -41600 1774 1888 -41600 1900 1519 -41600 1731 1863 -41600 1805 1863 -41600 1790 1805 -41600 1790 1912 -41600 1731 1790 -41600 1790 1532 -41600 1888 1532 -41600 1541 1533 -41600 1919 1510 -41600 1790 1863 -41600 1805 1888 -41600 1863 1532 -41600 1888 1912 -41600 1863 1916 -41600 1617 1464 -41600 1790 1888 -41600 1805 1828 -41600 1863 1912 -41600 1731 1888 -41600 1731 1805 -41600 1805 1532 -41600 1805 1916 -41600 1828 1916 -41600 1863 1888 -41600 1731 1532 -41600 1650 1762 -41600 1668 1762 -41600 1790 1916 -41600 1731 1916 -41600 1650 1668 -41620 1539 1544 -41620 1539 1761 -41620 1539 1499 -41620 1549 1443 -41620 1558 1619 -41620 1559 1604 -41620 1590 1602 -41620 1599 1525 -41620 1603 1449 -41620 1604 1616 -41620 1623 1871 -41620 1655 1706 -41620 1696 1757 -41620 1706 1766 -41620 1747 1448 -41620 1757 1761 -41620 1761 1766 -41620 1767 1840 -41620 1770 1842 -41620 1912 1532 -41620 1431 1516 -41620 1448 1527 -41620 1460 1525 -41620 1463 1513 -41620 1463 1527 -41620 1507 1522 -41620 1546 1558 -41620 1591 1858 -41620 1648 1757 -41620 1767 1489 -41620 1863 1524 -41620 1916 1532 -41620 1470 1526 -41620 1498 1526 -41620 1499 1529 -41620 1499 1525 -41620 1513 1527 -41620 1655 1696 -41620 1655 1761 -41620 1706 1761 -41620 1731 1828 -41620 1825 1501 -41620 1538 1524 -41620 1541 1555 -41620 1544 1659 -41620 1578 1920 -41620 1599 1443 -41620 1648 1696 -41620 1790 1828 -41620 1443 1523 -41620 1496 1505 -41620 1549 1523 -41620 1688 1457 -41620 1774 1888 -41620 1825 1525 -41620 1900 1519 -41620 1731 1863 -41620 1805 1863 -41620 1470 1498 -41620 1790 1805 -41620 1790 1912 -41620 1731 1790 -41620 1790 1532 -41620 1888 1532 -41620 1501 1525 -41620 1541 1533 -41620 1555 1533 -41620 1919 1510 -41620 1790 1863 -41620 1805 1888 -41620 1863 1532 -41620 1888 1912 -41620 1863 1916 -41620 1617 1464 -41620 1790 1888 -41620 1805 1828 -41620 1863 1912 -41620 1731 1888 -41620 1731 1805 -41620 1805 1532 -41620 1805 1916 -41620 1828 1916 -41620 1863 1888 -41620 1731 1532 -41620 1650 1762 -41620 1668 1762 -41620 1790 1916 -41620 1731 1916 -41620 1650 1668 -41640 1538 1888 -41640 1541 1590 -41640 1546 1558 -41640 1546 1879 -41640 1548 1431 -41640 1549 1499 -41640 1559 1616 -41640 1563 1592 -41640 1581 1742 -41640 1591 1858 -41640 1596 1773 -41640 1603 1531 -41640 1622 1831 -41640 1628 1513 -41640 1648 1757 -41640 1655 1757 -41640 1700 1437 -41640 1767 1489 -41640 1779 1527 -41640 1789 1517 -41640 1863 1524 -41640 1888 1524 -41640 1916 1532 -41640 1443 1501 -41640 1470 1526 -41640 1498 1526 -41640 1499 1529 -41640 1499 1525 -41640 1500 1511 -41640 1512 1531 -41640 1513 1527 -41640 1537 1520 -41640 1543 1562 -41640 1558 1468 -41640 1581 1613 -41640 1601 1920 -41640 1628 1463 -41640 1655 1696 -41640 1655 1761 -41640 1706 1761 -41640 1731 1828 -41640 1825 1501 -41640 1538 1524 -41640 1541 1555 -41640 1544 1659 -41640 1578 1920 -41640 1599 1443 -41640 1648 1696 -41640 1790 1828 -41640 1828 1532 -41640 1443 1523 -41640 1496 1505 -41640 1549 1523 -41640 1688 1457 -41640 1774 1888 -41640 1825 1525 -41640 1900 1519 -41640 1731 1863 -41640 1805 1863 -41640 1470 1498 -41640 1587 1535 -41640 1790 1805 -41640 1790 1912 -41640 1828 1912 -41640 1731 1790 -41640 1790 1532 -41640 1888 1532 -41640 1501 1525 -41640 1541 1533 -41640 1555 1533 -41640 1919 1510 -41640 1790 1863 -41640 1805 1888 -41640 1863 1532 -41640 1888 1912 -41640 1863 1916 -41640 1617 1464 -41640 1790 1888 -41640 1805 1828 -41640 1863 1912 -41640 1731 1888 -41640 1731 1805 -41640 1805 1532 -41640 1805 1916 -41640 1828 1916 -41640 1863 1888 -41640 1731 1532 -41640 1650 1762 -41640 1668 1762 -41640 1731 1912 -41640 1790 1916 -41640 1731 1916 -41640 1912 1916 -41640 1650 1668 -41660 1537 1520 -41660 1543 1562 -41660 1544 1499 -41660 1558 1468 -41660 1581 1613 -41660 1596 1630 -41660 1601 1920 -41660 1617 1441 -41660 1623 1470 -41660 1628 1871 -41660 1628 1463 -41660 1628 1527 -41660 1641 1773 -41660 1648 1501 -41660 1648 1525 -41660 1655 1696 -41660 1655 1761 -41660 1659 1499 -41660 1696 1501 -41660 1706 1761 -41660 1731 1828 -41660 1757 1761 -41660 1825 1501 -41660 1828 1863 -41660 1871 1527 -41660 1463 1527 -41660 1538 1524 -41660 1541 1555 -41660 1544 1659 -41660 1549 1443 -41660 1553 1756 -41660 1578 1920 -41660 1599 1443 -41660 1640 1756 -41660 1648 1696 -41660 1747 1448 -41660 1790 1828 -41660 1828 1532 -41660 1888 1916 -41660 1443 1523 -41660 1496 1505 -41660 1549 1523 -41660 1599 1756 -41660 1688 1457 -41660 1774 1888 -41660 1825 1525 -41660 1900 1519 -41660 1731 1863 -41660 1805 1863 -41660 1840 1489 -41660 1470 1498 -41660 1587 1535 -41660 1767 1779 -41660 1790 1805 -41660 1790 1912 -41660 1828 1912 -41660 1731 1790 -41660 1790 1532 -41660 1888 1532 -41660 1501 1525 -41660 1541 1533 -41660 1555 1533 -41660 1919 1510 -41660 1790 1863 -41660 1805 1888 -41660 1863 1532 -41660 1888 1912 -41660 1863 1916 -41660 1617 1464 -41660 1790 1888 -41660 1805 1828 -41660 1863 1912 -41660 1731 1888 -41660 1731 1805 -41660 1805 1532 -41660 1805 1916 -41660 1828 1916 -41660 1863 1888 -41660 1731 1532 -41660 1650 1762 -41660 1668 1762 -41660 1731 1912 -41660 1790 1916 -41660 1731 1916 -41660 1912 1916 -41660 1650 1668 -41680 1538 1524 -41680 1541 1555 -41680 1544 1659 -41680 1549 1443 -41680 1550 1486 -41680 1553 1756 -41680 1574 1770 -41680 1578 1920 -41680 1592 1742 -41680 1596 1500 -41680 1599 1640 -41680 1599 1443 -41680 1640 1756 -41680 1648 1696 -41680 1688 1443 -41680 1688 1761 -41680 1696 1529 -41680 1696 1443 -41680 1696 1525 -41680 1706 1766 -41680 1747 1448 -41680 1761 1513 -41680 1761 1522 -41680 1790 1828 -41680 1828 1532 -41680 1888 1916 -41680 1443 1523 -41680 1443 1499 -41680 1460 1499 -41680 1465 1503 -41680 1470 1526 -41680 1496 1505 -41680 1507 1522 -41680 1549 1523 -41680 1599 1756 -41680 1606 1516 -41680 1688 1457 -41680 1688 1706 -41680 1774 1888 -41680 1825 1525 -41680 1900 1519 -41680 1731 1863 -41680 1805 1863 -41680 1840 1489 -41680 1470 1498 -41680 1587 1535 -41680 1767 1779 -41680 1790 1805 -41680 1790 1912 -41680 1828 1912 -41680 1731 1790 -41680 1790 1532 -41680 1888 1532 -41680 1501 1525 -41680 1541 1533 -41680 1555 1533 -41680 1919 1510 -41680 1500 1511 -41680 1805 1912 -41680 1790 1863 -41680 1805 1888 -41680 1863 1532 -41680 1888 1912 -41680 1863 1916 -41680 1617 1464 -41680 1790 1888 -41680 1805 1828 -41680 1863 1912 -41680 1731 1888 -41680 1731 1805 -41680 1805 1532 -41680 1805 1916 -41680 1828 1916 -41680 1863 1888 -41680 1731 1532 -41680 1916 1532 -41680 1650 1762 -41680 1668 1762 -41680 1731 1912 -41680 1790 1916 -41680 1731 1916 -41680 1912 1916 -41680 1650 1668 -41700 1543 1562 -41700 1545 1430 -41700 1546 1468 -41700 1546 1558 -41700 1549 1523 -41700 1581 1641 -41700 1599 1756 -41700 1603 1512 -41700 1606 1516 -41700 1688 1457 -41700 1688 1706 -41700 1700 1437 -41700 1706 1457 -41700 1774 1888 -41700 1825 1525 -41700 1825 1501 -41700 1831 1528 -41700 1900 1519 -41700 1558 1468 -41700 1569 1520 -41700 1619 1448 -41700 1731 1863 -41700 1805 1863 -41700 1828 1863 -41700 1840 1489 -41700 1470 1498 -41700 1587 1535 -41700 1655 1757 -41700 1767 1779 -41700 1790 1805 -41700 1790 1912 -41700 1912 1532 -41700 1463 1527 -41700 1828 1912 -41700 1731 1790 -41700 1790 1532 -41700 1888 1532 -41700 1501 1525 -41700 1541 1533 -41700 1555 1533 -41700 1919 1510 -41700 1500 1511 -41700 1805 1912 -41700 1790 1863 -41700 1805 1888 -41700 1863 1532 -41700 1888 1912 -41700 1863 1916 -41700 1617 1464 -41700 1790 1888 -41700 1805 1828 -41700 1863 1912 -41700 1731 1888 -41700 1731 1805 -41700 1805 1532 -41700 1805 1916 -41700 1731 1828 -41700 1828 1916 -41700 1863 1888 -41700 1731 1532 -41700 1916 1532 -41700 1650 1762 -41700 1668 1762 -41700 1731 1912 -41700 1790 1916 -41700 1731 1916 -41700 1912 1916 -41700 1650 1668 -41720 1549 1499 -41720 1554 1520 -41720 1558 1468 -41720 1562 1634 -41720 1569 1520 -41720 1581 1517 -41720 1596 1716 -41720 1599 1519 -41720 1616 1770 -41720 1617 1441 -41720 1619 1448 -41720 1640 1756 -41720 1640 1519 -41720 1641 1441 -41720 1696 1529 -41720 1700 1831 -41720 1731 1863 -41720 1773 1791 -41720 1778 1839 -41720 1805 1863 -41720 1828 1863 -41720 1840 1489 -41720 1458 1460 -41720 1470 1498 -41720 1470 1526 -41720 1499 1529 -41720 1549 1640 -41720 1553 1756 -41720 1578 1920 -41720 1587 1535 -41720 1604 1770 -41720 1613 1631 -41720 1628 1900 -41720 1655 1757 -41720 1767 1779 -41720 1790 1805 -41720 1790 1912 -41720 1912 1532 -41720 1463 1527 -41720 1544 1659 -41720 1828 1912 -41720 1426 1459 -41720 1431 1516 -41720 1512 1531 -41720 1731 1790 -41720 1747 1448 -41720 1790 1532 -41720 1888 1532 -41720 1501 1525 -41720 1541 1533 -41720 1555 1533 -41720 1919 1510 -41720 1467 1504 -41720 1500 1511 -41720 1805 1912 -41720 1790 1863 -41720 1805 1888 -41720 1863 1532 -41720 1888 1912 -41720 1863 1916 -41720 1617 1464 -41720 1790 1888 -41720 1805 1828 -41720 1863 1912 -41720 1888 1916 -41720 1731 1888 -41720 1731 1805 -41720 1805 1532 -41720 1805 1916 -41720 1731 1828 -41720 1828 1916 -41720 1863 1888 -41720 1541 1555 -41720 1731 1532 -41720 1916 1532 -41720 1592 1742 -41720 1650 1762 -41720 1668 1762 -41720 1731 1912 -41720 1790 1916 -41720 1731 1916 -41720 1912 1916 -41720 1650 1668 -41740 1545 1430 -41740 1549 1640 -41740 1549 1553 -41740 1553 1756 -41740 1578 1920 -41740 1587 1535 -41740 1596 1879 -41740 1599 1523 -41740 1603 1512 -41740 1603 1441 -41740 1603 1517 -41740 1604 1616 -41740 1604 1770 -41740 1613 1631 -41740 1623 1520 -41740 1628 1900 -41740 1628 1527 -41740 1655 1757 -41740 1767 1779 -41740 1773 1831 -41740 1779 1489 -41740 1790 1805 -41740 1790 1912 -41740 1791 1517 -41740 1831 1528 -41740 1831 1531 -41740 1857 1526 -41740 1912 1532 -41740 1441 1517 -41740 1460 1499 -41740 1463 1527 -41740 1544 1659 -41740 1548 1431 -41740 1767 1840 -41740 1825 1523 -41740 1828 1912 -41740 1426 1459 -41740 1431 1516 -41740 1498 1526 -41740 1512 1531 -41740 1559 1604 -41740 1603 1531 -41740 1648 1529 -41740 1676 1471 -41740 1731 1790 -41740 1747 1448 -41740 1790 1828 -41740 1790 1532 -41740 1774 1888 -41740 1888 1532 -41740 1501 1525 -41740 1541 1533 -41740 1555 1533 -41740 1919 1510 -41740 1467 1504 -41740 1500 1511 -41740 1805 1912 -41740 1790 1863 -41740 1805 1888 -41740 1863 1532 -41740 1888 1912 -41740 1688 1457 -41740 1828 1532 -41740 1863 1916 -41740 1617 1464 -41740 1790 1888 -41740 1805 1828 -41740 1863 1912 -41740 1888 1916 -41740 1731 1888 -41740 1731 1805 -41740 1805 1532 -41740 1805 1916 -41740 1731 1828 -41740 1828 1916 -41740 1863 1888 -41740 1541 1555 -41740 1731 1532 -41740 1916 1532 -41740 1592 1742 -41740 1650 1762 -41740 1668 1762 -41740 1731 1912 -41740 1648 1696 -41740 1790 1916 -41740 1731 1916 -41740 1912 1916 -41740 1650 1668 -41760 1544 1659 -41760 1548 1431 -41760 1558 1468 -41760 1581 1613 -41760 1596 1652 -41760 1599 1527 -41760 1613 1495 -41760 1628 1463 -41760 1756 1527 -41760 1756 1525 -41760 1757 1766 -41760 1767 1840 -41760 1825 1523 -41760 1828 1912 -41760 1839 1470 -41760 1842 1466 -41760 1900 1489 -41760 1426 1459 -41760 1431 1516 -41760 1468 1512 -41760 1498 1526 -41760 1501 1529 -41760 1512 1531 -41760 1547 1716 -41760 1548 1516 -41760 1559 1604 -41760 1581 1495 -41760 1596 1678 -41760 1603 1531 -41760 1648 1529 -41760 1676 1471 -41760 1696 1529 -41760 1731 1790 -41760 1747 1448 -41760 1790 1828 -41760 1790 1532 -41760 1563 1497 -41760 1593 1524 -41760 1617 1441 -41760 1767 1489 -41760 1774 1888 -41760 1840 1489 -41760 1888 1532 -41760 1501 1525 -41760 1541 1533 -41760 1555 1533 -41760 1919 1510 -41760 1467 1504 -41760 1500 1511 -41760 1599 1756 -41760 1805 1912 -41760 1790 1863 -41760 1805 1888 -41760 1863 1532 -41760 1888 1912 -41760 1688 1457 -41760 1828 1532 -41760 1863 1916 -41760 1617 1464 -41760 1790 1888 -41760 1805 1828 -41760 1863 1912 -41760 1888 1916 -41760 1731 1888 -41760 1731 1805 -41760 1805 1863 -41760 1805 1532 -41760 1805 1916 -41760 1731 1828 -41760 1828 1916 -41760 1863 1888 -41760 1541 1555 -41760 1731 1532 -41760 1916 1532 -41760 1592 1742 -41760 1700 1528 -41760 1650 1762 -41760 1668 1762 -41760 1731 1912 -41760 1648 1696 -41760 1790 1916 -41760 1731 1916 -41760 1912 1916 -41760 1731 1863 -41760 1650 1668 -41780 1539 1716 -41780 1539 1879 -41780 1545 1430 -41780 1547 1716 -41780 1548 1516 -41780 1559 1770 -41780 1559 1604 -41780 1560 1604 -41780 1581 1495 -41780 1596 1678 -41780 1602 1874 -41780 1603 1531 -41780 1606 1516 -41780 1609 1434 -41780 1613 1630 -41780 1648 1529 -41780 1655 1757 -41780 1676 1471 -41780 1696 1529 -41780 1731 1790 -41780 1747 1448 -41780 1790 1828 -41780 1790 1912 -41780 1790 1532 -41780 1828 1888 -41780 1828 1863 -41780 1853 1471 -41780 1563 1497 -41780 1593 1524 -41780 1603 1437 -41780 1613 1448 -41780 1617 1441 -41780 1752 1766 -41780 1767 1489 -41780 1774 1888 -41780 1840 1489 -41780 1888 1532 -41780 1501 1525 -41780 1541 1533 -41780 1546 1519 -41780 1555 1533 -41780 1919 1510 -41780 1467 1504 -41780 1500 1511 -41780 1599 1756 -41780 1648 1525 -41780 1805 1912 -41780 1790 1863 -41780 1805 1888 -41780 1863 1532 -41780 1888 1912 -41780 1587 1535 -41780 1688 1457 -41780 1828 1532 -41780 1863 1916 -41780 1617 1464 -41780 1790 1888 -41780 1790 1805 -41780 1805 1828 -41780 1863 1912 -41780 1888 1916 -41780 1731 1888 -41780 1731 1805 -41780 1805 1863 -41780 1805 1532 -41780 1805 1916 -41780 1731 1828 -41780 1828 1916 -41780 1863 1888 -41780 1541 1555 -41780 1731 1532 -41780 1912 1532 -41780 1916 1532 -41780 1592 1742 -41780 1700 1528 -41780 1650 1762 -41780 1668 1762 -41780 1731 1912 -41780 1648 1696 -41780 1790 1916 -41780 1731 1916 -41780 1912 1916 -41780 1731 1863 -41780 1650 1668 -41800 1538 1524 -41800 1539 1580 -41800 1544 1659 -41800 1559 1616 -41800 1563 1688 -41800 1563 1497 -41800 1581 1652 -41800 1582 1602 -41800 1593 1524 -41800 1603 1437 -41800 1609 1915 -41800 1613 1448 -41800 1613 1623 -41800 1617 1441 -41800 1749 1757 -41800 1752 1512 -41800 1752 1766 -41800 1767 1489 -41800 1767 1779 -41800 1774 1888 -41800 1779 1489 -41800 1840 1489 -41800 1853 1487 -41800 1888 1532 -41800 1916 1524 -41800 1465 1503 -41800 1501 1525 -41800 1519 1523 -41800 1541 1533 -41800 1546 1519 -41800 1555 1533 -41800 1919 1510 -41800 1467 1504 -41800 1500 1511 -41800 1599 1756 -41800 1648 1525 -41800 1805 1912 -41800 1498 1526 -41800 1585 1752 -41800 1790 1863 -41800 1805 1888 -41800 1863 1532 -41800 1888 1912 -41800 1587 1535 -41800 1688 1457 -41800 1828 1532 -41800 1863 1916 -41800 1617 1464 -41800 1790 1888 -41800 1790 1805 -41800 1805 1828 -41800 1863 1912 -41800 1888 1916 -41800 1731 1888 -41800 1731 1805 -41800 1805 1863 -41800 1805 1532 -41800 1805 1916 -41800 1731 1828 -41800 1828 1916 -41800 1863 1888 -41800 1541 1555 -41800 1731 1532 -41800 1912 1532 -41800 1916 1532 -41800 1592 1742 -41800 1700 1528 -41800 1828 1912 -41800 1650 1762 -41800 1668 1762 -41800 1731 1912 -41800 1648 1696 -41800 1790 1916 -41800 1731 1916 -41800 1912 1916 -41800 1731 1863 -41800 1650 1668 -41820 1541 1533 -41820 1546 1519 -41820 1549 1583 -41820 1555 1533 -41820 1578 1920 -41820 1583 1529 -41820 1596 1465 -41820 1655 1512 -41820 1749 1512 -41820 1831 1858 -41820 1919 1510 -41820 1433 1487 -41820 1460 1499 -41820 1467 1504 -41820 1500 1511 -41820 1516 1520 -41820 1569 1599 -41820 1599 1756 -41820 1648 1525 -41820 1696 1529 -41820 1888 1524 -41820 1912 1524 -41820 1603 1486 -41820 1805 1912 -41820 1498 1526 -41820 1585 1752 -41820 1790 1863 -41820 1805 1888 -41820 1863 1532 -41820 1888 1912 -41820 1559 1604 -41820 1587 1535 -41820 1688 1457 -41820 1828 1532 -41820 1863 1916 -41820 1617 1464 -41820 1790 1888 -41820 1790 1805 -41820 1805 1828 -41820 1863 1912 -41820 1888 1916 -41820 1731 1888 -41820 1731 1805 -41820 1805 1863 -41820 1805 1532 -41820 1805 1916 -41820 1731 1828 -41820 1828 1916 -41820 1863 1888 -41820 1541 1555 -41820 1731 1532 -41820 1790 1828 -41820 1790 1532 -41820 1912 1532 -41820 1916 1532 -41820 1592 1742 -41820 1700 1528 -41820 1790 1912 -41820 1828 1912 -41820 1650 1762 -41820 1668 1762 -41820 1731 1912 -41820 1648 1696 -41820 1731 1790 -41820 1790 1916 -41820 1731 1916 -41820 1912 1916 -41820 1731 1863 -41820 1650 1668 -41840 1538 1888 -41840 1538 1912 -41840 1538 1731 -41840 1538 1524 -41840 1544 1569 -41840 1544 1523 -41840 1544 1599 -41840 1548 1448 -41840 1549 1525 -41840 1569 1599 -41840 1597 1749 -41840 1599 1756 -41840 1602 1789 -41840 1641 1773 -41840 1648 1529 -41840 1648 1525 -41840 1696 1529 -41840 1888 1524 -41840 1912 1524 -41840 1523 1525 -41840 1544 1525 -41840 1558 1468 -41840 1603 1486 -41840 1805 1912 -41840 1853 1434 -41840 1496 1505 -41840 1498 1526 -41840 1585 1752 -41840 1774 1888 -41840 1790 1863 -41840 1805 1888 -41840 1863 1532 -41840 1888 1912 -41840 1559 1604 -41840 1587 1535 -41840 1688 1457 -41840 1828 1532 -41840 1863 1916 -41840 1559 1574 -41840 1617 1464 -41840 1790 1888 -41840 1790 1805 -41840 1805 1828 -41840 1863 1912 -41840 1888 1916 -41840 1731 1888 -41840 1731 1805 -41840 1805 1863 -41840 1805 1532 -41840 1805 1916 -41840 1731 1828 -41840 1767 1779 -41840 1828 1916 -41840 1863 1888 -41840 1541 1555 -41840 1731 1532 -41840 1790 1828 -41840 1790 1532 -41840 1912 1532 -41840 1916 1532 -41840 1592 1742 -41840 1700 1528 -41840 1790 1912 -41840 1828 1912 -41840 1650 1762 -41840 1668 1762 -41840 1731 1912 -41840 1648 1696 -41840 1731 1790 -41840 1790 1916 -41840 1731 1916 -41840 1912 1916 -41840 1731 1863 -41840 1650 1668 -41860 1539 1495 -41860 1544 1525 -41860 1547 1716 -41860 1548 1516 -41860 1549 1599 -41860 1555 1533 -41860 1558 1468 -41860 1563 1457 -41860 1591 1858 -41860 1596 1629 -41860 1596 1495 -41860 1599 1523 -41860 1603 1486 -41860 1606 1516 -41860 1606 1431 -41860 1609 1471 -41860 1629 1517 -41860 1641 1514 -41860 1731 1524 -41860 1805 1524 -41860 1805 1912 -41860 1853 1434 -41860 1904 1513 -41860 1496 1505 -41860 1498 1526 -41860 1546 1825 -41860 1549 1583 -41860 1585 1752 -41860 1749 1757 -41860 1752 1766 -41860 1774 1888 -41860 1790 1863 -41860 1805 1888 -41860 1863 1532 -41860 1888 1912 -41860 1507 1522 -41860 1559 1604 -41860 1574 1604 -41860 1587 1535 -41860 1688 1457 -41860 1828 1532 -41860 1863 1916 -41860 1888 1532 -41860 1559 1574 -41860 1617 1464 -41860 1790 1888 -41860 1790 1805 -41860 1805 1828 -41860 1840 1489 -41860 1863 1912 -41860 1888 1916 -41860 1731 1888 -41860 1731 1805 -41860 1805 1863 -41860 1805 1532 -41860 1805 1916 -41860 1500 1511 -41860 1731 1828 -41860 1767 1779 -41860 1828 1916 -41860 1863 1888 -41860 1541 1555 -41860 1731 1532 -41860 1790 1828 -41860 1467 1504 -41860 1790 1532 -41860 1912 1532 -41860 1916 1532 -41860 1592 1742 -41860 1700 1528 -41860 1790 1912 -41860 1828 1912 -41860 1650 1762 -41860 1668 1762 -41860 1731 1912 -41860 1648 1696 -41860 1731 1790 -41860 1790 1916 -41860 1731 1916 -41860 1912 1916 -41860 1731 1863 -41860 1650 1668 -41880 1541 1533 -41880 1544 1523 -41880 1546 1825 -41880 1549 1583 -41880 1558 1516 -41880 1569 1696 -41880 1581 1505 -41880 1585 1752 -41880 1596 1858 -41880 1596 1700 -41880 1609 1628 -41880 1676 1853 -41880 1676 1469 -41880 1696 1525 -41880 1749 1465 -41880 1749 1757 -41880 1749 1470 -41880 1752 1766 -41880 1757 1470 -41880 1774 1888 -41880 1790 1863 -41880 1805 1888 -41880 1825 1529 -41880 1828 1863 -41880 1863 1532 -41880 1888 1912 -41880 1507 1522 -41880 1559 1604 -41880 1574 1604 -41880 1587 1535 -41880 1593 1521 -41880 1599 1756 -41880 1688 1457 -41880 1828 1532 -41880 1863 1916 -41880 1888 1532 -41880 1559 1574 -41880 1617 1464 -41880 1790 1888 -41880 1790 1805 -41880 1805 1828 -41880 1840 1489 -41880 1863 1912 -41880 1888 1916 -41880 1538 1888 -41880 1538 1805 -41880 1731 1888 -41880 1731 1805 -41880 1805 1863 -41880 1805 1532 -41880 1805 1916 -41880 1871 1517 -41880 1500 1511 -41880 1603 1449 -41880 1731 1828 -41880 1767 1779 -41880 1828 1916 -41880 1863 1888 -41880 1512 1531 -41880 1541 1555 -41880 1731 1532 -41880 1790 1828 -41880 1467 1504 -41880 1790 1532 -41880 1912 1532 -41880 1916 1532 -41880 1592 1742 -41880 1700 1528 -41880 1790 1912 -41880 1828 1912 -41880 1900 1920 -41880 1650 1762 -41880 1668 1762 -41880 1731 1912 -41880 1648 1696 -41880 1731 1790 -41880 1790 1916 -41880 1731 1916 -41880 1912 1916 -41880 1731 1863 -41880 1650 1668 -41900 1538 1916 -41900 1539 1596 -41900 1547 1629 -41900 1549 1553 -41900 1559 1604 -41900 1560 1789 -41900 1569 1602 -41900 1574 1604 -41900 1587 1535 -41900 1593 1521 -41900 1599 1756 -41900 1599 1645 -41900 1602 1469 -41900 1603 1512 -41900 1606 1516 -41900 1640 1525 -41900 1655 1707 -41900 1688 1457 -41900 1688 1434 -41900 1767 1489 -41900 1828 1532 -41900 1863 1916 -41900 1888 1532 -41900 1431 1519 -41900 1441 1464 -41900 1538 1524 -41900 1558 1468 -41900 1559 1574 -41900 1617 1464 -41900 1617 1441 -41900 1790 1888 -41900 1790 1805 -41900 1805 1828 -41900 1805 1912 -41900 1840 1489 -41900 1863 1912 -41900 1888 1524 -41900 1888 1916 -41900 1538 1888 -41900 1538 1805 -41900 1606 1431 -41900 1731 1888 -41900 1731 1805 -41900 1805 1863 -41900 1805 1532 -41900 1805 1916 -41900 1871 1517 -41900 1500 1511 -41900 1546 1519 -41900 1546 1431 -41900 1603 1449 -41900 1731 1828 -41900 1767 1779 -41900 1828 1916 -41900 1863 1888 -41900 1466 1486 -41900 1512 1531 -41900 1541 1555 -41900 1731 1532 -41900 1790 1828 -41900 1467 1504 -41900 1790 1532 -41900 1912 1532 -41900 1916 1532 -41900 1592 1742 -41900 1700 1528 -41900 1790 1912 -41900 1828 1912 -41900 1900 1920 -41900 1650 1762 -41900 1668 1762 -41900 1731 1912 -41900 1648 1696 -41900 1731 1790 -41900 1790 1916 -41900 1731 1916 -41900 1912 1916 -41900 1731 1863 -41900 1650 1668 -41920 1538 1731 -41920 1538 1524 -41920 1545 1430 -41920 1548 1904 -41920 1549 1525 -41920 1549 1599 -41920 1554 1752 -41920 1554 1766 -41920 1556 1771 -41920 1558 1468 -41920 1559 1574 -41920 1569 1688 -41920 1579 1676 -41920 1596 1716 -41920 1617 1464 -41920 1617 1441 -41920 1648 1529 -41920 1655 1764 -41920 1790 1888 -41920 1790 1805 -41920 1805 1828 -41920 1805 1912 -41920 1825 1525 -41920 1840 1489 -41920 1863 1912 -41920 1888 1524 -41920 1888 1912 -41920 1888 1916 -41920 1538 1888 -41920 1538 1805 -41920 1554 1448 -41920 1606 1825 -41920 1606 1431 -41920 1731 1888 -41920 1731 1805 -41920 1805 1888 -41920 1805 1863 -41920 1805 1532 -41920 1805 1916 -41920 1825 1431 -41920 1871 1517 -41920 1496 1505 -41920 1500 1511 -41920 1541 1533 -41920 1546 1825 -41920 1546 1519 -41920 1546 1431 -41920 1599 1525 -41920 1603 1449 -41920 1731 1828 -41920 1767 1779 -41920 1828 1916 -41920 1863 1888 -41920 1548 1468 -41920 1466 1486 -41920 1512 1531 -41920 1541 1555 -41920 1604 1616 -41920 1731 1532 -41920 1752 1766 -41920 1790 1828 -41920 1467 1504 -41920 1790 1532 -41920 1912 1532 -41920 1916 1532 -41920 1592 1742 -41920 1700 1528 -41920 1707 1764 -41920 1790 1912 -41920 1828 1912 -41920 1900 1920 -41920 1650 1762 -41920 1668 1762 -41920 1731 1912 -41920 1648 1696 -41920 1731 1790 -41920 1790 1916 -41920 1790 1863 -41920 1731 1916 -41920 1912 1916 -41920 1731 1863 -41920 1650 1668 -41940 1538 1888 -41940 1538 1916 -41940 1538 1805 -41940 1554 1448 -41940 1582 1496 -41940 1585 1752 -41940 1593 1521 -41940 1599 1600 -41940 1603 1441 -41940 1606 1825 -41940 1606 1516 -41940 1606 1431 -41940 1627 1641 -41940 1644 1525 -41940 1688 1457 -41940 1731 1888 -41940 1731 1805 -41940 1749 1757 -41940 1805 1888 -41940 1805 1863 -41940 1805 1532 -41940 1805 1916 -41940 1825 1519 -41940 1825 1431 -41940 1834 1525 -41940 1853 1919 -41940 1871 1517 -41940 1433 1487 -41940 1441 1514 -41940 1496 1505 -41940 1498 1526 -41940 1500 1511 -41940 1541 1533 -41940 1544 1644 -41940 1546 1825 -41940 1546 1519 -41940 1546 1431 -41940 1549 1600 -41940 1568 1587 -41940 1599 1525 -41940 1603 1449 -41940 1731 1828 -41940 1767 1779 -41940 1828 1532 -41940 1853 1510 -41940 1507 1522 -41940 1644 1834 -41940 1828 1916 -41940 1863 1888 -41940 1548 1468 -41940 1767 1489 -41940 1466 1486 -41940 1512 1531 -41940 1541 1555 -41940 1604 1616 -41940 1731 1532 -41940 1752 1766 -41940 1790 1828 -41940 1467 1504 -41940 1790 1532 -41940 1912 1532 -41940 1916 1532 -41940 1592 1742 -41940 1700 1528 -41940 1707 1764 -41940 1790 1912 -41940 1828 1912 -41940 1599 1834 -41940 1599 1644 -41940 1599 1648 -41940 1676 1470 -41940 1900 1920 -41940 1650 1762 -41940 1668 1762 -41940 1731 1912 -41940 1648 1696 -41940 1731 1790 -41940 1790 1916 -41940 1790 1863 -41940 1731 1916 -41940 1912 1916 -41940 1731 1863 -41940 1650 1668 -41960 1539 1545 -41960 1541 1533 -41960 1544 1644 -41960 1544 1525 -41960 1544 1599 -41960 1546 1825 -41960 1546 1519 -41960 1546 1431 -41960 1549 1600 -41960 1549 1523 -41960 1568 1587 -41960 1599 1696 -41960 1599 1525 -41960 1600 1756 -41960 1600 1645 -41960 1603 1449 -41960 1609 1871 -41960 1644 1696 -41960 1644 1772 -41960 1696 1834 -41960 1731 1828 -41960 1756 1525 -41960 1767 1779 -41960 1805 1828 -41960 1828 1532 -41960 1839 1915 -41960 1853 1510 -41960 1919 1510 -41960 1507 1522 -41960 1538 1828 -41960 1548 1558 -41960 1603 1512 -41960 1603 1531 -41960 1617 1514 -41960 1644 1834 -41960 1828 1916 -41960 1863 1888 -41960 1548 1468 -41960 1558 1468 -41960 1767 1489 -41960 1466 1486 -41960 1512 1531 -41960 1541 1555 -41960 1604 1616 -41960 1731 1532 -41960 1752 1766 -41960 1790 1828 -41960 1467 1504 -41960 1790 1532 -41960 1840 1489 -41960 1912 1532 -41960 1916 1532 -41960 1548 1516 -41960 1592 1742 -41960 1700 1528 -41960 1707 1764 -41960 1790 1912 -41960 1828 1912 -41960 1558 1516 -41960 1599 1834 -41960 1599 1644 -41960 1599 1648 -41960 1676 1470 -41960 1900 1920 -41960 1549 1525 -41960 1650 1762 -41960 1668 1762 -41960 1731 1912 -41960 1648 1696 -41960 1731 1790 -41960 1790 1916 -41960 1790 1863 -41960 1731 1916 -41960 1863 1916 -41960 1912 1916 -41960 1731 1863 -41960 1650 1668 -41980 1538 1916 -41980 1538 1828 -41980 1548 1558 -41980 1552 1469 -41980 1555 1533 -41980 1559 1596 -41980 1574 1581 -41980 1602 1603 -41980 1603 1512 -41980 1603 1531 -41980 1609 1619 -41980 1617 1514 -41980 1641 1441 -41980 1644 1648 -41980 1644 1834 -41980 1648 1834 -41980 1659 1842 -41980 1688 1466 -41980 1698 1707 -41980 1700 1511 -41980 1707 1772 -41980 1731 1888 -41980 1805 1863 -41980 1828 1888 -41980 1828 1863 -41980 1828 1916 -41980 1863 1888 -41980 1496 1505 -41980 1548 1468 -41980 1558 1468 -41980 1606 1431 -41980 1655 1707 -41980 1706 1522 -41980 1767 1489 -41980 1779 1489 -41980 1466 1486 -41980 1512 1531 -41980 1541 1555 -41980 1604 1616 -41980 1731 1532 -41980 1752 1766 -41980 1790 1828 -41980 1467 1504 -41980 1617 1441 -41980 1790 1532 -41980 1840 1489 -41980 1912 1532 -41980 1916 1532 -41980 1548 1516 -41980 1592 1742 -41980 1700 1528 -41980 1707 1764 -41980 1790 1912 -41980 1828 1912 -41980 1558 1516 -41980 1599 1834 -41980 1599 1644 -41980 1599 1648 -41980 1676 1470 -41980 1900 1920 -41980 1549 1525 -41980 1650 1762 -41980 1668 1762 -41980 1731 1912 -41980 1441 1514 -41980 1648 1696 -41980 1731 1790 -41980 1790 1916 -41980 1790 1863 -41980 1731 1916 -41980 1863 1912 -41980 1863 1916 -41980 1912 1916 -41980 1731 1863 -41980 1650 1668 -42000 1547 1752 -42000 1548 1468 -42000 1554 1853 -42000 1558 1468 -42000 1558 1606 -42000 1559 1743 -42000 1596 1678 -42000 1600 1756 -42000 1606 1431 -42000 1609 1503 -42000 1641 1773 -42000 1655 1707 -42000 1688 1457 -42000 1700 1858 -42000 1706 1522 -42000 1706 1507 -42000 1767 1840 -42000 1767 1489 -42000 1767 1779 -42000 1779 1489 -42000 1828 1524 -42000 1828 1532 -42000 1431 1468 -42000 1466 1486 -42000 1498 1526 -42000 1512 1531 -42000 1541 1555 -42000 1604 1616 -42000 1698 1764 -42000 1716 1743 -42000 1731 1532 -42000 1752 1766 -42000 1762 1463 -42000 1790 1828 -42000 1863 1532 -42000 1467 1504 -42000 1617 1441 -42000 1790 1532 -42000 1840 1489 -42000 1912 1532 -42000 1916 1532 -42000 1548 1516 -42000 1592 1742 -42000 1700 1528 -42000 1707 1764 -42000 1790 1912 -42000 1828 1912 -42000 1546 1825 -42000 1558 1516 -42000 1599 1834 -42000 1599 1644 -42000 1599 1648 -42000 1628 1463 -42000 1676 1470 -42000 1900 1920 -42000 1549 1525 -42000 1650 1762 -42000 1668 1762 -42000 1731 1912 -42000 1441 1514 -42000 1648 1696 -42000 1731 1790 -42000 1547 1743 -42000 1790 1916 -42000 1790 1863 -42000 1731 1916 -42000 1863 1912 -42000 1863 1916 -42000 1912 1916 -42000 1731 1863 -42000 1650 1668 -42020 1538 1828 -42020 1541 1555 -42020 1544 1698 -42020 1545 1430 -42020 1559 1871 -42020 1560 1466 -42020 1602 1512 -42020 1602 1688 -42020 1603 1512 -42020 1603 1511 -42020 1604 1616 -42020 1641 1441 -42020 1644 1834 -42020 1655 1764 -42020 1668 1463 -42020 1688 1528 -42020 1688 1700 -42020 1688 1500 -42020 1698 1764 -42020 1716 1743 -42020 1724 1903 -42020 1731 1532 -42020 1752 1766 -42020 1762 1463 -42020 1783 1443 -42020 1783 1527 -42020 1790 1828 -42020 1863 1532 -42020 1467 1504 -42020 1511 1531 -42020 1538 1524 -42020 1602 1437 -42020 1617 1441 -42020 1700 1457 -42020 1790 1532 -42020 1840 1489 -42020 1912 1532 -42020 1916 1532 -42020 1443 1527 -42020 1457 1528 -42020 1507 1522 -42020 1547 1716 -42020 1548 1516 -42020 1592 1742 -42020 1700 1528 -42020 1707 1764 -42020 1790 1912 -42020 1828 1912 -42020 1451 1458 -42020 1546 1825 -42020 1558 1516 -42020 1579 1501 -42020 1599 1834 -42020 1599 1644 -42020 1599 1648 -42020 1628 1463 -42020 1676 1470 -42020 1900 1920 -42020 1549 1525 -42020 1650 1762 -42020 1668 1762 -42020 1828 1916 -42020 1731 1912 -42020 1698 1707 -42020 1441 1514 -42020 1648 1696 -42020 1731 1790 -42020 1547 1743 -42020 1790 1916 -42020 1790 1863 -42020 1731 1916 -42020 1863 1912 -42020 1863 1916 -42020 1912 1916 -42020 1731 1863 -42020 1650 1668 -42040 1538 1524 -42040 1538 1916 -42040 1544 1676 -42040 1548 1431 -42040 1554 1853 -42040 1554 1590 -42040 1560 1531 -42040 1593 1521 -42040 1599 1529 -42040 1602 1603 -42040 1602 1437 -42040 1617 1441 -42040 1641 1858 -42040 1688 1531 -42040 1700 1457 -42040 1707 1752 -42040 1767 1779 -42040 1790 1532 -42040 1834 1529 -42040 1840 1489 -42040 1847 1879 -42040 1857 1500 -42040 1912 1532 -42040 1916 1532 -42040 1443 1527 -42040 1457 1528 -42040 1466 1500 -42040 1507 1522 -42040 1522 1531 -42040 1547 1716 -42040 1548 1516 -42040 1592 1742 -42040 1596 1609 -42040 1600 1645 -42040 1700 1528 -42040 1707 1764 -42040 1790 1912 -42040 1828 1912 -42040 1919 1510 -42040 1451 1458 -42040 1546 1825 -42040 1558 1516 -42040 1579 1501 -42040 1599 1834 -42040 1599 1644 -42040 1599 1648 -42040 1628 1463 -42040 1676 1470 -42040 1688 1507 -42040 1828 1524 -42040 1900 1920 -42040 1549 1525 -42040 1650 1762 -42040 1668 1762 -42040 1828 1916 -42040 1578 1920 -42040 1603 1688 -42040 1731 1912 -42040 1698 1707 -42040 1767 1489 -42040 1441 1514 -42040 1648 1696 -42040 1731 1790 -42040 1547 1743 -42040 1790 1916 -42040 1790 1863 -42040 1871 1517 -42040 1731 1916 -42040 1863 1912 -42040 1863 1916 -42040 1912 1916 -42040 1731 1863 -42040 1650 1668 -42060 1545 1430 -42060 1547 1716 -42060 1548 1516 -42060 1549 1523 -42060 1573 1452 -42060 1580 1531 -42060 1581 1441 -42060 1592 1742 -42060 1596 1609 -42060 1600 1756 -42060 1600 1645 -42060 1603 1457 -42060 1700 1528 -42060 1707 1770 -42060 1707 1764 -42060 1716 1743 -42060 1752 1920 -42060 1790 1912 -42060 1790 1828 -42060 1828 1912 -42060 1874 1496 -42060 1919 1510 -42060 1448 1465 -42060 1451 1458 -42060 1468 1516 -42060 1546 1825 -42060 1558 1516 -42060 1569 1592 -42060 1579 1501 -42060 1599 1834 -42060 1599 1644 -42060 1599 1648 -42060 1628 1463 -42060 1676 1470 -42060 1688 1512 -42060 1688 1507 -42060 1783 1527 -42060 1828 1524 -42060 1900 1920 -42060 1523 1525 -42060 1538 1532 -42060 1549 1525 -42060 1558 1468 -42060 1650 1762 -42060 1668 1762 -42060 1828 1916 -42060 1512 1531 -42060 1578 1920 -42060 1603 1688 -42060 1603 1522 -42060 1644 1834 -42060 1688 1522 -42060 1731 1912 -42060 1752 1766 -42060 1652 1747 -42060 1698 1707 -42060 1767 1489 -42060 1441 1514 -42060 1648 1696 -42060 1604 1616 -42060 1731 1790 -42060 1547 1743 -42060 1790 1916 -42060 1790 1863 -42060 1871 1517 -42060 1731 1916 -42060 1863 1912 -42060 1863 1916 -42060 1912 1916 -42060 1731 1863 -42060 1650 1668 -42080 1541 1555 -42080 1546 1825 -42080 1552 1872 -42080 1558 1516 -42080 1559 1617 -42080 1559 1581 -42080 1559 1441 -42080 1569 1592 -42080 1573 1771 -42080 1578 1900 -42080 1579 1501 -42080 1596 1771 -42080 1598 1622 -42080 1599 1696 -42080 1599 1834 -42080 1599 1644 -42080 1599 1648 -42080 1599 1529 -42080 1622 1752 -42080 1628 1465 -42080 1628 1463 -42080 1644 1523 -42080 1676 1470 -42080 1688 1512 -42080 1688 1507 -42080 1731 1828 -42080 1767 1840 -42080 1767 1779 -42080 1783 1527 -42080 1828 1524 -42080 1840 1489 -42080 1900 1920 -42080 1919 1468 -42080 1449 1531 -42080 1465 1510 -42080 1467 1504 -42080 1498 1526 -42080 1507 1522 -42080 1523 1525 -42080 1538 1532 -42080 1549 1525 -42080 1558 1468 -42080 1603 1531 -42080 1650 1762 -42080 1668 1762 -42080 1779 1489 -42080 1828 1916 -42080 1512 1531 -42080 1578 1920 -42080 1603 1688 -42080 1603 1522 -42080 1644 1834 -42080 1688 1522 -42080 1731 1912 -42080 1752 1766 -42080 1496 1505 -42080 1652 1747 -42080 1698 1707 -42080 1767 1489 -42080 1558 1919 -42080 1441 1514 -42080 1587 1535 -42080 1599 1523 -42080 1648 1696 -42080 1604 1616 -42080 1731 1790 -42080 1547 1743 -42080 1790 1916 -42080 1790 1863 -42080 1871 1517 -42080 1731 1916 -42080 1863 1912 -42080 1863 1916 -42080 1912 1916 -42080 1731 1863 -42080 1650 1668 -42100 1538 1532 -42100 1541 1434 -42100 1549 1525 -42100 1558 1468 -42100 1560 1457 -42100 1560 1437 -42100 1563 1459 -42100 1581 1772 -42100 1599 1525 -42100 1603 1531 -42100 1631 1652 -42100 1650 1762 -42100 1668 1762 -42100 1676 1448 -42100 1700 1467 -42100 1752 1771 -42100 1762 1463 -42100 1779 1489 -42100 1790 1828 -42100 1828 1916 -42100 1874 1459 -42100 1512 1522 -42100 1512 1531 -42100 1578 1920 -42100 1579 1510 -42100 1580 1531 -42100 1603 1688 -42100 1603 1522 -42100 1644 1834 -42100 1688 1522 -42100 1716 1743 -42100 1731 1912 -42100 1752 1766 -42100 1496 1505 -42100 1652 1747 -42100 1698 1707 -42100 1700 1504 -42100 1790 1912 -42100 1767 1489 -42100 1558 1919 -42100 1603 1507 -42100 1441 1514 -42100 1676 1465 -42100 1579 1448 -42100 1587 1535 -42100 1599 1523 -42100 1648 1696 -42100 1604 1616 -42100 1731 1790 -42100 1547 1743 -42100 1790 1916 -42100 1790 1863 -42100 1871 1517 -42100 1731 1916 -42100 1863 1912 -42100 1863 1916 -42100 1912 1916 -42100 1731 1863 -42100 1650 1668 -42120 1541 1533 -42120 1546 1558 -42120 1559 1512 -42120 1578 1920 -42120 1579 1510 -42120 1580 1531 -42120 1581 1448 -42120 1581 1762 -42120 1581 1468 -42120 1591 1858 -42120 1599 1712 -42120 1603 1688 -42120 1603 1457 -42120 1603 1522 -42120 1617 1688 -42120 1630 1742 -42120 1644 1834 -42120 1688 1457 -42120 1688 1522 -42120 1688 1531 -42120 1716 1743 -42120 1731 1912 -42120 1752 1766 -42120 1761 1920 -42120 1771 1501 -42120 1783 1527 -42120 1457 1522 -42120 1457 1531 -42120 1496 1505 -42120 1507 1522 -42120 1580 1688 -42120 1652 1747 -42120 1698 1707 -42120 1700 1504 -42120 1790 1912 -42120 1698 1764 -42120 1559 1580 -42120 1581 1628 -42120 1767 1489 -42120 1828 1524 -42120 1558 1919 -42120 1603 1507 -42120 1441 1514 -42120 1676 1465 -42120 1579 1448 -42120 1587 1535 -42120 1599 1523 -42120 1648 1696 -42120 1604 1616 -42120 1731 1790 -42120 1547 1743 -42120 1790 1916 -42120 1790 1863 -42120 1871 1517 -42120 1731 1916 -42120 1863 1912 -42120 1863 1916 -42120 1912 1916 -42120 1731 1863 -42120 1650 1668 -42140 1546 1519 -42140 1572 1517 -42140 1572 1871 -42140 1579 1676 -42140 1580 1688 -42140 1600 1756 -42140 1602 1631 -42140 1617 1441 -42140 1622 1904 -42140 1628 1463 -42140 1652 1747 -42140 1688 1498 -42140 1696 1525 -42140 1698 1707 -42140 1700 1504 -42140 1707 1764 -42140 1790 1912 -42140 1581 1463 -42140 1617 1857 -42140 1698 1764 -42140 1767 1840 -42140 1519 1525 -42140 1559 1580 -42140 1581 1628 -42140 1628 1762 -42140 1712 1739 -42140 1756 1525 -42140 1767 1489 -42140 1828 1524 -42140 1544 1644 -42140 1558 1919 -42140 1603 1507 -42140 1441 1514 -42140 1572 1622 -42140 1676 1465 -42140 1579 1448 -42140 1587 1535 -42140 1599 1523 -42140 1622 1517 -42140 1622 1871 -42140 1648 1696 -42140 1661 1739 -42140 1599 1657 -42140 1604 1616 -42140 1661 1712 -42140 1731 1790 -42140 1547 1743 -42140 1790 1916 -42140 1790 1863 -42140 1500 1511 -42140 1871 1517 -42140 1731 1916 -42140 1554 1470 -42140 1863 1912 -42140 1863 1916 -42140 1912 1916 -42140 1731 1863 -42140 1650 1668 -42160 1538 1828 -42160 1559 1531 -42160 1580 1747 -42160 1581 1463 -42160 1591 1858 -42160 1599 1825 -42160 1600 1645 -42160 1603 1449 -42160 1617 1857 -42160 1657 1523 -42160 1698 1764 -42160 1706 1426 -42160 1716 1743 -42160 1767 1840 -42160 1791 1505 -42160 1519 1525 -42160 1559 1580 -42160 1578 1920 -42160 1581 1762 -42160 1581 1628 -42160 1628 1762 -42160 1712 1739 -42160 1731 1828 -42160 1752 1766 -42160 1756 1525 -42160 1767 1489 -42160 1828 1524 -42160 1544 1644 -42160 1558 1919 -42160 1603 1507 -42160 1441 1514 -42160 1572 1622 -42160 1599 1710 -42160 1676 1465 -42160 1579 1448 -42160 1587 1535 -42160 1599 1523 -42160 1622 1517 -42160 1622 1871 -42160 1648 1696 -42160 1661 1739 -42160 1538 1524 -42160 1599 1657 -42160 1604 1616 -42160 1661 1712 -42160 1541 1555 -42160 1731 1790 -42160 1547 1743 -42160 1790 1916 -42160 1790 1863 -42160 1500 1511 -42160 1871 1517 -42160 1731 1916 -42160 1554 1470 -42160 1863 1912 -42160 1863 1916 -42160 1912 1916 -42160 1731 1863 -42160 1650 1668 -42180 1546 1448 -42180 1559 1580 -42180 1560 1619 -42180 1563 1592 -42180 1578 1920 -42180 1580 1779 -42180 1581 1762 -42180 1581 1628 -42180 1628 1762 -42180 1631 1771 -42180 1676 1688 -42180 1676 1448 -42180 1707 1764 -42180 1712 1739 -42180 1731 1828 -42180 1752 1766 -42180 1756 1525 -42180 1767 1489 -42180 1771 1466 -42180 1790 1912 -42180 1790 1828 -42180 1828 1912 -42180 1828 1524 -42180 1828 1916 -42180 1863 1524 -42180 1544 1644 -42180 1558 1919 -42180 1603 1522 -42180 1603 1507 -42180 1698 1707 -42180 1783 1527 -42180 1441 1514 -42180 1489 1500 -42180 1572 1622 -42180 1599 1710 -42180 1600 1756 -42180 1617 1441 -42180 1644 1834 -42180 1676 1465 -42180 1688 1457 -42180 1496 1505 -42180 1579 1448 -42180 1587 1535 -42180 1599 1523 -42180 1622 1517 -42180 1622 1871 -42180 1648 1696 -42180 1661 1739 -42180 1538 1524 -42180 1599 1657 -42180 1604 1616 -42180 1661 1712 -42180 1541 1555 -42180 1731 1790 -42180 1547 1743 -42180 1560 1716 -42180 1790 1916 -42180 1790 1863 -42180 1500 1511 -42180 1652 1747 -42180 1871 1517 -42180 1731 1916 -42180 1554 1470 -42180 1731 1912 -42180 1863 1912 -42180 1863 1916 -42180 1912 1916 -42180 1731 1863 -42180 1650 1668 -42200 1541 1533 -42200 1544 1644 -42200 1546 1688 -42200 1558 1919 -42200 1559 1602 -42200 1578 1604 -42200 1596 1532 -42200 1599 1496 -42200 1602 1631 -42200 1602 1652 -42200 1603 1522 -42200 1603 1507 -42200 1617 1779 -42200 1622 1839 -42200 1648 1529 -42200 1652 1441 -42200 1655 1525 -42200 1688 1468 -42200 1698 1707 -42200 1762 1463 -42200 1773 1531 -42200 1783 1527 -42200 1441 1514 -42200 1489 1500 -42200 1572 1622 -42200 1591 1858 -42200 1599 1710 -42200 1600 1756 -42200 1617 1441 -42200 1644 1834 -42200 1676 1465 -42200 1688 1457 -42200 1496 1505 -42200 1579 1448 -42200 1587 1535 -42200 1599 1523 -42200 1622 1517 -42200 1622 1871 -42200 1648 1696 -42200 1661 1739 -42200 1538 1524 -42200 1599 1657 -42200 1604 1616 -42200 1661 1712 -42200 1541 1555 -42200 1731 1790 -42200 1547 1743 -42200 1549 1525 -42200 1560 1716 -42200 1790 1916 -42200 1790 1863 -42200 1500 1511 -42200 1652 1747 -42200 1871 1517 -42200 1731 1916 -42200 1554 1470 -42200 1507 1522 -42200 1731 1912 -42200 1863 1912 -42200 1863 1916 -42200 1912 1916 -42200 1731 1863 -42200 1650 1668 -42220 1538 1828 -42220 1541 1501 -42220 1546 1448 -42220 1572 1622 -42220 1581 1644 -42220 1586 1639 -42220 1591 1858 -42220 1599 1710 -42220 1599 1505 -42220 1600 1756 -42220 1603 1512 -42220 1603 1449 -42220 1617 1441 -42220 1644 1834 -42220 1676 1465 -42220 1688 1457 -42220 1696 1529 -42220 1771 1532 -42220 1789 1497 -42220 1825 1525 -42220 1496 1505 -42220 1579 1448 -42220 1587 1535 -42220 1599 1523 -42220 1622 1517 -42220 1622 1871 -42220 1648 1696 -42220 1648 1681 -42220 1657 1681 -42220 1661 1739 -42220 1712 1739 -42220 1756 1525 -42220 1767 1489 -42220 1825 1519 -42220 1538 1524 -42220 1599 1657 -42220 1603 1531 -42220 1604 1616 -42220 1661 1712 -42220 1828 1524 -42220 1541 1555 -42220 1593 1521 -42220 1599 1681 -42220 1668 1463 -42220 1731 1790 -42220 1547 1743 -42220 1549 1525 -42220 1560 1716 -42220 1790 1912 -42220 1790 1916 -42220 1790 1863 -42220 1500 1511 -42220 1652 1747 -42220 1871 1517 -42220 1731 1916 -42220 1554 1470 -42220 1512 1531 -42220 1507 1522 -42220 1731 1912 -42220 1863 1912 -42220 1863 1916 -42220 1912 1916 -42220 1731 1863 -42220 1650 1668 -42240 1537 1740 -42240 1572 1771 -42240 1572 1517 -42240 1578 1920 -42240 1579 1448 -42240 1587 1535 -42240 1599 1523 -42240 1602 1517 -42240 1622 1771 -42240 1622 1517 -42240 1622 1871 -42240 1648 1696 -42240 1648 1681 -42240 1657 1681 -42240 1661 1739 -42240 1698 1707 -42240 1698 1495 -42240 1712 1739 -42240 1756 1525 -42240 1767 1489 -42240 1771 1517 -42240 1825 1519 -42240 1434 1457 -42240 1449 1512 -42240 1538 1524 -42240 1599 1657 -42240 1603 1531 -42240 1604 1616 -42240 1648 1529 -42240 1661 1712 -42240 1668 1762 -42240 1707 1764 -42240 1752 1847 -42240 1828 1524 -42240 1448 1465 -42240 1541 1555 -42240 1593 1521 -42240 1599 1681 -42240 1668 1463 -42240 1698 1764 -42240 1731 1790 -42240 1790 1828 -42240 1828 1912 -42240 1547 1743 -42240 1549 1525 -42240 1558 1919 -42240 1559 1580 -42240 1560 1716 -42240 1762 1463 -42240 1790 1912 -42240 1790 1916 -42240 1790 1863 -42240 1546 1743 -42240 1449 1531 -42240 1500 1511 -42240 1652 1747 -42240 1871 1517 -42240 1731 1916 -42240 1783 1527 -42240 1554 1470 -42240 1512 1531 -42240 1507 1522 -42240 1731 1912 -42240 1863 1912 -42240 1863 1916 -42240 1912 1916 -42240 1731 1863 -42240 1650 1668 -42260 1538 1828 -42260 1538 1524 -42260 1549 1712 -42260 1572 1585 -42260 1599 1657 -42260 1599 1710 -42260 1603 1531 -42260 1604 1616 -42260 1645 1756 -42260 1648 1529 -42260 1661 1712 -42260 1668 1762 -42260 1707 1764 -42260 1752 1847 -42260 1770 1434 -42260 1770 1771 -42260 1828 1524 -42260 1840 1489 -42260 1842 1467 -42260 1441 1514 -42260 1448 1465 -42260 1541 1555 -42260 1546 1547 -42260 1591 1467 -42260 1593 1521 -42260 1599 1681 -42260 1602 1688 -42260 1668 1463 -42260 1681 1523 -42260 1698 1764 -42260 1731 1828 -42260 1731 1790 -42260 1790 1828 -42260 1828 1912 -42260 1858 1467 -42260 1547 1743 -42260 1549 1525 -42260 1558 1919 -42260 1559 1580 -42260 1560 1716 -42260 1688 1457 -42260 1688 1496 -42260 1762 1463 -42260 1790 1912 -42260 1790 1916 -42260 1790 1863 -42260 1842 1858 -42260 1546 1743 -42260 1449 1531 -42260 1500 1511 -42260 1652 1747 -42260 1871 1517 -42260 1731 1916 -42260 1783 1527 -42260 1554 1470 -42260 1512 1531 -42260 1507 1522 -42260 1731 1912 -42260 1863 1912 -42260 1863 1916 -42260 1912 1916 -42260 1731 1863 -42260 1650 1668 -42280 1541 1555 -42280 1541 1533 -42280 1546 1547 -42280 1569 1459 -42280 1579 1448 -42280 1591 1467 -42280 1593 1521 -42280 1599 1681 -42280 1602 1688 -42280 1602 1496 -42280 1622 1770 -42280 1631 1648 -42280 1648 1696 -42280 1668 1463 -42280 1681 1523 -42280 1696 1811 -42280 1698 1764 -42280 1706 1426 -42280 1731 1828 -42280 1731 1790 -42280 1790 1828 -42280 1828 1912 -42280 1828 1916 -42280 1839 1517 -42280 1839 1871 -42280 1858 1467 -42280 1496 1505 -42280 1547 1743 -42280 1549 1525 -42280 1558 1919 -42280 1559 1580 -42280 1560 1716 -42280 1655 1811 -42280 1688 1457 -42280 1688 1496 -42280 1762 1463 -42280 1790 1912 -42280 1790 1916 -42280 1790 1863 -42280 1842 1858 -42280 1463 1526 -42280 1546 1743 -42280 1449 1531 -42280 1500 1511 -42280 1652 1747 -42280 1871 1517 -42280 1596 1503 -42280 1731 1916 -42280 1783 1527 -42280 1554 1470 -42280 1599 1525 -42280 1512 1531 -42280 1591 1858 -42280 1507 1522 -42280 1731 1912 -42280 1863 1912 -42280 1863 1916 -42280 1912 1916 -42280 1731 1863 -42280 1650 1668 -42300 1547 1743 -42300 1549 1525 -42300 1553 1599 -42300 1558 1919 -42300 1559 1580 -42300 1560 1716 -42300 1580 1441 -42300 1590 1853 -42300 1599 1638 -42300 1602 1648 -42300 1604 1920 -42300 1628 1463 -42300 1631 1761 -42300 1648 1688 -42300 1652 1770 -42300 1655 1811 -42300 1688 1457 -42300 1688 1496 -42300 1706 1770 -42300 1740 1496 -42300 1762 1463 -42300 1773 1532 -42300 1790 1912 -42300 1790 1916 -42300 1790 1863 -42300 1842 1858 -42300 1900 1920 -42300 1448 1465 -42300 1449 1512 -42300 1463 1526 -42300 1546 1743 -42300 1604 1616 -42300 1628 1526 -42300 1638 1525 -42300 1752 1766 -42300 1767 1489 -42300 1449 1531 -42300 1538 1790 -42300 1441 1514 -42300 1500 1511 -42300 1538 1524 -42300 1652 1747 -42300 1871 1517 -42300 1596 1503 -42300 1731 1916 -42300 1783 1527 -42300 1554 1470 -42300 1599 1525 -42300 1602 1631 -42300 1512 1531 -42300 1591 1858 -42300 1507 1522 -42300 1731 1912 -42300 1863 1912 -42300 1863 1916 -42300 1912 1916 -42300 1731 1863 -42300 1650 1668 -42320 1546 1743 -42320 1549 1529 -42320 1549 1523 -42320 1558 1811 -42320 1559 1831 -42320 1579 1771 -42320 1581 1470 -42320 1596 1434 -42320 1598 1464 -42320 1599 1761 -42320 1599 1769 -42320 1599 1657 -42320 1604 1616 -42320 1628 1526 -42320 1638 1525 -42320 1648 1696 -42320 1676 1811 -42320 1752 1766 -42320 1752 1847 -42320 1761 1811 -42320 1767 1489 -42320 1769 1825 -42320 1811 1448 -42320 1449 1531 -42320 1523 1529 -42320 1538 1790 -42320 1572 1500 -42320 1593 1521 -42320 1599 1825 -42320 1603 1531 -42320 1661 1712 -42320 1546 1547 -42320 1441 1514 -42320 1500 1511 -42320 1538 1524 -42320 1549 1599 -42320 1652 1747 -42320 1676 1761 -42320 1871 1517 -42320 1591 1467 -42320 1596 1503 -42320 1731 1916 -42320 1783 1527 -42320 1858 1467 -42320 1554 1470 -42320 1599 1525 -42320 1602 1631 -42320 1617 1441 -42320 1512 1531 -42320 1591 1858 -42320 1507 1522 -42320 1731 1912 -42320 1863 1912 -42320 1863 1916 -42320 1912 1916 -42320 1731 1863 -42320 1650 1668 -42340 1538 1790 -42340 1546 1716 -42340 1547 1431 -42340 1558 1771 -42340 1572 1500 -42340 1578 1920 -42340 1583 1523 -42340 1593 1521 -42340 1599 1825 -42340 1599 1655 -42340 1603 1531 -42340 1628 1762 -42340 1644 1700 -42340 1655 1525 -42340 1661 1712 -42340 1681 1825 -42340 1761 1771 -42340 1269 1453 -42340 1831 1433 -42340 1831 1487 -42340 1467 1531 -42340 1523 1525 -42340 1546 1547 -42340 1580 1628 -42340 1580 1463 -42340 1858 1531 -42340 1441 1514 -42340 1496 1505 -42340 1500 1511 -42340 1538 1524 -42340 1549 1599 -42340 1652 1747 -42340 1676 1761 -42340 1871 1517 -42340 1591 1467 -42340 1596 1503 -42340 1731 1916 -42340 1783 1527 -42340 1858 1467 -42340 1554 1470 -42340 1599 1525 -42340 1602 1631 -42340 1617 1441 -42340 1512 1531 -42340 1591 1858 -42340 1507 1522 -42340 1731 1912 -42340 1863 1912 -42340 1863 1916 -42340 1912 1916 -42340 1731 1863 -42340 1650 1668 -42360 1537 1505 -42360 1546 1547 -42360 1578 1900 -42360 1580 1628 -42360 1580 1463 -42360 1586 1639 -42360 1602 1740 -42360 1628 1463 -42360 1655 1523 -42360 1657 1769 -42360 1858 1531 -42360 1441 1514 -42360 1496 1505 -42360 1500 1511 -42360 1538 1524 -42360 1549 1523 -42360 1549 1525 -42360 1549 1599 -42360 1558 1919 -42360 1585 1466 -42360 1652 1747 -42360 1676 1761 -42360 1700 1467 -42360 1449 1531 -42360 1825 1523 -42360 1871 1517 -42360 1579 1688 -42360 1631 1448 -42360 1591 1467 -42360 1596 1503 -42360 1602 1448 -42360 1731 1916 -42360 1783 1527 -42360 1840 1489 -42360 1858 1467 -42360 1554 1470 -42360 1599 1525 -42360 1602 1631 -42360 1617 1441 -42360 1604 1616 -42360 1512 1531 -42360 1591 1858 -42360 1507 1522 -42360 1731 1912 -42360 1863 1912 -42360 1863 1916 -42360 1716 1431 -42360 1912 1916 -42360 1731 1863 -42360 1650 1668 -42380 1538 1524 -42380 1538 1790 -42380 1544 1600 -42380 1549 1674 -42380 1549 1523 -42380 1549 1525 -42380 1549 1599 -42380 1554 1834 -42380 1558 1919 -42380 1559 1441 -42380 1563 1569 -42380 1577 1489 -42380 1578 1920 -42380 1583 1825 -42380 1585 1466 -42380 1600 1758 -42380 1603 1512 -42380 1628 1650 -42380 1628 1668 -42380 1638 1465 -42380 1652 1747 -42380 1676 1761 -42380 1700 1467 -42380 1742 1520 -42380 1756 1505 -42380 1834 1470 -42380 1449 1531 -42380 1558 1468 -42380 1583 1523 -42380 1825 1523 -42380 1871 1517 -42380 1544 1614 -42380 1579 1688 -42380 1631 1448 -42380 1591 1467 -42380 1596 1503 -42380 1602 1448 -42380 1731 1916 -42380 1783 1527 -42380 1840 1489 -42380 1858 1467 -42380 1554 1470 -42380 1599 1525 -42380 1602 1631 -42380 1674 1525 -42380 1617 1441 -42380 1604 1616 -42380 1599 1674 -42380 1512 1531 -42380 1591 1858 -42380 1507 1522 -42380 1731 1912 -42380 1771 1529 -42380 1863 1912 -42380 1863 1916 -42380 1716 1431 -42380 1912 1916 -42380 1731 1863 -42380 1650 1668 -42400 1546 1716 -42400 1549 1583 -42400 1550 1630 -42400 1558 1468 -42400 1583 1523 -42400 1657 1769 -42400 1661 1712 -42400 1688 1496 -42400 1761 1463 -42400 1789 1834 -42400 1825 1523 -42400 1871 1517 -42400 1541 1555 -42400 1544 1614 -42400 1579 1688 -42400 1593 1521 -42400 1631 1448 -42400 1591 1467 -42400 1596 1503 -42400 1602 1448 -42400 1645 1756 -42400 1731 1916 -42400 1761 1489 -42400 1783 1527 -42400 1840 1489 -42400 1858 1467 -42400 1554 1470 -42400 1599 1525 -42400 1602 1631 -42400 1674 1525 -42400 1617 1441 -42400 1604 1616 -42400 1599 1674 -42400 1512 1531 -42400 1731 1790 -42400 1790 1912 -42400 1790 1916 -42400 1790 1863 -42400 1591 1858 -42400 1507 1522 -42400 1731 1912 -42400 1771 1529 -42400 1863 1912 -42400 1863 1916 -42400 1681 1771 -42400 1716 1431 -42400 1912 1916 -42400 1731 1863 -42400 1650 1668 -42420 1541 1555 -42420 1544 1614 -42420 1563 1581 -42420 1579 1688 -42420 1590 1688 -42420 1592 1747 -42420 1593 1521 -42420 1631 1448 -42420 1688 1505 -42420 1712 1458 -42420 1767 1770 -42420 1434 1496 -42420 1547 1431 -42420 1591 1467 -42420 1596 1503 -42420 1602 1448 -42420 1645 1756 -42420 1681 1529 -42420 1731 1916 -42420 1761 1489 -42420 1783 1527 -42420 1496 1505 -42420 1580 1761 -42420 1770 1489 -42420 1840 1489 -42420 1858 1467 -42420 1554 1470 -42420 1599 1525 -42420 1602 1631 -42420 1674 1525 -42420 1546 1547 -42420 1578 1920 -42420 1617 1441 -42420 1604 1616 -42420 1599 1674 -42420 1512 1531 -42420 1731 1790 -42420 1790 1912 -42420 1790 1916 -42420 1790 1863 -42420 1591 1858 -42420 1507 1522 -42420 1731 1912 -42420 1771 1529 -42420 1863 1912 -42420 1863 1916 -42420 1269 1453 -42420 1681 1771 -42420 1716 1431 -42420 1912 1916 -42420 1731 1863 -42420 1650 1668 -42440 1547 1431 -42440 1558 1919 -42440 1559 1457 -42440 1559 1434 -42440 1577 1489 -42440 1591 1467 -42440 1596 1503 -42440 1602 1448 -42440 1644 1700 -42440 1645 1756 -42440 1661 1712 -42440 1667 1735 -42440 1681 1529 -42440 1700 1504 -42440 1716 1505 -42440 1731 1916 -42440 1761 1840 -42440 1761 1489 -42440 1783 1527 -42440 1791 1501 -42440 1496 1505 -42440 1500 1511 -42440 1550 1630 -42440 1580 1761 -42440 1770 1489 -42440 1840 1489 -42440 1858 1467 -42440 1919 1468 -42440 1554 1470 -42440 1599 1525 -42440 1602 1631 -42440 1674 1525 -42440 1546 1547 -42440 1578 1920 -42440 1617 1441 -42440 1604 1616 -42440 1558 1468 -42440 1599 1674 -42440 1512 1531 -42440 1731 1790 -42440 1790 1912 -42440 1790 1916 -42440 1790 1863 -42440 1591 1858 -42440 1507 1522 -42440 1731 1912 -42440 1771 1529 -42440 1863 1912 -42440 1863 1916 -42440 1770 1840 -42440 1269 1453 -42440 1681 1771 -42440 1716 1431 -42440 1912 1916 -42440 1716 1496 -42440 1731 1863 -42440 1650 1668 -42460 1550 1630 -42460 1579 1434 -42460 1580 1761 -42460 1631 1465 -42460 1770 1489 -42460 1831 1433 -42460 1840 1489 -42460 1858 1467 -42460 1919 1468 -42460 1554 1470 -42460 1599 1525 -42460 1602 1631 -42460 1674 1525 -42460 1853 1459 -42460 1431 1496 -42460 1546 1547 -42460 1578 1920 -42460 1617 1441 -42460 1548 1516 -42460 1604 1616 -42460 1558 1468 -42460 1599 1674 -42460 1512 1531 -42460 1731 1790 -42460 1790 1912 -42460 1790 1916 -42460 1790 1863 -42460 1591 1858 -42460 1507 1522 -42460 1731 1912 -42460 1771 1529 -42460 1863 1912 -42460 1863 1916 -42460 1770 1840 -42460 1269 1453 -42460 1681 1771 -42460 1716 1431 -42460 1912 1916 -42460 1716 1496 -42460 1731 1863 -42460 1650 1668 -42480 1554 1470 -42480 1578 1616 -42480 1599 1525 -42480 1602 1631 -42480 1604 1920 -42480 1674 1525 -42480 1681 1529 -42480 1767 1770 -42480 1853 1459 -42480 1871 1517 -42480 1431 1496 -42480 1523 1525 -42480 1538 1524 -42480 1546 1547 -42480 1578 1920 -42480 1593 1766 -42480 1617 1441 -42480 1649 1791 -42480 1649 1655 -42480 1688 1434 -42480 1706 1466 -42480 1496 1505 -42480 1500 1511 -42480 1676 1767 -42480 1716 1505 -42480 1548 1516 -42480 1604 1616 -42480 1558 1468 -42480 1599 1674 -42480 1512 1531 -42480 1731 1790 -42480 1790 1912 -42480 1790 1916 -42480 1790 1863 -42480 1591 1858 -42480 1507 1522 -42480 1731 1912 -42480 1731 1916 -42480 1771 1529 -42480 1863 1912 -42480 1863 1916 -42480 1770 1840 -42480 1269 1453 -42480 1681 1771 -42480 1676 1770 -42480 1716 1431 -42480 1912 1916 -42480 1716 1496 -42480 1731 1863 -42480 1650 1668 -42500 1538 1524 -42500 1546 1547 -42500 1578 1920 -42500 1579 1688 -42500 1583 1525 -42500 1593 1766 -42500 1606 1448 -42500 1617 1441 -42500 1631 1743 -42500 1649 1791 -42500 1649 1655 -42500 1688 1434 -42500 1706 1466 -42500 1437 1522 -42500 1449 1531 -42500 1493 1526 -42500 1496 1505 -42500 1500 1511 -42500 1550 1630 -42500 1655 1791 -42500 1676 1767 -42500 1716 1505 -42500 1767 1489 -42500 1548 1516 -42500 1604 1616 -42500 1858 1467 -42500 1558 1468 -42500 1599 1674 -42500 1676 1840 -42500 1783 1527 -42500 1512 1531 -42500 1731 1790 -42500 1790 1912 -42500 1790 1916 -42500 1790 1863 -42500 1591 1858 -42500 1507 1522 -42500 1731 1912 -42500 1731 1916 -42500 1771 1529 -42500 1863 1912 -42500 1863 1916 -42500 1645 1756 -42500 1676 1489 -42500 1770 1840 -42500 1770 1489 -42500 1269 1453 -42500 1681 1771 -42500 1840 1489 -42500 1676 1770 -42500 1716 1431 -42500 1912 1916 -42500 1716 1496 -42500 1731 1863 -42500 1650 1668 -42520 1538 1731 -42520 1549 1519 -42520 1550 1630 -42520 1554 1514 -42520 1603 1449 -42520 1603 1858 -42520 1603 1531 -42520 1644 1700 -42520 1655 1791 -42520 1676 1767 -42520 1681 1758 -42520 1688 1779 -42520 1716 1505 -42520 1761 1463 -42520 1767 1489 -42520 1811 1831 -42520 1523 1525 -42520 1548 1516 -42520 1602 1631 -42520 1604 1616 -42520 1853 1470 -42520 1858 1467 -42520 1538 1790 -42520 1558 1468 -42520 1599 1674 -42520 1676 1840 -42520 1783 1527 -42520 1512 1531 -42520 1731 1790 -42520 1790 1912 -42520 1790 1916 -42520 1790 1863 -42520 1591 1858 -42520 1853 1459 -42520 1507 1522 -42520 1731 1912 -42520 1731 1916 -42520 1771 1529 -42520 1863 1912 -42520 1863 1916 -42520 1645 1756 -42520 1676 1489 -42520 1770 1840 -42520 1770 1489 -42520 1269 1453 -42520 1681 1771 -42520 1840 1489 -42520 1676 1770 -42520 1716 1431 -42520 1912 1916 -42520 1716 1496 -42520 1731 1863 -42520 1650 1668 -42540 1544 1465 -42540 1544 1549 -42540 1547 1505 -42540 1548 1516 -42540 1554 1602 -42540 1554 1631 -42540 1583 1523 -42540 1590 1761 -42540 1592 1652 -42540 1602 1631 -42540 1603 1441 -42540 1603 1526 -42540 1604 1616 -42540 1638 1500 -42540 1767 1770 -42540 1853 1470 -42540 1858 1467 -42540 1538 1790 -42540 1546 1441 -42540 1558 1468 -42540 1599 1674 -42540 1652 1747 -42540 1676 1840 -42540 1783 1527 -42540 1512 1531 -42540 1603 1461 -42540 1661 1712 -42540 1731 1790 -42540 1790 1912 -42540 1790 1916 -42540 1790 1863 -42540 1505 1528 -42540 1591 1858 -42540 1853 1459 -42540 1507 1522 -42540 1731 1912 -42540 1731 1916 -42540 1771 1529 -42540 1863 1912 -42540 1863 1916 -42540 1645 1756 -42540 1676 1489 -42540 1770 1840 -42540 1770 1489 -42540 1269 1453 -42540 1500 1511 -42540 1681 1771 -42540 1840 1489 -42540 1676 1770 -42540 1716 1431 -42540 1912 1916 -42540 1496 1505 -42540 1716 1496 -42540 1731 1863 -42540 1650 1668 -42560 1538 1790 -42560 1538 1863 -42560 1546 1441 -42560 1553 1599 -42560 1558 1468 -42560 1572 1470 -42560 1599 1674 -42560 1616 1920 -42560 1626 1811 -42560 1652 1747 -42560 1676 1840 -42560 1681 1529 -42560 1681 1523 -42560 1783 1527 -42560 1919 1468 -42560 1512 1531 -42560 1549 1599 -42560 1587 1535 -42560 1603 1461 -42560 1661 1712 -42560 1700 1467 -42560 1731 1790 -42560 1790 1912 -42560 1790 1916 -42560 1790 1863 -42560 1443 1493 -42560 1449 1512 -42560 1496 1528 -42560 1505 1528 -42560 1579 1706 -42560 1591 1858 -42560 1853 1459 -42560 1507 1522 -42560 1731 1912 -42560 1731 1916 -42560 1771 1529 -42560 1831 1433 -42560 1863 1912 -42560 1863 1916 -42560 1645 1756 -42560 1676 1489 -42560 1770 1840 -42560 1770 1489 -42560 1269 1453 -42560 1500 1511 -42560 1681 1771 -42560 1840 1489 -42560 1676 1770 -42560 1716 1431 -42560 1912 1916 -42560 1599 1821 -42560 1805 1888 -42560 1496 1505 -42560 1716 1496 -42560 1731 1863 -42560 1650 1668 -42580 1549 1599 -42580 1554 1457 -42580 1580 1761 -42580 1583 1825 -42580 1587 1535 -42580 1590 1437 -42580 1600 1519 -42580 1603 1461 -42580 1617 1514 -42580 1628 1761 -42580 1628 1463 -42580 1661 1712 -42580 1700 1467 -42580 1731 1790 -42580 1769 1443 -42580 1769 1467 -42580 1790 1912 -42580 1790 1916 -42580 1790 1863 -42580 1858 1467 -42580 1443 1493 -42580 1449 1512 -42580 1493 1526 -42580 1496 1528 -42580 1505 1528 -42580 1541 1555 -42580 1541 1533 -42580 1579 1706 -42580 1591 1858 -42580 1700 1858 -42580 1853 1459 -42580 1507 1522 -42580 1523 1525 -42580 1604 1616 -42580 1731 1912 -42580 1731 1916 -42580 1771 1529 -42580 1831 1433 -42580 1863 1912 -42580 1863 1916 -42580 1645 1756 -42580 1676 1489 -42580 1770 1840 -42580 1770 1489 -42580 1269 1453 -42580 1467 1493 -42580 1500 1511 -42580 1681 1771 -42580 1735 1465 -42580 1840 1489 -42580 1443 1467 -42580 1676 1770 -42580 1716 1431 -42580 1912 1916 -42580 1599 1821 -42580 1805 1888 -42580 1496 1505 -42580 1716 1496 -42580 1731 1863 -42580 1650 1668 -42600 1541 1555 -42600 1541 1533 -42600 1548 1516 -42600 1572 1470 -42600 1579 1706 -42600 1591 1858 -42600 1652 1747 -42600 1681 1529 -42600 1700 1858 -42600 1716 1505 -42600 1779 1514 -42600 1825 1525 -42600 1853 1459 -42600 1858 1443 -42600 1858 1493 -42600 1871 1517 -42600 1449 1531 -42600 1458 1503 -42600 1501 1516 -42600 1507 1522 -42600 1512 1531 -42600 1523 1525 -42600 1546 1770 -42600 1549 1674 -42600 1604 1616 -42600 1630 1520 -42600 1676 1840 -42600 1731 1912 -42600 1731 1916 -42600 1771 1529 -42600 1831 1433 -42600 1863 1912 -42600 1863 1916 -42600 1645 1756 -42600 1676 1489 -42600 1770 1840 -42600 1770 1489 -42600 1269 1453 -42600 1467 1493 -42600 1500 1511 -42600 1538 1790 -42600 1681 1771 -42600 1735 1465 -42600 1840 1489 -42600 1443 1467 -42600 1676 1770 -42600 1716 1431 -42600 1912 1916 -42600 1599 1821 -42600 1767 1489 -42600 1805 1888 -42600 1496 1505 -42600 1783 1527 -42600 1716 1496 -42600 1731 1863 -42600 1650 1668 -42620 1546 1770 -42620 1549 1674 -42620 1600 1519 -42620 1604 1616 -42620 1630 1520 -42620 1661 1712 -42620 1676 1840 -42620 1676 1767 -42620 1681 1525 -42620 1700 1504 -42620 1731 1912 -42620 1731 1916 -42620 1761 1791 -42620 1767 1770 -42620 1771 1529 -42620 1831 1433 -42620 1863 1912 -42620 1863 1916 -42620 1645 1756 -42620 1676 1489 -42620 1770 1840 -42620 1770 1489 -42620 1269 1453 -42620 1467 1493 -42620 1500 1511 -42620 1505 1528 -42620 1538 1790 -42620 1558 1468 -42620 1681 1771 -42620 1735 1465 -42620 1840 1489 -42620 1443 1467 -42620 1587 1535 -42620 1676 1770 -42620 1716 1431 -42620 1912 1916 -42620 1599 1821 -42620 1617 1857 -42620 1767 1489 -42620 1805 1888 -42620 1496 1505 -42620 1783 1527 -42620 1716 1496 -42620 1731 1863 -42620 1650 1668 -42640 1586 1771 -42640 1590 1522 -42640 1591 1858 -42640 1602 1471 -42640 1628 1791 -42640 1645 1756 -42640 1676 1489 -42640 1700 1858 -42640 1700 1443 -42640 1740 1501 -42640 1769 1443 -42640 1770 1840 -42640 1770 1489 -42640 1269 1453 -42640 1791 1463 -42640 1831 1470 -42640 1871 1517 -42640 1467 1493 -42640 1500 1511 -42640 1505 1528 -42640 1512 1531 -42640 1538 1790 -42640 1558 1468 -42640 1585 1772 -42640 1617 1676 -42640 1667 1434 -42640 1681 1771 -42640 1735 1465 -42640 1769 1467 -42640 1790 1912 -42640 1840 1489 -42640 1858 1493 -42640 1443 1467 -42640 1587 1535 -42640 1676 1770 -42640 1716 1431 -42640 1912 1916 -42640 1599 1821 -42640 1617 1857 -42640 1767 1489 -42640 1599 1664 -42640 1603 1507 -42640 1853 1459 -42640 1858 1467 -42640 1549 1735 -42640 1549 1465 -42640 1805 1888 -42640 1507 1522 -42640 1496 1505 -42640 1783 1527 -42640 1716 1496 -42640 1603 1522 -42640 1664 1821 -42640 1731 1863 -42640 1650 1668 -42660 1538 1790 -42660 1544 1599 -42660 1553 1599 -42660 1558 1468 -42660 1585 1772 -42660 1596 1598 -42660 1598 1920 -42660 1601 1761 -42660 1617 1770 -42660 1617 1676 -42660 1664 1713 -42660 1667 1434 -42660 1674 1735 -42660 1681 1529 -42660 1681 1771 -42660 1735 1465 -42660 1752 1766 -42660 1769 1467 -42660 1790 1912 -42660 1840 1489 -42660 1858 1493 -42660 1919 1468 -42660 1443 1467 -42660 1449 1512 -42660 1538 1912 -42660 1538 1916 -42660 1559 1655 -42660 1587 1535 -42660 1599 1713 -42660 1630 1520 -42660 1676 1770 -42660 1700 1504 -42660 1716 1431 -42660 1731 1916 -42660 1863 1916 -42660 1912 1916 -42660 1599 1821 -42660 1617 1857 -42660 1688 1706 -42660 1767 1489 -42660 1523 1525 -42660 1599 1664 -42660 1603 1507 -42660 1853 1459 -42660 1858 1467 -42660 1549 1735 -42660 1549 1465 -42660 1647 1666 -42660 1805 1888 -42660 1507 1522 -42660 1496 1505 -42660 1783 1527 -42660 1716 1496 -42660 1603 1522 -42660 1604 1616 -42660 1664 1821 -42660 1652 1747 -42660 1731 1863 -42660 1650 1668 -42680 1538 1912 -42680 1538 1916 -42680 1559 1655 -42680 1587 1535 -42680 1599 1713 -42680 1600 1519 -42680 1630 1520 -42680 1664 1701 -42680 1674 1465 -42680 1676 1770 -42680 1700 1504 -42680 1716 1431 -42680 1731 1912 -42680 1731 1916 -42680 1767 1840 -42680 1770 1489 -42680 1772 1466 -42680 1772 1443 -42680 1774 1524 -42680 1863 1916 -42680 1912 1916 -42680 1443 1487 -42680 1544 1523 -42680 1591 1858 -42680 1598 1847 -42680 1599 1821 -42680 1617 1857 -42680 1688 1706 -42680 1761 1489 -42680 1767 1489 -42680 1523 1525 -42680 1544 1525 -42680 1599 1664 -42680 1603 1507 -42680 1701 1713 -42680 1769 1443 -42680 1853 1459 -42680 1858 1467 -42680 1549 1735 -42680 1549 1465 -42680 1647 1666 -42680 1805 1888 -42680 1507 1522 -42680 1496 1505 -42680 1783 1527 -42680 1716 1496 -42680 1716 1505 -42680 1603 1522 -42680 1604 1616 -42680 1664 1821 -42680 1652 1747 -42680 1731 1863 -42680 1650 1668 -42700 1538 1790 -42700 1544 1523 -42700 1544 1701 -42700 1549 1559 -42700 1559 1604 -42700 1591 1858 -42700 1598 1847 -42700 1599 1821 -42700 1616 1655 -42700 1617 1857 -42700 1617 1441 -42700 1645 1756 -42700 1688 1706 -42700 1701 1523 -42700 1756 1448 -42700 1761 1489 -42700 1767 1489 -42700 1769 1487 -42700 1847 1920 -42700 1857 1441 -42700 1871 1517 -42700 1489 1511 -42700 1498 1526 -42700 1523 1525 -42700 1544 1525 -42700 1569 1742 -42700 1599 1664 -42700 1603 1507 -42700 1701 1713 -42700 1769 1443 -42700 1853 1459 -42700 1858 1467 -42700 1544 1713 -42700 1549 1735 -42700 1549 1465 -42700 1602 1631 -42700 1701 1525 -42700 1713 1525 -42700 1470 1526 -42700 1647 1666 -42700 1805 1888 -42700 1840 1489 -42700 1507 1522 -42700 1496 1505 -42700 1783 1527 -42700 1716 1496 -42700 1716 1505 -42700 1603 1522 -42700 1604 1616 -42700 1512 1531 -42700 1664 1821 -42700 1652 1747 -42700 1731 1863 -42700 1650 1668 -42720 1544 1525 -42720 1544 1583 -42720 1553 1599 -42720 1569 1742 -42720 1596 1464 -42720 1599 1664 -42720 1599 1523 -42720 1603 1507 -42720 1627 1505 -42720 1644 1700 -42720 1664 1681 -42720 1677 1523 -42720 1701 1713 -42720 1767 1500 -42720 1769 1443 -42720 1791 1463 -42720 1821 1519 -42720 1840 1511 -42720 1840 1500 -42720 1847 1501 -42720 1853 1459 -42720 1858 1467 -42720 1500 1511 -42720 1544 1713 -42720 1549 1735 -42720 1549 1465 -42720 1602 1631 -42720 1664 1519 -42720 1701 1525 -42720 1713 1525 -42720 1470 1526 -42720 1647 1666 -42720 1805 1888 -42720 1840 1489 -42720 1507 1522 -42720 1700 1504 -42720 1496 1505 -42720 1583 1713 -42720 1783 1527 -42720 1767 1840 -42720 1716 1496 -42720 1716 1505 -42720 1603 1522 -42720 1604 1616 -42720 1512 1531 -42720 1600 1664 -42720 1559 1599 -42720 1664 1821 -42720 1652 1747 -42720 1731 1863 -42720 1650 1668 -42740 1544 1713 -42740 1549 1713 -42740 1549 1735 -42740 1549 1465 -42740 1558 1468 -42740 1559 1655 -42740 1600 1821 -42740 1601 1630 -42740 1602 1631 -42740 1664 1519 -42740 1677 1713 -42740 1742 1520 -42740 1847 1904 -42740 1467 1493 -42740 1489 1500 -42740 1523 1525 -42740 1735 1465 -42740 1449 1512 -42740 1701 1525 -42740 1713 1525 -42740 1269 1453 -42740 1449 1531 -42740 1470 1526 -42740 1591 1858 -42740 1647 1666 -42740 1805 1888 -42740 1840 1489 -42740 1507 1522 -42740 1700 1504 -42740 1713 1523 -42740 1847 1920 -42740 1496 1505 -42740 1583 1713 -42740 1783 1527 -42740 1767 1840 -42740 1716 1496 -42740 1716 1505 -42740 1767 1489 -42740 1603 1522 -42740 1604 1616 -42740 1512 1531 -42740 1600 1664 -42740 1559 1599 -42740 1664 1821 -42740 1652 1747 -42740 1731 1863 -42740 1650 1668 -42760 1544 1599 -42760 1544 1559 -42760 1555 1533 -42760 1598 1688 -42760 1627 1505 -42760 1700 1495 -42760 1735 1465 -42760 1437 1470 -42760 1449 1512 -42760 1537 1437 -42760 1645 1756 -42760 1688 1772 -42760 1701 1713 -42760 1701 1525 -42760 1713 1525 -42760 1269 1453 -42760 1449 1531 -42760 1470 1526 -42760 1537 1603 -42760 1591 1858 -42760 1647 1666 -42760 1805 1888 -42760 1840 1489 -42760 1507 1522 -42760 1700 1504 -42760 1713 1523 -42760 1847 1920 -42760 1467 1495 -42760 1496 1505 -42760 1500 1511 -42760 1583 1713 -42760 1603 1507 -42760 1783 1527 -42760 1767 1840 -42760 1431 1516 -42760 1716 1496 -42760 1716 1505 -42760 1767 1489 -42760 1603 1522 -42760 1604 1616 -42760 1512 1531 -42760 1600 1664 -42760 1559 1599 -42760 1664 1821 -42760 1652 1747 -42760 1731 1863 -42760 1650 1668 -42780 1537 1437 -42780 1546 1563 -42780 1574 1596 -42780 1583 1525 -42780 1596 1772 -42780 1598 1772 -42780 1599 1525 -42780 1617 1857 -42780 1628 1761 -42780 1644 1495 -42780 1645 1756 -42780 1681 1525 -42780 1688 1772 -42780 1701 1713 -42780 1701 1525 -42780 1713 1525 -42780 1269 1453 -42780 1449 1531 -42780 1470 1526 -42780 1489 1500 -42780 1523 1525 -42780 1537 1603 -42780 1549 1713 -42780 1591 1858 -42780 1601 1630 -42780 1644 1700 -42780 1647 1666 -42780 1805 1888 -42780 1840 1489 -42780 1507 1522 -42780 1538 1524 -42780 1700 1504 -42780 1713 1523 -42780 1847 1920 -42780 1467 1495 -42780 1496 1505 -42780 1500 1511 -42780 1583 1713 -42780 1603 1507 -42780 1677 1701 -42780 1783 1527 -42780 1767 1840 -42780 1431 1516 -42780 1676 1770 -42780 1716 1496 -42780 1716 1505 -42780 1767 1489 -42780 1544 1549 -42780 1603 1522 -42780 1604 1616 -42780 1512 1531 -42780 1600 1664 -42780 1559 1599 -42780 1664 1821 -42780 1652 1747 -42780 1731 1863 -42780 1650 1668 -42800 1537 1603 -42800 1544 1559 -42800 1549 1713 -42800 1563 1592 -42800 1580 1628 -42800 1580 1463 -42800 1591 1858 -42800 1595 1599 -42800 1601 1630 -42800 1644 1700 -42800 1647 1666 -42800 1650 1463 -42800 1668 1463 -42800 1756 1524 -42800 1805 1888 -42800 1840 1489 -42800 1871 1517 -42800 1507 1522 -42800 1522 1526 -42800 1538 1524 -42800 1544 1599 -42800 1595 1655 -42800 1664 1519 -42800 1700 1504 -42800 1713 1523 -42800 1847 1920 -42800 1874 1493 -42800 1467 1495 -42800 1496 1505 -42800 1500 1511 -42800 1583 1713 -42800 1603 1507 -42800 1628 1463 -42800 1677 1701 -42800 1783 1527 -42800 1548 1516 -42800 1767 1840 -42800 1431 1516 -42800 1676 1770 -42800 1716 1496 -42800 1716 1505 -42800 1767 1489 -42800 1544 1549 -42800 1603 1522 -42800 1604 1616 -42800 1512 1531 -42800 1600 1664 -42800 1600 1821 -42800 1559 1599 -42800 1664 1821 -42800 1652 1747 -42800 1731 1863 -42800 1650 1668 -42820 1537 1526 -42820 1538 1524 -42820 1544 1599 -42820 1583 1525 -42820 1595 1654 -42820 1595 1655 -42820 1627 1716 -42820 1664 1519 -42820 1688 1527 -42820 1700 1504 -42820 1700 1467 -42820 1713 1523 -42820 1847 1920 -42820 1874 1493 -42820 1467 1495 -42820 1496 1505 -42820 1500 1511 -42820 1583 1713 -42820 1603 1507 -42820 1628 1463 -42820 1677 1701 -42820 1700 1495 -42820 1735 1465 -42820 1783 1527 -42820 1548 1516 -42820 1688 1465 -42820 1713 1525 -42820 1767 1840 -42820 1431 1516 -42820 1676 1770 -42820 1716 1496 -42820 1716 1505 -42820 1767 1489 -42820 1544 1549 -42820 1603 1522 -42820 1617 1857 -42820 1701 1525 -42820 1604 1616 -42820 1512 1531 -42820 1600 1664 -42820 1600 1821 -42820 1559 1599 -42820 1664 1821 -42820 1652 1747 -42820 1731 1863 -42820 1650 1668 -42840 1547 1578 -42840 1563 1592 -42840 1583 1713 -42840 1600 1681 -42840 1600 1523 -42840 1603 1507 -42840 1627 1528 -42840 1628 1650 -42840 1628 1463 -42840 1647 1666 -42840 1664 1529 -42840 1668 1463 -42840 1677 1701 -42840 1700 1458 -42840 1700 1495 -42840 1701 1713 -42840 1713 1825 -42840 1735 1465 -42840 1756 1526 -42840 1783 1527 -42840 1840 1489 -42840 1548 1516 -42840 1601 1630 -42840 1602 1631 -42840 1628 1668 -42840 1677 1525 -42840 1688 1465 -42840 1713 1525 -42840 1767 1840 -42840 1871 1517 -42840 1919 1510 -42840 1591 1858 -42840 1431 1516 -42840 1676 1770 -42840 1716 1496 -42840 1716 1505 -42840 1767 1489 -42840 1544 1549 -42840 1433 1443 -42840 1603 1522 -42840 1617 1857 -42840 1664 1681 -42840 1701 1525 -42840 1604 1616 -42840 1512 1531 -42840 1600 1664 -42840 1761 1493 -42840 1805 1888 -42840 1600 1821 -42840 1559 1599 -42840 1664 1821 -42840 1652 1747 -42840 1731 1863 -42840 1650 1668 -42860 1544 1825 -42860 1548 1516 -42860 1553 1599 -42860 1559 1825 -42860 1583 1825 -42860 1595 1654 -42860 1599 1825 -42860 1601 1630 -42860 1602 1631 -42860 1628 1668 -42860 1665 1525 -42860 1677 1525 -42860 1688 1465 -42860 1701 1523 -42860 1713 1523 -42860 1713 1525 -42860 1716 1528 -42860 1716 1791 -42860 1767 1840 -42860 1825 1525 -42860 1853 1459 -42860 1871 1517 -42860 1919 1510 -42860 1591 1858 -42860 1431 1516 -42860 1470 1526 -42860 1599 1665 -42860 1676 1770 -42860 1716 1496 -42860 1716 1505 -42860 1767 1489 -42860 1467 1495 -42860 1544 1549 -42860 1433 1443 -42860 1603 1522 -42860 1617 1857 -42860 1664 1681 -42860 1701 1525 -42860 1604 1616 -42860 1512 1531 -42860 1600 1664 -42860 1761 1493 -42860 1805 1888 -42860 1600 1821 -42860 1559 1599 -42860 1664 1821 -42860 1858 1495 -42860 1652 1747 -42860 1731 1863 -42860 1650 1668 -42880 1538 1563 -42880 1538 1524 -42880 1559 1523 -42880 1578 1791 -42880 1591 1858 -42880 1599 1821 -42880 1666 1772 -42880 1700 1458 -42880 1767 1811 -42880 1783 1527 -42880 1431 1516 -42880 1470 1526 -42880 1525 1529 -42880 1558 1468 -42880 1592 1524 -42880 1599 1665 -42880 1603 1507 -42880 1665 1677 -42880 1665 1701 -42880 1676 1770 -42880 1716 1496 -42880 1716 1505 -42880 1767 1489 -42880 1449 1531 -42880 1467 1495 -42880 1544 1549 -42880 1628 1463 -42880 1665 1523 -42880 1433 1443 -42880 1507 1522 -42880 1603 1522 -42880 1563 1524 -42880 1617 1857 -42880 1664 1681 -42880 1681 1821 -42880 1701 1525 -42880 1604 1616 -42880 1512 1531 -42880 1544 1713 -42880 1600 1664 -42880 1761 1493 -42880 1537 1443 -42880 1805 1888 -42880 1600 1821 -42880 1769 1487 -42880 1559 1599 -42880 1664 1821 -42880 1858 1495 -42880 1652 1747 -42880 1731 1863 -42880 1650 1668 -42900 1558 1468 -42900 1559 1665 -42900 1563 1592 -42900 1578 1505 -42900 1592 1524 -42900 1599 1665 -42900 1599 1523 -42900 1599 1701 -42900 1603 1507 -42900 1665 1677 -42900 1665 1701 -42900 1676 1770 -42900 1716 1496 -42900 1716 1505 -42900 1767 1489 -42900 1825 1529 -42900 1840 1489 -42900 1449 1531 -42900 1461 1467 -42900 1467 1495 -42900 1496 1505 -42900 1544 1549 -42900 1549 1713 -42900 1628 1463 -42900 1665 1523 -42900 1676 1756 -42900 1853 1459 -42900 1919 1427 -42900 1433 1443 -42900 1507 1522 -42900 1578 1716 -42900 1591 1495 -42900 1603 1522 -42900 1627 1716 -42900 1716 1528 -42900 1563 1524 -42900 1617 1857 -42900 1645 1526 -42900 1664 1681 -42900 1681 1821 -42900 1701 1525 -42900 1767 1840 -42900 1604 1616 -42900 1645 1756 -42900 1512 1531 -42900 1544 1713 -42900 1600 1664 -42900 1761 1493 -42900 1537 1443 -42900 1805 1888 -42900 1600 1821 -42900 1769 1487 -42900 1559 1599 -42900 1664 1821 -42900 1858 1495 -42900 1652 1747 -42900 1731 1863 -42900 1650 1668 -42920 1544 1549 -42920 1547 1716 -42920 1549 1713 -42920 1553 1599 -42920 1566 1665 -42920 1599 1825 -42920 1617 1441 -42920 1628 1463 -42920 1665 1523 -42920 1676 1842 -42920 1676 1756 -42920 1677 1701 -42920 1700 1496 -42920 1756 1526 -42920 1779 1811 -42920 1842 1470 -42920 1853 1459 -42920 1919 1427 -42920 1433 1443 -42920 1507 1522 -42920 1578 1716 -42920 1591 1495 -42920 1603 1522 -42920 1627 1716 -42920 1716 1528 -42920 1783 1527 -42920 1791 1528 -42920 1563 1524 -42920 1617 1857 -42920 1645 1526 -42920 1664 1681 -42920 1681 1821 -42920 1701 1525 -42920 1767 1840 -42920 1549 1665 -42920 1604 1616 -42920 1645 1756 -42920 1512 1531 -42920 1544 1713 -42920 1600 1664 -42920 1761 1493 -42920 1871 1517 -42920 1537 1443 -42920 1566 1525 -42920 1805 1888 -42920 1600 1821 -42920 1769 1487 -42920 1559 1599 -42920 1664 1821 -42920 1858 1495 -42920 1652 1747 -42920 1731 1863 -42920 1650 1668 -42940 1550 1700 -42940 1566 1642 -42940 1578 1716 -42940 1591 1495 -42940 1595 1654 -42940 1599 1701 -42940 1600 1681 -42940 1602 1631 -42940 1603 1522 -42940 1627 1716 -42940 1642 1701 -42940 1665 1713 -42940 1666 1772 -42940 1676 1441 -42940 1676 1811 -42940 1716 1528 -42940 1269 1453 -42940 1783 1527 -42940 1791 1528 -42940 1825 1529 -42940 1461 1467 -42940 1470 1526 -42940 1544 1665 -42940 1559 1525 -42940 1563 1524 -42940 1566 1701 -42940 1599 1525 -42940 1601 1630 -42940 1617 1857 -42940 1642 1525 -42940 1645 1526 -42940 1664 1681 -42940 1681 1821 -42940 1700 1528 -42940 1701 1525 -42940 1767 1840 -42940 1549 1665 -42940 1566 1523 -42940 1604 1616 -42940 1645 1756 -42940 1512 1531 -42940 1544 1713 -42940 1600 1664 -42940 1603 1507 -42940 1761 1493 -42940 1871 1517 -42940 1537 1443 -42940 1566 1525 -42940 1805 1888 -42940 1600 1821 -42940 1769 1487 -42940 1559 1599 -42940 1664 1821 -42940 1858 1495 -42940 1652 1747 -42940 1731 1863 -42940 1650 1668 -42960 1544 1665 -42960 1544 1525 -42960 1546 1701 -42960 1547 1716 -42960 1553 1664 -42960 1553 1642 -42960 1559 1525 -42960 1563 1524 -42960 1566 1701 -42960 1566 1599 -42960 1593 1811 -42960 1599 1525 -42960 1601 1630 -42960 1603 1811 -42960 1617 1857 -42960 1642 1525 -42960 1645 1526 -42960 1664 1681 -42960 1674 1920 -42960 1676 1779 -42960 1681 1821 -42960 1700 1528 -42960 1701 1525 -42960 1752 1766 -42960 1756 1526 -42960 1767 1840 -42960 1767 1489 -42960 1431 1516 -42960 1549 1665 -42960 1549 1713 -42960 1566 1523 -42960 1580 1628 -42960 1599 1642 -42960 1604 1616 -42960 1645 1756 -42960 1713 1758 -42960 1842 1433 -42960 1919 1427 -42960 1449 1531 -42960 1512 1531 -42960 1544 1713 -42960 1544 1549 -42960 1600 1664 -42960 1603 1507 -42960 1628 1463 -42960 1761 1493 -42960 1871 1517 -42960 1537 1443 -42960 1538 1524 -42960 1566 1525 -42960 1805 1888 -42960 1840 1489 -42960 1600 1821 -42960 1769 1487 -42960 1559 1599 -42960 1664 1821 -42960 1858 1495 -42960 1652 1747 -42960 1731 1863 -42960 1650 1668 -42980 1544 1701 -42980 1549 1665 -42980 1549 1713 -42980 1566 1523 -42980 1580 1628 -42980 1598 1674 -42980 1599 1642 -42980 1604 1616 -42980 1606 1716 -42980 1617 1441 -42980 1627 1716 -42980 1645 1756 -42980 1665 1713 -42980 1665 1701 -42980 1713 1758 -42980 1716 1459 -42980 1740 1453 -42980 1825 1529 -42980 1842 1433 -42980 1919 1427 -42980 1449 1531 -42980 1512 1531 -42980 1523 1525 -42980 1544 1713 -42980 1544 1549 -42980 1549 1701 -42980 1600 1664 -42980 1603 1522 -42980 1603 1507 -42980 1628 1463 -42980 1761 1493 -42980 1871 1517 -42980 1507 1522 -42980 1537 1443 -42980 1538 1524 -42980 1547 1578 -42980 1566 1525 -42980 1805 1888 -42980 1840 1489 -42980 1600 1821 -42980 1769 1487 -42980 1647 1675 -42980 1779 1441 -42980 1559 1599 -42980 1664 1821 -42980 1591 1495 -42980 1858 1495 -42980 1578 1716 -42980 1652 1747 -42980 1731 1863 -42980 1650 1668 -43000 1538 1563 -43000 1544 1713 -43000 1544 1549 -43000 1549 1701 -43000 1566 1701 -43000 1594 1696 -43000 1595 1654 -43000 1599 1651 -43000 1600 1664 -43000 1603 1522 -43000 1603 1507 -43000 1617 1857 -43000 1628 1463 -43000 1630 1842 -43000 1664 1681 -43000 1665 1531 -43000 1761 1493 -43000 1831 1443 -43000 1871 1517 -43000 1507 1522 -43000 1537 1443 -43000 1538 1524 -43000 1547 1578 -43000 1549 1525 -43000 1566 1525 -43000 1583 1523 -43000 1599 1675 -43000 1601 1630 -43000 1666 1772 -43000 1805 1888 -43000 1544 1616 -43000 1544 1604 -43000 1572 1742 -43000 1767 1489 -43000 1840 1489 -43000 1600 1821 -43000 1769 1487 -43000 1647 1675 -43000 1647 1651 -43000 1651 1675 -43000 1779 1441 -43000 1559 1599 -43000 1664 1821 -43000 1591 1495 -43000 1858 1495 -43000 1578 1716 -43000 1652 1747 -43000 1731 1863 -43000 1650 1668 -43020 1537 1443 -43020 1538 1524 -43020 1544 1523 -43020 1544 1651 -43020 1544 1531 -43020 1547 1578 -43020 1549 1525 -43020 1559 1525 -43020 1566 1525 -43020 1583 1523 -43020 1599 1642 -43020 1599 1675 -43020 1601 1630 -43020 1604 1512 -43020 1604 1531 -43020 1606 1716 -43020 1616 1531 -43020 1616 1758 -43020 1622 1520 -43020 1642 1523 -43020 1655 1731 -43020 1655 1863 -43020 1666 1772 -43020 1805 1888 -43020 1500 1511 -43020 1512 1531 -43020 1544 1616 -43020 1544 1604 -43020 1559 1642 -43020 1572 1742 -43020 1603 1470 -43020 1681 1825 -43020 1767 1489 -43020 1840 1489 -43020 1523 1525 -43020 1600 1821 -43020 1603 1526 -43020 1628 1756 -43020 1769 1487 -43020 1544 1529 -43020 1647 1675 -43020 1647 1651 -43020 1701 1525 -43020 1651 1675 -43020 1779 1441 -43020 1559 1599 -43020 1664 1821 -43020 1591 1495 -43020 1858 1495 -43020 1578 1716 -43020 1652 1747 -43020 1731 1863 -43020 1650 1668 -43040 1544 1664 -43040 1544 1616 -43040 1544 1604 -43040 1545 1791 -43040 1559 1642 -43040 1572 1742 -43040 1595 1654 -43040 1603 1470 -43040 1617 1779 -43040 1617 1441 -43040 1681 1825 -43040 1767 1489 -43040 1821 1825 -43040 1831 1458 -43040 1840 1489 -43040 1507 1522 -43040 1523 1525 -43040 1600 1821 -43040 1603 1526 -43040 1628 1756 -43040 1769 1487 -43040 1544 1529 -43040 1617 1857 -43040 1647 1675 -43040 1604 1616 -43040 1647 1651 -43040 1701 1525 -43040 1871 1517 -43040 1783 1531 -43040 1527 1531 -43040 1566 1531 -43040 1651 1675 -43040 1779 1441 -43040 1559 1599 -43040 1600 1664 -43040 1590 1811 -43040 1664 1821 -43040 1591 1495 -43040 1858 1495 -43040 1578 1716 -43040 1652 1747 -43040 1731 1863 -43040 1650 1668 -43060 1538 1563 -43060 1549 1525 -43060 1549 1599 -43060 1559 1523 -43060 1566 1783 -43060 1595 1740 -43060 1595 1678 -43060 1600 1821 -43060 1603 1526 -43060 1604 1664 -43060 1622 1520 -43060 1628 1756 -43060 1761 1526 -43060 1769 1487 -43060 1919 1427 -43060 1495 1532 -43060 1496 1505 -43060 1500 1511 -43060 1544 1529 -43060 1563 1524 -43060 1617 1857 -43060 1647 1675 -43060 1767 1840 -43060 1604 1616 -43060 1647 1651 -43060 1701 1525 -43060 1871 1517 -43060 1783 1531 -43060 1805 1888 -43060 1527 1531 -43060 1566 1531 -43060 1651 1675 -43060 1779 1441 -43060 1559 1599 -43060 1600 1664 -43060 1590 1811 -43060 1664 1821 -43060 1591 1495 -43060 1858 1495 -43060 1578 1716 -43060 1652 1747 -43060 1538 1524 -43060 1731 1863 -43060 1650 1668 -43080 1544 1529 -43080 1544 1642 -43080 1559 1642 -43080 1563 1524 -43080 1566 1527 -43080 1606 1716 -43080 1617 1857 -43080 1647 1675 -43080 1664 1529 -43080 1677 1525 -43080 1767 1840 -43080 1595 1654 -43080 1599 1642 -43080 1604 1616 -43080 1644 1467 -43080 1647 1651 -43080 1701 1525 -43080 1840 1489 -43080 1871 1517 -43080 1783 1531 -43080 1805 1888 -43080 1527 1531 -43080 1566 1531 -43080 1651 1675 -43080 1779 1441 -43080 1559 1599 -43080 1600 1664 -43080 1590 1811 -43080 1664 1821 -43080 1591 1495 -43080 1858 1495 -43080 1578 1716 -43080 1652 1747 -43080 1538 1524 -43080 1731 1863 -43080 1650 1668 -43100 1595 1654 -43100 1599 1681 -43100 1599 1642 -43100 1600 1529 -43100 1601 1630 -43100 1604 1616 -43100 1617 1441 -43100 1642 1525 -43100 1644 1467 -43100 1647 1651 -43100 1666 1772 -43100 1701 1525 -43100 1840 1489 -43100 1871 1517 -43100 1538 1563 -43100 1544 1616 -43100 1544 1604 -43100 1546 1770 -43100 1769 1487 -43100 1783 1531 -43100 1805 1888 -43100 1527 1531 -43100 1566 1531 -43100 1651 1675 -43100 1500 1514 -43100 1779 1441 -43100 1470 1526 -43100 1559 1599 -43100 1600 1664 -43100 1600 1821 -43100 1590 1811 -43100 1664 1821 -43100 1591 1495 -43100 1858 1495 -43100 1578 1716 -43100 1652 1747 -43100 1538 1524 -43100 1731 1863 -43100 1650 1668 -43120 1538 1563 -43120 1544 1616 -43120 1544 1604 -43120 1546 1770 -43120 1563 1524 -43120 1581 1842 -43120 1661 1857 -43120 1712 1857 -43120 1769 1487 -43120 1783 1531 -43120 1805 1888 -43120 1493 1532 -43120 1496 1505 -43120 1527 1531 -43120 1566 1531 -43120 1645 1756 -43120 1651 1675 -43120 1761 1443 -43120 1500 1514 -43120 1566 1527 -43120 1677 1701 -43120 1779 1441 -43120 1857 1526 -43120 1467 1504 -43120 1470 1526 -43120 1559 1599 -43120 1600 1664 -43120 1600 1821 -43120 1590 1811 -43120 1664 1821 -43120 1591 1495 -43120 1858 1495 -43120 1578 1716 -43120 1652 1747 -43120 1857 1470 -43120 1644 1504 -43120 1538 1524 -43120 1731 1863 -43120 1650 1668 -43140 1541 1789 -43140 1544 1783 -43140 1549 1599 -43140 1566 1531 -43140 1606 1716 -43140 1645 1756 -43140 1651 1675 -43140 1654 1839 -43140 1677 1525 -43140 1761 1443 -43140 1500 1514 -43140 1566 1527 -43140 1604 1616 -43140 1677 1701 -43140 1701 1525 -43140 1767 1840 -43140 1779 1441 -43140 1857 1526 -43140 1467 1504 -43140 1470 1526 -43140 1500 1511 -43140 1512 1525 -43140 1549 1681 -43140 1559 1599 -43140 1600 1664 -43140 1600 1821 -43140 1590 1811 -43140 1664 1821 -43140 1591 1495 -43140 1858 1495 -43140 1578 1716 -43140 1603 1740 -43140 1652 1747 -43140 1857 1470 -43140 1644 1504 -43140 1538 1524 -43140 1644 1467 -43140 1840 1489 -43140 1731 1863 -43140 1650 1668 -43160 1549 1586 -43160 1563 1524 -43160 1566 1527 -43160 1593 1449 -43160 1598 1713 -43160 1604 1616 -43160 1664 1519 -43160 1677 1701 -43160 1685 1771 -43160 1701 1525 -43160 1767 1840 -43160 1767 1489 -43160 1779 1441 -43160 1825 1529 -43160 1825 1519 -43160 1857 1526 -43160 1467 1504 -43160 1470 1526 -43160 1500 1511 -43160 1512 1525 -43160 1549 1681 -43160 1559 1599 -43160 1600 1664 -43160 1600 1821 -43160 1617 1441 -43160 1590 1811 -43160 1664 1821 -43160 1783 1527 -43160 1591 1495 -43160 1858 1495 -43160 1544 1527 -43160 1578 1716 -43160 1603 1740 -43160 1652 1747 -43160 1857 1470 -43160 1644 1504 -43160 1769 1487 -43160 1538 1524 -43160 1644 1467 -43160 1840 1489 -43160 1731 1863 -43160 1650 1668 -43180 1540 1779 -43180 1541 1649 -43180 1549 1681 -43180 1559 1599 -43180 1595 1654 -43180 1599 1642 -43180 1600 1664 -43180 1600 1821 -43180 1603 1858 -43180 1617 1441 -43180 1639 1681 -43180 1740 1467 -43180 1512 1531 -43180 1544 1783 -43180 1548 1431 -43180 1590 1811 -43180 1664 1821 -43180 1783 1527 -43180 1591 1495 -43180 1616 1617 -43180 1858 1495 -43180 1459 1468 -43180 1544 1527 -43180 1578 1716 -43180 1496 1505 -43180 1538 1563 -43180 1603 1740 -43180 1652 1747 -43180 1857 1470 -43180 1644 1504 -43180 1769 1487 -43180 1538 1524 -43180 1644 1467 -43180 1840 1489 -43180 1645 1756 -43180 1731 1863 -43180 1650 1668 -43200 1544 1783 -43200 1548 1516 -43200 1548 1431 -43200 1549 1599 -43200 1559 1531 -43200 1563 1524 -43200 1590 1811 -43200 1591 1647 -43200 1664 1821 -43200 1665 1495 -43200 1676 1821 -43200 1783 1527 -43200 1431 1516 -43200 1467 1504 -43200 1591 1495 -43200 1616 1617 -43200 1647 1495 -43200 1783 1531 -43200 1858 1495 -43200 1459 1468 -43200 1500 1511 -43200 1544 1527 -43200 1578 1716 -43200 1606 1716 -43200 1496 1505 -43200 1538 1563 -43200 1603 1740 -43200 1652 1747 -43200 1857 1526 -43200 1857 1470 -43200 1644 1504 -43200 1769 1487 -43200 1591 1740 -43200 1538 1524 -43200 1644 1467 -43200 1840 1489 -43200 1767 1489 -43200 1549 1525 -43200 1645 1756 -43200 1731 1863 -43200 1665 1858 -43200 1650 1668 -43220 1546 1590 -43220 1547 1716 -43220 1568 1842 -43220 1591 1495 -43220 1602 1631 -43220 1616 1617 -43220 1626 1904 -43220 1627 1461 -43220 1647 1495 -43220 1761 1443 -43220 1783 1531 -43220 1858 1495 -43220 1919 1427 -43220 1434 1514 -43220 1459 1468 -43220 1500 1511 -43220 1544 1527 -43220 1547 1606 -43220 1549 1681 -43220 1578 1716 -43220 1604 1616 -43220 1606 1716 -43220 1681 1525 -43220 1770 1489 -43220 1496 1505 -43220 1538 1563 -43220 1603 1740 -43220 1652 1747 -43220 1712 1463 -43220 1857 1526 -43220 1628 1712 -43220 1740 1858 -43220 1857 1470 -43220 1644 1504 -43220 1769 1487 -43220 1591 1740 -43220 1538 1524 -43220 1644 1467 -43220 1840 1489 -43220 1767 1840 -43220 1767 1489 -43220 1549 1525 -43220 1645 1756 -43220 1591 1665 -43220 1731 1863 -43220 1591 1858 -43220 1665 1858 -43220 1650 1668 -43240 1544 1531 -43240 1544 1527 -43240 1547 1606 -43240 1549 1681 -43240 1553 1599 -43240 1559 1531 -43240 1578 1716 -43240 1581 1761 -43240 1596 1920 -43240 1596 1497 -43240 1604 1616 -43240 1606 1716 -43240 1661 1712 -43240 1681 1525 -43240 1770 1489 -43240 1430 1501 -43240 1431 1516 -43240 1441 1489 -43240 1496 1505 -43240 1512 1527 -43240 1538 1563 -43240 1603 1740 -43240 1652 1747 -43240 1665 1740 -43240 1712 1463 -43240 1857 1526 -43240 1595 1654 -43240 1628 1712 -43240 1630 1761 -43240 1727 1845 -43240 1740 1858 -43240 1857 1470 -43240 1591 1603 -43240 1603 1665 -43240 1603 1858 -43240 1644 1504 -43240 1769 1487 -43240 1467 1504 -43240 1545 1501 -43240 1591 1740 -43240 1538 1524 -43240 1644 1467 -43240 1840 1489 -43240 1767 1840 -43240 1767 1489 -43240 1549 1525 -43240 1645 1756 -43240 1591 1665 -43240 1731 1863 -43240 1591 1858 -43240 1665 1858 -43240 1650 1668 -43260 1538 1563 -43260 1544 1549 -43260 1545 1430 -43260 1599 1825 -43260 1603 1740 -43260 1652 1747 -43260 1655 1434 -43260 1655 1727 -43260 1665 1740 -43260 1712 1463 -43260 1727 1512 -43260 1735 1465 -43260 1857 1526 -43260 1437 1470 -43260 1449 1531 -43260 1527 1531 -43260 1595 1654 -43260 1628 1712 -43260 1630 1761 -43260 1727 1434 -43260 1727 1845 -43260 1740 1858 -43260 1857 1470 -43260 1437 1526 -43260 1470 1526 -43260 1591 1603 -43260 1603 1665 -43260 1603 1858 -43260 1644 1504 -43260 1769 1487 -43260 1467 1504 -43260 1545 1501 -43260 1559 1527 -43260 1591 1740 -43260 1655 1845 -43260 1845 1434 -43260 1538 1524 -43260 1644 1467 -43260 1840 1489 -43260 1767 1840 -43260 1767 1489 -43260 1549 1525 -43260 1459 1468 -43260 1647 1495 -43260 1645 1756 -43260 1591 1665 -43260 1731 1863 -43260 1591 1858 -43260 1665 1858 -43260 1650 1668 -43280 1548 1431 -43280 1549 1681 -43280 1558 1459 -43280 1569 1742 -43280 1595 1654 -43280 1599 1529 -43280 1604 1616 -43280 1628 1712 -43280 1630 1761 -43280 1674 1495 -43280 1681 1825 -43280 1727 1434 -43280 1727 1845 -43280 1740 1858 -43280 1770 1489 -43280 1783 1527 -43280 1857 1470 -43280 1437 1526 -43280 1470 1526 -43280 1591 1603 -43280 1603 1665 -43280 1603 1858 -43280 1644 1504 -43280 1655 1512 -43280 1664 1821 -43280 1769 1487 -43280 1467 1504 -43280 1545 1501 -43280 1559 1527 -43280 1591 1740 -43280 1496 1505 -43280 1655 1845 -43280 1845 1434 -43280 1538 1524 -43280 1644 1467 -43280 1840 1489 -43280 1767 1840 -43280 1767 1489 -43280 1549 1525 -43280 1459 1468 -43280 1647 1495 -43280 1645 1756 -43280 1591 1665 -43280 1731 1863 -43280 1591 1858 -43280 1665 1858 -43280 1650 1668 -43300 1545 1430 -43300 1577 1511 -43300 1591 1603 -43300 1603 1665 -43300 1603 1858 -43300 1617 1470 -43300 1644 1504 -43300 1655 1512 -43300 1664 1821 -43300 1688 1761 -43300 1727 1512 -43300 1742 1770 -43300 1769 1487 -43300 1791 1453 -43300 1467 1504 -43300 1500 1511 -43300 1545 1501 -43300 1558 1468 -43300 1559 1527 -43300 1591 1740 -43300 1496 1505 -43300 1546 1459 -43300 1546 1558 -43300 1559 1599 -43300 1655 1845 -43300 1845 1434 -43300 1578 1857 -43300 1538 1524 -43300 1644 1467 -43300 1840 1489 -43300 1767 1840 -43300 1767 1489 -43300 1549 1525 -43300 1459 1468 -43300 1647 1495 -43300 1645 1756 -43300 1591 1665 -43300 1731 1863 -43300 1591 1858 -43300 1665 1858 -43300 1650 1668 -43320 1538 1592 -43320 1545 1501 -43320 1546 1606 -43320 1549 1531 -43320 1558 1468 -43320 1559 1527 -43320 1563 1592 -43320 1578 1617 -43320 1591 1740 -43320 1592 1524 -43320 1600 1529 -43320 1606 1459 -43320 1617 1857 -43320 1712 1463 -43320 1430 1501 -43320 1496 1505 -43320 1538 1563 -43320 1546 1459 -43320 1546 1558 -43320 1559 1599 -43320 1655 1845 -43320 1845 1434 -43320 1578 1857 -43320 1630 1761 -43320 1538 1524 -43320 1644 1467 -43320 1840 1489 -43320 1767 1840 -43320 1767 1489 -43320 1549 1525 -43320 1459 1468 -43320 1647 1495 -43320 1645 1756 -43320 1591 1665 -43320 1731 1863 -43320 1591 1858 -43320 1665 1858 -43320 1650 1668 -43340 1538 1563 -43340 1546 1459 -43340 1546 1558 -43340 1559 1599 -43340 1580 1463 -43340 1604 1616 -43340 1655 1845 -43340 1769 1487 -43340 1519 1525 -43340 1599 1449 -43340 1845 1434 -43340 1578 1857 -43340 1630 1761 -43340 1538 1524 -43340 1644 1467 -43340 1840 1489 -43340 1767 1840 -43340 1767 1489 -43340 1549 1525 -43340 1459 1468 -43340 1544 1659 -43340 1647 1495 -43340 1645 1756 -43340 1591 1665 -43340 1731 1863 -43340 1591 1858 -43340 1665 1858 -43340 1650 1668 -43360 1583 1523 -43360 1599 1449 -43360 1688 1496 -43360 1688 1831 -43360 1735 1465 -43360 1779 1500 -43360 1783 1449 -43360 1845 1434 -43360 1449 1531 -43360 1545 1501 -43360 1563 1524 -43360 1569 1742 -43360 1449 1532 -43360 1578 1857 -43360 1630 1761 -43360 1467 1504 -43360 1538 1524 -43360 1644 1467 -43360 1443 1487 -43360 1840 1489 -43360 1767 1840 -43360 1767 1489 -43360 1549 1525 -43360 1459 1468 -43360 1544 1659 -43360 1647 1495 -43360 1645 1756 -43360 1591 1665 -43360 1731 1863 -43360 1591 1858 -43360 1665 1858 -43360 1650 1668 -43380 1538 1563 -43380 1545 1501 -43380 1546 1606 -43380 1559 1599 -43380 1559 1527 -43380 1563 1524 -43380 1569 1622 -43380 1569 1742 -43380 1617 1511 -43380 1622 1742 -43380 1644 1674 -43380 1666 1688 -43380 1667 1520 -43380 1791 1453 -43380 1449 1532 -43380 1505 1526 -43380 1599 1527 -43380 1617 1500 -43380 1578 1857 -43380 1630 1761 -43380 1467 1504 -43380 1538 1524 -43380 1550 1448 -43380 1644 1467 -43380 1443 1487 -43380 1840 1489 -43380 1767 1840 -43380 1767 1489 -43380 1549 1525 -43380 1459 1468 -43380 1544 1659 -43380 1647 1495 -43380 1645 1756 -43380 1591 1665 -43380 1731 1863 -43380 1591 1858 -43380 1665 1858 -43380 1650 1668 -43400 1599 1825 -43400 1599 1527 -43400 1600 1519 -43400 1617 1500 -43400 1651 1532 -43400 1664 1821 -43400 1681 1523 -43400 1716 1845 -43400 1716 1727 -43400 1761 1487 -43400 1825 1523 -43400 1825 1525 -43400 1825 1527 -43400 1531 1532 -43400 1547 1845 -43400 1578 1857 -43400 1630 1761 -43400 1467 1504 -43400 1538 1524 -43400 1550 1448 -43400 1644 1467 -43400 1706 1501 -43400 1443 1487 -43400 1840 1489 -43400 1767 1840 -43400 1767 1489 -43400 1549 1525 -43400 1459 1468 -43400 1544 1659 -43400 1647 1495 -43400 1665 1740 -43400 1598 1676 -43400 1645 1756 -43400 1591 1665 -43400 1731 1863 -43400 1740 1858 -43400 1591 1858 -43400 1591 1740 -43400 1665 1858 -43400 1650 1668 -43420 1547 1845 -43420 1559 1825 -43420 1559 1599 -43420 1578 1857 -43420 1630 1761 -43420 1655 1531 -43420 1688 1503 -43420 1871 1517 -43420 1467 1504 -43420 1652 1747 -43420 1538 1524 -43420 1546 1606 -43420 1550 1448 -43420 1644 1467 -43420 1706 1501 -43420 1443 1487 -43420 1840 1489 -43420 1559 1527 -43420 1767 1840 -43420 1767 1489 -43420 1523 1527 -43420 1716 1434 -43420 1549 1525 -43420 1459 1468 -43420 1500 1511 -43420 1544 1659 -43420 1496 1505 -43420 1647 1495 -43420 1665 1740 -43420 1598 1676 -43420 1645 1756 -43420 1591 1665 -43420 1731 1863 -43420 1740 1858 -43420 1591 1858 -43420 1591 1740 -43420 1665 1858 -43420 1650 1668 -43440 1538 1592 -43440 1552 1842 -43440 1559 1523 -43440 1603 1526 -43440 1642 1643 -43440 1643 1739 -43440 1652 1747 -43440 1664 1448 -43440 1664 1821 -43440 1701 1443 -43440 1716 1845 -43440 1772 1459 -43440 1805 1531 -43440 1538 1524 -43440 1546 1606 -43440 1550 1448 -43440 1642 1739 -43440 1644 1467 -43440 1706 1501 -43440 1443 1487 -43440 1596 1920 -43440 1840 1489 -43440 1559 1527 -43440 1716 1727 -43440 1767 1840 -43440 1767 1489 -43440 1523 1527 -43440 1599 1689 -43440 1716 1434 -43440 1549 1525 -43440 1585 1599 -43440 1459 1468 -43440 1500 1511 -43440 1544 1659 -43440 1496 1505 -43440 1647 1495 -43440 1665 1740 -43440 1598 1676 -43440 1645 1756 -43440 1591 1665 -43440 1731 1863 -43440 1740 1858 -43440 1591 1858 -43440 1591 1740 -43440 1665 1858 -43440 1650 1668 -43460 1538 1524 -43460 1546 1606 -43460 1550 1448 -43460 1550 1501 -43460 1604 1616 -43460 1604 1501 -43460 1642 1739 -43460 1706 1448 -43460 1805 1888 -43460 1563 1524 -43460 1644 1467 -43460 1706 1501 -43460 1443 1487 -43460 1448 1501 -43460 1467 1504 -43460 1596 1920 -43460 1840 1489 -43460 1559 1527 -43460 1716 1727 -43460 1767 1840 -43460 1767 1489 -43460 1523 1527 -43460 1599 1689 -43460 1716 1434 -43460 1549 1525 -43460 1585 1599 -43460 1459 1468 -43460 1500 1511 -43460 1544 1659 -43460 1496 1505 -43460 1647 1495 -43460 1665 1740 -43460 1598 1676 -43460 1645 1756 -43460 1591 1665 -43460 1731 1863 -43460 1740 1858 -43460 1591 1858 -43460 1591 1740 -43460 1665 1858 -43460 1650 1668 -43480 1563 1524 -43480 1630 1821 -43480 1644 1467 -43480 1664 1448 -43480 1664 1706 -43480 1664 1501 -43480 1706 1501 -43480 1431 1516 -43480 1443 1487 -43480 1448 1501 -43480 1467 1504 -43480 1596 1920 -43480 1840 1489 -43480 1559 1523 -43480 1559 1527 -43480 1716 1727 -43480 1767 1840 -43480 1767 1489 -43480 1523 1527 -43480 1599 1689 -43480 1716 1434 -43480 1558 1459 -43480 1716 1845 -43480 1549 1525 -43480 1585 1599 -43480 1459 1468 -43480 1500 1511 -43480 1544 1659 -43480 1496 1505 -43480 1647 1495 -43480 1665 1740 -43480 1598 1676 -43480 1645 1756 -43480 1591 1665 -43480 1731 1863 -43480 1740 1858 -43480 1591 1858 -43480 1591 1740 -43480 1665 1858 -43480 1650 1668 -43500 1550 1791 -43500 1568 1524 -43500 1586 1639 -43500 1596 1920 -43500 1666 1701 -43500 1840 1489 -43500 1511 1520 -43500 1559 1523 -43500 1559 1527 -43500 1642 1739 -43500 1716 1727 -43500 1767 1840 -43500 1767 1489 -43500 1523 1527 -43500 1576 1599 -43500 1599 1689 -43500 1716 1434 -43500 1547 1845 -43500 1558 1459 -43500 1716 1845 -43500 1549 1525 -43500 1585 1599 -43500 1459 1468 -43500 1500 1511 -43500 1544 1659 -43500 1496 1505 -43500 1647 1495 -43500 1665 1740 -43500 1598 1676 -43500 1645 1756 -43500 1591 1665 -43500 1731 1863 -43500 1740 1858 -43500 1591 1858 -43500 1591 1740 -43500 1665 1858 -43500 1650 1668 -43520 1543 1622 -43520 1548 1516 -43520 1550 1448 -43520 1555 1664 -43520 1555 1501 -43520 1559 1523 -43520 1559 1527 -43520 1578 1523 -43520 1642 1739 -43520 1664 1501 -43520 1677 1701 -43520 1681 1523 -43520 1688 1904 -43520 1716 1727 -43520 1767 1840 -43520 1767 1489 -43520 1523 1527 -43520 1576 1599 -43520 1599 1689 -43520 1600 1519 -43520 1716 1434 -43520 1547 1845 -43520 1558 1459 -43520 1716 1845 -43520 1549 1525 -43520 1578 1681 -43520 1585 1599 -43520 1459 1468 -43520 1449 1531 -43520 1500 1511 -43520 1544 1659 -43520 1496 1505 -43520 1647 1495 -43520 1665 1740 -43520 1598 1676 -43520 1645 1756 -43520 1591 1665 -43520 1731 1863 -43520 1740 1858 -43520 1591 1858 -43520 1591 1740 -43520 1665 1858 -43520 1650 1668 -43540 1538 1563 -43540 1576 1599 -43540 1599 1689 -43540 1600 1519 -43540 1689 1443 -43540 1716 1434 -43540 1727 1434 -43540 1761 1493 -43540 1825 1519 -43540 1845 1434 -43540 1547 1845 -43540 1558 1459 -43540 1577 1441 -43540 1628 1463 -43540 1716 1845 -43540 1549 1525 -43540 1578 1681 -43540 1585 1599 -43540 1644 1467 -43540 1857 1441 -43540 1459 1468 -43540 1449 1531 -43540 1500 1511 -43540 1544 1659 -43540 1617 1441 -43540 1496 1505 -43540 1527 1531 -43540 1647 1495 -43540 1665 1740 -43540 1598 1676 -43540 1645 1756 -43540 1591 1665 -43540 1731 1863 -43540 1740 1858 -43540 1591 1858 -43540 1591 1740 -43540 1665 1858 -43540 1650 1668 -43560 1547 1845 -43560 1558 1459 -43560 1577 1617 -43560 1577 1441 -43560 1578 1527 -43560 1582 1513 -43560 1599 1443 -43560 1600 1825 -43560 1628 1463 -43560 1681 1527 -43560 1716 1845 -43560 1549 1525 -43560 1550 1448 -43560 1578 1681 -43560 1585 1599 -43560 1644 1467 -43560 1857 1441 -43560 1459 1468 -43560 1681 1523 -43560 1449 1531 -43560 1500 1511 -43560 1543 1622 -43560 1544 1659 -43560 1617 1441 -43560 1496 1505 -43560 1527 1531 -43560 1647 1495 -43560 1665 1740 -43560 1598 1676 -43560 1645 1756 -43560 1591 1665 -43560 1731 1863 -43560 1740 1858 -43560 1591 1858 -43560 1591 1740 -43560 1665 1858 -43560 1650 1668 -43580 1547 1716 -43580 1549 1525 -43580 1550 1448 -43580 1576 1599 -43580 1578 1681 -43580 1581 1831 -43580 1585 1599 -43580 1642 1739 -43580 1644 1467 -43580 1689 1443 -43580 1767 1489 -43580 1779 1903 -43580 1857 1441 -43580 1459 1468 -43580 1642 1834 -43580 1681 1523 -43580 1761 1493 -43580 1449 1531 -43580 1500 1511 -43580 1543 1622 -43580 1544 1659 -43580 1617 1441 -43580 1496 1505 -43580 1655 1911 -43580 1527 1531 -43580 1647 1495 -43580 1665 1740 -43580 1598 1676 -43580 1645 1756 -43580 1591 1665 -43580 1731 1863 -43580 1740 1858 -43580 1591 1858 -43580 1591 1740 -43580 1665 1858 -43580 1650 1668 -43600 1538 1563 -43600 1608 1700 -43600 1642 1834 -43600 1681 1523 -43600 1761 1493 -43600 1774 1459 -43600 1449 1531 -43600 1497 1526 -43600 1500 1511 -43600 1543 1622 -43600 1544 1659 -43600 1600 1825 -43600 1617 1857 -43600 1617 1441 -43600 1655 1784 -43600 1784 1911 -43600 1853 1513 -43600 1496 1505 -43600 1603 1834 -43600 1655 1911 -43600 1527 1531 -43600 1647 1495 -43600 1600 1519 -43600 1665 1740 -43600 1598 1676 -43600 1645 1756 -43600 1591 1665 -43600 1731 1863 -43600 1740 1858 -43600 1591 1858 -43600 1591 1740 -43600 1665 1858 -43600 1650 1668 -43620 1543 1622 -43620 1544 1659 -43620 1549 1553 -43620 1600 1825 -43620 1617 1857 -43620 1617 1441 -43620 1655 1784 -43620 1688 1443 -43620 1784 1911 -43620 1853 1513 -43620 1919 1427 -43620 1496 1505 -43620 1523 1525 -43620 1578 1681 -43620 1603 1834 -43620 1655 1911 -43620 1716 1784 -43620 1568 1825 -43620 1677 1701 -43620 1527 1531 -43620 1647 1495 -43620 1600 1519 -43620 1665 1740 -43620 1598 1676 -43620 1645 1756 -43620 1591 1665 -43620 1731 1863 -43620 1740 1858 -43620 1591 1858 -43620 1591 1740 -43620 1665 1858 -43620 1650 1668 -43640 1578 1681 -43640 1591 1831 -43640 1599 1531 -43640 1603 1834 -43640 1642 1739 -43640 1644 1467 -43640 1655 1911 -43640 1707 1524 -43640 1716 1784 -43640 1761 1493 -43640 1568 1825 -43640 1647 1831 -43640 1677 1701 -43640 1527 1531 -43640 1647 1495 -43640 1831 1495 -43640 1599 1655 -43640 1600 1519 -43640 1665 1740 -43640 1598 1676 -43640 1645 1756 -43640 1591 1665 -43640 1731 1863 -43640 1740 1858 -43640 1591 1858 -43640 1591 1740 -43640 1665 1858 -43640 1650 1668 -43660 1539 1789 -43660 1568 1825 -43660 1583 1523 -43660 1591 1495 -43660 1594 1696 -43660 1630 1524 -43660 1647 1831 -43660 1655 1527 -43660 1677 1701 -43660 1808 1464 -43660 1527 1531 -43660 1544 1659 -43660 1547 1716 -43660 1603 1643 -43660 1647 1495 -43660 1698 1707 -43660 1831 1495 -43660 1599 1655 -43660 1600 1519 -43660 1665 1740 -43660 1716 1911 -43660 1784 1911 -43660 1496 1505 -43660 1598 1676 -43660 1645 1756 -43660 1591 1665 -43660 1731 1863 -43660 1740 1858 -43660 1591 1858 -43660 1591 1740 -43660 1665 1858 -43660 1650 1668 -43680 1538 1563 -43680 1539 1707 -43680 1544 1659 -43680 1547 1716 -43680 1559 1574 -43680 1577 1599 -43680 1603 1643 -43680 1644 1467 -43680 1647 1495 -43680 1650 1463 -43680 1698 1707 -43680 1698 1764 -43680 1707 1764 -43680 1716 1784 -43680 1761 1493 -43680 1767 1489 -43680 1467 1495 -43680 1543 1622 -43680 1831 1495 -43680 1599 1655 -43680 1600 1519 -43680 1665 1740 -43680 1716 1911 -43680 1784 1911 -43680 1630 1648 -43680 1496 1505 -43680 1598 1676 -43680 1628 1783 -43680 1645 1756 -43680 1591 1665 -43680 1731 1863 -43680 1716 1458 -43680 1740 1858 -43680 1591 1858 -43680 1591 1740 -43680 1665 1858 -43680 1650 1668 -43700 1543 1622 -43700 1547 1458 -43700 1577 1655 -43700 1617 1857 -43700 1617 1441 -43700 1630 1524 -43700 1642 1643 -43700 1642 1739 -43700 1644 1831 -43700 1688 1527 -43700 1831 1495 -43700 1500 1511 -43700 1527 1531 -43700 1599 1655 -43700 1600 1519 -43700 1665 1740 -43700 1716 1911 -43700 1770 1489 -43700 1784 1911 -43700 1630 1648 -43700 1496 1505 -43700 1598 1676 -43700 1628 1783 -43700 1645 1756 -43700 1857 1441 -43700 1591 1665 -43700 1731 1863 -43700 1716 1458 -43700 1740 1858 -43700 1591 1858 -43700 1591 1740 -43700 1665 1858 -43700 1650 1668 -43720 1538 1563 -43720 1568 1674 -43720 1599 1655 -43720 1600 1519 -43720 1628 1489 -43720 1644 1467 -43720 1648 1524 -43720 1665 1740 -43720 1716 1911 -43720 1770 1489 -43720 1784 1911 -43720 1842 1526 -43720 1857 1503 -43720 1911 1458 -43720 1523 1525 -43720 1630 1648 -43720 1681 1529 -43720 1698 1866 -43720 1496 1505 -43720 1577 1599 -43720 1598 1676 -43720 1628 1783 -43720 1645 1756 -43720 1857 1441 -43720 1591 1665 -43720 1731 1863 -43720 1716 1458 -43720 1740 1858 -43720 1591 1858 -43720 1591 1740 -43720 1665 1858 -43720 1650 1668 -43740 1543 1622 -43740 1558 1459 -43740 1580 1463 -43740 1630 1648 -43740 1681 1529 -43740 1698 1866 -43740 1698 1764 -43740 1784 1459 -43740 1825 1519 -43740 1845 1434 -43740 1465 1503 -43740 1496 1505 -43740 1577 1599 -43740 1598 1676 -43740 1628 1783 -43740 1645 1756 -43740 1665 1831 -43740 1676 1434 -43740 1857 1441 -43740 1591 1665 -43740 1647 1495 -43740 1731 1863 -43740 1716 1458 -43740 1740 1858 -43740 1591 1858 -43740 1591 1740 -43740 1665 1858 -43740 1650 1668 -43760 1547 1459 -43760 1577 1599 -43760 1593 1503 -43760 1630 1789 -43760 1642 1739 -43760 1644 1858 -43760 1676 1845 -43760 1681 1523 -43760 1700 1487 -43760 1716 1459 -43760 1767 1489 -43760 1825 1525 -43760 1598 1676 -43760 1628 1783 -43760 1645 1756 -43760 1661 1712 -43760 1665 1831 -43760 1676 1434 -43760 1716 1468 -43760 1857 1441 -43760 1591 1665 -43760 1644 1467 -43760 1647 1495 -43760 1700 1528 -43760 1731 1863 -43760 1665 1740 -43760 1547 1458 -43760 1716 1458 -43760 1740 1858 -43760 1538 1563 -43760 1591 1858 -43760 1591 1740 -43760 1665 1858 -43760 1650 1668 -43780 1598 1676 -43780 1628 1783 -43780 1645 1756 -43780 1661 1712 -43780 1665 1831 -43780 1676 1434 -43780 1676 1470 -43780 1700 1464 -43780 1716 1468 -43780 1831 1465 -43780 1857 1441 -43780 1449 1496 -43780 1458 1468 -43780 1467 1504 -43780 1583 1600 -43780 1591 1665 -43780 1644 1467 -43780 1647 1495 -43780 1700 1528 -43780 1825 1519 -43780 1496 1505 -43780 1731 1863 -43780 1770 1437 -43780 1840 1489 -43780 1665 1740 -43780 1698 1764 -43780 1547 1458 -43780 1716 1458 -43780 1740 1858 -43780 1784 1441 -43780 1458 1459 -43780 1538 1563 -43780 1591 1858 -43780 1591 1740 -43780 1665 1858 -43780 1650 1668 -43800 1577 1599 -43800 1583 1600 -43800 1591 1665 -43800 1599 1779 -43800 1617 1465 -43800 1644 1467 -43800 1647 1495 -43800 1700 1528 -43800 1779 1489 -43800 1825 1519 -43800 1449 1505 -43800 1496 1505 -43800 1519 1529 -43800 1549 1583 -43800 1716 1459 -43800 1731 1863 -43800 1770 1437 -43800 1840 1489 -43800 1459 1468 -43800 1665 1740 -43800 1698 1764 -43800 1547 1558 -43800 1547 1458 -43800 1716 1458 -43800 1740 1858 -43800 1784 1441 -43800 1458 1459 -43800 1538 1563 -43800 1547 1459 -43800 1544 1659 -43800 1591 1858 -43800 1591 1740 -43800 1665 1858 -43800 1650 1668 -43820 1549 1583 -43820 1600 1519 -43820 1645 1756 -43820 1648 1524 -43820 1681 1525 -43820 1716 1459 -43820 1731 1863 -43820 1770 1437 -43820 1840 1489 -43820 1863 1512 -43820 1459 1468 -43820 1519 1523 -43820 1665 1740 -43820 1698 1764 -43820 1731 1512 -43820 1547 1558 -43820 1716 1526 -43820 1547 1458 -43820 1716 1458 -43820 1740 1858 -43820 1784 1441 -43820 1599 1449 -43820 1458 1459 -43820 1538 1563 -43820 1547 1459 -43820 1544 1659 -43820 1591 1858 -43820 1591 1740 -43820 1665 1858 -43820 1650 1668 -43840 1540 1542 -43840 1547 1468 -43840 1665 1740 -43840 1681 1529 -43840 1698 1764 -43840 1731 1512 -43840 1770 1495 -43840 1784 1911 -43840 1853 1532 -43840 1458 1526 -43840 1459 1526 -43840 1547 1558 -43840 1596 1779 -43840 1716 1526 -43840 1547 1458 -43840 1716 1458 -43840 1740 1858 -43840 1784 1441 -43840 1599 1449 -43840 1647 1495 -43840 1458 1459 -43840 1538 1563 -43840 1547 1459 -43840 1500 1511 -43840 1558 1468 -43840 1544 1659 -43840 1591 1858 -43840 1591 1740 -43840 1665 1858 -43840 1650 1668 -43860 1547 1558 -43860 1558 1459 -43860 1596 1779 -43860 1600 1519 -43860 1644 1740 -43860 1671 1911 -43860 1681 1525 -43860 1707 1517 -43860 1716 1526 -43860 1727 1434 -43860 1911 1441 -43860 1919 1427 -43860 1523 1525 -43860 1547 1458 -43860 1676 1434 -43860 1681 1825 -43860 1716 1458 -43860 1740 1858 -43860 1784 1441 -43860 1459 1468 -43860 1599 1449 -43860 1647 1495 -43860 1458 1459 -43860 1538 1563 -43860 1547 1459 -43860 1628 1783 -43860 1731 1863 -43860 1840 1489 -43860 1645 1756 -43860 1500 1511 -43860 1558 1468 -43860 1544 1659 -43860 1591 1858 -43860 1591 1740 -43860 1665 1858 -43860 1650 1668 -43880 1537 1576 -43880 1547 1458 -43880 1563 1592 -43880 1595 1853 -43880 1617 1911 -43880 1676 1434 -43880 1681 1825 -43880 1681 1523 -43880 1716 1458 -43880 1731 1512 -43880 1740 1858 -43880 1784 1441 -43880 1825 1523 -43880 1458 1468 -43880 1459 1468 -43880 1537 1585 -43880 1547 1716 -43880 1599 1449 -43880 1642 1643 -43880 1647 1495 -43880 1665 1740 -43880 1458 1459 -43880 1538 1563 -43880 1547 1459 -43880 1591 1665 -43880 1628 1783 -43880 1731 1863 -43880 1840 1489 -43880 1645 1756 -43880 1500 1511 -43880 1558 1468 -43880 1544 1659 -43880 1591 1858 -43880 1591 1740 -43880 1665 1858 -43880 1650 1668 -43900 1537 1585 -43900 1547 1716 -43900 1549 1553 -43900 1586 1639 -43900 1599 1449 -43900 1642 1643 -43900 1644 1504 -43900 1644 1740 -43900 1647 1495 -43900 1665 1740 -43900 1676 1439 -43900 1784 1911 -43900 1839 1911 -43900 1919 1427 -43900 1434 1439 -43900 1458 1459 -43900 1538 1563 -43900 1547 1459 -43900 1558 1716 -43900 1591 1665 -43900 1628 1783 -43900 1523 1525 -43900 1731 1863 -43900 1840 1489 -43900 1645 1756 -43900 1500 1511 -43900 1558 1468 -43900 1544 1659 -43900 1591 1858 -43900 1591 1740 -43900 1665 1858 -43900 1650 1668 -43920 1538 1563 -43920 1547 1459 -43920 1558 1716 -43920 1591 1665 -43920 1596 1598 -43920 1628 1463 -43920 1628 1783 -43920 1644 1874 -43920 1713 1514 -43920 1783 1463 -43920 1523 1525 -43920 1577 1655 -43920 1599 1655 -43920 1731 1863 -43920 1840 1489 -43920 1645 1756 -43920 1716 1468 -43920 1500 1511 -43920 1558 1468 -43920 1740 1858 -43920 1544 1659 -43920 1591 1858 -43920 1591 1740 -43920 1665 1858 -43920 1650 1668 -43940 1547 1716 -43940 1577 1655 -43940 1592 1600 -43940 1598 1659 -43940 1599 1655 -43940 1731 1512 -43940 1731 1863 -43940 1784 1911 -43940 1840 1489 -43940 1874 1495 -43940 1582 1600 -43940 1645 1756 -43940 1716 1459 -43940 1716 1468 -43940 1547 1558 -43940 1500 1511 -43940 1544 1598 -43940 1558 1468 -43940 1740 1858 -43940 1544 1659 -43940 1577 1599 -43940 1591 1858 -43940 1591 1740 -43940 1665 1858 -43940 1467 1495 -43940 1650 1668 -43960 1549 1553 -43960 1582 1600 -43960 1582 1825 -43960 1592 1911 -43960 1645 1756 -43960 1716 1459 -43960 1716 1468 -43960 1459 1468 -43960 1507 1522 -43960 1523 1525 -43960 1547 1459 -43960 1547 1468 -43960 1547 1558 -43960 1573 1452 -43960 1596 1920 -43960 1500 1511 -43960 1544 1598 -43960 1558 1468 -43960 1740 1858 -43960 1544 1659 -43960 1577 1599 -43960 1591 1858 -43960 1591 1740 -43960 1665 1858 -43960 1467 1495 -43960 1600 1519 -43960 1650 1668 -43980 1547 1459 -43980 1547 1468 -43980 1547 1558 -43980 1549 1523 -43980 1549 1525 -43980 1549 1583 -43980 1550 1791 -43980 1558 1716 -43980 1573 1452 -43980 1596 1920 -43980 1665 1740 -43980 1853 1513 -43980 1500 1511 -43980 1544 1598 -43980 1558 1468 -43980 1700 1528 -43980 1740 1858 -43980 1840 1489 -43980 1857 1441 -43980 1544 1659 -43980 1577 1599 -43980 1591 1858 -43980 1591 1740 -43980 1665 1858 -43980 1467 1495 -43980 1591 1665 -43980 1582 1628 -43980 1600 1519 -43980 1441 1489 -43980 1650 1668 -44000 1544 1598 -44000 1558 1459 -44000 1558 1468 -44000 1700 1528 -44000 1740 1858 -44000 1840 1489 -44000 1857 1441 -44000 1459 1468 -44000 1544 1659 -44000 1577 1599 -44000 1591 1858 -44000 1591 1740 -44000 1665 1858 -44000 1467 1495 -44000 1591 1665 -44000 1582 1628 -44000 1600 1519 -44000 1441 1489 -44000 1650 1668 -44020 1544 1659 -44020 1577 1599 -44020 1591 1858 -44020 1591 1740 -44020 1665 1858 -44020 1666 1495 -44020 1716 1495 -44020 1467 1495 -44020 1495 1521 -44020 1523 1525 -44020 1547 1716 -44020 1591 1665 -44020 1655 1899 -44020 1582 1628 -44020 1600 1519 -44020 1441 1489 -44020 1500 1511 -44020 1650 1668 -44040 1547 1716 -44040 1591 1665 -44040 1643 1645 -44040 1655 1899 -44040 1700 1497 -44040 1582 1628 -44040 1600 1519 -44040 1857 1489 -44040 1441 1489 -44040 1645 1756 -44040 1500 1511 -44040 1650 1668 -44060 1665 1858 -44060 1681 1525 -44060 1700 1497 -44060 1700 1505 -44060 1899 1459 -44060 1582 1628 -44060 1600 1519 -44060 1767 1840 -44060 1857 1489 -44060 1467 1495 -44060 1523 1525 -44060 1544 1659 -44060 1655 1459 -44060 1441 1489 -44060 1645 1756 -44060 1500 1511 -44060 1650 1668 -44080 1558 1678 -44080 1582 1628 -44080 1600 1519 -44080 1603 1899 -44080 1681 1523 -44080 1700 1727 -44080 1767 1840 -44080 1857 1489 -44080 1857 1441 -44080 1467 1495 -44080 1523 1525 -44080 1582 1643 -44080 1591 1665 -44080 1593 1847 -44080 1678 1468 -44080 1544 1659 -44080 1547 1716 -44080 1655 1459 -44080 1441 1489 -44080 1847 1470 -44080 1645 1756 -44080 1647 1713 -44080 1500 1511 -44080 1650 1668 -44100 1577 1599 -44100 1582 1643 -44100 1591 1665 -44100 1593 1847 -44100 1651 1523 -44100 1665 1858 -44100 1678 1468 -44100 1700 1434 -44100 1825 1525 -44100 1840 1489 -44100 1497 1505 -44100 1544 1659 -44100 1547 1716 -44100 1591 1858 -44100 1655 1459 -44100 1673 1680 -44100 1673 1732 -44100 1441 1489 -44100 1847 1470 -44100 1645 1756 -44100 1680 1732 -44100 1647 1713 -44100 1500 1511 -44100 1650 1668 -44120 1543 1842 -44120 1544 1659 -44120 1547 1716 -44120 1562 1467 -44120 1591 1858 -44120 1591 1532 -44120 1655 1459 -44120 1673 1680 -44120 1673 1732 -44120 1673 1765 -44120 1767 1840 -44120 1842 1888 -44120 1858 1532 -44120 1441 1489 -44120 1740 1857 -44120 1847 1470 -44120 1645 1756 -44120 1680 1732 -44120 1562 1574 -44120 1647 1713 -44120 1582 1628 -44120 1500 1511 -44120 1650 1668 -44140 1581 1467 -44140 1583 1523 -44140 1740 1857 -44140 1847 1470 -44140 1467 1495 -44140 1645 1756 -44140 1680 1732 -44140 1840 1489 -44140 1562 1574 -44140 1647 1713 -44140 1582 1628 -44140 1500 1511 -44140 1650 1668 -44160 1573 1452 -44160 1586 1758 -44160 1591 1858 -44160 1645 1756 -44160 1651 1905 -44160 1655 1905 -44160 1680 1765 -44160 1689 1762 -44160 1905 1523 -44160 1655 1523 -44160 1680 1732 -44160 1681 1525 -44160 1840 1489 -44160 1562 1574 -44160 1647 1713 -44160 1582 1628 -44160 1500 1511 -44160 1650 1668 -44180 1543 1842 -44180 1562 1433 -44180 1562 1527 -44180 1600 1519 -44180 1655 1523 -44180 1673 1765 -44180 1731 1863 -44180 1847 1470 -44180 1433 1527 -44180 1580 1463 -44180 1680 1732 -44180 1681 1525 -44180 1825 1519 -44180 1840 1489 -44180 1544 1659 -44180 1562 1574 -44180 1647 1713 -44180 1582 1628 -44180 1500 1511 -44180 1650 1668 -44200 1580 1463 -44200 1591 1665 -44200 1591 1510 -44200 1600 1825 -44200 1622 1727 -44200 1665 1858 -44200 1680 1732 -44200 1681 1525 -44200 1825 1519 -44200 1831 1498 -44200 1840 1489 -44200 1544 1659 -44200 1562 1574 -44200 1647 1713 -44200 1582 1628 -44200 1500 1511 -44200 1650 1668 -44220 1591 1517 -44220 1747 1433 -44220 1784 1911 -44220 1544 1659 -44220 1562 1574 -44220 1647 1713 -44220 1582 1628 -44220 1500 1511 -44220 1650 1668 -44240 1544 1659 -44240 1562 1574 -44240 1617 1441 -44240 1622 1505 -44240 1622 1842 -44240 1647 1713 -44240 1661 1712 -44240 1680 1732 -44240 1582 1628 -44240 1500 1511 -44240 1650 1668 -44260 1600 1519 -44260 1622 1727 -44260 1582 1628 -44260 1599 1655 -44260 1840 1489 -44260 1500 1511 -44260 1650 1668 -44280 1563 1532 -44280 1573 1452 -44280 1593 1521 -44280 1606 1516 -44280 1673 1765 -44280 1740 1857 -44280 1582 1628 -44280 1599 1655 -44280 1617 1740 -44280 1661 1712 -44280 1840 1489 -44280 1500 1511 -44280 1650 1668 -44300 1582 1628 -44300 1599 1655 -44300 1617 1740 -44300 1661 1712 -44300 1840 1489 -44300 1500 1511 -44300 1650 1668 -44320 1582 1628 -44320 1599 1655 -44320 1496 1497 -44320 1582 1603 -44320 1617 1740 -44320 1661 1712 -44320 1740 1857 -44320 1840 1489 -44320 1500 1511 -44320 1650 1668 -44340 1582 1603 -44340 1603 1463 -44340 1617 1740 -44340 1661 1712 -44340 1740 1857 -44340 1840 1489 -44340 1500 1511 -44340 1650 1668 -44360 1681 1825 -44360 1716 1808 -44360 1470 1525 -44360 1582 1628 -44360 1840 1489 -44360 1500 1511 -44360 1650 1668 -44380 1599 1655 -44380 1651 1523 -44380 1731 1863 -44380 1767 1489 -44380 1905 1523 -44380 1651 1905 -44380 1582 1628 -44380 1840 1489 -44380 1500 1511 -44380 1650 1668 -44400 1651 1825 -44400 1651 1905 -44400 1655 1678 -44400 1740 1857 -44400 1853 1513 -44400 1544 1659 -44400 1582 1628 -44400 1716 1808 -44400 1617 1857 -44400 1617 1740 -44400 1840 1489 -44400 1500 1511 -44400 1650 1668 -44420 1544 1659 -44420 1582 1628 -44420 1582 1655 -44420 1661 1712 -44420 1731 1811 -44420 1716 1808 -44420 1617 1857 -44420 1617 1740 -44420 1840 1489 -44420 1599 1655 -44420 1500 1511 -44420 1547 1643 -44420 1650 1668 -44440 1591 1517 -44440 1598 1770 -44440 1599 1825 -44440 1645 1756 -44440 1655 1523 -44440 1716 1808 -44440 1731 1831 -44440 1905 1511 -44440 1507 1522 -44440 1617 1857 -44440 1617 1740 -44440 1655 1681 -44440 1740 1857 -44440 1840 1489 -44440 1599 1681 -44440 1599 1523 -44440 1599 1655 -44440 1500 1511 -44440 1547 1643 -44440 1650 1668 -44460 1617 1857 -44460 1617 1740 -44460 1655 1681 -44460 1661 1712 -44460 1740 1857 -44460 1840 1489 -44460 1579 1678 -44460 1599 1681 -44460 1599 1523 -44460 1582 1628 -44460 1435 1532 -44460 1599 1655 -44460 1500 1511 -44460 1547 1643 -44460 1650 1668 -44480 1544 1659 -44480 1579 1678 -44480 1582 1463 -44480 1583 1523 -44480 1599 1681 -44480 1599 1523 -44480 1666 1767 -44480 1678 1503 -44480 1758 1853 -44480 1582 1628 -44480 1655 1523 -44480 1716 1808 -44480 1435 1532 -44480 1599 1655 -44480 1500 1511 -44480 1547 1643 -44480 1650 1668 -44500 1586 1853 -44500 1731 1863 -44500 1756 1770 -44500 1758 1853 -44500 1582 1628 -44500 1617 1857 -44500 1655 1523 -44500 1617 1740 -44500 1716 1808 -44500 1740 1857 -44500 1435 1532 -44500 1599 1655 -44500 1544 1529 -44500 1500 1511 -44500 1547 1643 -44500 1650 1668 -44520 1582 1628 -44520 1582 1463 -44520 1599 1813 -44520 1617 1857 -44520 1617 1666 -44520 1651 1905 -44520 1655 1523 -44520 1767 1489 -44520 1599 1683 -44520 1617 1740 -44520 1666 1857 -44520 1716 1808 -44520 1740 1857 -44520 1435 1532 -44520 1681 1813 -44520 1599 1655 -44520 1544 1529 -44520 1500 1511 -44520 1547 1643 -44520 1599 1523 -44520 1650 1668 -44540 1582 1905 -44540 1599 1683 -44540 1617 1740 -44540 1666 1857 -44540 1681 1683 -44540 1683 1704 -44540 1716 1808 -44540 1740 1857 -44540 1435 1532 -44540 1582 1651 -44540 1681 1813 -44540 1704 1813 -44540 1580 1668 -44540 1599 1655 -44540 1628 1463 -44540 1683 1813 -44540 1544 1529 -44540 1500 1511 -44540 1547 1643 -44540 1599 1523 -44540 1650 1668 -44560 1582 1651 -44560 1599 1600 -44560 1599 1825 -44560 1603 1513 -44560 1666 1489 -44560 1681 1813 -44560 1704 1813 -44560 1580 1668 -44560 1617 1857 -44560 1651 1905 -44560 1562 1463 -44560 1599 1655 -44560 1628 1463 -44560 1683 1813 -44560 1544 1529 -44560 1500 1511 -44560 1547 1643 -44560 1593 1521 -44560 1562 1628 -44560 1599 1523 -44560 1538 1920 -44560 1650 1668 -44580 1580 1668 -44580 1617 1857 -44580 1651 1905 -44580 1562 1463 -44580 1599 1655 -44580 1628 1463 -44580 1683 1813 -44580 1544 1529 -44580 1558 1516 -44580 1582 1905 -44580 1500 1511 -44580 1547 1643 -44580 1593 1521 -44580 1562 1628 -44580 1599 1523 -44580 1538 1920 -44580 1650 1668 -44600 1549 1599 -44600 1562 1463 -44600 1582 1651 -44600 1599 1655 -44600 1628 1463 -44600 1683 1813 -44600 1544 1529 -44600 1558 1516 -44600 1582 1905 -44600 1500 1511 -44600 1547 1643 -44600 1593 1521 -44600 1562 1628 -44600 1599 1523 -44600 1538 1920 -44600 1920 1522 -44600 1650 1668 -44620 1544 1529 -44620 1558 1516 -44620 1582 1905 -44620 1857 1441 -44620 1500 1511 -44620 1547 1643 -44620 1593 1521 -44620 1562 1628 -44620 1599 1523 -44620 1579 1678 -44620 1538 1920 -44620 1920 1522 -44620 1650 1668 -44640 1547 1643 -44640 1593 1521 -44640 1562 1628 -44640 1840 1489 -44640 1599 1523 -44640 1579 1678 -44640 1538 1920 -44640 1920 1522 -44640 1650 1668 -44660 1544 1659 -44660 1558 1516 -44660 1562 1628 -44660 1655 1523 -44660 1767 1489 -44660 1840 1489 -44660 1538 1522 -44660 1599 1523 -44660 1599 1655 -44660 1628 1463 -44660 1579 1678 -44660 1538 1920 -44660 1920 1522 -44660 1650 1668 -44680 1716 1808 -44680 1558 1468 -44680 1857 1441 -44680 1538 1522 -44680 1599 1523 -44680 1599 1655 -44680 1628 1463 -44680 1579 1678 -44680 1538 1920 -44680 1920 1522 -44680 1650 1668 -44700 1544 1513 -44700 1558 1468 -44700 1651 1905 -44700 1767 1489 -44700 1857 1441 -44700 1538 1522 -44700 1599 1523 -44700 1599 1655 -44700 1628 1463 -44700 1579 1678 -44700 1538 1920 -44700 1920 1522 -44700 1650 1668 -44720 1538 1522 -44720 1544 1659 -44720 1558 1606 -44720 1599 1523 -44720 1599 1655 -44720 1606 1468 -44720 1628 1463 -44720 1668 1825 -44720 1681 1683 -44720 1920 1507 -44720 1716 1808 -44720 1579 1678 -44720 1500 1511 -44720 1538 1920 -44720 1920 1522 -44720 1650 1668 -44740 1547 1765 -44740 1558 1459 -44740 1558 1468 -44740 1606 1516 -44740 1655 1523 -44740 1825 1523 -44740 1459 1468 -44740 1468 1516 -44740 1716 1808 -44740 1579 1678 -44740 1500 1511 -44740 1538 1920 -44740 1920 1522 -44740 1650 1668 -44760 1538 1522 -44760 1716 1808 -44760 1920 1507 -44760 1579 1678 -44760 1600 1519 -44760 1500 1511 -44760 1538 1920 -44760 1920 1522 -44760 1650 1668 -44780 1579 1678 -44780 1586 1758 -44780 1599 1529 -44780 1617 1666 -44780 1645 1756 -44780 1731 1831 -44780 1647 1459 -44780 1599 1525 -44780 1600 1519 -44780 1500 1511 -44780 1538 1920 -44780 1920 1522 -44780 1767 1489 -44780 1650 1668 -44800 1580 1628 -44800 1647 1459 -44800 1599 1525 -44800 1600 1519 -44800 1500 1511 -44800 1538 1920 -44800 1920 1522 -44800 1920 1507 -44800 1767 1489 -44800 1650 1668 -44820 1563 1511 -44820 1599 1525 -44820 1600 1519 -44820 1696 1920 -44820 1731 1513 -44820 1500 1511 -44820 1857 1441 -44820 1538 1920 -44820 1920 1522 -44820 1920 1507 -44820 1767 1489 -44820 1650 1668 -44840 1583 1529 -44840 1599 1529 -44840 1678 1532 -44840 1857 1441 -44840 1538 1920 -44840 1920 1522 -44840 1920 1507 -44840 1767 1489 -44840 1650 1668 -44860 1580 1628 -44860 1598 1463 -44860 1857 1441 -44860 1538 1920 -44860 1519 1523 -44860 1825 1519 -44860 1920 1522 -44860 1920 1507 -44860 1767 1489 -44860 1650 1668 -44880 1583 1529 -44880 1599 1529 -44880 1655 1754 -44880 1669 1754 -44880 1825 1523 -44880 1538 1920 -44880 1713 1762 -44880 1519 1523 -44880 1825 1519 -44880 1572 1628 -44880 1599 1525 -44880 1920 1522 -44880 1562 1603 -44880 1920 1507 -44880 1767 1489 -44880 1650 1668 -44900 1538 1920 -44900 1600 1519 -44900 1655 1825 -44900 1713 1762 -44900 1716 1770 -44900 1519 1523 -44900 1600 1655 -44900 1825 1519 -44900 1572 1628 -44900 1599 1525 -44900 1920 1522 -44900 1562 1603 -44900 1920 1507 -44900 1767 1489 -44900 1650 1668 -44920 1538 1522 -44920 1544 1659 -44920 1582 1831 -44920 1600 1523 -44920 1600 1655 -44920 1651 1905 -44920 1825 1519 -44920 1572 1628 -44920 1716 1808 -44920 1572 1580 -44920 1669 1754 -44920 1678 1716 -44920 1599 1525 -44920 1920 1522 -44920 1562 1603 -44920 1920 1507 -44920 1767 1489 -44920 1650 1668 -44940 1572 1628 -44940 1580 1628 -44940 1583 1529 -44940 1586 1758 -44940 1592 1920 -44940 1606 1468 -44940 1716 1808 -44940 1813 1489 -44940 1572 1580 -44940 1599 1529 -44940 1669 1754 -44940 1678 1716 -44940 1599 1525 -44940 1920 1522 -44940 1562 1603 -44940 1920 1507 -44940 1767 1489 -44940 1650 1668 -44960 1572 1668 -44960 1572 1580 -44960 1599 1529 -44960 1669 1754 -44960 1678 1716 -44960 1713 1762 -44960 1538 1522 -44960 1599 1525 -44960 1920 1522 -44960 1547 1808 -44960 1562 1603 -44960 1920 1507 -44960 1767 1489 -44960 1650 1668 -44980 1538 1522 -44980 1548 1431 -44980 1599 1525 -44980 1920 1522 -44980 1547 1808 -44980 1576 1689 -44980 1857 1441 -44980 1562 1603 -44980 1920 1507 -44980 1767 1489 -44980 1538 1920 -44980 1650 1668 -45000 1544 1659 -45000 1547 1808 -45000 1576 1689 -45000 1606 1468 -45000 1643 1704 -45000 1740 1905 -45000 1857 1441 -45000 1562 1603 -45000 1920 1507 -45000 1767 1489 -45000 1538 1920 -45000 1650 1668 -45020 1548 1431 -45020 1586 1758 -45020 1600 1529 -45020 1731 1863 -45020 1740 1905 -45020 1825 1519 -45020 1857 1441 -45020 1547 1716 -45020 1562 1603 -45020 1920 1507 -45020 1825 1872 -45020 1920 1522 -45020 1767 1489 -45020 1538 1920 -45020 1650 1668 -45040 1547 1716 -45040 1605 1636 -45040 1669 1754 -45040 1678 1704 -45040 1507 1522 -45040 1547 1808 -45040 1580 1628 -45040 1538 1522 -45040 1562 1603 -45040 1920 1507 -45040 1825 1872 -45040 1920 1522 -45040 1767 1489 -45040 1538 1920 -45040 1650 1668 -45060 1547 1808 -45060 1580 1628 -45060 1592 1731 -45060 1599 1600 -45060 1606 1468 -45060 1643 1704 -45060 1716 1808 -45060 1731 1863 -45060 1538 1522 -45060 1562 1603 -45060 1572 1628 -45060 1920 1507 -45060 1740 1905 -45060 1825 1872 -45060 1920 1522 -45060 1767 1489 -45060 1538 1920 -45060 1650 1668 -45080 1538 1522 -45080 1548 1431 -45080 1562 1603 -45080 1572 1628 -45080 1599 1831 -45080 1605 1636 -45080 1617 1468 -45080 1920 1507 -45080 1740 1905 -45080 1825 1872 -45080 1920 1522 -45080 1767 1489 -45080 1587 1716 -45080 1538 1920 -45080 1599 1437 -45080 1547 1587 -45080 1650 1668 -45100 1592 1716 -45100 1643 1704 -45100 1712 1532 -45100 1740 1905 -45100 1825 1872 -45100 1920 1522 -45100 1547 1716 -45100 1767 1489 -45100 1547 1808 -45100 1587 1716 -45100 1731 1863 -45100 1507 1522 -45100 1538 1920 -45100 1599 1437 -45100 1547 1587 -45100 1650 1668 -45120 1547 1716 -45120 1716 1808 -45120 1767 1489 -45120 1547 1808 -45120 1562 1603 -45120 1587 1716 -45120 1600 1529 -45120 1605 1636 -45120 1731 1863 -45120 1507 1522 -45120 1587 1808 -45120 1825 1519 -45120 1538 1920 -45120 1599 1437 -45120 1547 1587 -45120 1650 1668 -45140 1547 1808 -45140 1562 1603 -45140 1587 1716 -45140 1600 1825 -45140 1600 1519 -45140 1600 1529 -45140 1605 1636 -45140 1731 1863 -45140 1507 1522 -45140 1587 1808 -45140 1825 1519 -45140 1538 1920 -45140 1599 1437 -45140 1547 1587 -45140 1544 1659 -45140 1650 1668 -45160 1587 1808 -45160 1643 1704 -45160 1651 1905 -45160 1669 1754 -45160 1825 1519 -45160 1538 1920 -45160 1599 1437 -45160 1617 1857 -45160 1547 1587 -45160 1544 1659 -45160 1650 1668 -45180 1538 1920 -45180 1549 1825 -45180 1549 1583 -45180 1599 1437 -45180 1600 1825 -45180 1825 1529 -45180 1519 1529 -45180 1575 1679 -45180 1617 1857 -45180 1547 1587 -45180 1740 1905 -45180 1544 1659 -45180 1650 1668 -45200 1549 1523 -45200 1563 1592 -45200 1575 1679 -45200 1617 1857 -45200 1572 1628 -45200 1547 1587 -45200 1740 1905 -45200 1544 1659 -45200 1587 1808 -45200 1825 1519 -45200 1650 1668 -45220 1617 1857 -45220 1825 1529 -45220 1507 1522 -45220 1547 1808 -45220 1572 1628 -45220 1731 1863 -45220 1547 1587 -45220 1740 1905 -45220 1544 1659 -45220 1587 1808 -45220 1825 1519 -45220 1650 1668 -45240 1538 1519 -45240 1547 1808 -45240 1553 1655 -45240 1572 1628 -45240 1731 1863 -45240 1547 1587 -45240 1740 1905 -45240 1544 1659 -45240 1587 1808 -45240 1825 1519 -45240 1650 1668 -45260 1538 1825 -45260 1587 1716 -45260 1617 1857 -45260 1731 1863 -45260 1547 1587 -45260 1740 1905 -45260 1767 1489 -45260 1544 1659 -45260 1587 1808 -45260 1669 1754 -45260 1825 1519 -45260 1650 1668 -45280 1547 1808 -45280 1547 1587 -45280 1549 1525 -45280 1572 1668 -45280 1576 1872 -45280 1599 1512 -45280 1740 1905 -45280 1767 1489 -45280 1825 1529 -45280 1459 1516 -45280 1538 1655 -45280 1544 1659 -45280 1549 1519 -45280 1558 1459 -45280 1587 1808 -45280 1669 1754 -45280 1825 1519 -45280 1650 1668 -45300 1538 1655 -45300 1544 1659 -45300 1549 1523 -45300 1549 1519 -45300 1558 1459 -45300 1587 1808 -45300 1587 1716 -45300 1825 1523 -45300 1519 1523 -45300 1669 1754 -45300 1758 1847 -45300 1825 1519 -45300 1600 1529 -45300 1650 1668 -45320 1549 1600 -45320 1563 1592 -45320 1586 1847 -45320 1606 1468 -45320 1639 1847 -45320 1669 1754 -45320 1758 1847 -45320 1767 1857 -45320 1825 1519 -45320 1600 1529 -45320 1740 1905 -45320 1650 1668 -45340 1587 1716 -45340 1599 1512 -45340 1600 1529 -45340 1600 1825 -45340 1617 1441 -45340 1740 1905 -45340 1587 1808 -45340 1650 1668 -45360 1538 1523 -45360 1582 1593 -45360 1857 1441 -45360 1740 1905 -45360 1813 1441 -45360 1825 1523 -45360 1587 1808 -45360 1547 1587 -45360 1650 1668 -45380 1547 1808 -45380 1587 1716 -45380 1669 1754 -45380 1765 1441 -45380 1871 1517 -45380 1740 1905 -45380 1813 1441 -45380 1825 1523 -45380 1587 1808 -45380 1600 1529 -45380 1547 1587 -45380 1544 1659 -45380 1731 1863 -45380 1650 1668 -45400 1740 1905 -45400 1813 1441 -45400 1825 1523 -45400 1507 1522 -45400 1587 1808 -45400 1600 1529 -45400 1547 1587 -45400 1538 1825 -45400 1544 1659 -45400 1731 1863 -45400 1650 1668 -45420 1549 1525 -45420 1587 1716 -45420 1605 1636 -45420 1655 1806 -45420 1825 1523 -45420 1507 1522 -45420 1552 1668 -45420 1587 1808 -45420 1600 1529 -45420 1547 1587 -45420 1538 1825 -45420 1544 1659 -45420 1731 1863 -45420 1650 1668 -45440 1552 1668 -45440 1587 1808 -45440 1600 1529 -45440 1655 1529 -45440 1563 1592 -45440 1547 1587 -45440 1538 1825 -45440 1544 1659 -45440 1731 1863 -45440 1650 1668 -45460 1549 1525 -45460 1563 1592 -45460 1598 1489 -45460 1598 1617 -45460 1547 1808 -45460 1547 1587 -45460 1538 1825 -45460 1544 1659 -45460 1825 1523 -45460 1813 1441 -45460 1731 1863 -45460 1650 1668 -45480 1547 1808 -45480 1547 1587 -45480 1549 1529 -45480 1565 1655 -45480 1600 1529 -45480 1600 1525 -45480 1813 1857 -45480 1857 1441 -45480 1538 1825 -45480 1538 1523 -45480 1544 1659 -45480 1825 1523 -45480 1813 1441 -45480 1731 1863 -45480 1650 1668 -45500 1549 1600 -45500 1617 1489 -45500 1767 1489 -45500 1813 1857 -45500 1825 1529 -45500 1857 1441 -45500 1538 1825 -45500 1538 1523 -45500 1544 1659 -45500 1825 1523 -45500 1813 1441 -45500 1731 1863 -45500 1650 1668 -45520 1586 1765 -45520 1758 1765 -45520 1857 1441 -45520 1538 1825 -45520 1538 1523 -45520 1544 1659 -45520 1549 1529 -45520 1563 1592 -45520 1565 1655 -45520 1825 1523 -45520 1813 1441 -45520 1628 1808 -45520 1731 1863 -45520 1650 1668 -45540 1538 1825 -45540 1538 1523 -45540 1544 1659 -45540 1549 1529 -45540 1563 1592 -45540 1598 1659 -45540 1565 1655 -45540 1825 1523 -45540 1544 1598 -45540 1813 1441 -45540 1628 1808 -45540 1731 1863 -45540 1650 1668 -45560 1565 1655 -45560 1605 1636 -45560 1678 1679 -45560 1507 1522 -45560 1735 1465 -45560 1825 1523 -45560 1544 1598 -45560 1813 1441 -45560 1628 1808 -45560 1731 1863 -45560 1650 1668 -45580 1735 1465 -45580 1767 1489 -45580 1825 1523 -45580 1552 1668 -45580 1544 1598 -45580 1563 1592 -45580 1813 1441 -45580 1544 1659 -45580 1549 1525 -45580 1679 1716 -45580 1628 1808 -45580 1731 1863 -45580 1650 1668 -45600 1552 1668 -45600 1831 1847 -45600 1544 1598 -45600 1563 1592 -45600 1813 1441 -45600 1544 1659 -45600 1598 1659 -45600 1549 1525 -45600 1679 1716 -45600 1628 1808 -45600 1731 1863 -45600 1650 1668 -45620 1544 1598 -45620 1563 1592 -45620 1603 1825 -45620 1813 1441 -45620 1544 1659 -45620 1598 1659 -45620 1549 1525 -45620 1600 1603 -45620 1679 1716 -45620 1605 1636 -45620 1628 1808 -45620 1731 1863 -45620 1650 1668 -45640 1544 1659 -45640 1552 1668 -45640 1580 1463 -45640 1598 1659 -45640 1651 1905 -45640 1549 1525 -45640 1600 1603 -45640 1679 1716 -45640 1605 1636 -45640 1628 1808 -45640 1731 1863 -45640 1650 1668 -45660 1575 1716 -45660 1549 1525 -45660 1600 1603 -45660 1813 1857 -45660 1507 1522 -45660 1679 1716 -45660 1857 1441 -45660 1563 1592 -45660 1605 1636 -45660 1628 1808 -45660 1731 1863 -45660 1650 1668 -45680 1549 1600 -45680 1549 1525 -45680 1600 1603 -45680 1603 1825 -45680 1603 1525 -45680 1813 1857 -45680 1507 1522 -45680 1679 1716 -45680 1857 1441 -45680 1563 1592 -45680 1605 1636 -45680 1628 1808 -45680 1731 1863 -45680 1650 1668 -45700 1552 1668 -45700 1583 1523 -45700 1679 1716 -45700 1699 1523 -45700 1857 1441 -45700 1563 1592 -45700 1655 1699 -45700 1605 1636 -45700 1628 1808 -45700 1731 1863 -45700 1650 1668 -45720 1549 1600 -45720 1563 1592 -45720 1655 1699 -45720 1735 1465 -45720 1825 1529 -45720 1507 1522 -45720 1605 1636 -45720 1628 1808 -45720 1731 1863 -45720 1650 1668 -45740 1603 1523 -45740 1605 1636 -45740 1813 1441 -45740 1552 1650 -45740 1857 1441 -45740 1628 1808 -45740 1549 1523 -45740 1523 1525 -45740 1731 1863 -45740 1549 1525 -45740 1650 1668 -45760 1552 1650 -45760 1580 1463 -45760 1585 1847 -45760 1600 1825 -45760 1655 1699 -45760 1813 1857 -45760 1847 1437 -45760 1857 1441 -45760 1628 1808 -45760 1825 1529 -45760 1549 1523 -45760 1569 1742 -45760 1523 1525 -45760 1731 1863 -45760 1549 1525 -45760 1650 1668 -45780 1547 1716 -45780 1628 1808 -45780 1825 1529 -45780 1544 1659 -45780 1549 1523 -45780 1569 1742 -45780 1598 1659 -45780 1605 1636 -45780 1523 1525 -45780 1617 1857 -45780 1731 1863 -45780 1549 1525 -45780 1650 1668 -45800 1544 1659 -45800 1544 1598 -45800 1549 1523 -45800 1563 1592 -45800 1569 1742 -45800 1586 1758 -45800 1598 1659 -45800 1603 1523 -45800 1605 1636 -45800 1617 1441 -45800 1813 1441 -45800 1523 1525 -45800 1603 1825 -45800 1617 1857 -45800 1617 1813 -45800 1655 1699 -45800 1731 1863 -45800 1549 1525 -45800 1650 1668 -45820 1572 1643 -45820 1603 1825 -45820 1617 1857 -45820 1617 1813 -45820 1643 1704 -45820 1655 1699 -45820 1731 1863 -45820 1549 1525 -45820 1650 1668 -45840 1538 1666 -45840 1563 1592 -45840 1605 1636 -45840 1731 1863 -45840 1549 1525 -45840 1650 1668 -45860 1563 1592 -45860 1598 1659 -45860 1655 1825 -45860 1507 1522 -45860 1605 1636 -45860 1731 1863 -45860 1549 1525 -45860 1650 1668 -45880 1605 1636 -45880 1617 1857 -45880 1699 1489 -45880 1825 1529 -45880 1617 1441 -45880 1731 1863 -45880 1544 1598 -45880 1549 1525 -45880 1650 1668 -45900 1598 1659 -45900 1600 1825 -45900 1606 1468 -45900 1784 1911 -45900 1617 1441 -45900 1731 1863 -45900 1544 1598 -45900 1549 1525 -45900 1650 1668 -45920 1617 1813 -45920 1712 1911 -45920 1767 1489 -45920 1871 1530 -45920 1519 1529 -45920 1643 1739 -45920 1813 1441 -45920 1617 1441 -45920 1643 1704 -45920 1731 1863 -45920 1544 1598 -45920 1549 1525 -45920 1650 1668 -45940 1606 1468 -45940 1628 1808 -45940 1643 1739 -45940 1813 1441 -45940 1825 1529 -45940 1911 1530 -45940 1617 1441 -45940 1643 1704 -45940 1666 1857 -45940 1731 1863 -45940 1600 1519 -45940 1544 1598 -45940 1507 1522 -45940 1549 1525 -45940 1650 1668 -45960 1547 1716 -45960 1547 1582 -45960 1600 1655 -45960 1696 1920 -45960 1617 1441 -45960 1643 1704 -45960 1666 1857 -45960 1731 1863 -45960 1600 1519 -45960 1655 1825 -45960 1544 1598 -45960 1507 1522 -45960 1549 1525 -45960 1650 1668 -45980 1606 1468 -45980 1617 1441 -45980 1643 1704 -45980 1643 1739 -45980 1666 1857 -45980 1731 1863 -45980 1600 1519 -45980 1617 1857 -45980 1655 1825 -45980 1857 1441 -45980 1544 1598 -45980 1507 1522 -45980 1549 1525 -45980 1650 1668 -46000 1553 1600 -46000 1562 1489 -46000 1593 1599 -46000 1600 1519 -46000 1617 1857 -46000 1655 1825 -46000 1857 1441 -46000 1544 1598 -46000 1825 1519 -46000 1507 1522 -46000 1549 1525 -46000 1666 1441 -46000 1650 1668 -46020 1544 1598 -46020 1576 1503 -46020 1582 1732 -46020 1825 1519 -46020 1519 1529 -46020 1643 1739 -46020 1731 1863 -46020 1579 1441 -46020 1507 1522 -46020 1549 1525 -46020 1666 1441 -46020 1650 1668 -46040 1563 1592 -46040 1617 1857 -46040 1638 1825 -46040 1643 1739 -46040 1731 1863 -46040 1579 1617 -46040 1579 1441 -46040 1579 1857 -46040 1600 1519 -46040 1507 1522 -46040 1549 1525 -46040 1628 1808 -46040 1666 1441 -46040 1650 1668 -46060 1579 1617 -46060 1579 1441 -46060 1579 1857 -46060 1606 1468 -46060 1600 1519 -46060 1507 1522 -46060 1549 1525 -46060 1628 1808 -46060 1666 1441 -46060 1587 1598 -46060 1650 1668 -46080 1600 1519 -46080 1638 1825 -46080 1666 1857 -46080 1731 1863 -46080 1857 1441 -46080 1507 1522 -46080 1549 1525 -46080 1580 1628 -46080 1628 1808 -46080 1666 1441 -46080 1587 1598 -46080 1650 1668 -46100 1579 1441 -46100 1579 1617 -46100 1507 1522 -46100 1549 1525 -46100 1580 1628 -46100 1628 1808 -46100 1666 1441 -46100 1587 1598 -46100 1650 1668 -46120 1549 1525 -46120 1580 1628 -46120 1638 1825 -46120 1628 1808 -46120 1666 1441 -46120 1655 1759 -46120 1695 1759 -46120 1587 1598 -46120 1650 1668 -46140 1549 1519 -46140 1580 1628 -46140 1638 1825 -46140 1643 1853 -46140 1643 1879 -46140 1507 1522 -46140 1628 1808 -46140 1666 1441 -46140 1655 1759 -46140 1695 1759 -46140 1600 1519 -46140 1655 1695 -46140 1587 1598 -46140 1650 1668 -46160 1539 1458 -46160 1549 1529 -46160 1549 1583 -46160 1579 1617 -46160 1470 1517 -46160 1507 1522 -46160 1628 1808 -46160 1666 1441 -46160 1655 1759 -46160 1695 1759 -46160 1600 1519 -46160 1655 1695 -46160 1587 1598 -46160 1650 1668 -46180 1549 1759 -46180 1598 1831 -46180 1628 1808 -46180 1643 1853 -46180 1666 1441 -46180 1857 1441 -46180 1655 1759 -46180 1695 1759 -46180 1600 1519 -46180 1825 1519 -46180 1655 1695 -46180 1587 1598 -46180 1650 1668 -46200 1549 1529 -46200 1598 1603 -46200 1857 1441 -46200 1617 1857 -46200 1655 1759 -46200 1695 1759 -46200 1600 1519 -46200 1825 1519 -46200 1655 1695 -46200 1587 1598 -46200 1650 1668 -46220 1549 1525 -46220 1617 1857 -46220 1628 1808 -46220 1655 1759 -46220 1668 1825 -46220 1695 1759 -46220 1600 1519 -46220 1825 1519 -46220 1655 1695 -46220 1587 1598 -46220 1650 1668 -46240 1549 1523 -46240 1580 1808 -46240 1580 1628 -46240 1583 1529 -46240 1600 1519 -46240 1643 1853 -46240 1825 1519 -46240 1655 1695 -46240 1587 1598 -46240 1650 1668 -46260 1628 1808 -46260 1666 1767 -46260 1669 1754 -46260 1695 1759 -46260 1655 1529 -46260 1655 1759 -46260 1655 1695 -46260 1572 1871 -46260 1617 1857 -46260 1587 1598 -46260 1650 1668 -46280 1605 1636 -46280 1695 1529 -46280 1759 1529 -46280 1655 1529 -46280 1655 1759 -46280 1655 1695 -46280 1572 1871 -46280 1617 1857 -46280 1587 1598 -46280 1650 1668 -46300 1547 1716 -46300 1600 1523 -46300 1628 1463 -46300 1655 1529 -46300 1655 1759 -46300 1655 1825 -46300 1655 1695 -46300 1666 1767 -46300 1825 1519 -46300 1572 1871 -46300 1695 1759 -46300 1507 1522 -46300 1617 1857 -46300 1587 1598 -46300 1650 1668 -46320 1572 1871 -46320 1669 1754 -46320 1695 1759 -46320 1643 1853 -46320 1507 1522 -46320 1695 1529 -46320 1617 1857 -46320 1587 1598 -46320 1650 1668 -46340 1593 1599 -46340 1643 1853 -46340 1507 1522 -46340 1596 1762 -46340 1593 1521 -46340 1695 1529 -46340 1617 1857 -46340 1587 1598 -46340 1650 1668 -46360 1580 1655 -46360 1596 1762 -46360 1593 1521 -46360 1600 1695 -46360 1695 1529 -46360 1695 1759 -46360 1617 1857 -46360 1759 1529 -46360 1587 1598 -46360 1669 1754 -46360 1650 1668 -46380 1547 1716 -46380 1593 1521 -46380 1600 1695 -46380 1666 1767 -46380 1695 1529 -46380 1695 1759 -46380 1617 1857 -46380 1759 1529 -46380 1825 1519 -46380 1857 1441 -46380 1696 1920 -46380 1587 1598 -46380 1669 1754 -46380 1643 1853 -46380 1650 1668 -46400 1617 1857 -46400 1617 1441 -46400 1628 1463 -46400 1759 1529 -46400 1825 1519 -46400 1857 1441 -46400 1655 1523 -46400 1696 1920 -46400 1587 1598 -46400 1669 1754 -46400 1579 1582 -46400 1643 1853 -46400 1650 1668 -46420 1549 1825 -46420 1580 1603 -46420 1655 1523 -46420 1696 1920 -46420 1523 1529 -46420 1587 1598 -46420 1669 1754 -46420 1759 1523 -46420 1579 1582 -46420 1643 1853 -46420 1650 1668 -46440 1547 1808 -46440 1549 1519 -46440 1587 1598 -46440 1593 1521 -46440 1619 1866 -46440 1669 1754 -46440 1759 1523 -46440 1659 1519 -46440 1507 1522 -46440 1617 1857 -46440 1579 1582 -46440 1643 1853 -46440 1650 1668 -46460 1549 1529 -46460 1628 1463 -46460 1659 1519 -46460 1669 1441 -46460 1857 1920 -46460 1470 1517 -46460 1507 1522 -46460 1617 1857 -46460 1579 1582 -46460 1643 1853 -46460 1666 1767 -46460 1650 1668 -46480 1574 1783 -46480 1583 1825 -46480 1587 1598 -46480 1617 1857 -46480 1692 1519 -46480 1759 1523 -46480 1579 1582 -46480 1643 1853 -46480 1660 1692 -46480 1666 1767 -46480 1650 1668 -46500 1547 1808 -46500 1549 1668 -46500 1579 1441 -46500 1692 1523 -46500 1732 1503 -46500 1759 1523 -46500 1507 1522 -46500 1579 1582 -46500 1669 1754 -46500 1643 1853 -46500 1660 1692 -46500 1666 1767 -46500 1655 1692 -46500 1650 1668 -46520 1539 1458 -46520 1547 1585 -46520 1553 1519 -46520 1579 1582 -46520 1669 1754 -46520 1643 1853 -46520 1660 1692 -46520 1666 1767 -46520 1655 1692 -46520 1650 1668 -46540 1549 1759 -46540 1579 1582 -46540 1669 1754 -46540 1692 1759 -46540 1759 1523 -46540 1759 1519 -46540 1547 1808 -46540 1549 1523 -46540 1587 1598 -46540 1643 1853 -46540 1660 1692 -46540 1666 1767 -46540 1655 1660 -46540 1655 1692 -46540 1650 1668 -46560 1539 1458 -46560 1547 1808 -46560 1547 1585 -46560 1547 1576 -46560 1549 1523 -46560 1587 1598 -46560 1757 1765 -46560 1643 1853 -46560 1660 1692 -46560 1666 1767 -46560 1507 1522 -46560 1655 1660 -46560 1655 1692 -46560 1650 1668 -46580 1643 1853 -46580 1660 1692 -46580 1666 1767 -46580 1759 1523 -46580 1507 1522 -46580 1655 1660 -46580 1655 1692 -46580 1669 1754 -46580 1549 1759 -46580 1650 1668 -46600 1547 1576 -46600 1549 1523 -46600 1576 1808 -46600 1692 1519 -46600 1784 1911 -46600 1507 1522 -46600 1599 1512 -46600 1655 1660 -46600 1655 1692 -46600 1669 1754 -46600 1549 1759 -46600 1650 1668 -46620 1544 1732 -46620 1549 1529 -46620 1599 1512 -46620 1628 1754 -46620 1655 1660 -46620 1655 1692 -46620 1655 1825 -46620 1692 1825 -46620 1857 1441 -46620 1669 1754 -46620 1759 1523 -46620 1549 1759 -46620 1660 1692 -46620 1666 1767 -46620 1650 1668 -46640 1596 1762 -46640 1692 1523 -46640 1692 1503 -46640 1707 1470 -46640 1759 1825 -46640 1669 1754 -46640 1759 1523 -46640 1549 1523 -46640 1549 1759 -46640 1660 1692 -46640 1544 1519 -46640 1587 1598 -46640 1666 1767 -46640 1650 1668 -46660 1544 1825 -46660 1549 1695 -46660 1563 1618 -46660 1599 1512 -46660 1600 1825 -46660 1669 1754 -46660 1692 1825 -46660 1759 1523 -46660 1825 1519 -46660 1549 1523 -46660 1549 1759 -46660 1660 1692 -46660 1544 1519 -46660 1587 1598 -46660 1507 1522 -46660 1617 1857 -46660 1617 1441 -46660 1666 1767 -46660 1650 1668 -46680 1549 1523 -46680 1549 1759 -46680 1563 1525 -46680 1643 1853 -46680 1660 1692 -46680 1544 1519 -46680 1587 1598 -46680 1507 1522 -46680 1617 1857 -46680 1857 1441 -46680 1617 1441 -46680 1666 1767 -46680 1650 1668 -46700 1544 1519 -46700 1596 1762 -46700 1470 1517 -46700 1587 1598 -46700 1669 1754 -46700 1507 1522 -46700 1617 1857 -46700 1819 1512 -46700 1857 1441 -46700 1617 1441 -46700 1920 1512 -46700 1666 1767 -46700 1599 1655 -46700 1650 1668 -46720 1587 1598 -46720 1659 1519 -46720 1669 1754 -46720 1754 1489 -46720 1759 1529 -46720 1507 1522 -46720 1617 1857 -46720 1819 1512 -46720 1857 1441 -46720 1617 1441 -46720 1643 1853 -46720 1660 1692 -46720 1819 1920 -46720 1920 1512 -46720 1549 1759 -46720 1628 1489 -46720 1666 1767 -46720 1599 1655 -46720 1549 1523 -46720 1759 1523 -46720 1650 1668 -46740 1574 1783 -46740 1617 1857 -46740 1819 1512 -46740 1857 1441 -46740 1470 1517 -46740 1617 1441 -46740 1643 1853 -46740 1660 1692 -46740 1819 1920 -46740 1920 1512 -46740 1549 1759 -46740 1628 1489 -46740 1666 1767 -46740 1599 1655 -46740 1549 1523 -46740 1759 1523 -46740 1650 1668 -46760 1617 1441 -46760 1643 1853 -46760 1661 1712 -46760 1825 1519 -46760 1628 1857 -46760 1660 1692 -46760 1819 1920 -46760 1857 1489 -46760 1920 1512 -46760 1669 1754 -46760 1549 1759 -46760 1628 1489 -46760 1666 1767 -46760 1599 1655 -46760 1599 1512 -46760 1549 1523 -46760 1759 1523 -46760 1650 1668 -46780 1628 1857 -46780 1660 1692 -46780 1754 1831 -46780 1819 1920 -46780 1857 1489 -46780 1920 1512 -46780 1669 1754 -46780 1549 1759 -46780 1628 1489 -46780 1666 1767 -46780 1599 1655 -46780 1599 1512 -46780 1549 1523 -46780 1544 1519 -46780 1759 1523 -46780 1650 1668 -46800 1554 1707 -46800 1661 1712 -46800 1669 1754 -46800 1507 1522 -46800 1549 1759 -46800 1628 1489 -46800 1666 1767 -46800 1659 1825 -46800 1599 1655 -46800 1655 1512 -46800 1599 1512 -46800 1549 1523 -46800 1544 1519 -46800 1759 1523 -46800 1650 1668 -46820 1549 1759 -46820 1605 1636 -46820 1628 1489 -46820 1643 1853 -46820 1666 1767 -46820 1659 1825 -46820 1660 1692 -46820 1599 1655 -46820 1655 1512 -46820 1599 1512 -46820 1549 1523 -46820 1544 1519 -46820 1759 1523 -46820 1650 1668 -46840 1582 1592 -46840 1605 1636 -46840 1628 1489 -46840 1628 1767 -46840 1643 1853 -46840 1666 1767 -46840 1831 1503 -46840 1659 1825 -46840 1660 1692 -46840 1599 1655 -46840 1655 1512 -46840 1599 1512 -46840 1549 1523 -46840 1544 1519 -46840 1759 1523 -46840 1650 1668 -46860 1628 1463 -46860 1659 1825 -46860 1660 1692 -46860 1754 1463 -46860 1759 1529 -46860 1575 1679 -46860 1599 1655 -46860 1603 1847 -46860 1655 1512 -46860 1599 1512 -46860 1767 1489 -46860 1549 1523 -46860 1549 1759 -46860 1544 1519 -46860 1759 1523 -46860 1650 1668 -46880 1575 1679 -46880 1599 1655 -46880 1603 1847 -46880 1655 1512 -46880 1679 1522 -46880 1679 1731 -46880 1599 1512 -46880 1643 1853 -46880 1767 1489 -46880 1808 1847 -46880 1549 1523 -46880 1549 1759 -46880 1544 1519 -46880 1759 1523 -46880 1770 1819 -46880 1770 1920 -46880 1650 1668 -46900 1538 1679 -46900 1547 1716 -46900 1547 1847 -46900 1592 1441 -46900 1599 1512 -46900 1643 1853 -46900 1507 1522 -46900 1767 1489 -46900 1808 1847 -46900 1549 1523 -46900 1549 1759 -46900 1660 1692 -46900 1669 1754 -46900 1605 1636 -46900 1544 1519 -46900 1759 1523 -46900 1770 1819 -46900 1770 1920 -46900 1650 1668 -46920 1767 1489 -46920 1808 1847 -46920 1549 1523 -46920 1549 1759 -46920 1660 1692 -46920 1669 1754 -46920 1605 1636 -46920 1544 1519 -46920 1716 1847 -46920 1759 1523 -46920 1770 1819 -46920 1770 1920 -46920 1650 1668 -46940 1582 1603 -46940 1603 1872 -46940 1692 1831 -46940 1839 1503 -46940 1847 1503 -46940 1507 1522 -46940 1808 1847 -46940 1549 1523 -46940 1549 1759 -46940 1660 1692 -46940 1669 1754 -46940 1605 1636 -46940 1819 1920 -46940 1544 1519 -46940 1716 1847 -46940 1759 1523 -46940 1770 1819 -46940 1770 1920 -46940 1650 1668 -46960 1692 1839 -46960 1808 1847 -46960 1549 1523 -46960 1549 1759 -46960 1655 1512 -46960 1660 1692 -46960 1669 1754 -46960 1605 1636 -46960 1819 1920 -46960 1544 1519 -46960 1716 1847 -46960 1759 1523 -46960 1770 1819 -46960 1770 1920 -46960 1650 1668 -46980 1549 1523 -46980 1549 1759 -46980 1600 1659 -46980 1655 1512 -46980 1660 1692 -46980 1666 1740 -46980 1669 1754 -46980 1695 1825 -46980 1759 1825 -46980 1549 1825 -46980 1605 1636 -46980 1767 1489 -46980 1643 1853 -46980 1819 1920 -46980 1544 1519 -46980 1716 1847 -46980 1759 1523 -46980 1770 1819 -46980 1770 1920 -46980 1650 1668 -47000 1549 1825 -47000 1579 1519 -47000 1580 1603 -47000 1605 1636 -47000 1767 1489 -47000 1808 1847 -47000 1600 1530 -47000 1643 1853 -47000 1819 1920 -47000 1544 1519 -47000 1579 1825 -47000 1716 1847 -47000 1759 1523 -47000 1770 1819 -47000 1770 1920 -47000 1650 1668 -47020 1547 1716 -47020 1549 1523 -47020 1579 1759 -47020 1582 1593 -47020 1582 1603 -47020 1600 1530 -47020 1617 1441 -47020 1643 1853 -47020 1655 1512 -47020 1692 1839 -47020 1759 1825 -47020 1441 1489 -47020 1549 1759 -47020 1819 1920 -47020 1544 1519 -47020 1579 1825 -47020 1716 1847 -47020 1759 1523 -47020 1770 1819 -47020 1770 1920 -47020 1650 1668 -47040 1544 1600 -47040 1549 1636 -47040 1549 1759 -47040 1563 1666 -47040 1600 1759 -47040 1669 1754 -47040 1767 1489 -47040 1819 1920 -47040 1544 1519 -47040 1579 1825 -47040 1716 1847 -47040 1759 1523 -47040 1770 1819 -47040 1770 1920 -47040 1650 1668 -47060 1507 1522 -47060 1655 1512 -47060 1544 1519 -47060 1579 1825 -47060 1716 1847 -47060 1759 1523 -47060 1770 1819 -47060 1770 1920 -47060 1650 1668 -47080 1538 1575 -47080 1582 1603 -47080 1660 1847 -47080 1678 1489 -47080 1600 1759 -47080 1669 1754 -47080 1819 1920 -47080 1731 1863 -47080 1655 1512 -47080 1544 1519 -47080 1579 1825 -47080 1716 1847 -47080 1759 1523 -47080 1770 1819 -47080 1770 1920 -47080 1650 1668 -47100 1563 1666 -47100 1600 1759 -47100 1507 1522 -47100 1669 1754 -47100 1819 1920 -47100 1731 1863 -47100 1655 1512 -47100 1544 1519 -47100 1579 1825 -47100 1716 1847 -47100 1759 1523 -47100 1770 1819 -47100 1770 1920 -47100 1650 1668 -47120 1538 1575 -47120 1549 1636 -47120 1549 1605 -47120 1600 1530 -47120 1660 1692 -47120 1669 1754 -47120 1692 1839 -47120 1819 1920 -47120 1582 1603 -47120 1731 1863 -47120 1617 1441 -47120 1655 1512 -47120 1544 1519 -47120 1579 1825 -47120 1716 1847 -47120 1759 1523 -47120 1770 1819 -47120 1770 1920 -47120 1650 1668 -47140 1582 1603 -47140 1636 1759 -47140 1731 1863 -47140 1617 1441 -47140 1655 1512 -47140 1544 1519 -47140 1507 1522 -47140 1643 1853 -47140 1579 1825 -47140 1716 1847 -47140 1759 1523 -47140 1770 1819 -47140 1770 1920 -47140 1650 1668 -47160 1563 1666 -47160 1617 1441 -47160 1655 1512 -47160 1544 1519 -47160 1600 1530 -47160 1507 1522 -47160 1643 1853 -47160 1549 1605 -47160 1579 1825 -47160 1716 1847 -47160 1759 1523 -47160 1770 1819 -47160 1770 1920 -47160 1650 1668 -47180 1544 1519 -47180 1600 1530 -47180 1650 1463 -47180 1507 1522 -47180 1643 1853 -47180 1731 1863 -47180 1549 1605 -47180 1579 1825 -47180 1716 1847 -47180 1759 1523 -47180 1770 1819 -47180 1770 1920 -47180 1650 1668 -47200 1554 1707 -47200 1582 1603 -47200 1643 1853 -47200 1668 1463 -47200 1731 1863 -47200 1600 1759 -47200 1549 1605 -47200 1579 1825 -47200 1716 1847 -47200 1759 1523 -47200 1770 1819 -47200 1770 1920 -47200 1650 1668 -47220 1544 1519 -47220 1592 1831 -47220 1600 1759 -47220 1666 1740 -47220 1819 1920 -47220 1549 1605 -47220 1919 1427 -47220 1579 1825 -47220 1716 1847 -47220 1759 1523 -47220 1770 1819 -47220 1770 1920 -47220 1650 1668 -47240 1549 1605 -47240 1554 1707 -47240 1579 1600 -47240 1587 1731 -47240 1605 1636 -47240 1919 1427 -47240 1549 1636 -47240 1579 1825 -47240 1643 1853 -47240 1716 1847 -47240 1759 1523 -47240 1547 1716 -47240 1770 1819 -47240 1617 1441 -47240 1770 1920 -47240 1650 1668 -47260 1549 1636 -47260 1579 1825 -47260 1643 1853 -47260 1819 1920 -47260 1716 1847 -47260 1759 1523 -47260 1547 1716 -47260 1770 1819 -47260 1617 1441 -47260 1770 1920 -47260 1544 1519 -47260 1650 1668 -47280 1600 1759 -47280 1660 1692 -47280 1716 1847 -47280 1547 1847 -47280 1692 1428 -47280 1759 1523 -47280 1547 1716 -47280 1549 1605 -47280 1770 1819 -47280 1617 1441 -47280 1770 1920 -47280 1544 1519 -47280 1650 1668 -47300 1547 1847 -47300 1579 1463 -47300 1643 1853 -47300 1692 1428 -47300 1759 1523 -47300 1547 1716 -47300 1549 1605 -47300 1770 1819 -47300 1617 1441 -47300 1770 1920 -47300 1544 1519 -47300 1650 1668 -47320 1547 1716 -47320 1549 1636 -47320 1549 1605 -47320 1770 1819 -47320 1617 1441 -47320 1770 1920 -47320 1716 1847 -47320 1544 1519 -47320 1650 1668 -47340 1731 1863 -47340 1770 1819 -47340 1617 1441 -47340 1770 1920 -47340 1819 1920 -47340 1716 1847 -47340 1759 1523 -47340 1544 1519 -47340 1650 1668 -47360 1579 1592 -47360 1617 1441 -47360 1650 1463 -47360 1692 1428 -47360 1770 1920 -47360 1819 1920 -47360 1643 1853 -47360 1716 1847 -47360 1759 1523 -47360 1544 1519 -47360 1650 1668 -47380 1563 1592 -47380 1678 1872 -47380 1549 1605 -47380 1655 1759 -47380 1770 1920 -47380 1819 1920 -47380 1643 1853 -47380 1716 1847 -47380 1759 1523 -47380 1770 1819 -47380 1544 1519 -47380 1650 1668 -47400 1549 1605 -47400 1655 1759 -47400 1563 1579 -47400 1770 1920 -47400 1819 1920 -47400 1643 1853 -47400 1716 1847 -47400 1759 1523 -47400 1770 1819 -47400 1544 1519 -47400 1600 1519 -47400 1650 1668 -47420 1549 1759 -47420 1563 1579 -47420 1698 1764 -47420 1731 1863 -47420 1770 1920 -47420 1819 1920 -47420 1643 1853 -47420 1716 1847 -47420 1759 1523 -47420 1770 1819 -47420 1605 1636 -47420 1544 1519 -47420 1600 1519 -47420 1650 1668 -47440 1562 1678 -47440 1562 1847 -47440 1731 1920 -47440 1819 1920 -47440 1643 1853 -47440 1699 1441 -47440 1716 1847 -47440 1759 1523 -47440 1770 1819 -47440 1605 1636 -47440 1549 1605 -47440 1544 1519 -47440 1600 1519 -47440 1650 1668 -47460 1563 1592 -47460 1579 1441 -47460 1643 1853 -47460 1660 1716 -47460 1699 1441 -47460 1716 1847 -47460 1770 1920 -47460 1847 1428 -47460 1579 1592 -47460 1759 1523 -47460 1770 1819 -47460 1660 1692 -47460 1605 1636 -47460 1563 1579 -47460 1549 1605 -47460 1544 1519 -47460 1600 1519 -47460 1650 1668 -47480 1544 1600 -47480 1547 1617 -47480 1579 1592 -47480 1590 1871 -47480 1698 1764 -47480 1759 1523 -47480 1770 1819 -47480 1549 1636 -47480 1628 1463 -47480 1660 1692 -47480 1605 1636 -47480 1669 1754 -47480 1563 1579 -47480 1549 1605 -47480 1544 1519 -47480 1600 1519 -47480 1650 1668 -47500 1544 1825 -47500 1549 1636 -47500 1562 1603 -47500 1562 1582 -47500 1628 1463 -47500 1660 1692 -47500 1605 1636 -47500 1669 1754 -47500 1563 1579 -47500 1549 1605 -47500 1544 1519 -47500 1600 1519 -47500 1650 1668 -47520 1579 1592 -47520 1599 1441 -47520 1605 1636 -47520 1669 1754 -47520 1770 1819 -47520 1847 1441 -47520 1563 1579 -47520 1698 1764 -47520 1549 1605 -47520 1544 1519 -47520 1759 1523 -47520 1600 1519 -47520 1650 1668 -47540 1563 1579 -47540 1628 1463 -47540 1655 1512 -47540 1692 1847 -47540 1698 1764 -47540 1731 1863 -47540 1549 1605 -47540 1544 1519 -47540 1759 1523 -47540 1600 1519 -47540 1549 1636 -47540 1650 1668 -47560 1698 1704 -47560 1698 1905 -47560 1698 1805 -47560 1716 1441 -47560 1549 1605 -47560 1544 1519 -47560 1759 1523 -47560 1580 1628 -47560 1600 1519 -47560 1549 1636 -47560 1650 1668 -47580 1549 1605 -47580 1573 1452 -47580 1599 1759 -47580 1544 1519 -47580 1759 1523 -47580 1580 1628 -47580 1600 1519 -47580 1605 1636 -47580 1549 1636 -47580 1563 1579 -47580 1650 1668 -47600 1544 1519 -47600 1731 1489 -47600 1759 1523 -47600 1467 1531 -47600 1580 1628 -47600 1600 1519 -47600 1544 1825 -47600 1605 1636 -47600 1549 1636 -47600 1563 1579 -47600 1770 1819 -47600 1650 1668 -47620 1579 1592 -47620 1580 1628 -47620 1591 1470 -47620 1598 1441 -47620 1600 1519 -47620 1643 1853 -47620 1669 1754 -47620 1920 1441 -47620 1470 1517 -47620 1544 1825 -47620 1871 1517 -47620 1605 1636 -47620 1549 1636 -47620 1563 1579 -47620 1549 1605 -47620 1770 1819 -47620 1650 1668 -47640 1544 1825 -47640 1575 1679 -47640 1770 1441 -47640 1819 1441 -47640 1871 1517 -47640 1467 1531 -47640 1605 1636 -47640 1549 1636 -47640 1563 1579 -47640 1549 1605 -47640 1770 1819 -47640 1650 1668 -47660 1605 1636 -47660 1659 1441 -47660 1669 1754 -47660 1544 1519 -47660 1549 1636 -47660 1563 1579 -47660 1580 1628 -47660 1549 1605 -47660 1770 1819 -47660 1650 1668 -47680 1544 1519 -47680 1547 1716 -47680 1549 1636 -47680 1554 1707 -47680 1563 1579 -47680 1580 1628 -47680 1655 1847 -47680 1449 1512 -47680 1643 1853 -47680 1549 1605 -47680 1871 1517 -47680 1770 1819 -47680 1650 1668 -47700 1591 1470 -47700 1759 1523 -47700 1819 1920 -47700 1731 1863 -47700 1770 1920 -47700 1643 1853 -47700 1549 1605 -47700 1871 1517 -47700 1770 1819 -47700 1650 1668 -47720 1538 1544 -47720 1544 1655 -47720 1731 1863 -47720 1544 1519 -47720 1583 1523 -47720 1770 1920 -47720 1580 1628 -47720 1643 1853 -47720 1449 1512 -47720 1549 1605 -47720 1871 1517 -47720 1770 1819 -47720 1650 1668 -47740 1544 1519 -47740 1549 1523 -47740 1563 1441 -47740 1563 1579 -47740 1579 1441 -47740 1583 1523 -47740 1591 1470 -47740 1692 1847 -47740 1770 1920 -47740 1847 1489 -47740 1580 1628 -47740 1599 1655 -47740 1643 1853 -47740 1449 1512 -47740 1549 1605 -47740 1871 1517 -47740 1770 1819 -47740 1650 1668 -47760 1538 1523 -47760 1547 1716 -47760 1549 1583 -47760 1580 1628 -47760 1599 1655 -47760 1643 1853 -47760 1692 1839 -47760 1449 1512 -47760 1549 1605 -47760 1617 1857 -47760 1538 1544 -47760 1871 1517 -47760 1770 1819 -47760 1650 1668 -47780 1549 1636 -47780 1549 1605 -47780 1574 1731 -47780 1600 1523 -47780 1617 1857 -47780 1551 1269 -47780 1538 1544 -47780 1871 1517 -47780 1591 1470 -47780 1770 1819 -47780 1650 1668 -47800 1543 1700 -47800 1544 1519 -47800 1551 1269 -47800 1591 1665 -47800 1605 1636 -47800 1606 1468 -47800 1669 1754 -47800 1538 1544 -47800 1840 1489 -47800 1871 1517 -47800 1591 1470 -47800 1770 1819 -47800 1650 1668 -47820 1538 1544 -47820 1600 1759 -47820 1689 1525 -47820 1759 1523 -47820 1767 1840 -47820 1767 1489 -47820 1840 1489 -47820 1871 1517 -47820 1549 1605 -47820 1591 1470 -47820 1770 1819 -47820 1650 1668 -47840 1544 1825 -47840 1591 1665 -47840 1600 1519 -47840 1840 1489 -47840 1871 1517 -47840 1549 1605 -47840 1825 1519 -47840 1544 1659 -47840 1605 1636 -47840 1544 1519 -47840 1591 1470 -47840 1770 1819 -47840 1643 1853 -47840 1650 1668 -47860 1549 1605 -47860 1580 1628 -47860 1659 1825 -47860 1685 1771 -47860 1759 1523 -47860 1770 1489 -47860 1825 1519 -47860 1920 1489 -47860 1544 1659 -47860 1548 1516 -47860 1605 1636 -47860 1544 1519 -47860 1591 1470 -47860 1431 1516 -47860 1770 1819 -47860 1643 1853 -47860 1650 1668 -47880 1544 1659 -47880 1548 1516 -47880 1554 1707 -47880 1591 1665 -47880 1605 1636 -47880 1544 1519 -47880 1591 1470 -47880 1431 1516 -47880 1770 1819 -47880 1643 1853 -47880 1650 1668 -47900 1538 1659 -47900 1544 1519 -47900 1575 1679 -47900 1600 1759 -47900 1606 1468 -47900 1759 1523 -47900 1871 1517 -47900 1591 1470 -47900 1431 1516 -47900 1770 1819 -47900 1643 1853 -47900 1650 1668 -47920 1544 1605 -47920 1544 1549 -47920 1554 1707 -47920 1600 1529 -47920 1600 1519 -47920 1659 1825 -47920 1731 1863 -47920 1825 1519 -47920 1871 1517 -47920 1591 1470 -47920 1431 1516 -47920 1858 1872 -47920 1549 1605 -47920 1770 1819 -47920 1643 1853 -47920 1650 1668 -47940 1548 1431 -47940 1549 1636 -47940 1591 1470 -47940 1431 1516 -47940 1605 1636 -47940 1669 1754 -47940 1858 1872 -47940 1549 1605 -47940 1770 1819 -47940 1643 1853 -47940 1650 1668 -47960 1544 1553 -47960 1544 1605 -47960 1547 1716 -47960 1551 1269 -47960 1600 1529 -47960 1605 1636 -47960 1548 1516 -47960 1669 1754 -47960 1858 1872 -47960 1549 1605 -47960 1770 1819 -47960 1643 1853 -47960 1650 1668 -47980 1544 1523 -47980 1547 1808 -47980 1548 1516 -47980 1617 1857 -47980 1783 1449 -47980 1819 1920 -47980 1513 1516 -47980 1519 1523 -47980 1669 1754 -47980 1858 1872 -47980 1549 1605 -47980 1770 1819 -47980 1547 1626 -47980 1643 1853 -47980 1650 1668 -48000 1538 1825 -48000 1669 1754 -48000 1678 1831 -48000 1731 1863 -48000 1431 1516 -48000 1858 1872 -48000 1549 1605 -48000 1770 1819 -48000 1547 1626 -48000 1643 1853 -48000 1650 1668 -48020 1544 1523 -48020 1660 1839 -48020 1825 1519 -48020 1858 1872 -48020 1544 1519 -48020 1549 1605 -48020 1574 1762 -48020 1605 1636 -48020 1548 1516 -48020 1770 1819 -48020 1547 1626 -48020 1643 1853 -48020 1650 1668 -48040 1544 1519 -48040 1545 1430 -48040 1549 1605 -48040 1574 1762 -48040 1605 1636 -48040 1606 1468 -48040 1664 1501 -48040 1759 1523 -48040 1920 1489 -48040 1669 1754 -48040 1548 1516 -48040 1759 1525 -48040 1770 1819 -48040 1431 1516 -48040 1547 1626 -48040 1643 1853 -48040 1650 1668 -48060 1669 1754 -48060 1731 1863 -48060 1858 1872 -48060 1548 1516 -48060 1660 1692 -48060 1660 1839 -48060 1759 1525 -48060 1770 1819 -48060 1431 1516 -48060 1547 1626 -48060 1600 1519 -48060 1643 1853 -48060 1650 1668 -48080 1548 1516 -48080 1660 1692 -48080 1660 1839 -48080 1689 1813 -48080 1759 1525 -48080 1770 1819 -48080 1825 1519 -48080 1431 1516 -48080 1547 1626 -48080 1626 1716 -48080 1600 1519 -48080 1643 1853 -48080 1650 1668 -48100 1547 1626 -48100 1600 1525 -48100 1759 1523 -48100 1523 1525 -48100 1626 1716 -48100 1666 1489 -48100 1731 1863 -48100 1600 1519 -48100 1643 1853 -48100 1650 1668 -48120 1549 1636 -48120 1606 1468 -48120 1626 1716 -48120 1666 1489 -48120 1431 1516 -48120 1759 1525 -48120 1731 1863 -48120 1547 1716 -48120 1600 1519 -48120 1643 1853 -48120 1770 1819 -48120 1650 1668 -48140 1759 1525 -48140 1847 1489 -48140 1858 1872 -48140 1731 1863 -48140 1547 1716 -48140 1600 1519 -48140 1643 1853 -48140 1770 1819 -48140 1650 1668 -48160 1549 1636 -48160 1617 1441 -48160 1628 1668 -48160 1666 1489 -48160 1858 1872 -48160 1655 1694 -48160 1731 1863 -48160 1538 1825 -48160 1547 1716 -48160 1600 1519 -48160 1643 1853 -48160 1770 1819 -48160 1650 1668 -48180 1541 1619 -48180 1596 1512 -48180 1600 1825 -48180 1655 1694 -48180 1660 1839 -48180 1731 1863 -48180 1759 1525 -48180 1847 1489 -48180 1441 1489 -48180 1523 1525 -48180 1538 1825 -48180 1609 1915 -48180 1547 1716 -48180 1600 1519 -48180 1643 1853 -48180 1770 1819 -48180 1650 1668 -48200 1549 1636 -48200 1558 1698 -48200 1558 1516 -48200 1698 1516 -48200 1538 1825 -48200 1609 1915 -48200 1547 1716 -48200 1600 1519 -48200 1643 1853 -48200 1770 1819 -48200 1574 1762 -48200 1549 1605 -48200 1650 1668 -48220 1538 1825 -48220 1609 1915 -48220 1655 1825 -48220 1767 1840 -48220 1840 1441 -48220 1547 1716 -48220 1759 1525 -48220 1600 1519 -48220 1643 1853 -48220 1770 1819 -48220 1574 1762 -48220 1549 1605 -48220 1650 1668 -48240 1547 1716 -48240 1590 1530 -48240 1666 1489 -48240 1727 1743 -48240 1759 1529 -48240 1759 1525 -48240 1600 1519 -48240 1643 1853 -48240 1770 1819 -48240 1574 1762 -48240 1549 1605 -48240 1650 1668 -48260 1538 1825 -48260 1600 1519 -48260 1643 1853 -48260 1784 1911 -48260 1825 1519 -48260 1770 1819 -48260 1574 1762 -48260 1549 1605 -48260 1650 1668 -48280 1605 1636 -48280 1770 1819 -48280 1840 1441 -48280 1840 1489 -48280 1441 1489 -48280 1547 1716 -48280 1574 1762 -48280 1549 1605 -48280 1650 1668 -48300 1558 1431 -48300 1583 1523 -48300 1606 1468 -48300 1669 1754 -48300 1695 1759 -48300 1759 1529 -48300 1547 1716 -48300 1574 1762 -48300 1784 1911 -48300 1549 1605 -48300 1519 1525 -48300 1650 1668 -48320 1547 1716 -48320 1574 1762 -48320 1626 1770 -48320 1643 1853 -48320 1784 1911 -48320 1549 1605 -48320 1871 1517 -48320 1519 1525 -48320 1650 1668 -48340 1549 1636 -48340 1554 1655 -48340 1558 1606 -48340 1643 1853 -48340 1784 1911 -48340 1840 1489 -48340 1549 1605 -48340 1574 1783 -48340 1606 1468 -48340 1871 1517 -48340 1519 1525 -48340 1650 1668 -48360 1558 1431 -48360 1574 1762 -48360 1619 1678 -48360 1660 1692 -48360 1784 1911 -48360 1819 1920 -48360 1840 1489 -48360 1549 1605 -48360 1574 1783 -48360 1600 1519 -48360 1606 1468 -48360 1660 1839 -48360 1871 1517 -48360 1549 1683 -48360 1606 1431 -48360 1519 1525 -48360 1650 1668 -48380 1547 1716 -48380 1549 1605 -48380 1574 1783 -48380 1600 1519 -48380 1606 1468 -48380 1660 1839 -48380 1747 1433 -48380 1871 1517 -48380 1549 1683 -48380 1549 1636 -48380 1606 1431 -48380 1519 1525 -48380 1650 1668 -48400 1606 1516 -48400 1825 1529 -48400 1547 1619 -48400 1619 1716 -48400 1871 1517 -48400 1549 1683 -48400 1549 1636 -48400 1605 1683 -48400 1606 1431 -48400 1636 1683 -48400 1519 1525 -48400 1650 1668 -48420 1547 1619 -48420 1574 1762 -48420 1619 1716 -48420 1871 1517 -48420 1549 1683 -48420 1549 1636 -48420 1840 1489 -48420 1605 1683 -48420 1606 1431 -48420 1636 1683 -48420 1519 1525 -48420 1650 1668 -48440 1605 1636 -48440 1606 1516 -48440 1871 1517 -48440 1549 1683 -48440 1549 1636 -48440 1840 1489 -48440 1605 1683 -48440 1606 1431 -48440 1636 1683 -48440 1591 1470 -48440 1519 1525 -48440 1650 1668 -48460 1549 1683 -48460 1549 1636 -48460 1598 1783 -48460 1600 1525 -48460 1840 1489 -48460 1605 1683 -48460 1819 1920 -48460 1606 1431 -48460 1547 1716 -48460 1636 1683 -48460 1549 1605 -48460 1600 1519 -48460 1591 1470 -48460 1519 1525 -48460 1650 1668 -48480 1605 1683 -48480 1606 1516 -48480 1871 1517 -48480 1619 1489 -48480 1819 1920 -48480 1606 1431 -48480 1547 1716 -48480 1636 1683 -48480 1538 1825 -48480 1549 1605 -48480 1600 1519 -48480 1591 1470 -48480 1519 1525 -48480 1650 1668 -48500 1558 1606 -48500 1598 1783 -48500 1600 1525 -48500 1619 1489 -48500 1716 1740 -48500 1819 1920 -48500 1857 1441 -48500 1431 1516 -48500 1599 1512 -48500 1606 1431 -48500 1547 1716 -48500 1636 1683 -48500 1857 1489 -48500 1538 1825 -48500 1549 1605 -48500 1600 1519 -48500 1591 1470 -48500 1519 1525 -48500 1549 1636 -48500 1549 1683 -48500 1650 1668 -48520 1572 1467 -48520 1599 1512 -48520 1605 1683 -48520 1606 1516 -48520 1606 1431 -48520 1655 1684 -48520 1547 1716 -48520 1636 1683 -48520 1857 1489 -48520 1538 1825 -48520 1549 1605 -48520 1600 1519 -48520 1591 1470 -48520 1519 1525 -48520 1549 1636 -48520 1549 1683 -48520 1650 1668 -48540 1547 1716 -48540 1636 1683 -48540 1643 1853 -48540 1857 1489 -48540 1538 1825 -48540 1545 1684 -48540 1549 1605 -48540 1600 1519 -48540 1591 1470 -48540 1519 1525 -48540 1549 1636 -48540 1549 1683 -48540 1650 1668 -48560 1583 1759 -48560 1605 1636 -48560 1684 1430 -48560 1707 1470 -48560 1857 1489 -48560 1871 1517 -48560 1605 1683 -48560 1619 1489 -48560 1538 1825 -48560 1545 1684 -48560 1545 1655 -48560 1606 1431 -48560 1549 1605 -48560 1600 1519 -48560 1619 1857 -48560 1591 1470 -48560 1606 1516 -48560 1519 1525 -48560 1549 1636 -48560 1549 1683 -48560 1650 1668 -48580 1547 1716 -48580 1548 1516 -48580 1605 1683 -48580 1619 1489 -48580 1660 1839 -48580 1825 1519 -48580 1538 1825 -48580 1545 1684 -48580 1545 1655 -48580 1599 1512 -48580 1606 1468 -48580 1606 1431 -48580 1698 1747 -48580 1549 1605 -48580 1600 1519 -48580 1655 1684 -48580 1825 1529 -48580 1858 1872 -48580 1619 1857 -48580 1591 1470 -48580 1606 1516 -48580 1519 1525 -48580 1549 1636 -48580 1549 1683 -48580 1650 1668 -48600 1538 1825 -48600 1545 1684 -48600 1545 1655 -48600 1548 1606 -48600 1599 1512 -48600 1606 1468 -48600 1606 1431 -48600 1636 1683 -48600 1698 1747 -48600 1698 1765 -48600 1549 1605 -48600 1600 1519 -48600 1655 1684 -48600 1655 1703 -48600 1684 1703 -48600 1825 1529 -48600 1858 1872 -48600 1545 1574 -48600 1558 1606 -48600 1574 1655 -48600 1619 1857 -48600 1698 1764 -48600 1767 1489 -48600 1591 1470 -48600 1606 1516 -48600 1655 1430 -48600 1519 1525 -48600 1549 1636 -48600 1549 1683 -48600 1650 1668 -48620 1549 1605 -48620 1574 1703 -48620 1600 1519 -48620 1605 1683 -48620 1655 1684 -48620 1655 1703 -48620 1684 1703 -48620 1825 1529 -48620 1858 1872 -48620 1545 1574 -48620 1545 1759 -48620 1558 1606 -48620 1574 1655 -48620 1619 1857 -48620 1643 1853 -48620 1698 1764 -48620 1767 1489 -48620 1591 1470 -48620 1606 1516 -48620 1655 1430 -48620 1519 1525 -48620 1549 1636 -48620 1549 1683 -48620 1650 1668 -48640 1545 1695 -48640 1545 1574 -48640 1545 1759 -48640 1554 1740 -48640 1558 1606 -48640 1574 1759 -48640 1574 1684 -48640 1574 1655 -48640 1619 1857 -48640 1643 1853 -48640 1698 1764 -48640 1764 1765 -48640 1767 1489 -48640 1819 1920 -48640 1545 1684 -48640 1684 1759 -48640 1591 1470 -48640 1606 1516 -48640 1655 1430 -48640 1519 1525 -48640 1549 1636 -48640 1606 1431 -48640 1871 1517 -48640 1549 1683 -48640 1650 1668 -48660 1545 1684 -48660 1545 1430 -48660 1545 1655 -48660 1605 1636 -48660 1619 1489 -48660 1644 1664 -48660 1655 1684 -48660 1655 1695 -48660 1664 1791 -48660 1684 1430 -48660 1684 1759 -48660 1269 1440 -48660 1871 1504 -48660 1591 1470 -48660 1606 1516 -48660 1655 1430 -48660 1857 1489 -48660 1431 1516 -48660 1504 1517 -48660 1519 1525 -48660 1600 1519 -48660 1619 1767 -48660 1549 1636 -48660 1606 1431 -48660 1605 1683 -48660 1549 1605 -48660 1871 1517 -48660 1549 1683 -48660 1650 1668 -48680 1548 1516 -48680 1548 1431 -48680 1591 1470 -48680 1599 1512 -48680 1606 1516 -48680 1626 1740 -48680 1655 1430 -48680 1857 1489 -48680 1431 1516 -48680 1504 1517 -48680 1519 1525 -48680 1538 1825 -48680 1600 1519 -48680 1619 1767 -48680 1698 1764 -48680 1549 1636 -48680 1606 1431 -48680 1605 1683 -48680 1549 1605 -48680 1871 1517 -48680 1549 1683 -48680 1650 1668 -48700 1538 1825 -48700 1545 1759 -48700 1606 1468 -48700 1269 1440 -48700 1825 1519 -48700 1857 1441 -48700 1600 1519 -48700 1619 1767 -48700 1698 1764 -48700 1548 1606 -48700 1549 1636 -48700 1643 1853 -48700 1558 1606 -48700 1606 1431 -48700 1605 1683 -48700 1549 1605 -48700 1871 1517 -48700 1549 1683 -48700 1650 1668 -48720 1545 1684 -48720 1545 1430 -48720 1548 1516 -48720 1554 1740 -48720 1600 1519 -48720 1619 1767 -48720 1545 1525 -48720 1606 1516 -48720 1626 1740 -48720 1698 1764 -48720 1548 1606 -48720 1549 1636 -48720 1643 1853 -48720 1655 1430 -48720 1558 1606 -48720 1606 1431 -48720 1591 1470 -48720 1605 1683 -48720 1549 1605 -48720 1871 1517 -48720 1549 1683 -48720 1650 1668 -48740 1545 1525 -48740 1554 1626 -48740 1558 1431 -48740 1583 1825 -48740 1606 1516 -48740 1626 1740 -48740 1628 1463 -48740 1660 1759 -48740 1698 1764 -48740 1857 1489 -48740 1857 1441 -48740 1545 1655 -48740 1548 1606 -48740 1549 1636 -48740 1643 1853 -48740 1655 1430 -48740 1858 1872 -48740 1558 1606 -48740 1599 1512 -48740 1606 1431 -48740 1591 1470 -48740 1605 1683 -48740 1549 1605 -48740 1871 1517 -48740 1549 1683 -48740 1650 1668 -48760 1545 1684 -48760 1545 1655 -48760 1548 1606 -48760 1549 1636 -48760 1606 1468 -48760 1643 1853 -48760 1655 1430 -48760 1858 1872 -48760 1558 1606 -48760 1599 1512 -48760 1606 1431 -48760 1619 1767 -48760 1545 1430 -48760 1591 1470 -48760 1605 1683 -48760 1549 1605 -48760 1655 1684 -48760 1871 1517 -48760 1549 1683 -48760 1650 1668 -48780 1558 1606 -48780 1599 1512 -48780 1606 1431 -48780 1619 1767 -48780 1643 1504 -48780 1650 1463 -48780 1507 1522 -48780 1545 1430 -48780 1591 1470 -48780 1605 1683 -48780 1655 1825 -48780 1668 1463 -48780 1684 1825 -48780 1549 1605 -48780 1655 1684 -48780 1871 1517 -48780 1549 1683 -48780 1650 1668 -48800 1545 1430 -48800 1580 1463 -48800 1591 1470 -48800 1605 1683 -48800 1655 1825 -48800 1668 1463 -48800 1684 1825 -48800 1269 1440 -48800 1857 1489 -48800 1428 1525 -48800 1858 1872 -48800 1549 1605 -48800 1655 1684 -48800 1871 1517 -48800 1698 1764 -48800 1549 1683 -48800 1650 1668 -48820 1545 1525 -48820 1548 1606 -48820 1600 1684 -48820 1605 1525 -48820 1636 1525 -48820 1643 1510 -48820 1683 1525 -48820 1858 1872 -48820 1549 1605 -48820 1606 1516 -48820 1606 1431 -48820 1655 1684 -48820 1871 1517 -48820 1698 1764 -48820 1549 1636 -48820 1549 1683 -48820 1650 1668 -48840 1545 1628 -48840 1549 1605 -48840 1703 1489 -48840 1825 1428 -48840 1857 1489 -48840 1428 1519 -48840 1545 1783 -48840 1558 1606 -48840 1606 1516 -48840 1606 1431 -48840 1655 1684 -48840 1871 1517 -48840 1698 1764 -48840 1549 1636 -48840 1825 1525 -48840 1549 1683 -48840 1650 1668 -48860 1545 1430 -48860 1545 1783 -48860 1558 1606 -48860 1573 1452 -48860 1580 1463 -48860 1606 1516 -48860 1703 1857 -48860 1619 1441 -48860 1548 1606 -48860 1606 1431 -48860 1655 1684 -48860 1871 1517 -48860 1698 1764 -48860 1605 1683 -48860 1549 1636 -48860 1825 1525 -48860 1549 1683 -48860 1650 1668 -48880 1545 1580 -48880 1545 1463 -48880 1548 1431 -48880 1558 1431 -48880 1591 1470 -48880 1619 1441 -48880 1858 1872 -48880 1548 1606 -48880 1606 1431 -48880 1655 1684 -48880 1871 1517 -48880 1698 1764 -48880 1605 1683 -48880 1549 1636 -48880 1825 1525 -48880 1549 1605 -48880 1549 1683 -48880 1650 1668 -48900 1539 1458 -48900 1545 1628 -48900 1548 1606 -48900 1599 1774 -48900 1606 1516 -48900 1606 1431 -48900 1655 1684 -48900 1655 1911 -48900 1660 1692 -48900 1660 1839 -48900 1684 1911 -48900 1692 1839 -48900 1871 1517 -48900 1507 1522 -48900 1599 1512 -48900 1599 1449 -48900 1840 1857 -48900 1698 1764 -48900 1840 1489 -48900 1605 1683 -48900 1857 1489 -48900 1549 1636 -48900 1599 1787 -48900 1825 1525 -48900 1628 1463 -48900 1549 1605 -48900 1549 1683 -48900 1650 1668 -48920 1545 1430 -48920 1558 1431 -48920 1599 1512 -48920 1599 1449 -48920 1606 1468 -48920 1619 1703 -48920 1650 1463 -48920 1668 1463 -48920 1831 1504 -48920 1840 1857 -48920 1628 1668 -48920 1698 1764 -48920 1787 1851 -48920 1840 1489 -48920 1858 1872 -48920 1605 1683 -48920 1857 1489 -48920 1599 1851 -48920 1549 1636 -48920 1599 1787 -48920 1825 1525 -48920 1628 1463 -48920 1549 1605 -48920 1549 1683 -48920 1650 1668 -48940 1628 1668 -48940 1698 1764 -48940 1787 1851 -48940 1840 1489 -48940 1858 1872 -48940 1510 1521 -48940 1605 1683 -48940 1619 1441 -48940 1857 1489 -48940 1599 1851 -48940 1857 1441 -48940 1549 1636 -48940 1579 1819 -48940 1599 1787 -48940 1825 1525 -48940 1628 1463 -48940 1549 1605 -48940 1549 1683 -48940 1650 1668 -48960 1599 1449 -48960 1605 1683 -48960 1619 1441 -48960 1656 1684 -48960 1787 1449 -48960 1857 1489 -48960 1591 1470 -48960 1599 1851 -48960 1857 1441 -48960 1507 1522 -48960 1549 1636 -48960 1579 1819 -48960 1599 1787 -48960 1825 1525 -48960 1628 1463 -48960 1549 1605 -48960 1549 1683 -48960 1650 1668 -48980 1545 1911 -48980 1579 1920 -48980 1587 1699 -48980 1591 1470 -48980 1599 1851 -48980 1703 1441 -48980 1840 1489 -48980 1857 1441 -48980 1858 1872 -48980 1507 1522 -48980 1549 1636 -48980 1579 1819 -48980 1599 1787 -48980 1825 1525 -48980 1628 1463 -48980 1545 1430 -48980 1549 1605 -48980 1549 1683 -48980 1650 1668 -49000 1549 1636 -49000 1574 1430 -49000 1579 1819 -49000 1668 1463 -49000 1441 1489 -49000 1599 1787 -49000 1650 1463 -49000 1655 1684 -49000 1787 1851 -49000 1573 1452 -49000 1825 1525 -49000 1628 1463 -49000 1655 1656 -49000 1656 1682 -49000 1656 1684 -49000 1682 1684 -49000 1545 1430 -49000 1549 1605 -49000 1549 1683 -49000 1650 1668 -49020 1574 1762 -49020 1591 1470 -49020 1599 1851 -49020 1599 1787 -49020 1650 1463 -49020 1655 1684 -49020 1767 1840 -49020 1787 1851 -49020 1911 1430 -49020 1573 1452 -49020 1600 1428 -49020 1825 1525 -49020 1857 1441 -49020 1628 1463 -49020 1655 1656 -49020 1655 1682 -49020 1656 1682 -49020 1656 1684 -49020 1682 1684 -49020 1599 1512 -49020 1545 1430 -49020 1549 1605 -49020 1819 1920 -49020 1549 1683 -49020 1650 1668 -49040 1573 1452 -49040 1600 1428 -49040 1668 1463 -49040 1825 1428 -49040 1825 1525 -49040 1840 1441 -49040 1853 1866 -49040 1857 1441 -49040 1628 1463 -49040 1655 1656 -49040 1655 1682 -49040 1656 1682 -49040 1656 1684 -49040 1682 1684 -49040 1767 1489 -49040 1599 1512 -49040 1605 1683 -49040 1545 1430 -49040 1857 1489 -49040 1549 1605 -49040 1819 1920 -49040 1549 1683 -49040 1650 1668 -49060 1628 1463 -49060 1655 1656 -49060 1655 1682 -49060 1656 1682 -49060 1656 1684 -49060 1682 1684 -49060 1767 1489 -49060 1767 1857 -49060 1811 1521 -49060 1811 1853 -49060 1853 1521 -49060 1599 1512 -49060 1605 1683 -49060 1655 1684 -49060 1545 1430 -49060 1857 1489 -49060 1549 1605 -49060 1574 1762 -49060 1591 1470 -49060 1819 1920 -49060 1549 1683 -49060 1650 1668 -49080 1574 1592 -49080 1599 1512 -49080 1605 1683 -49080 1628 1433 -49080 1655 1684 -49080 1811 1510 -49080 1840 1489 -49080 1545 1430 -49080 1857 1489 -49080 1441 1489 -49080 1825 1525 -49080 1549 1605 -49080 1574 1762 -49080 1591 1470 -49080 1819 1920 -49080 1549 1683 -49080 1650 1668 -49100 1545 1430 -49100 1656 1682 -49100 1825 1433 -49100 1857 1489 -49100 1441 1489 -49100 1767 1840 -49100 1825 1525 -49100 1549 1605 -49100 1574 1762 -49100 1591 1470 -49100 1819 1920 -49100 1549 1683 -49100 1650 1668 -49120 1548 1516 -49120 1549 1636 -49120 1573 1452 -49120 1599 1512 -49120 1605 1683 -49120 1671 1427 -49120 1767 1840 -49120 1767 1489 -49120 1825 1525 -49120 1468 1516 -49120 1549 1605 -49120 1707 1470 -49120 1574 1762 -49120 1840 1489 -49120 1591 1470 -49120 1660 1692 -49120 1819 1920 -49120 1549 1683 -49120 1650 1668 -49140 1545 1430 -49140 1549 1605 -49140 1551 1440 -49140 1551 1269 -49140 1574 1911 -49140 1575 1847 -49140 1606 1468 -49140 1636 1683 -49140 1679 1847 -49140 1707 1470 -49140 1767 1857 -49140 1840 1857 -49140 1574 1762 -49140 1840 1489 -49140 1591 1470 -49140 1660 1692 -49140 1819 1920 -49140 1549 1683 -49140 1650 1668 -49160 1574 1762 -49160 1600 1428 -49160 1619 1519 -49160 1671 1427 -49160 1840 1489 -49160 1847 1486 -49160 1857 1489 -49160 1441 1489 -49160 1563 1592 -49160 1591 1470 -49160 1660 1692 -49160 1857 1441 -49160 1656 1682 -49160 1819 1920 -49160 1919 1510 -49160 1547 1716 -49160 1549 1683 -49160 1650 1668 -49180 1558 1606 -49180 1563 1592 -49180 1591 1470 -49180 1606 1516 -49180 1655 1684 -49180 1656 1449 -49180 1660 1692 -49180 1667 1757 -49180 1669 1754 -49180 1857 1441 -49180 1574 1489 -49180 1656 1682 -49180 1819 1920 -49180 1606 1468 -49180 1919 1510 -49180 1547 1716 -49180 1549 1683 -49180 1599 1787 -49180 1650 1668 -49200 1574 1489 -49200 1599 1851 -49200 1656 1489 -49200 1656 1682 -49200 1694 1489 -49200 1819 1920 -49200 1606 1468 -49200 1767 1489 -49200 1919 1510 -49200 1547 1716 -49200 1549 1683 -49200 1599 1787 -49200 1767 1840 -49200 1573 1452 -49200 1650 1668 -49220 1551 1269 -49220 1563 1592 -49220 1606 1468 -49220 1669 1754 -49220 1692 1839 -49220 1767 1489 -49220 1919 1510 -49220 1547 1716 -49220 1549 1683 -49220 1599 1787 -49220 1606 1516 -49220 1698 1847 -49220 1840 1489 -49220 1767 1840 -49220 1660 1692 -49220 1573 1452 -49220 1650 1668 -49240 1545 1656 -49240 1547 1716 -49240 1548 1606 -49240 1549 1683 -49240 1599 1787 -49240 1606 1516 -49240 1606 1431 -49240 1626 1695 -49240 1656 1911 -49240 1698 1847 -49240 1840 1489 -49240 1441 1489 -49240 1819 1920 -49240 1767 1840 -49240 1549 1525 -49240 1656 1682 -49240 1660 1692 -49240 1573 1452 -49240 1650 1668 -49260 1551 1269 -49260 1563 1592 -49260 1599 1851 -49260 1700 1758 -49260 1774 1851 -49260 1819 1920 -49260 1669 1754 -49260 1767 1840 -49260 1549 1525 -49260 1606 1468 -49260 1656 1682 -49260 1660 1692 -49260 1600 1428 -49260 1573 1452 -49260 1650 1668 -49280 1549 1683 -49280 1591 1470 -49280 1627 1851 -49280 1669 1754 -49280 1716 1441 -49280 1716 1489 -49280 1731 1427 -49280 1767 1840 -49280 1919 1510 -49280 1655 1684 -49280 1840 1489 -49280 1441 1489 -49280 1549 1525 -49280 1606 1468 -49280 1431 1516 -49280 1656 1682 -49280 1767 1489 -49280 1599 1512 -49280 1660 1692 -49280 1600 1428 -49280 1740 1853 -49280 1573 1452 -49280 1650 1668 -49300 1549 1523 -49300 1655 1684 -49300 1684 1489 -49300 1684 1911 -49300 1840 1489 -49300 1441 1489 -49300 1549 1525 -49300 1606 1468 -49300 1683 1523 -49300 1819 1920 -49300 1431 1516 -49300 1656 1682 -49300 1767 1489 -49300 1599 1512 -49300 1660 1692 -49300 1600 1428 -49300 1740 1853 -49300 1573 1452 -49300 1650 1668 -49320 1548 1606 -49320 1549 1525 -49320 1551 1269 -49320 1606 1468 -49320 1606 1431 -49320 1683 1523 -49320 1684 1441 -49320 1684 1716 -49320 1787 1851 -49320 1819 1920 -49320 1851 1464 -49320 1911 1441 -49320 1431 1516 -49320 1656 1682 -49320 1767 1489 -49320 1919 1510 -49320 1599 1512 -49320 1669 1754 -49320 1660 1692 -49320 1667 1787 -49320 1600 1428 -49320 1740 1853 -49320 1545 1430 -49320 1573 1452 -49320 1650 1668 -49340 1537 1772 -49340 1538 1825 -49340 1656 1682 -49340 1667 1851 -49340 1700 1526 -49340 1767 1489 -49340 1825 1523 -49340 1919 1510 -49340 1441 1489 -49340 1599 1512 -49340 1669 1754 -49340 1840 1489 -49340 1660 1692 -49340 1667 1787 -49340 1522 1524 -49340 1600 1428 -49340 1740 1853 -49340 1683 1525 -49340 1545 1430 -49340 1573 1452 -49340 1650 1668 -49360 1591 1470 -49360 1599 1512 -49360 1600 1825 -49360 1669 1754 -49360 1684 1489 -49360 1684 1911 -49360 1716 1489 -49360 1754 1840 -49360 1840 1489 -49360 1507 1524 -49360 1563 1592 -49360 1599 1787 -49360 1660 1692 -49360 1667 1787 -49360 1522 1524 -49360 1543 1727 -49360 1551 1269 -49360 1600 1428 -49360 1740 1853 -49360 1683 1525 -49360 1545 1430 -49360 1573 1452 -49360 1549 1683 -49360 1650 1668 -49380 1563 1592 -49380 1599 1787 -49380 1660 1692 -49380 1667 1787 -49380 1767 1840 -49380 1507 1522 -49380 1522 1524 -49380 1543 1727 -49380 1551 1269 -49380 1600 1428 -49380 1656 1682 -49380 1740 1853 -49380 1911 1441 -49380 1683 1525 -49380 1825 1428 -49380 1545 1430 -49380 1573 1452 -49380 1549 1683 -49380 1650 1668 -49400 1543 1727 -49400 1551 1269 -49400 1591 1470 -49400 1592 1920 -49400 1599 1667 -49400 1600 1428 -49400 1605 1692 -49400 1656 1682 -49400 1684 1441 -49400 1694 1716 -49400 1600 1519 -49400 1605 1636 -49400 1619 1703 -49400 1684 1911 -49400 1740 1853 -49400 1911 1441 -49400 1683 1525 -49400 1825 1428 -49400 1545 1430 -49400 1573 1452 -49400 1549 1683 -49400 1650 1668 -49420 1549 1525 -49420 1600 1519 -49420 1605 1636 -49420 1619 1703 -49420 1622 1626 -49420 1626 1858 -49420 1667 1787 -49420 1684 1911 -49420 1692 1523 -49420 1700 1466 -49420 1754 1847 -49420 1767 1911 -49420 1740 1853 -49420 1911 1441 -49420 1683 1525 -49420 1538 1428 -49420 1825 1428 -49420 1545 1430 -49420 1573 1452 -49420 1549 1683 -49420 1819 1920 -49420 1660 1692 -49420 1650 1668 -49440 1541 1735 -49440 1613 1749 -49440 1740 1853 -49440 1759 1858 -49440 1840 1441 -49440 1857 1441 -49440 1911 1441 -49440 1599 1787 -49440 1656 1682 -49440 1683 1525 -49440 1684 1840 -49440 1507 1522 -49440 1538 1428 -49440 1825 1428 -49440 1545 1430 -49440 1573 1452 -49440 1549 1683 -49440 1630 1438 -49440 1819 1920 -49440 1660 1692 -49440 1650 1668 -49460 1546 1470 -49460 1599 1787 -49460 1613 1700 -49460 1656 1682 -49460 1683 1525 -49460 1684 1840 -49460 1684 1441 -49460 1507 1522 -49460 1538 1428 -49460 1825 1428 -49460 1545 1430 -49460 1573 1452 -49460 1549 1683 -49460 1630 1438 -49460 1819 1920 -49460 1660 1692 -49460 1650 1668 -49480 1538 1428 -49480 1605 1636 -49480 1619 1703 -49480 1667 1847 -49480 1825 1428 -49480 1851 1433 -49480 1545 1430 -49480 1573 1452 -49480 1599 1512 -49480 1600 1428 -49480 1549 1683 -49480 1740 1853 -49480 1676 1700 -49480 1551 1269 -49480 1630 1438 -49480 1819 1920 -49480 1660 1692 -49480 1650 1668 -49500 1545 1430 -49500 1573 1452 -49500 1583 1600 -49500 1599 1512 -49500 1600 1825 -49500 1600 1819 -49500 1600 1428 -49500 1684 1911 -49500 1857 1441 -49500 1912 1916 -49500 1549 1683 -49500 1683 1525 -49500 1740 1853 -49500 1676 1700 -49500 1551 1269 -49500 1630 1438 -49500 1819 1920 -49500 1660 1692 -49500 1656 1682 -49500 1650 1668 -49520 1549 1683 -49520 1563 1425 -49520 1683 1525 -49520 1687 1920 -49520 1740 1853 -49520 1840 1441 -49520 1676 1700 -49520 1551 1269 -49520 1635 1655 -49520 1851 1433 -49520 1619 1703 -49520 1630 1438 -49520 1819 1920 -49520 1660 1692 -49520 1656 1682 -49520 1650 1668 -49540 1537 1840 -49540 1546 1431 -49540 1554 1772 -49540 1676 1700 -49540 1551 1269 -49540 1635 1655 -49540 1702 1920 -49540 1851 1433 -49540 1619 1703 -49540 1625 1523 -49540 1630 1438 -49540 1600 1519 -49540 1754 1787 -49540 1819 1920 -49540 1573 1452 -49540 1660 1692 -49540 1656 1682 -49540 1545 1430 -49540 1625 1519 -49540 1650 1668 -49560 1538 1825 -49560 1551 1269 -49560 1635 1425 -49560 1635 1428 -49560 1635 1655 -49560 1655 1425 -49560 1692 1441 -49560 1702 1920 -49560 1702 1819 -49560 1787 1433 -49560 1851 1433 -49560 1522 1524 -49560 1619 1703 -49560 1625 1523 -49560 1630 1438 -49560 1635 1920 -49560 1687 1920 -49560 1600 1519 -49560 1754 1787 -49560 1819 1920 -49560 1573 1452 -49560 1695 1759 -49560 1660 1692 -49560 1656 1682 -49560 1545 1430 -49560 1625 1519 -49560 1650 1668 -49580 1543 1438 -49580 1600 1625 -49580 1619 1703 -49580 1625 1523 -49580 1630 1438 -49580 1635 1920 -49580 1635 1819 -49580 1659 1853 -49580 1687 1920 -49580 1687 1819 -49580 1687 1702 -49580 1692 1858 -49580 1700 1504 -49580 1727 1434 -49580 1735 1466 -49580 1519 1523 -49580 1568 1825 -49580 1600 1519 -49580 1754 1787 -49580 1819 1920 -49580 1538 1568 -49580 1573 1452 -49580 1449 1512 -49580 1676 1700 -49580 1695 1759 -49580 1613 1526 -49580 1660 1692 -49580 1656 1682 -49580 1545 1430 -49580 1625 1519 -49580 1650 1668 -49600 1568 1825 -49600 1599 1787 -49600 1600 1825 -49600 1600 1519 -49600 1702 1920 -49600 1754 1787 -49600 1819 1920 -49600 1840 1911 -49600 1538 1568 -49600 1573 1452 -49600 1449 1512 -49600 1676 1700 -49600 1695 1759 -49600 1613 1526 -49600 1549 1683 -49600 1660 1692 -49600 1551 1269 -49600 1656 1682 -49600 1545 1430 -49600 1625 1519 -49600 1857 1441 -49600 1650 1668 -49620 1538 1568 -49620 1539 1770 -49620 1547 1716 -49620 1573 1452 -49620 1600 1625 -49620 1635 1825 -49620 1912 1916 -49620 1449 1512 -49620 1459 1516 -49620 1599 1754 -49620 1676 1700 -49620 1695 1759 -49620 1613 1526 -49620 1549 1683 -49620 1605 1636 -49620 1660 1692 -49620 1551 1269 -49620 1655 1523 -49620 1656 1682 -49620 1545 1430 -49620 1625 1519 -49620 1857 1441 -49620 1650 1668 -49640 1539 1466 -49640 1539 1602 -49640 1568 1655 -49640 1586 1639 -49640 1599 1754 -49640 1600 1519 -49640 1602 1466 -49640 1602 1700 -49640 1676 1466 -49640 1676 1700 -49640 1695 1759 -49640 1700 1772 -49640 1735 1427 -49640 1772 1466 -49640 1613 1526 -49640 1819 1920 -49640 1549 1683 -49640 1605 1636 -49640 1660 1692 -49640 1551 1269 -49640 1568 1825 -49640 1655 1523 -49640 1656 1682 -49640 1545 1430 -49640 1625 1519 -49640 1857 1441 -49640 1650 1668 -49660 1539 1749 -49660 1548 1468 -49660 1579 1617 -49660 1613 1526 -49660 1754 1787 -49660 1772 1427 -49660 1819 1920 -49660 1543 1438 -49660 1549 1683 -49660 1605 1636 -49660 1660 1692 -49660 1787 1449 -49660 1551 1269 -49660 1568 1825 -49660 1573 1452 -49660 1655 1523 -49660 1656 1682 -49660 1545 1430 -49660 1625 1519 -49660 1857 1441 -49660 1650 1668 -49680 1538 1568 -49680 1543 1438 -49680 1549 1683 -49680 1605 1636 -49680 1660 1692 -49680 1671 1521 -49680 1727 1434 -49680 1787 1449 -49680 1840 1911 -49680 1551 1269 -49680 1568 1825 -49680 1548 1516 -49680 1573 1452 -49680 1655 1523 -49680 1656 1682 -49680 1545 1430 -49680 1537 1825 -49680 1625 1519 -49680 1857 1441 -49680 1650 1668 -49700 1551 1269 -49700 1568 1825 -49700 1575 1679 -49700 1676 1700 -49700 1700 1770 -49700 1548 1516 -49700 1573 1452 -49700 1655 1523 -49700 1656 1682 -49700 1545 1430 -49700 1676 1770 -49700 1537 1825 -49700 1613 1526 -49700 1625 1519 -49700 1857 1441 -49700 1650 1668 -49720 1543 1438 -49720 1548 1516 -49720 1549 1683 -49720 1573 1452 -49720 1655 1523 -49720 1656 1682 -49720 1660 1692 -49720 1671 1521 -49720 1911 1441 -49720 1545 1430 -49720 1676 1770 -49720 1537 1825 -49720 1613 1526 -49720 1673 1747 -49720 1625 1519 -49720 1857 1441 -49720 1650 1668 -49740 1545 1430 -49740 1549 1525 -49740 1676 1770 -49740 1683 1525 -49740 1700 1452 -49740 1767 1840 -49740 1819 1920 -49740 1470 1530 -49740 1496 1505 -49740 1537 1825 -49740 1538 1568 -49740 1613 1526 -49740 1673 1747 -49740 1625 1519 -49740 1857 1441 -49740 1650 1668 -49760 1537 1825 -49760 1538 1568 -49760 1543 1438 -49760 1549 1683 -49760 1551 1269 -49760 1558 1468 -49760 1613 1526 -49760 1645 1756 -49760 1660 1692 -49760 1673 1747 -49760 1496 1497 -49760 1605 1636 -49760 1625 1519 -49760 1541 1512 -49760 1599 1512 -49760 1676 1700 -49760 1857 1441 -49760 1656 1682 -49760 1650 1668 -49780 1545 1430 -49780 1605 1636 -49780 1625 1519 -49780 1671 1903 -49780 1677 1899 -49780 1677 1701 -49780 1701 1899 -49780 1767 1840 -49780 1541 1512 -49780 1599 1512 -49780 1825 1525 -49780 1496 1505 -49780 1676 1700 -49780 1857 1441 -49780 1656 1682 -49780 1650 1668 -49800 1541 1512 -49800 1548 1516 -49800 1573 1452 -49800 1599 1512 -49800 1655 1523 -49800 1683 1825 -49800 1819 1920 -49800 1825 1525 -49800 1496 1505 -49800 1617 1857 -49800 1617 1441 -49800 1676 1700 -49800 1911 1441 -49800 1459 1516 -49800 1857 1441 -49800 1537 1549 -49800 1537 1525 -49800 1541 1851 -49800 1656 1682 -49800 1549 1683 -49800 1549 1525 -49800 1650 1668 -49820 1537 1619 -49820 1541 1599 -49820 1581 1495 -49820 1606 1516 -49820 1617 1857 -49820 1617 1441 -49820 1676 1700 -49820 1911 1441 -49820 1431 1516 -49820 1459 1516 -49820 1568 1825 -49820 1599 1787 -49820 1857 1441 -49820 1537 1549 -49820 1537 1525 -49820 1545 1430 -49820 1541 1851 -49820 1673 1747 -49820 1660 1692 -49820 1656 1682 -49820 1671 1821 -49820 1549 1683 -49820 1549 1525 -49820 1650 1668 -49840 1538 1568 -49840 1568 1825 -49840 1591 1665 -49840 1599 1787 -49840 1645 1756 -49840 1857 1441 -49840 1496 1505 -49840 1496 1497 -49840 1537 1549 -49840 1537 1525 -49840 1545 1430 -49840 1541 1851 -49840 1593 1684 -49840 1673 1747 -49840 1660 1692 -49840 1551 1269 -49840 1656 1682 -49840 1671 1821 -49840 1549 1683 -49840 1549 1525 -49840 1650 1668 -49860 1537 1549 -49860 1537 1525 -49860 1545 1430 -49860 1548 1431 -49860 1599 1512 -49860 1613 1526 -49860 1667 1692 -49860 1767 1840 -49860 1541 1851 -49860 1593 1684 -49860 1673 1747 -49860 1660 1692 -49860 1676 1700 -49860 1551 1269 -49860 1656 1682 -49860 1671 1821 -49860 1549 1683 -49860 1549 1525 -49860 1650 1668 -49880 1541 1851 -49880 1541 1787 -49880 1547 1605 -49880 1593 1684 -49880 1606 1431 -49880 1673 1747 -49880 1660 1692 -49880 1676 1700 -49880 1857 1911 -49880 1617 1911 -49880 1599 1787 -49880 1551 1269 -49880 1551 1440 -49880 1656 1682 -49880 1671 1821 -49880 1857 1441 -49880 1669 1754 -49880 1549 1683 -49880 1549 1525 -49880 1650 1668 -49900 1537 1683 -49900 1537 1583 -49900 1660 1692 -49900 1676 1700 -49900 1698 1518 -49900 1857 1911 -49900 1496 1497 -49900 1547 1716 -49900 1553 1683 -49900 1568 1825 -49900 1617 1857 -49900 1617 1911 -49900 1599 1787 -49900 1605 1716 -49900 1551 1269 -49900 1551 1440 -49900 1656 1682 -49900 1671 1821 -49900 1857 1441 -49900 1635 1747 -49900 1669 1754 -49900 1549 1683 -49900 1549 1525 -49900 1650 1668 -49920 1537 1525 -49920 1541 1851 -49920 1545 1489 -49920 1547 1716 -49920 1613 1528 -49920 1655 1711 -49920 1553 1683 -49920 1568 1825 -49920 1617 1441 -49920 1617 1857 -49920 1617 1911 -49920 1547 1684 -49920 1599 1787 -49920 1605 1716 -49920 1684 1716 -49920 1551 1269 -49920 1551 1440 -49920 1656 1682 -49920 1671 1821 -49920 1857 1441 -49920 1635 1747 -49920 1669 1754 -49920 1549 1683 -49920 1625 1519 -49920 1549 1525 -49920 1650 1668 -49940 1553 1683 -49940 1568 1825 -49940 1591 1665 -49940 1617 1441 -49940 1697 1711 -49940 1911 1441 -49940 1459 1516 -49940 1496 1497 -49940 1617 1857 -49940 1617 1911 -49940 1655 1697 -49940 1655 1670 -49940 1767 1840 -49940 1547 1684 -49940 1599 1787 -49940 1605 1716 -49940 1684 1716 -49940 1551 1269 -49940 1551 1440 -49940 1656 1682 -49940 1671 1821 -49940 1857 1441 -49940 1635 1747 -49940 1669 1754 -49940 1549 1683 -49940 1625 1519 -49940 1549 1525 -49940 1650 1668 -49960 1538 1568 -49960 1613 1526 -49960 1617 1857 -49960 1617 1911 -49960 1655 1697 -49960 1655 1670 -49960 1673 1695 -49960 1767 1840 -49960 1496 1505 -49960 1541 1851 -49960 1547 1684 -49960 1599 1787 -49960 1605 1716 -49960 1684 1716 -49960 1727 1434 -49960 1551 1269 -49960 1574 1489 -49960 1551 1440 -49960 1655 1711 -49960 1660 1692 -49960 1656 1682 -49960 1670 1711 -49960 1671 1821 -49960 1857 1441 -49960 1635 1747 -49960 1669 1754 -49960 1549 1683 -49960 1625 1519 -49960 1549 1525 -49960 1650 1668 -49980 1538 1524 -49980 1541 1851 -49980 1547 1684 -49980 1559 1761 -49980 1599 1787 -49980 1605 1427 -49980 1605 1716 -49980 1617 1441 -49980 1684 1716 -49980 1688 1460 -49980 1727 1434 -49980 1459 1516 -49980 1504 1528 -49980 1551 1269 -49980 1574 1489 -49980 1551 1440 -49980 1655 1711 -49980 1660 1692 -49980 1676 1700 -49980 1656 1682 -49980 1670 1711 -49980 1671 1821 -49980 1857 1441 -49980 1635 1747 -49980 1669 1754 -49980 1537 1549 -49980 1549 1683 -49980 1625 1519 -49980 1549 1525 -49980 1650 1668 -50000 1551 1269 -50000 1558 1468 -50000 1574 1489 -50000 1613 1526 -50000 1684 1839 -50000 1500 1511 -50000 1605 1636 -50000 1655 1697 -50000 1655 1670 -50000 1551 1440 -50000 1655 1711 -50000 1660 1692 -50000 1676 1700 -50000 1656 1682 -50000 1670 1711 -50000 1671 1821 -50000 1857 1441 -50000 1635 1747 -50000 1669 1754 -50000 1568 1524 -50000 1537 1549 -50000 1549 1683 -50000 1625 1519 -50000 1547 1716 -50000 1549 1525 -50000 1650 1668 -50020 1545 1443 -50020 1545 1430 -50020 1572 1706 -50020 1605 1636 -50020 1606 1516 -50020 1655 1697 -50020 1655 1670 -50020 1538 1524 -50020 1551 1440 -50020 1655 1711 -50020 1660 1692 -50020 1676 1700 -50020 1700 1528 -50020 1727 1434 -50020 1537 1525 -50020 1617 1441 -50020 1656 1682 -50020 1670 1711 -50020 1671 1821 -50020 1857 1441 -50020 1635 1747 -50020 1669 1754 -50020 1568 1524 -50020 1537 1549 -50020 1549 1683 -50020 1625 1519 -50020 1547 1716 -50020 1549 1525 -50020 1650 1668 -50040 1538 1568 -50040 1538 1524 -50040 1548 1468 -50040 1551 1440 -50040 1574 1839 -50040 1591 1665 -50040 1648 1448 -50040 1655 1711 -50040 1660 1692 -50040 1670 1697 -50040 1671 1448 -50040 1676 1700 -50040 1700 1528 -50040 1727 1434 -50040 1431 1516 -50040 1500 1511 -50040 1537 1525 -50040 1545 1604 -50040 1616 1430 -50040 1617 1441 -50040 1656 1682 -50040 1670 1711 -50040 1671 1821 -50040 1857 1441 -50040 1635 1747 -50040 1669 1754 -50040 1568 1524 -50040 1537 1549 -50040 1549 1683 -50040 1625 1519 -50040 1547 1716 -50040 1549 1525 -50040 1650 1668 -50060 1537 1525 -50060 1545 1604 -50060 1550 1531 -50060 1550 1791 -50060 1616 1430 -50060 1617 1441 -50060 1656 1682 -50060 1670 1711 -50060 1671 1821 -50060 1697 1711 -50060 1857 1441 -50060 1458 1531 -50060 1513 1519 -50060 1551 1269 -50060 1605 1636 -50060 1635 1747 -50060 1684 1911 -50060 1767 1840 -50060 1498 1527 -50060 1669 1754 -50060 1695 1527 -50060 1568 1524 -50060 1695 1498 -50060 1537 1549 -50060 1549 1683 -50060 1625 1519 -50060 1547 1716 -50060 1549 1525 -50060 1650 1668 -50080 1538 1524 -50080 1540 1542 -50080 1551 1269 -50080 1587 1688 -50080 1604 1616 -50080 1605 1636 -50080 1613 1526 -50080 1635 1747 -50080 1684 1911 -50080 1767 1840 -50080 1498 1527 -50080 1538 1568 -50080 1669 1754 -50080 1695 1527 -50080 1568 1524 -50080 1695 1498 -50080 1537 1549 -50080 1549 1683 -50080 1625 1519 -50080 1676 1700 -50080 1547 1716 -50080 1617 1857 -50080 1549 1525 -50080 1650 1668 -50100 1537 1525 -50100 1538 1568 -50100 1550 1531 -50100 1639 1710 -50100 1660 1692 -50100 1669 1754 -50100 1695 1527 -50100 1468 1516 -50100 1537 1683 -50100 1568 1524 -50100 1700 1528 -50100 1431 1516 -50100 1695 1498 -50100 1537 1549 -50100 1549 1683 -50100 1625 1519 -50100 1676 1700 -50100 1547 1716 -50100 1656 1682 -50100 1617 1857 -50100 1549 1525 -50100 1650 1668 -50120 1537 1683 -50120 1538 1825 -50120 1541 1555 -50120 1568 1524 -50120 1655 1825 -50120 1655 1523 -50120 1676 1528 -50120 1700 1528 -50120 1702 1448 -50120 1761 1531 -50120 1431 1516 -50120 1541 1533 -50120 1545 1430 -50120 1695 1498 -50120 1537 1549 -50120 1549 1683 -50120 1625 1519 -50120 1676 1700 -50120 1547 1716 -50120 1656 1682 -50120 1617 1857 -50120 1549 1525 -50120 1650 1668 -50140 1538 1911 -50140 1541 1533 -50140 1639 1710 -50140 1752 1766 -50140 1825 1524 -50140 1845 1434 -50140 1545 1430 -50140 1538 1524 -50140 1695 1498 -50140 1660 1692 -50140 1537 1549 -50140 1549 1683 -50140 1625 1519 -50140 1669 1754 -50140 1676 1700 -50140 1547 1716 -50140 1656 1682 -50140 1617 1857 -50140 1549 1525 -50140 1650 1668 -50160 1538 1568 -50160 1545 1771 -50160 1545 1430 -50160 1563 1592 -50160 1568 1524 -50160 1431 1516 -50160 1538 1524 -50160 1695 1498 -50160 1660 1692 -50160 1537 1549 -50160 1549 1683 -50160 1625 1519 -50160 1669 1754 -50160 1676 1700 -50160 1547 1716 -50160 1655 1523 -50160 1656 1682 -50160 1617 1857 -50160 1549 1525 -50160 1650 1668 -50180 1538 1524 -50180 1568 1825 -50180 1583 1523 -50180 1604 1616 -50180 1642 1752 -50180 1642 1766 -50180 1695 1498 -50180 1702 1466 -50180 1727 1845 -50180 1752 1766 -50180 1660 1692 -50180 1605 1636 -50180 1537 1549 -50180 1537 1525 -50180 1549 1683 -50180 1625 1519 -50180 1669 1754 -50180 1676 1700 -50180 1547 1716 -50180 1655 1523 -50180 1840 1489 -50180 1656 1682 -50180 1617 1857 -50180 1549 1525 -50180 1650 1668 -50200 1550 1493 -50200 1595 1469 -50200 1660 1692 -50200 1706 1863 -50200 1269 1440 -50200 1458 1501 -50200 1513 1523 -50200 1551 1440 -50200 1591 1665 -50200 1605 1636 -50200 1537 1549 -50200 1537 1525 -50200 1538 1825 -50200 1549 1683 -50200 1625 1519 -50200 1669 1754 -50200 1676 1700 -50200 1547 1716 -50200 1655 1523 -50200 1840 1489 -50200 1656 1682 -50200 1617 1857 -50200 1549 1525 -50200 1650 1668 -50220 1541 1688 -50220 1541 1581 -50220 1551 1440 -50220 1560 1688 -50220 1591 1504 -50220 1591 1665 -50220 1605 1636 -50220 1619 1911 -50220 1664 1821 -50220 1706 1501 -50220 1537 1549 -50220 1537 1525 -50220 1538 1825 -50220 1549 1683 -50220 1625 1519 -50220 1669 1754 -50220 1676 1700 -50220 1825 1524 -50220 1547 1716 -50220 1583 1523 -50220 1655 1523 -50220 1840 1489 -50220 1656 1682 -50220 1617 1857 -50220 1549 1525 -50220 1650 1668 -50240 1537 1655 -50240 1537 1683 -50240 1537 1549 -50240 1537 1525 -50240 1538 1825 -50240 1549 1683 -50240 1550 1501 -50240 1550 1706 -50240 1550 1863 -50240 1559 1791 -50240 1563 1513 -50240 1579 1773 -50240 1595 1685 -50240 1625 1519 -50240 1669 1754 -50240 1676 1700 -50240 1684 1489 -50240 1695 1498 -50240 1706 1863 -50240 1825 1524 -50240 1834 1903 -50240 1840 1857 -50240 1541 1533 -50240 1547 1716 -50240 1550 1458 -50240 1583 1523 -50240 1599 1512 -50240 1467 1493 -50240 1655 1523 -50240 1752 1766 -50240 1840 1489 -50240 1656 1682 -50240 1617 1857 -50240 1549 1525 -50240 1650 1668 -50260 1541 1533 -50260 1547 1716 -50260 1550 1458 -50260 1583 1523 -50260 1599 1512 -50260 1664 1821 -50260 1676 1528 -50260 1700 1528 -50260 1467 1493 -50260 1655 1523 -50260 1752 1766 -50260 1840 1489 -50260 1656 1682 -50260 1617 1857 -50260 1549 1525 -50260 1650 1668 -50280 1538 1825 -50280 1549 1683 -50280 1563 1574 -50280 1655 1523 -50280 1676 1504 -50280 1702 1466 -50280 1706 1501 -50280 1752 1766 -50280 1840 1489 -50280 1899 1495 -50280 1504 1528 -50280 1595 1654 -50280 1605 1636 -50280 1656 1682 -50280 1706 1458 -50280 1458 1501 -50280 1617 1857 -50280 1700 1504 -50280 1549 1525 -50280 1625 1519 -50280 1650 1668 -50300 1568 1825 -50300 1574 1441 -50300 1585 1766 -50300 1595 1654 -50300 1597 1504 -50300 1605 1636 -50300 1616 1899 -50300 1656 1682 -50300 1664 1821 -50300 1670 1711 -50300 1688 1457 -50300 1706 1458 -50300 1757 1467 -50300 1441 1489 -50300 1458 1501 -50300 1604 1518 -50300 1617 1857 -50300 1700 1504 -50300 1761 1531 -50300 1562 1449 -50300 1547 1716 -50300 1549 1525 -50300 1625 1519 -50300 1650 1668 -50320 1541 1749 -50320 1549 1683 -50320 1593 1521 -50320 1604 1518 -50320 1617 1857 -50320 1700 1504 -50320 1707 1764 -50320 1752 1766 -50320 1761 1531 -50320 1791 1531 -50320 1504 1528 -50320 1562 1449 -50320 1547 1716 -50320 1549 1525 -50320 1857 1441 -50320 1676 1700 -50320 1625 1519 -50320 1574 1617 -50320 1650 1668 -50340 1562 1449 -50340 1597 1676 -50340 1605 1659 -50340 1605 1636 -50340 1706 1458 -50340 1706 1863 -50340 1774 1512 -50340 1840 1441 -50340 1547 1716 -50340 1549 1525 -50340 1568 1825 -50340 1670 1711 -50340 1574 1857 -50340 1617 1441 -50340 1857 1489 -50340 1857 1441 -50340 1656 1682 -50340 1676 1700 -50340 1625 1519 -50340 1574 1441 -50340 1574 1617 -50340 1650 1668 -50360 1541 1555 -50360 1547 1716 -50360 1549 1525 -50360 1568 1825 -50360 1670 1711 -50360 1727 1845 -50360 1752 1766 -50360 1752 1495 -50360 1574 1857 -50360 1574 1489 -50360 1617 1441 -50360 1617 1489 -50360 1655 1512 -50360 1857 1489 -50360 1857 1441 -50360 1863 1501 -50360 1441 1489 -50360 1458 1501 -50360 1845 1434 -50360 1593 1521 -50360 1656 1682 -50360 1676 1700 -50360 1625 1519 -50360 1574 1441 -50360 1574 1617 -50360 1650 1668 -50380 1550 1752 -50380 1560 1495 -50380 1574 1857 -50380 1574 1489 -50380 1605 1636 -50380 1617 1441 -50380 1617 1489 -50380 1655 1512 -50380 1706 1501 -50380 1707 1764 -50380 1857 1489 -50380 1857 1441 -50380 1863 1458 -50380 1863 1501 -50380 1441 1489 -50380 1458 1501 -50380 1669 1754 -50380 1845 1434 -50380 1593 1521 -50380 1656 1682 -50380 1676 1700 -50380 1569 1742 -50380 1625 1519 -50380 1574 1441 -50380 1538 1524 -50380 1549 1683 -50380 1574 1617 -50380 1650 1668 -50400 1669 1754 -50400 1765 1495 -50400 1845 1434 -50400 1593 1521 -50400 1656 1682 -50400 1671 1523 -50400 1676 1700 -50400 1547 1716 -50400 1569 1742 -50400 1625 1519 -50400 1697 1711 -50400 1574 1441 -50400 1549 1525 -50400 1538 1524 -50400 1549 1683 -50400 1574 1617 -50400 1650 1668 -50420 1593 1521 -50420 1605 1636 -50420 1655 1512 -50420 1656 1682 -50420 1670 1711 -50420 1671 1523 -50420 1676 1700 -50420 1707 1764 -50420 1767 1489 -50420 1863 1501 -50420 1443 1467 -50420 1547 1716 -50420 1569 1742 -50420 1625 1519 -50420 1697 1711 -50420 1712 1523 -50420 1458 1501 -50420 1574 1441 -50420 1842 1439 -50420 1549 1525 -50420 1467 1495 -50420 1538 1524 -50420 1549 1683 -50420 1574 1617 -50420 1650 1668 -50440 1547 1716 -50440 1569 1742 -50440 1625 1519 -50440 1697 1711 -50440 1698 1764 -50440 1706 1501 -50440 1712 1523 -50440 1431 1516 -50440 1458 1501 -50440 1551 1440 -50440 1574 1441 -50440 1698 1707 -50440 1761 1531 -50440 1842 1439 -50440 1493 1495 -50440 1459 1512 -50440 1549 1525 -50440 1669 1754 -50440 1676 1504 -50440 1467 1495 -50440 1538 1524 -50440 1549 1683 -50440 1574 1617 -50440 1650 1668 -50460 1551 1440 -50460 1574 1441 -50460 1606 1516 -50460 1617 1441 -50460 1676 1700 -50460 1698 1707 -50460 1707 1764 -50460 1749 1757 -50460 1761 1531 -50460 1769 1845 -50460 1791 1531 -50460 1825 1524 -50460 1842 1439 -50460 1863 1458 -50460 1493 1495 -50460 1670 1711 -50460 1700 1528 -50460 1459 1512 -50460 1543 1700 -50460 1549 1525 -50460 1669 1754 -50460 1676 1504 -50460 1467 1495 -50460 1538 1524 -50460 1549 1683 -50460 1574 1617 -50460 1605 1636 -50460 1650 1668 -50480 1547 1716 -50480 1551 1269 -50480 1566 1453 -50480 1575 1679 -50480 1579 1701 -50480 1617 1489 -50480 1655 1512 -50480 1670 1711 -50480 1676 1528 -50480 1677 1701 -50480 1678 1503 -50480 1697 1711 -50480 1700 1528 -50480 1459 1512 -50480 1543 1504 -50480 1543 1528 -50480 1543 1700 -50480 1549 1525 -50480 1669 1754 -50480 1676 1504 -50480 1467 1495 -50480 1538 1524 -50480 1549 1683 -50480 1625 1519 -50480 1840 1489 -50480 1574 1617 -50480 1605 1636 -50480 1650 1668 -50500 1543 1504 -50500 1543 1528 -50500 1543 1700 -50500 1545 1430 -50500 1549 1525 -50500 1562 1694 -50500 1579 1642 -50500 1593 1521 -50500 1669 1754 -50500 1676 1504 -50500 1676 1700 -50500 1842 1439 -50500 1863 1458 -50500 1458 1501 -50500 1467 1495 -50500 1538 1524 -50500 1549 1683 -50500 1625 1519 -50500 1840 1489 -50500 1574 1617 -50500 1605 1636 -50500 1650 1668 -50520 1569 1742 -50520 1595 1654 -50520 1684 1489 -50520 1761 1531 -50520 1467 1495 -50520 1547 1808 -50520 1825 1524 -50520 1538 1524 -50520 1551 1269 -50520 1656 1682 -50520 1549 1683 -50520 1566 1453 -50520 1625 1519 -50520 1840 1489 -50520 1574 1617 -50520 1605 1636 -50520 1650 1668 -50540 1539 1701 -50540 1547 1808 -50540 1593 1521 -50540 1695 1759 -50540 1825 1524 -50540 1458 1501 -50540 1538 1524 -50540 1551 1269 -50540 1606 1521 -50540 1656 1682 -50540 1549 1683 -50540 1566 1453 -50540 1676 1504 -50540 1625 1519 -50540 1840 1489 -50540 1574 1617 -50540 1605 1636 -50540 1549 1525 -50540 1543 1700 -50540 1650 1668 -50560 1537 1858 -50560 1538 1524 -50560 1541 1521 -50560 1551 1269 -50560 1593 1526 -50560 1606 1521 -50560 1656 1682 -50560 1684 1489 -50560 1431 1516 -50560 1549 1683 -50560 1566 1453 -50560 1652 1747 -50560 1676 1504 -50560 1559 1531 -50560 1625 1519 -50560 1761 1531 -50560 1840 1489 -50560 1695 1443 -50560 1574 1617 -50560 1605 1636 -50560 1549 1525 -50560 1543 1700 -50560 1650 1668 -50580 1549 1683 -50580 1551 1769 -50580 1566 1453 -50580 1625 1683 -50580 1652 1747 -50580 1676 1504 -50580 1676 1700 -50580 1695 1759 -50580 1706 1458 -50580 1458 1501 -50580 1459 1512 -50580 1559 1761 -50580 1559 1531 -50580 1625 1519 -50580 1677 1701 -50580 1761 1791 -50580 1791 1531 -50580 1761 1531 -50580 1840 1489 -50580 1595 1654 -50580 1695 1443 -50580 1574 1617 -50580 1605 1636 -50580 1549 1524 -50580 1549 1525 -50580 1543 1700 -50580 1650 1668 -50600 1538 1825 -50600 1551 1440 -50600 1559 1761 -50600 1559 1531 -50600 1601 1911 -50600 1625 1519 -50600 1677 1701 -50600 1695 1498 -50600 1761 1791 -50600 1791 1531 -50600 1551 1269 -50600 1697 1711 -50600 1656 1682 -50600 1761 1531 -50600 1840 1489 -50600 1595 1654 -50600 1695 1443 -50600 1574 1617 -50600 1605 1636 -50600 1549 1524 -50600 1549 1525 -50600 1543 1700 -50600 1650 1668 -50620 1551 1269 -50620 1573 1452 -50620 1574 1441 -50620 1635 1684 -50620 1684 1840 -50620 1697 1711 -50620 1656 1682 -50620 1761 1531 -50620 1840 1489 -50620 1595 1654 -50620 1695 1443 -50620 1574 1617 -50620 1605 1636 -50620 1549 1524 -50620 1549 1525 -50620 1549 1683 -50620 1543 1700 -50620 1650 1668 -50640 1543 1676 -50640 1569 1742 -50640 1617 1441 -50640 1635 1840 -50640 1635 1489 -50640 1656 1682 -50640 1716 1808 -50640 1761 1531 -50640 1791 1531 -50640 1840 1489 -50640 1595 1654 -50640 1676 1700 -50640 1695 1443 -50640 1574 1617 -50640 1601 1911 -50640 1605 1636 -50640 1549 1524 -50640 1549 1525 -50640 1524 1525 -50640 1549 1683 -50640 1543 1700 -50640 1650 1668 -50660 1541 1555 -50660 1595 1654 -50660 1635 1441 -50660 1676 1504 -50660 1676 1700 -50660 1695 1443 -50660 1759 1443 -50660 1574 1617 -50660 1601 1911 -50660 1605 1636 -50660 1683 1524 -50660 1549 1524 -50660 1568 1825 -50660 1549 1525 -50660 1537 1678 -50660 1524 1525 -50660 1549 1683 -50660 1543 1700 -50660 1650 1668 -50680 1539 1501 -50680 1541 1691 -50680 1549 1681 -50680 1574 1617 -50680 1574 1489 -50680 1601 1911 -50680 1605 1636 -50680 1617 1441 -50680 1683 1524 -50680 1791 1531 -50680 1600 1519 -50680 1551 1269 -50680 1683 1525 -50680 1549 1524 -50680 1676 1528 -50680 1676 1453 -50680 1568 1825 -50680 1572 1501 -50680 1656 1682 -50680 1549 1525 -50680 1537 1678 -50680 1524 1525 -50680 1549 1683 -50680 1543 1453 -50680 1543 1700 -50680 1681 1683 -50680 1650 1668 -50700 1559 1531 -50700 1563 1711 -50700 1600 1625 -50700 1600 1519 -50700 1635 1489 -50700 1911 1467 -50700 1441 1489 -50700 1551 1269 -50700 1669 1754 -50700 1683 1525 -50700 1543 1528 -50700 1543 1676 -50700 1549 1524 -50700 1676 1528 -50700 1676 1453 -50700 1568 1825 -50700 1572 1501 -50700 1706 1761 -50700 1656 1682 -50700 1549 1525 -50700 1537 1678 -50700 1684 1711 -50700 1524 1525 -50700 1549 1683 -50700 1625 1519 -50700 1543 1453 -50700 1700 1453 -50700 1543 1700 -50700 1681 1683 -50700 1650 1668 -50720 1551 1269 -50720 1569 1742 -50720 1669 1754 -50720 1683 1525 -50720 1695 1759 -50720 1767 1489 -50720 1467 1493 -50720 1543 1528 -50720 1543 1676 -50720 1549 1524 -50720 1676 1528 -50720 1676 1453 -50720 1683 1524 -50720 1857 1441 -50720 1550 1443 -50720 1568 1825 -50720 1572 1501 -50720 1706 1761 -50720 1453 1528 -50720 1563 1592 -50720 1656 1682 -50720 1549 1525 -50720 1537 1678 -50720 1684 1711 -50720 1524 1525 -50720 1549 1683 -50720 1625 1519 -50720 1543 1453 -50720 1700 1453 -50720 1543 1700 -50720 1681 1683 -50720 1650 1668 -50740 1543 1528 -50740 1543 1676 -50740 1549 1524 -50740 1591 1665 -50740 1635 1489 -50740 1656 1671 -50740 1671 1682 -50740 1676 1528 -50740 1676 1700 -50740 1676 1453 -50740 1683 1524 -50740 1711 1467 -50740 1857 1441 -50740 1504 1528 -50740 1550 1443 -50740 1568 1825 -50740 1572 1501 -50740 1617 1489 -50740 1697 1711 -50740 1706 1761 -50740 1453 1528 -50740 1563 1592 -50740 1441 1489 -50740 1656 1682 -50740 1549 1525 -50740 1791 1531 -50740 1537 1678 -50740 1684 1711 -50740 1524 1525 -50740 1549 1683 -50740 1625 1519 -50740 1543 1453 -50740 1700 1453 -50740 1543 1700 -50740 1681 1683 -50740 1650 1668 -50760 1550 1443 -50760 1559 1531 -50760 1568 1825 -50760 1572 1501 -50760 1574 1441 -50760 1617 1489 -50760 1683 1525 -50760 1697 1711 -50760 1706 1761 -50760 1453 1528 -50760 1563 1592 -50760 1655 1519 -50760 1441 1489 -50760 1656 1682 -50760 1625 1655 -50760 1549 1525 -50760 1791 1531 -50760 1537 1678 -50760 1684 1711 -50760 1524 1525 -50760 1549 1683 -50760 1625 1519 -50760 1543 1453 -50760 1700 1453 -50760 1543 1700 -50760 1549 1681 -50760 1681 1524 -50760 1681 1683 -50760 1650 1668 -50780 1541 1555 -50780 1548 1516 -50780 1553 1681 -50780 1563 1592 -50780 1600 1655 -50780 1635 1441 -50780 1655 1519 -50780 1669 1754 -50780 1676 1700 -50780 1683 1524 -50780 1441 1489 -50780 1574 1617 -50780 1656 1682 -50780 1676 1528 -50780 1625 1655 -50780 1546 1606 -50780 1549 1525 -50780 1606 1516 -50780 1791 1531 -50780 1537 1678 -50780 1538 1671 -50780 1684 1711 -50780 1524 1525 -50780 1549 1683 -50780 1549 1524 -50780 1625 1519 -50780 1543 1453 -50780 1700 1453 -50780 1543 1700 -50780 1549 1681 -50780 1681 1524 -50780 1681 1683 -50780 1650 1668 -50800 1545 1430 -50800 1551 1269 -50800 1569 1742 -50800 1572 1501 -50800 1574 1617 -50800 1656 1682 -50800 1676 1528 -50800 1676 1453 -50800 1453 1528 -50800 1625 1655 -50800 1681 1525 -50800 1546 1606 -50800 1700 1528 -50800 1548 1606 -50800 1549 1525 -50800 1606 1516 -50800 1791 1531 -50800 1537 1678 -50800 1538 1671 -50800 1684 1711 -50800 1524 1525 -50800 1549 1683 -50800 1549 1524 -50800 1625 1519 -50800 1543 1453 -50800 1700 1453 -50800 1543 1700 -50800 1549 1681 -50800 1681 1524 -50800 1568 1671 -50800 1681 1683 -50800 1650 1668 -50820 1600 1625 -50820 1606 1468 -50820 1617 1441 -50820 1625 1655 -50820 1635 1489 -50820 1669 1754 -50820 1681 1525 -50820 1546 1606 -50820 1574 1489 -50820 1617 1489 -50820 1700 1528 -50820 1548 1606 -50820 1549 1525 -50820 1606 1516 -50820 1791 1531 -50820 1537 1678 -50820 1538 1671 -50820 1441 1489 -50820 1559 1531 -50820 1591 1665 -50820 1684 1711 -50820 1524 1525 -50820 1549 1683 -50820 1549 1524 -50820 1625 1519 -50820 1543 1453 -50820 1700 1453 -50820 1543 1700 -50820 1549 1681 -50820 1681 1524 -50820 1683 1524 -50820 1568 1671 -50820 1681 1683 -50820 1650 1668 -50840 1546 1606 -50840 1572 1501 -50840 1574 1441 -50840 1574 1635 -50840 1574 1489 -50840 1617 1489 -50840 1700 1528 -50840 1453 1528 -50840 1548 1606 -50840 1549 1525 -50840 1566 1761 -50840 1606 1516 -50840 1791 1531 -50840 1537 1678 -50840 1538 1671 -50840 1441 1489 -50840 1559 1531 -50840 1591 1665 -50840 1655 1477 -50840 1656 1682 -50840 1684 1711 -50840 1524 1525 -50840 1549 1683 -50840 1549 1524 -50840 1625 1519 -50840 1543 1453 -50840 1700 1453 -50840 1600 1519 -50840 1543 1700 -50840 1549 1681 -50840 1681 1524 -50840 1683 1524 -50840 1568 1671 -50840 1681 1683 -50840 1650 1668 -50860 1548 1606 -50860 1549 1525 -50860 1566 1761 -50860 1600 1625 -50860 1600 1655 -50860 1606 1516 -50860 1655 1519 -50860 1683 1525 -50860 1791 1531 -50860 1537 1678 -50860 1538 1671 -50860 1569 1742 -50860 1574 1617 -50860 1635 1489 -50860 1441 1489 -50860 1559 1531 -50860 1591 1665 -50860 1655 1477 -50860 1656 1682 -50860 1684 1711 -50860 1524 1525 -50860 1549 1683 -50860 1549 1524 -50860 1625 1519 -50860 1543 1453 -50860 1700 1453 -50860 1605 1636 -50860 1600 1519 -50860 1543 1700 -50860 1549 1681 -50860 1681 1524 -50860 1683 1524 -50860 1568 1671 -50860 1681 1683 -50860 1650 1668 -50880 1537 1678 -50880 1538 1671 -50880 1569 1742 -50880 1574 1617 -50880 1635 1489 -50880 1682 1688 -50880 1749 1757 -50880 1441 1489 -50880 1453 1528 -50880 1559 1531 -50880 1669 1754 -50880 1670 1697 -50880 1825 1477 -50880 1591 1665 -50880 1655 1477 -50880 1656 1682 -50880 1684 1711 -50880 1524 1525 -50880 1549 1683 -50880 1549 1524 -50880 1625 1519 -50880 1543 1453 -50880 1700 1453 -50880 1605 1636 -50880 1600 1519 -50880 1543 1700 -50880 1549 1681 -50880 1681 1524 -50880 1683 1524 -50880 1568 1671 -50880 1681 1683 -50880 1650 1668 -50900 1543 1676 -50900 1559 1531 -50900 1600 1655 -50900 1609 1857 -50900 1617 1489 -50900 1669 1754 -50900 1670 1697 -50900 1670 1711 -50900 1706 1831 -50900 1825 1477 -50900 1874 1517 -50900 1591 1665 -50900 1655 1477 -50900 1656 1682 -50900 1684 1711 -50900 1524 1525 -50900 1549 1683 -50900 1549 1524 -50900 1549 1525 -50900 1625 1519 -50900 1543 1453 -50900 1700 1453 -50900 1605 1636 -50900 1600 1519 -50900 1543 1700 -50900 1549 1681 -50900 1681 1524 -50900 1683 1524 -50900 1568 1671 -50900 1681 1683 -50900 1650 1668 -50920 1538 1671 -50920 1563 1592 -50920 1591 1665 -50920 1655 1477 -50920 1656 1682 -50920 1676 1528 -50920 1700 1528 -50920 1791 1531 -50920 1537 1678 -50920 1676 1453 -50920 1683 1525 -50920 1684 1711 -50920 1524 1525 -50920 1549 1683 -50920 1549 1524 -50920 1549 1525 -50920 1625 1519 -50920 1543 1453 -50920 1700 1453 -50920 1605 1636 -50920 1600 1519 -50920 1566 1761 -50920 1609 1669 -50920 1543 1700 -50920 1574 1617 -50920 1549 1681 -50920 1681 1524 -50920 1683 1524 -50920 1568 1671 -50920 1681 1683 -50920 1650 1668 -50940 1537 1678 -50940 1539 1858 -50940 1583 1477 -50940 1606 1468 -50940 1672 1706 -50940 1676 1453 -50940 1453 1528 -50940 1591 1858 -50940 1683 1525 -50940 1684 1711 -50940 1524 1525 -50940 1543 1676 -50940 1617 1489 -50940 1549 1683 -50940 1549 1524 -50940 1549 1525 -50940 1625 1519 -50940 1543 1453 -50940 1700 1453 -50940 1676 1700 -50940 1605 1636 -50940 1600 1519 -50940 1566 1761 -50940 1609 1669 -50940 1543 1700 -50940 1574 1617 -50940 1549 1681 -50940 1681 1524 -50940 1683 1524 -50940 1568 1671 -50940 1681 1683 -50940 1650 1668 -50960 1574 1441 -50960 1583 1655 -50960 1591 1858 -50960 1683 1525 -50960 1684 1711 -50960 1700 1528 -50960 1524 1525 -50960 1543 1676 -50960 1617 1489 -50960 1671 1825 -50960 1543 1528 -50960 1549 1683 -50960 1549 1524 -50960 1549 1525 -50960 1625 1519 -50960 1655 1477 -50960 1543 1453 -50960 1700 1453 -50960 1676 1700 -50960 1605 1636 -50960 1600 1519 -50960 1566 1761 -50960 1609 1669 -50960 1543 1700 -50960 1538 1671 -50960 1656 1682 -50960 1574 1617 -50960 1549 1681 -50960 1681 1524 -50960 1683 1524 -50960 1568 1671 -50960 1681 1683 -50960 1650 1668 -50980 1543 1676 -50980 1568 1825 -50980 1617 1489 -50980 1635 1489 -50980 1671 1825 -50980 1677 1501 -50980 1687 1702 -50980 1728 1774 -50980 1681 1525 -50980 1682 1688 -50980 1728 1512 -50980 1537 1678 -50980 1543 1528 -50980 1549 1683 -50980 1549 1524 -50980 1549 1525 -50980 1625 1519 -50980 1655 1477 -50980 1543 1453 -50980 1700 1453 -50980 1670 1711 -50980 1676 1528 -50980 1676 1700 -50980 1605 1636 -50980 1600 1519 -50980 1566 1761 -50980 1609 1669 -50980 1543 1700 -50980 1538 1671 -50980 1656 1682 -50980 1574 1617 -50980 1549 1681 -50980 1681 1524 -50980 1683 1524 -50980 1568 1671 -50980 1681 1683 -50980 1650 1668 -51000 1548 1558 -51000 1591 1858 -51000 1600 1625 -51000 1681 1525 -51000 1682 1688 -51000 1684 1489 -51000 1697 1711 -51000 1700 1528 -51000 1728 1512 -51000 1453 1528 -51000 1537 1678 -51000 1543 1528 -51000 1549 1683 -51000 1549 1524 -51000 1549 1525 -51000 1625 1519 -51000 1655 1477 -51000 1543 1453 -51000 1700 1453 -51000 1670 1711 -51000 1676 1528 -51000 1676 1700 -51000 1559 1531 -51000 1605 1636 -51000 1600 1519 -51000 1566 1761 -51000 1601 1911 -51000 1609 1669 -51000 1543 1700 -51000 1791 1531 -51000 1538 1671 -51000 1656 1682 -51000 1574 1617 -51000 1549 1681 -51000 1681 1524 -51000 1683 1524 -51000 1568 1671 -51000 1681 1683 -51000 1650 1668 -51020 1537 1678 -51020 1543 1528 -51020 1549 1683 -51020 1549 1524 -51020 1549 1525 -51020 1625 1519 -51020 1655 1477 -51020 1670 1697 -51020 1728 1774 -51020 1767 1840 -51020 1543 1676 -51020 1543 1453 -51020 1671 1825 -51020 1700 1453 -51020 1524 1525 -51020 1545 1430 -51020 1670 1711 -51020 1676 1528 -51020 1676 1700 -51020 1559 1531 -51020 1574 1441 -51020 1605 1636 -51020 1600 1519 -51020 1566 1761 -51020 1683 1525 -51020 1601 1911 -51020 1609 1669 -51020 1543 1700 -51020 1791 1531 -51020 1538 1671 -51020 1656 1682 -51020 1574 1617 -51020 1549 1681 -51020 1681 1524 -51020 1683 1524 -51020 1568 1671 -51020 1681 1683 -51020 1650 1668 -51040 1543 1504 -51040 1543 1676 -51040 1543 1453 -51040 1574 1489 -51040 1597 1504 -51040 1597 1528 -51040 1635 1489 -51040 1671 1825 -51040 1700 1453 -51040 1524 1525 -51040 1543 1597 -51040 1545 1430 -51040 1563 1592 -51040 1597 1700 -51040 1670 1711 -51040 1676 1528 -51040 1676 1700 -51040 1700 1504 -51040 1453 1528 -51040 1559 1531 -51040 1574 1441 -51040 1605 1636 -51040 1600 1519 -51040 1684 1489 -51040 1566 1761 -51040 1683 1525 -51040 1601 1911 -51040 1609 1669 -51040 1543 1700 -51040 1791 1531 -51040 1538 1671 -51040 1656 1682 -51040 1574 1617 -51040 1549 1681 -51040 1681 1524 -51040 1683 1524 -51040 1568 1671 -51040 1591 1858 -51040 1681 1683 -51040 1650 1668 -51060 1543 1597 -51060 1545 1430 -51060 1551 1665 -51060 1553 1519 -51060 1563 1592 -51060 1597 1700 -51060 1670 1711 -51060 1676 1528 -51060 1676 1700 -51060 1684 1767 -51060 1700 1504 -51060 1431 1516 -51060 1453 1528 -51060 1559 1531 -51060 1574 1441 -51060 1605 1636 -51060 1767 1489 -51060 1600 1519 -51060 1684 1489 -51060 1549 1525 -51060 1566 1761 -51060 1683 1525 -51060 1601 1911 -51060 1609 1669 -51060 1543 1700 -51060 1791 1531 -51060 1538 1671 -51060 1656 1682 -51060 1681 1525 -51060 1574 1617 -51060 1549 1681 -51060 1549 1683 -51060 1681 1524 -51060 1549 1524 -51060 1683 1524 -51060 1568 1671 -51060 1591 1858 -51060 1681 1683 -51060 1650 1668 -51080 1559 1531 -51080 1574 1441 -51080 1579 1501 -51080 1605 1636 -51080 1767 1489 -51080 1524 1525 -51080 1600 1519 -51080 1684 1489 -51080 1700 1453 -51080 1767 1441 -51080 1825 1477 -51080 1549 1525 -51080 1566 1761 -51080 1683 1525 -51080 1601 1911 -51080 1609 1669 -51080 1700 1528 -51080 1543 1700 -51080 1791 1531 -51080 1538 1671 -51080 1656 1682 -51080 1681 1525 -51080 1574 1617 -51080 1549 1681 -51080 1549 1683 -51080 1681 1524 -51080 1549 1524 -51080 1683 1524 -51080 1568 1671 -51080 1591 1858 -51080 1681 1683 -51080 1650 1668 -51100 1543 1453 -51100 1563 1600 -51100 1583 1825 -51100 1600 1519 -51100 1682 1688 -51100 1684 1489 -51100 1684 1441 -51100 1700 1453 -51100 1767 1441 -51100 1825 1477 -51100 1453 1528 -51100 1549 1525 -51100 1562 1449 -51100 1566 1761 -51100 1645 1756 -51100 1676 1700 -51100 1683 1525 -51100 1583 1477 -51100 1601 1911 -51100 1609 1669 -51100 1676 1528 -51100 1700 1528 -51100 1543 1700 -51100 1791 1531 -51100 1538 1671 -51100 1671 1825 -51100 1656 1682 -51100 1681 1525 -51100 1574 1617 -51100 1549 1681 -51100 1549 1683 -51100 1681 1524 -51100 1549 1524 -51100 1683 1524 -51100 1568 1671 -51100 1591 1858 -51100 1681 1683 -51100 1650 1668 -51120 1538 1568 -51120 1549 1525 -51120 1554 1564 -51120 1562 1449 -51120 1566 1761 -51120 1574 1489 -51120 1574 1441 -51120 1617 1489 -51120 1635 1857 -51120 1645 1756 -51120 1676 1700 -51120 1683 1525 -51120 1684 1857 -51120 1441 1489 -51120 1462 1512 -51120 1541 1691 -51120 1543 1676 -51120 1583 1477 -51120 1601 1911 -51120 1609 1669 -51120 1676 1528 -51120 1700 1528 -51120 1857 1441 -51120 1543 1700 -51120 1601 1629 -51120 1524 1525 -51120 1791 1531 -51120 1538 1671 -51120 1671 1825 -51120 1656 1682 -51120 1681 1525 -51120 1574 1617 -51120 1549 1681 -51120 1549 1683 -51120 1681 1524 -51120 1549 1524 -51120 1683 1524 -51120 1568 1671 -51120 1591 1858 -51120 1605 1636 -51120 1681 1683 -51120 1650 1668 -51140 1541 1691 -51140 1543 1676 -51140 1583 1477 -51140 1601 1911 -51140 1609 1669 -51140 1629 1911 -51140 1655 1477 -51140 1676 1528 -51140 1700 1528 -51140 1857 1441 -51140 1857 1489 -51140 1543 1700 -51140 1551 1269 -51140 1601 1629 -51140 1767 1489 -51140 1524 1525 -51140 1791 1531 -51140 1538 1671 -51140 1574 1857 -51140 1671 1825 -51140 1562 1593 -51140 1669 1754 -51140 1656 1682 -51140 1681 1525 -51140 1574 1617 -51140 1549 1681 -51140 1549 1683 -51140 1681 1524 -51140 1549 1524 -51140 1683 1524 -51140 1568 1671 -51140 1591 1858 -51140 1605 1636 -51140 1681 1683 -51140 1650 1668 -51160 1543 1700 -51160 1551 1269 -51160 1559 1531 -51160 1593 1449 -51160 1601 1629 -51160 1609 1911 -51160 1676 1700 -51160 1761 1453 -51160 1767 1489 -51160 1787 1851 -51160 1524 1525 -51160 1538 1568 -51160 1549 1525 -51160 1566 1761 -51160 1684 1489 -51160 1791 1531 -51160 1538 1671 -51160 1574 1857 -51160 1617 1857 -51160 1671 1825 -51160 1562 1593 -51160 1645 1756 -51160 1669 1754 -51160 1683 1525 -51160 1656 1682 -51160 1681 1525 -51160 1574 1617 -51160 1549 1681 -51160 1549 1683 -51160 1681 1524 -51160 1549 1524 -51160 1683 1524 -51160 1568 1671 -51160 1591 1858 -51160 1605 1636 -51160 1681 1683 -51160 1650 1668 -51180 1562 1449 -51180 1767 1840 -51180 1524 1525 -51180 1538 1568 -51180 1541 1691 -51180 1549 1525 -51180 1563 1592 -51180 1566 1761 -51180 1684 1489 -51180 1728 1911 -51180 1791 1531 -51180 1538 1671 -51180 1574 1857 -51180 1617 1857 -51180 1671 1825 -51180 1562 1593 -51180 1600 1519 -51180 1645 1756 -51180 1669 1754 -51180 1683 1525 -51180 1656 1682 -51180 1681 1525 -51180 1574 1617 -51180 1549 1681 -51180 1549 1683 -51180 1681 1524 -51180 1549 1524 -51180 1683 1524 -51180 1568 1671 -51180 1591 1858 -51180 1605 1636 -51180 1681 1683 -51180 1650 1668 -51200 1538 1568 -51200 1541 1691 -51200 1543 1528 -51200 1546 1431 -51200 1549 1525 -51200 1551 1269 -51200 1563 1592 -51200 1566 1761 -51200 1566 1453 -51200 1568 1825 -51200 1676 1700 -51200 1684 1489 -51200 1728 1911 -51200 1761 1453 -51200 1791 1531 -51200 1538 1671 -51200 1574 1857 -51200 1599 1512 -51200 1617 1857 -51200 1657 1769 -51200 1671 1825 -51200 1562 1593 -51200 1600 1519 -51200 1645 1756 -51200 1669 1754 -51200 1683 1525 -51200 1656 1682 -51200 1681 1525 -51200 1574 1617 -51200 1549 1681 -51200 1549 1683 -51200 1681 1524 -51200 1549 1524 -51200 1683 1524 -51200 1568 1671 -51200 1591 1858 -51200 1605 1636 -51200 1681 1683 -51200 1650 1668 -51220 1538 1671 -51220 1574 1857 -51220 1583 1825 -51220 1599 1512 -51220 1617 1857 -51220 1635 1857 -51220 1657 1769 -51220 1671 1825 -51220 1697 1711 -51220 1840 1441 -51220 1840 1857 -51220 1857 1441 -51220 1562 1449 -51220 1562 1593 -51220 1600 1519 -51220 1684 1857 -51220 1767 1489 -51220 1645 1756 -51220 1695 1449 -51220 1669 1754 -51220 1683 1525 -51220 1656 1682 -51220 1681 1525 -51220 1574 1617 -51220 1549 1681 -51220 1549 1683 -51220 1681 1524 -51220 1549 1524 -51220 1683 1524 -51220 1568 1671 -51220 1591 1858 -51220 1605 1636 -51220 1681 1683 -51220 1650 1668 -51240 1541 1691 -51240 1549 1525 -51240 1562 1449 -51240 1562 1593 -51240 1563 1667 -51240 1574 1635 -51240 1574 1441 -51240 1583 1477 -51240 1600 1519 -51240 1617 1441 -51240 1684 1857 -51240 1767 1840 -51240 1767 1489 -51240 1840 1489 -51240 1635 1489 -51240 1645 1756 -51240 1695 1449 -51240 1791 1531 -51240 1507 1522 -51240 1543 1528 -51240 1669 1754 -51240 1683 1525 -51240 1656 1682 -51240 1524 1525 -51240 1681 1525 -51240 1574 1617 -51240 1549 1681 -51240 1549 1683 -51240 1681 1524 -51240 1549 1524 -51240 1683 1524 -51240 1568 1671 -51240 1591 1858 -51240 1605 1636 -51240 1681 1683 -51240 1650 1668 -51260 1563 1592 -51260 1602 1531 -51260 1635 1489 -51260 1645 1756 -51260 1676 1700 -51260 1684 1489 -51260 1695 1449 -51260 1791 1531 -51260 1441 1489 -51260 1507 1522 -51260 1543 1528 -51260 1568 1825 -51260 1669 1754 -51260 1671 1825 -51260 1683 1525 -51260 1656 1682 -51260 1524 1525 -51260 1857 1489 -51260 1655 1477 -51260 1681 1525 -51260 1574 1617 -51260 1549 1681 -51260 1549 1683 -51260 1681 1524 -51260 1549 1524 -51260 1683 1524 -51260 1568 1671 -51260 1591 1858 -51260 1605 1636 -51260 1681 1683 -51260 1650 1668 -51280 1543 1528 -51280 1562 1521 -51280 1566 1761 -51280 1568 1825 -51280 1657 1769 -51280 1669 1754 -51280 1671 1825 -51280 1683 1525 -51280 1684 1767 -51280 1787 1851 -51280 1656 1682 -51280 1524 1525 -51280 1761 1453 -51280 1767 1840 -51280 1857 1489 -51280 1655 1477 -51280 1677 1701 -51280 1681 1525 -51280 1684 1840 -51280 1574 1617 -51280 1549 1681 -51280 1549 1683 -51280 1681 1524 -51280 1538 1671 -51280 1549 1524 -51280 1683 1524 -51280 1568 1671 -51280 1591 1858 -51280 1605 1636 -51280 1681 1683 -51280 1650 1668 -51300 1548 1516 -51300 1635 1441 -51300 1645 1756 -51300 1656 1682 -51300 1700 1528 -51300 1468 1516 -51300 1524 1525 -51300 1563 1592 -51300 1583 1477 -51300 1507 1522 -51300 1761 1453 -51300 1767 1840 -51300 1857 1489 -51300 1566 1453 -51300 1655 1477 -51300 1677 1701 -51300 1681 1525 -51300 1684 1840 -51300 1574 1617 -51300 1549 1681 -51300 1549 1683 -51300 1681 1524 -51300 1538 1671 -51300 1549 1524 -51300 1683 1524 -51300 1568 1671 -51300 1591 1858 -51300 1605 1636 -51300 1681 1683 -51300 1650 1668 -51320 1538 1568 -51320 1549 1525 -51320 1563 1592 -51320 1574 1857 -51320 1583 1477 -51320 1669 1754 -51320 1694 1440 -51320 1507 1522 -51320 1761 1453 -51320 1767 1840 -51320 1857 1489 -51320 1566 1453 -51320 1655 1825 -51320 1655 1477 -51320 1677 1701 -51320 1681 1525 -51320 1684 1767 -51320 1684 1840 -51320 1825 1477 -51320 1574 1617 -51320 1683 1525 -51320 1549 1681 -51320 1549 1683 -51320 1657 1769 -51320 1681 1524 -51320 1538 1671 -51320 1549 1524 -51320 1683 1524 -51320 1568 1671 -51320 1591 1858 -51320 1605 1636 -51320 1681 1683 -51320 1650 1668 -51340 1543 1700 -51340 1545 1430 -51340 1551 1269 -51340 1562 1593 -51340 1676 1700 -51340 1749 1757 -51340 1761 1453 -51340 1767 1840 -51340 1857 1489 -51340 1441 1489 -51340 1566 1453 -51340 1579 1501 -51340 1655 1825 -51340 1655 1477 -51340 1677 1701 -51340 1681 1525 -51340 1684 1767 -51340 1819 1920 -51340 1656 1682 -51340 1684 1840 -51340 1825 1477 -51340 1574 1617 -51340 1683 1525 -51340 1549 1681 -51340 1549 1683 -51340 1657 1769 -51340 1681 1524 -51340 1524 1525 -51340 1538 1671 -51340 1549 1524 -51340 1683 1524 -51340 1568 1671 -51340 1566 1761 -51340 1591 1858 -51340 1605 1636 -51340 1681 1683 -51340 1650 1668 -51360 1558 1516 -51360 1566 1453 -51360 1574 1857 -51360 1579 1501 -51360 1601 1629 -51360 1655 1825 -51360 1655 1477 -51360 1677 1701 -51360 1681 1525 -51360 1684 1767 -51360 1774 1531 -51360 1819 1920 -51360 1656 1682 -51360 1684 1840 -51360 1825 1477 -51360 1574 1617 -51360 1683 1525 -51360 1549 1681 -51360 1549 1683 -51360 1645 1756 -51360 1538 1568 -51360 1657 1769 -51360 1681 1524 -51360 1524 1525 -51360 1538 1671 -51360 1549 1524 -51360 1683 1524 -51360 1568 1671 -51360 1539 1635 -51360 1566 1761 -51360 1591 1858 -51360 1605 1636 -51360 1681 1683 -51360 1650 1668 -51380 1541 1691 -51380 1655 1911 -51380 1656 1682 -51380 1656 1911 -51380 1684 1840 -51380 1825 1477 -51380 1512 1531 -51380 1779 1834 -51380 1563 1592 -51380 1574 1617 -51380 1683 1525 -51380 1840 1489 -51380 1549 1681 -51380 1549 1683 -51380 1645 1756 -51380 1538 1568 -51380 1657 1769 -51380 1681 1524 -51380 1524 1525 -51380 1538 1671 -51380 1549 1524 -51380 1683 1524 -51380 1568 1671 -51380 1539 1635 -51380 1566 1761 -51380 1591 1858 -51380 1605 1636 -51380 1681 1683 -51380 1650 1668 -51400 1587 1535 -51400 1669 1754 -51400 1716 1808 -51400 1779 1834 -51400 1449 1531 -51400 1563 1592 -51400 1574 1617 -51400 1677 1701 -51400 1683 1525 -51400 1761 1453 -51400 1819 1920 -51400 1840 1489 -51400 1549 1681 -51400 1549 1683 -51400 1645 1756 -51400 1538 1568 -51400 1657 1769 -51400 1681 1524 -51400 1857 1489 -51400 1524 1525 -51400 1538 1671 -51400 1549 1524 -51400 1683 1524 -51400 1568 1671 -51400 1539 1635 -51400 1566 1761 -51400 1591 1858 -51400 1681 1525 -51400 1684 1767 -51400 1605 1636 -51400 1681 1683 -51400 1650 1668 -51420 1563 1592 -51420 1566 1453 -51420 1574 1617 -51420 1574 1857 -51420 1677 1701 -51420 1683 1525 -51420 1761 1453 -51420 1819 1920 -51420 1840 1489 -51420 1549 1681 -51420 1549 1683 -51420 1645 1756 -51420 1656 1682 -51420 1825 1477 -51420 1538 1568 -51420 1657 1769 -51420 1681 1524 -51420 1857 1489 -51420 1512 1531 -51420 1524 1525 -51420 1538 1671 -51420 1549 1524 -51420 1600 1519 -51420 1683 1524 -51420 1568 1671 -51420 1539 1635 -51420 1566 1761 -51420 1591 1858 -51420 1681 1525 -51420 1684 1767 -51420 1605 1636 -51420 1681 1683 -51420 1650 1668 -51440 1549 1681 -51440 1549 1683 -51440 1551 1269 -51440 1553 1683 -51440 1617 1857 -51440 1645 1756 -51440 1656 1682 -51440 1697 1711 -51440 1716 1808 -51440 1825 1477 -51440 1538 1568 -51440 1657 1769 -51440 1681 1524 -51440 1857 1489 -51440 1507 1522 -51440 1512 1531 -51440 1524 1525 -51440 1538 1671 -51440 1549 1524 -51440 1600 1519 -51440 1683 1524 -51440 1568 1671 -51440 1539 1635 -51440 1566 1761 -51440 1591 1858 -51440 1681 1525 -51440 1684 1767 -51440 1605 1636 -51440 1681 1683 -51440 1650 1668 -51460 1538 1568 -51460 1556 1791 -51460 1655 1531 -51460 1657 1769 -51460 1681 1524 -51460 1754 1840 -51460 1779 1834 -51460 1857 1489 -51460 1507 1522 -51460 1512 1531 -51460 1524 1525 -51460 1538 1671 -51460 1549 1524 -51460 1600 1519 -51460 1683 1524 -51460 1825 1519 -51460 1441 1489 -51460 1568 1671 -51460 1655 1774 -51460 1539 1635 -51460 1566 1761 -51460 1591 1665 -51460 1574 1617 -51460 1591 1858 -51460 1681 1525 -51460 1684 1767 -51460 1665 1858 -51460 1605 1636 -51460 1681 1683 -51460 1650 1668 -51480 1538 1671 -51480 1548 1516 -51480 1549 1524 -51480 1600 1519 -51480 1601 1629 -51480 1655 1512 -51480 1656 1682 -51480 1671 1524 -51480 1677 1701 -51480 1683 1524 -51480 1683 1525 -51480 1779 1903 -51480 1791 1464 -51480 1825 1519 -51480 1441 1489 -51480 1449 1531 -51480 1538 1524 -51480 1549 1681 -51480 1568 1671 -51480 1655 1774 -51480 1761 1453 -51480 1574 1857 -51480 1539 1635 -51480 1566 1761 -51480 1591 1665 -51480 1645 1756 -51480 1563 1688 -51480 1574 1617 -51480 1591 1858 -51480 1549 1683 -51480 1681 1525 -51480 1684 1767 -51480 1606 1516 -51480 1665 1858 -51480 1605 1636 -51480 1681 1683 -51480 1650 1668 -51500 1538 1524 -51500 1539 1769 -51500 1541 1555 -51500 1549 1681 -51500 1558 1606 -51500 1566 1453 -51500 1568 1671 -51500 1617 1857 -51500 1655 1774 -51500 1684 1840 -51500 1761 1453 -51500 1574 1857 -51500 1655 1531 -51500 1539 1635 -51500 1562 1531 -51500 1566 1761 -51500 1591 1665 -51500 1645 1756 -51500 1563 1688 -51500 1574 1617 -51500 1548 1606 -51500 1591 1858 -51500 1549 1683 -51500 1681 1525 -51500 1684 1767 -51500 1606 1516 -51500 1665 1858 -51500 1605 1636 -51500 1681 1683 -51500 1650 1668 -51520 1574 1857 -51520 1592 1688 -51520 1655 1531 -51520 1676 1700 -51520 1779 1834 -51520 1449 1531 -51520 1539 1635 -51520 1562 1531 -51520 1566 1761 -51520 1591 1665 -51520 1645 1756 -51520 1655 1512 -51520 1563 1688 -51520 1574 1617 -51520 1441 1489 -51520 1548 1606 -51520 1591 1858 -51520 1549 1683 -51520 1681 1525 -51520 1684 1767 -51520 1606 1516 -51520 1665 1858 -51520 1605 1636 -51520 1681 1683 -51520 1650 1668 -51540 1539 1635 -51540 1548 1516 -51540 1549 1681 -51540 1562 1449 -51540 1562 1531 -51540 1566 1761 -51540 1591 1665 -51540 1635 1769 -51540 1645 1756 -51540 1655 1512 -51540 1683 1525 -51540 1754 1851 -51540 1539 1769 -51540 1563 1688 -51540 1574 1617 -51540 1606 1468 -51540 1761 1453 -51540 1819 1920 -51540 1441 1489 -51540 1548 1606 -51540 1591 1858 -51540 1549 1683 -51540 1681 1525 -51540 1563 1592 -51540 1684 1767 -51540 1606 1516 -51540 1665 1858 -51540 1541 1691 -51540 1605 1636 -51540 1681 1683 -51540 1650 1668 -51560 1539 1769 -51560 1551 1269 -51560 1563 1688 -51560 1574 1617 -51560 1574 1857 -51560 1592 1688 -51560 1606 1468 -51560 1761 1453 -51560 1819 1920 -51560 1441 1489 -51560 1548 1606 -51560 1449 1531 -51560 1591 1858 -51560 1549 1683 -51560 1566 1453 -51560 1681 1525 -51560 1563 1592 -51560 1617 1857 -51560 1684 1767 -51560 1606 1516 -51560 1665 1858 -51560 1541 1691 -51560 1605 1636 -51560 1681 1683 -51560 1650 1668 -51580 1545 1430 -51580 1546 1606 -51580 1548 1606 -51580 1551 1858 -51580 1558 1606 -51580 1645 1756 -51580 1672 1706 -51580 1684 1840 -51580 1684 1489 -51580 1449 1531 -51580 1566 1761 -51580 1591 1665 -51580 1591 1858 -51580 1549 1683 -51580 1566 1453 -51580 1681 1525 -51580 1840 1489 -51580 1563 1592 -51580 1617 1857 -51580 1684 1767 -51580 1549 1681 -51580 1606 1516 -51580 1665 1858 -51580 1541 1691 -51580 1605 1636 -51580 1681 1683 -51580 1650 1668 -51600 1566 1761 -51600 1591 1665 -51600 1591 1858 -51600 1697 1711 -51600 1779 1903 -51600 1787 1851 -51600 1441 1489 -51600 1549 1683 -51600 1566 1453 -51600 1681 1525 -51600 1840 1489 -51600 1922 1512 -51600 1507 1522 -51600 1563 1592 -51600 1617 1857 -51600 1684 1767 -51600 1549 1681 -51600 1606 1516 -51600 1665 1858 -51600 1541 1691 -51600 1563 1688 -51600 1605 1636 -51600 1681 1683 -51600 1650 1668 -51620 1538 1562 -51620 1549 1683 -51620 1566 1453 -51620 1645 1756 -51620 1677 1701 -51620 1681 1525 -51620 1716 1808 -51620 1767 1489 -51620 1840 1489 -51620 1922 1512 -51620 1507 1522 -51620 1538 1524 -51620 1563 1592 -51620 1617 1857 -51620 1683 1525 -51620 1684 1840 -51620 1684 1767 -51620 1549 1681 -51620 1606 1516 -51620 1665 1858 -51620 1541 1691 -51620 1563 1688 -51620 1684 1489 -51620 1605 1636 -51620 1681 1683 -51620 1650 1668 -51640 1538 1524 -51640 1558 1606 -51640 1563 1592 -51640 1617 1857 -51640 1683 1525 -51640 1684 1840 -51640 1684 1767 -51640 1761 1453 -51640 1779 1834 -51640 1549 1681 -51640 1606 1516 -51640 1665 1858 -51640 1541 1691 -51640 1563 1688 -51640 1684 1489 -51640 1605 1636 -51640 1681 1683 -51640 1650 1668 -51660 1549 1681 -51660 1579 1501 -51660 1606 1516 -51660 1665 1858 -51660 1819 1477 -51660 1857 1441 -51660 1512 1531 -51660 1541 1691 -51660 1819 1920 -51660 1617 1441 -51660 1681 1525 -51660 1767 1840 -51660 1441 1489 -51660 1563 1688 -51660 1840 1489 -51660 1684 1489 -51660 1767 1489 -51660 1605 1636 -51660 1681 1683 -51660 1650 1668 -51680 1541 1691 -51680 1548 1516 -51680 1684 1767 -51680 1772 1874 -51680 1819 1920 -51680 1507 1522 -51680 1562 1524 -51680 1617 1441 -51680 1645 1756 -51680 1681 1525 -51680 1449 1531 -51680 1592 1688 -51680 1767 1840 -51680 1441 1489 -51680 1563 1688 -51680 1840 1489 -51680 1684 1489 -51680 1767 1489 -51680 1605 1636 -51680 1563 1592 -51680 1681 1683 -51680 1650 1668 -51700 1549 1600 -51700 1562 1524 -51700 1566 1761 -51700 1595 1654 -51700 1617 1441 -51700 1645 1756 -51700 1681 1525 -51700 1683 1525 -51700 1449 1531 -51700 1539 1441 -51700 1592 1688 -51700 1600 1683 -51700 1767 1840 -51700 1441 1489 -51700 1539 1617 -51700 1563 1688 -51700 1840 1489 -51700 1512 1531 -51700 1684 1489 -51700 1767 1489 -51700 1605 1636 -51700 1563 1592 -51700 1681 1683 -51700 1650 1668 -51720 1539 1441 -51720 1592 1688 -51720 1600 1683 -51720 1767 1840 -51720 1834 1903 -51720 1441 1489 -51720 1539 1617 -51720 1563 1688 -51720 1655 1512 -51720 1681 1477 -51720 1840 1489 -51720 1507 1522 -51720 1512 1531 -51720 1549 1683 -51720 1477 1525 -51720 1684 1489 -51720 1767 1489 -51720 1605 1636 -51720 1549 1477 -51720 1683 1477 -51720 1655 1531 -51720 1563 1592 -51720 1677 1701 -51720 1681 1683 -51720 1650 1668 -51740 1539 1617 -51740 1563 1688 -51740 1566 1761 -51740 1655 1512 -51740 1668 1825 -51740 1681 1477 -51740 1681 1525 -51740 1684 1767 -51740 1840 1489 -51740 1507 1522 -51740 1512 1531 -51740 1549 1683 -51740 1645 1756 -51740 1761 1453 -51740 1477 1525 -51740 1617 1441 -51740 1657 1769 -51740 1684 1489 -51740 1767 1489 -51740 1605 1636 -51740 1579 1501 -51740 1683 1525 -51740 1871 1517 -51740 1549 1477 -51740 1683 1477 -51740 1655 1531 -51740 1563 1592 -51740 1677 1701 -51740 1681 1683 -51740 1650 1668 -51760 1539 1441 -51760 1549 1681 -51760 1549 1683 -51760 1568 1863 -51760 1645 1756 -51760 1684 1840 -51760 1688 1879 -51760 1761 1453 -51760 1477 1525 -51760 1617 1441 -51760 1657 1769 -51760 1684 1489 -51760 1767 1489 -51760 1605 1636 -51760 1579 1501 -51760 1683 1525 -51760 1871 1517 -51760 1549 1477 -51760 1683 1477 -51760 1655 1531 -51760 1563 1592 -51760 1677 1701 -51760 1681 1683 -51760 1650 1668 -51780 1671 1740 -51780 1740 1911 -51780 1477 1525 -51780 1617 1441 -51780 1657 1769 -51780 1684 1489 -51780 1767 1489 -51780 1547 1808 -51780 1605 1636 -51780 1579 1501 -51780 1655 1512 -51780 1683 1525 -51780 1871 1517 -51780 1549 1477 -51780 1683 1477 -51780 1655 1531 -51780 1563 1592 -51780 1677 1701 -51780 1681 1525 -51780 1681 1683 -51780 1650 1668 -51800 1563 1635 -51800 1617 1441 -51800 1657 1769 -51800 1684 1489 -51800 1688 1769 -51800 1767 1489 -51800 1547 1808 -51800 1549 1683 -51800 1605 1636 -51800 1617 1489 -51800 1681 1477 -51800 1761 1453 -51800 1787 1449 -51800 1579 1501 -51800 1655 1512 -51800 1683 1525 -51800 1549 1681 -51800 1871 1517 -51800 1549 1477 -51800 1683 1477 -51800 1655 1531 -51800 1563 1592 -51800 1677 1701 -51800 1681 1525 -51800 1681 1683 -51800 1650 1668 -51820 1547 1808 -51820 1549 1683 -51820 1566 1761 -51820 1605 1636 -51820 1609 1678 -51820 1617 1489 -51820 1617 1767 -51820 1681 1477 -51820 1761 1453 -51820 1787 1449 -51820 1920 1517 -51820 1541 1691 -51820 1579 1501 -51820 1645 1756 -51820 1655 1512 -51820 1507 1522 -51820 1683 1525 -51820 1549 1681 -51820 1871 1517 -51820 1512 1531 -51820 1477 1525 -51820 1549 1477 -51820 1683 1477 -51820 1655 1531 -51820 1563 1592 -51820 1677 1701 -51820 1681 1525 -51820 1681 1683 -51820 1650 1668 -51840 1538 1524 -51840 1541 1691 -51840 1579 1501 -51840 1606 1516 -51840 1617 1840 -51840 1645 1756 -51840 1655 1512 -51840 1684 1840 -51840 1507 1522 -51840 1566 1453 -51840 1657 1769 -51840 1671 1740 -51840 1683 1525 -51840 1857 1441 -51840 1767 1489 -51840 1549 1681 -51840 1599 1512 -51840 1871 1517 -51840 1512 1531 -51840 1477 1525 -51840 1549 1477 -51840 1683 1477 -51840 1655 1531 -51840 1563 1592 -51840 1677 1701 -51840 1681 1525 -51840 1599 1655 -51840 1681 1683 -51840 1650 1668 -51860 1549 1525 -51860 1566 1453 -51860 1617 1684 -51860 1635 1671 -51860 1657 1769 -51860 1671 1740 -51860 1683 1525 -51860 1857 1441 -51860 1767 1489 -51860 1549 1681 -51860 1599 1512 -51860 1871 1517 -51860 1512 1531 -51860 1605 1636 -51860 1767 1840 -51860 1840 1489 -51860 1477 1525 -51860 1549 1477 -51860 1683 1477 -51860 1655 1531 -51860 1761 1453 -51860 1549 1683 -51860 1563 1592 -51860 1677 1701 -51860 1681 1525 -51860 1599 1655 -51860 1681 1683 -51860 1650 1668 -51880 1857 1441 -51880 1767 1489 -51880 1549 1681 -51880 1599 1512 -51880 1871 1517 -51880 1512 1531 -51880 1605 1636 -51880 1767 1840 -51880 1840 1489 -51880 1477 1525 -51880 1549 1477 -51880 1681 1477 -51880 1683 1477 -51880 1599 1531 -51880 1655 1531 -51880 1761 1453 -51880 1549 1683 -51880 1563 1592 -51880 1539 1669 -51880 1677 1701 -51880 1681 1525 -51880 1599 1655 -51880 1681 1683 -51880 1650 1668 -51900 1600 1911 -51900 1676 1700 -51900 1728 1911 -51900 1767 1489 -51900 1789 1911 -51900 1549 1681 -51900 1599 1512 -51900 1655 1512 -51900 1671 1703 -51900 1871 1517 -51900 1512 1531 -51900 1605 1636 -51900 1767 1840 -51900 1840 1489 -51900 1477 1525 -51900 1549 1477 -51900 1681 1477 -51900 1683 1477 -51900 1566 1453 -51900 1599 1531 -51900 1655 1531 -51900 1761 1453 -51900 1549 1683 -51900 1563 1592 -51900 1539 1669 -51900 1677 1701 -51900 1681 1525 -51900 1599 1655 -51900 1681 1683 -51900 1650 1668 -51920 1549 1681 -51920 1587 1535 -51920 1599 1512 -51920 1655 1512 -51920 1671 1703 -51920 1716 1771 -51920 1871 1517 -51920 1512 1531 -51920 1605 1636 -51920 1767 1840 -51920 1840 1489 -51920 1477 1525 -51920 1507 1522 -51920 1549 1477 -51920 1681 1477 -51920 1683 1477 -51920 1566 1453 -51920 1599 1531 -51920 1655 1531 -51920 1761 1453 -51920 1549 1683 -51920 1563 1592 -51920 1683 1525 -51920 1539 1669 -51920 1677 1701 -51920 1681 1525 -51920 1599 1655 -51920 1681 1683 -51920 1650 1668 -51940 1547 1716 -51940 1583 1911 -51940 1605 1636 -51940 1657 1769 -51940 1681 1519 -51940 1703 1740 -51940 1767 1840 -51940 1767 1489 -51940 1840 1489 -51940 1857 1441 -51940 1477 1525 -51940 1507 1522 -51940 1519 1525 -51940 1549 1477 -51940 1681 1477 -51940 1683 1477 -51940 1541 1555 -51940 1566 1453 -51940 1599 1531 -51940 1655 1531 -51940 1671 1740 -51940 1761 1453 -51940 1549 1683 -51940 1563 1592 -51940 1683 1525 -51940 1911 1519 -51940 1539 1669 -51940 1677 1701 -51940 1681 1525 -51940 1617 1684 -51940 1599 1655 -51940 1681 1683 -51940 1650 1668 -51960 1549 1477 -51960 1563 1771 -51960 1587 1787 -51960 1681 1477 -51960 1683 1477 -51960 1684 1840 -51960 1851 1535 -51960 1541 1555 -51960 1566 1453 -51960 1599 1531 -51960 1655 1531 -51960 1671 1740 -51960 1754 1851 -51960 1761 1453 -51960 1754 1787 -51960 1549 1683 -51960 1563 1592 -51960 1683 1525 -51960 1911 1519 -51960 1539 1669 -51960 1871 1517 -51960 1677 1701 -51960 1681 1525 -51960 1617 1684 -51960 1599 1655 -51960 1681 1683 -51960 1650 1668 -51980 1541 1555 -51980 1547 1716 -51980 1549 1519 -51980 1566 1453 -51980 1587 1535 -51980 1599 1531 -51980 1601 1629 -51980 1655 1531 -51980 1671 1740 -51980 1703 1740 -51980 1754 1851 -51980 1761 1453 -51980 1825 1477 -51980 1671 1703 -51980 1754 1787 -51980 1787 1535 -51980 1549 1683 -51980 1563 1592 -51980 1655 1512 -51980 1683 1525 -51980 1911 1519 -51980 1539 1669 -51980 1871 1517 -51980 1677 1701 -51980 1681 1525 -51980 1599 1512 -51980 1617 1684 -51980 1599 1655 -51980 1549 1681 -51980 1681 1683 -51980 1650 1668 -52000 1553 1477 -52000 1593 1754 -52000 1671 1703 -52000 1754 1787 -52000 1787 1851 -52000 1787 1535 -52000 1549 1683 -52000 1563 1592 -52000 1655 1512 -52000 1683 1525 -52000 1676 1700 -52000 1911 1519 -52000 1539 1669 -52000 1871 1517 -52000 1677 1701 -52000 1681 1525 -52000 1599 1512 -52000 1617 1684 -52000 1599 1655 -52000 1549 1681 -52000 1681 1683 -52000 1650 1668 -52020 1549 1683 -52020 1563 1592 -52020 1566 1453 -52020 1605 1636 -52020 1655 1512 -52020 1683 1525 -52020 1761 1453 -52020 1789 1519 -52020 1676 1700 -52020 1911 1519 -52020 1539 1669 -52020 1599 1531 -52020 1655 1531 -52020 1803 1477 -52020 1871 1517 -52020 1902 1477 -52020 1677 1701 -52020 1681 1525 -52020 1599 1512 -52020 1617 1684 -52020 1599 1655 -52020 1549 1681 -52020 1681 1683 -52020 1650 1668 -52040 1657 1769 -52040 1676 1700 -52040 1789 1803 -52040 1911 1519 -52040 1539 1669 -52040 1599 1531 -52040 1655 1531 -52040 1803 1477 -52040 1871 1517 -52040 1902 1477 -52040 1677 1701 -52040 1681 1525 -52040 1599 1512 -52040 1617 1684 -52040 1803 1902 -52040 1599 1655 -52040 1549 1681 -52040 1681 1683 -52040 1650 1668 -52060 1539 1669 -52060 1549 1683 -52060 1587 1535 -52060 1599 1531 -52060 1601 1629 -52060 1655 1512 -52060 1655 1531 -52060 1803 1477 -52060 1871 1517 -52060 1902 1477 -52060 1677 1701 -52060 1681 1525 -52060 1787 1535 -52060 1562 1449 -52060 1599 1512 -52060 1617 1684 -52060 1716 1808 -52060 1803 1902 -52060 1767 1840 -52060 1599 1655 -52060 1683 1525 -52060 1549 1681 -52060 1681 1683 -52060 1650 1668 -52080 1541 1691 -52080 1548 1516 -52080 1635 1740 -52080 1657 1769 -52080 1677 1701 -52080 1681 1525 -52080 1684 1840 -52080 1761 1453 -52080 1787 1535 -52080 1911 1477 -52080 1562 1449 -52080 1563 1592 -52080 1599 1512 -52080 1617 1684 -52080 1676 1700 -52080 1716 1808 -52080 1789 1902 -52080 1803 1902 -52080 1522 1524 -52080 1538 1522 -52080 1767 1840 -52080 1579 1501 -52080 1599 1655 -52080 1911 1519 -52080 1683 1525 -52080 1549 1681 -52080 1681 1683 -52080 1650 1668 -52100 1549 1683 -52100 1562 1449 -52100 1563 1592 -52100 1599 1512 -52100 1617 1684 -52100 1676 1700 -52100 1716 1808 -52100 1789 1902 -52100 1803 1902 -52100 1522 1524 -52100 1538 1522 -52100 1767 1840 -52100 1541 1555 -52100 1579 1501 -52100 1599 1655 -52100 1911 1519 -52100 1683 1525 -52100 1549 1681 -52100 1681 1683 -52100 1650 1668 -52120 1538 1522 -52120 1605 1636 -52120 1645 1756 -52120 1683 1789 -52120 1767 1840 -52120 1825 1826 -52120 1825 1911 -52120 1541 1555 -52120 1579 1501 -52120 1600 1789 -52120 1595 1654 -52120 1599 1655 -52120 1826 1477 -52120 1911 1519 -52120 1683 1525 -52120 1549 1681 -52120 1562 1593 -52120 1681 1683 -52120 1650 1668 -52140 1541 1555 -52140 1549 1683 -52140 1579 1501 -52140 1677 1701 -52140 1681 1525 -52140 1761 1453 -52140 1468 1516 -52140 1600 1789 -52140 1595 1654 -52140 1599 1655 -52140 1803 1902 -52140 1826 1477 -52140 1857 1441 -52140 1871 1517 -52140 1625 1728 -52140 1563 1592 -52140 1911 1519 -52140 1683 1525 -52140 1549 1681 -52140 1562 1593 -52140 1681 1683 -52140 1650 1668 -52160 1551 1458 -52160 1600 1789 -52160 1635 1740 -52160 1640 1684 -52160 1676 1700 -52160 1683 1789 -52160 1787 1851 -52160 1789 1902 -52160 1826 1911 -52160 1507 1524 -52160 1538 1524 -52160 1566 1453 -52160 1595 1654 -52160 1599 1655 -52160 1803 1902 -52160 1826 1477 -52160 1857 1441 -52160 1871 1517 -52160 1625 1728 -52160 1563 1592 -52160 1684 1857 -52160 1911 1519 -52160 1683 1525 -52160 1549 1681 -52160 1562 1593 -52160 1681 1683 -52160 1650 1668 -52180 1538 1522 -52180 1538 1524 -52180 1566 1453 -52180 1595 1654 -52180 1599 1655 -52180 1684 1441 -52180 1803 1902 -52180 1826 1477 -52180 1857 1441 -52180 1871 1517 -52180 1549 1683 -52180 1625 1728 -52180 1563 1592 -52180 1640 1441 -52180 1684 1857 -52180 1911 1519 -52180 1683 1525 -52180 1549 1681 -52180 1677 1701 -52180 1522 1524 -52180 1562 1593 -52180 1681 1683 -52180 1650 1668 -52200 1547 1808 -52200 1547 1716 -52200 1549 1683 -52200 1625 1728 -52200 1683 1789 -52200 1716 1808 -52200 1787 1851 -52200 1825 1531 -52200 1507 1524 -52200 1563 1592 -52200 1579 1501 -52200 1657 1769 -52200 1640 1441 -52200 1684 1857 -52200 1911 1519 -52200 1683 1525 -52200 1549 1681 -52200 1677 1701 -52200 1477 1531 -52200 1522 1524 -52200 1600 1683 -52200 1562 1593 -52200 1681 1683 -52200 1650 1668 -52220 1541 1555 -52220 1553 1600 -52220 1562 1920 -52220 1563 1592 -52220 1566 1453 -52220 1579 1501 -52220 1657 1769 -52220 1771 1787 -52220 1803 1902 -52220 1826 1477 -52220 1871 1517 -52220 1902 1531 -52220 1911 1531 -52220 1599 1655 -52220 1600 1525 -52220 1640 1441 -52220 1684 1857 -52220 1911 1519 -52220 1562 1449 -52220 1681 1525 -52220 1683 1525 -52220 1600 1681 -52220 1549 1681 -52220 1677 1701 -52220 1477 1531 -52220 1522 1524 -52220 1600 1683 -52220 1562 1593 -52220 1681 1683 -52220 1650 1668 -52240 1539 1769 -52240 1546 1606 -52240 1547 1716 -52240 1548 1606 -52240 1549 1683 -52240 1551 1458 -52240 1559 1920 -52240 1599 1655 -52240 1600 1525 -52240 1606 1468 -52240 1640 1441 -52240 1645 1756 -52240 1684 1857 -52240 1911 1519 -52240 1562 1449 -52240 1606 1516 -52240 1681 1525 -52240 1683 1525 -52240 1600 1681 -52240 1549 1681 -52240 1677 1701 -52240 1477 1531 -52240 1522 1524 -52240 1600 1683 -52240 1562 1593 -52240 1681 1683 -52240 1650 1668 -52260 1558 1431 -52260 1657 1769 -52260 1684 1441 -52260 1911 1519 -52260 1431 1468 -52260 1562 1449 -52260 1606 1516 -52260 1606 1431 -52260 1681 1525 -52260 1683 1525 -52260 1803 1531 -52260 1857 1441 -52260 1593 1449 -52260 1803 1902 -52260 1549 1525 -52260 1553 1600 -52260 1600 1681 -52260 1771 1787 -52260 1549 1681 -52260 1677 1701 -52260 1477 1531 -52260 1871 1517 -52260 1522 1524 -52260 1600 1683 -52260 1562 1593 -52260 1681 1683 -52260 1650 1668 -52280 1538 1522 -52280 1545 1430 -52280 1546 1606 -52280 1548 1606 -52280 1558 1606 -52280 1562 1449 -52280 1606 1516 -52280 1606 1431 -52280 1606 1468 -52280 1681 1525 -52280 1683 1531 -52280 1683 1525 -52280 1803 1531 -52280 1857 1441 -52280 1902 1477 -52280 1902 1531 -52280 1593 1449 -52280 1803 1902 -52280 1826 1911 -52280 1911 1531 -52280 1600 1525 -52280 1549 1600 -52280 1549 1525 -52280 1553 1600 -52280 1600 1681 -52280 1613 1526 -52280 1771 1787 -52280 1549 1681 -52280 1549 1683 -52280 1677 1701 -52280 1566 1453 -52280 1477 1531 -52280 1871 1517 -52280 1522 1524 -52280 1605 1636 -52280 1600 1683 -52280 1562 1593 -52280 1681 1683 -52280 1650 1668 -52300 1563 1769 -52300 1593 1449 -52300 1771 1851 -52300 1803 1902 -52300 1826 1477 -52300 1826 1911 -52300 1911 1531 -52300 1539 1769 -52300 1600 1525 -52300 1683 1911 -52300 1772 1874 -52300 1549 1600 -52300 1549 1525 -52300 1553 1600 -52300 1600 1681 -52300 1613 1526 -52300 1771 1787 -52300 1549 1681 -52300 1549 1683 -52300 1871 1503 -52300 1677 1701 -52300 1566 1453 -52300 1911 1519 -52300 1477 1531 -52300 1871 1517 -52300 1522 1524 -52300 1605 1636 -52300 1600 1683 -52300 1562 1593 -52300 1681 1683 -52300 1650 1668 -52320 1539 1769 -52320 1541 1691 -52320 1562 1449 -52320 1600 1525 -52320 1645 1756 -52320 1683 1911 -52320 1772 1874 -52320 1468 1516 -52320 1525 1531 -52320 1549 1600 -52320 1549 1525 -52320 1553 1600 -52320 1600 1681 -52320 1613 1526 -52320 1657 1769 -52320 1771 1787 -52320 1549 1681 -52320 1549 1683 -52320 1683 1525 -52320 1871 1503 -52320 1503 1517 -52320 1677 1701 -52320 1566 1453 -52320 1911 1519 -52320 1477 1531 -52320 1871 1517 -52320 1522 1524 -52320 1538 1522 -52320 1605 1636 -52320 1600 1683 -52320 1562 1593 -52320 1681 1525 -52320 1681 1683 -52320 1650 1668 -52340 1549 1600 -52340 1549 1525 -52340 1553 1600 -52340 1600 1681 -52340 1613 1526 -52340 1657 1769 -52340 1716 1808 -52340 1771 1787 -52340 1549 1681 -52340 1549 1683 -52340 1683 1525 -52340 1871 1503 -52340 1503 1517 -52340 1677 1701 -52340 1507 1524 -52340 1566 1453 -52340 1911 1519 -52340 1477 1531 -52340 1871 1517 -52340 1522 1524 -52340 1857 1441 -52340 1538 1522 -52340 1605 1636 -52340 1600 1683 -52340 1562 1593 -52340 1681 1525 -52340 1681 1683 -52340 1650 1668 -52360 1539 1769 -52360 1549 1681 -52360 1549 1683 -52360 1553 1683 -52360 1574 1770 -52360 1683 1525 -52360 1787 1851 -52360 1871 1503 -52360 1879 1531 -52360 1503 1517 -52360 1677 1701 -52360 1507 1524 -52360 1566 1453 -52360 1911 1519 -52360 1477 1531 -52360 1871 1517 -52360 1522 1524 -52360 1857 1441 -52360 1538 1522 -52360 1605 1636 -52360 1600 1683 -52360 1562 1593 -52360 1681 1525 -52360 1681 1683 -52360 1650 1668 -52380 1677 1701 -52380 1789 1902 -52380 1507 1524 -52380 1566 1453 -52380 1911 1519 -52380 1477 1531 -52380 1871 1517 -52380 1522 1524 -52380 1857 1441 -52380 1645 1756 -52380 1538 1522 -52380 1547 1716 -52380 1605 1636 -52380 1600 1683 -52380 1562 1593 -52380 1599 1655 -52380 1681 1525 -52380 1681 1683 -52380 1650 1668 -52400 1600 1525 -52400 1613 1526 -52400 1769 1517 -52400 1787 1851 -52400 1549 1826 -52400 1566 1453 -52400 1911 1519 -52400 1477 1531 -52400 1679 1517 -52400 1679 1871 -52400 1871 1517 -52400 1522 1524 -52400 1857 1441 -52400 1645 1756 -52400 1669 1754 -52400 1538 1522 -52400 1547 1716 -52400 1605 1636 -52400 1600 1681 -52400 1600 1683 -52400 1683 1525 -52400 1562 1593 -52400 1599 1655 -52400 1681 1525 -52400 1681 1683 -52400 1650 1668 -52420 1545 1430 -52420 1547 1808 -52420 1549 1826 -52420 1553 1683 -52420 1562 1701 -52420 1566 1453 -52420 1593 1701 -52420 1761 1803 -52420 1911 1519 -52420 1477 1531 -52420 1507 1524 -52420 1543 1526 -52420 1679 1517 -52420 1679 1871 -52420 1789 1902 -52420 1871 1517 -52420 1522 1524 -52420 1857 1441 -52420 1645 1756 -52420 1669 1754 -52420 1538 1522 -52420 1547 1716 -52420 1605 1636 -52420 1600 1681 -52420 1600 1683 -52420 1683 1525 -52420 1562 1593 -52420 1599 1655 -52420 1681 1525 -52420 1681 1683 -52420 1650 1668 -52440 1543 1526 -52440 1550 1552 -52440 1613 1526 -52440 1617 1441 -52440 1676 1526 -52440 1679 1517 -52440 1679 1871 -52440 1769 1871 -52440 1787 1851 -52440 1789 1902 -52440 1851 1521 -52440 1866 1469 -52440 1871 1517 -52440 1522 1524 -52440 1857 1441 -52440 1597 1526 -52440 1645 1756 -52440 1669 1754 -52440 1538 1522 -52440 1547 1716 -52440 1605 1636 -52440 1600 1681 -52440 1600 1683 -52440 1683 1525 -52440 1562 1593 -52440 1599 1655 -52440 1681 1525 -52440 1681 1683 -52440 1650 1668 -52460 1549 1525 -52460 1563 1517 -52460 1563 1871 -52460 1600 1525 -52460 1825 1477 -52460 1857 1441 -52460 1497 1505 -52460 1550 1531 -52460 1552 1531 -52460 1597 1526 -52460 1645 1756 -52460 1669 1754 -52460 1538 1522 -52460 1538 1524 -52460 1547 1716 -52460 1605 1636 -52460 1600 1681 -52460 1600 1683 -52460 1683 1525 -52460 1562 1593 -52460 1599 1655 -52460 1681 1525 -52460 1681 1683 -52460 1650 1668 -52480 1549 1683 -52480 1550 1531 -52480 1552 1531 -52480 1563 1427 -52480 1597 1526 -52480 1617 1857 -52480 1617 1441 -52480 1635 1517 -52480 1645 1756 -52480 1669 1754 -52480 1761 1803 -52480 1761 1789 -52480 1871 1517 -52480 1549 1681 -52480 1553 1600 -52480 1761 1879 -52480 1789 1902 -52480 1538 1522 -52480 1538 1524 -52480 1547 1716 -52480 1550 1872 -52480 1605 1636 -52480 1769 1826 -52480 1549 1600 -52480 1600 1681 -52480 1600 1683 -52480 1566 1453 -52480 1683 1525 -52480 1562 1593 -52480 1522 1524 -52480 1599 1655 -52480 1681 1525 -52480 1681 1683 -52480 1650 1668 -52500 1549 1681 -52500 1553 1600 -52500 1560 1754 -52500 1740 1517 -52500 1761 1879 -52500 1772 1874 -52500 1789 1902 -52500 1851 1521 -52500 1857 1441 -52500 1431 1516 -52500 1497 1505 -52500 1538 1522 -52500 1538 1524 -52500 1547 1716 -52500 1550 1872 -52500 1605 1636 -52500 1769 1826 -52500 1549 1600 -52500 1600 1681 -52500 1600 1683 -52500 1600 1525 -52500 1566 1453 -52500 1825 1477 -52500 1683 1525 -52500 1562 1593 -52500 1522 1524 -52500 1599 1655 -52500 1681 1525 -52500 1681 1683 -52500 1650 1668 -52520 1538 1522 -52520 1538 1524 -52520 1547 1716 -52520 1550 1872 -52520 1551 1269 -52520 1563 1728 -52520 1579 1501 -52520 1605 1636 -52520 1606 1516 -52520 1617 1857 -52520 1667 1441 -52520 1769 1826 -52520 1549 1600 -52520 1600 1681 -52520 1600 1683 -52520 1600 1525 -52520 1566 1453 -52520 1477 1519 -52520 1740 1761 -52520 1645 1756 -52520 1825 1477 -52520 1683 1525 -52520 1562 1593 -52520 1522 1524 -52520 1599 1655 -52520 1871 1517 -52520 1681 1525 -52520 1681 1683 -52520 1650 1668 -52540 1549 1600 -52540 1600 1681 -52540 1600 1683 -52540 1600 1525 -52540 1626 1467 -52540 1630 1467 -52540 1667 1767 -52540 1431 1516 -52540 1566 1453 -52540 1597 1526 -52540 1716 1808 -52540 1857 1441 -52540 1477 1519 -52540 1504 1526 -52540 1740 1761 -52540 1617 1441 -52540 1789 1902 -52540 1645 1756 -52540 1825 1477 -52540 1683 1525 -52540 1562 1593 -52540 1522 1524 -52540 1599 1655 -52540 1871 1517 -52540 1681 1525 -52540 1681 1683 -52540 1650 1668 -52560 1550 1671 -52560 1552 1740 -52560 1562 1520 -52560 1566 1453 -52560 1597 1526 -52560 1626 1630 -52560 1716 1808 -52560 1857 1441 -52560 1477 1519 -52560 1504 1526 -52560 1507 1522 -52560 1740 1761 -52560 1617 1441 -52560 1617 1857 -52560 1789 1902 -52560 1605 1636 -52560 1645 1756 -52560 1825 1477 -52560 1683 1525 -52560 1562 1593 -52560 1522 1524 -52560 1599 1655 -52560 1871 1517 -52560 1681 1525 -52560 1681 1683 -52560 1650 1668 -52580 1547 1716 -52580 1549 1681 -52580 1560 1769 -52580 1657 1769 -52580 1740 1761 -52580 1803 1902 -52580 1468 1516 -52580 1617 1441 -52580 1617 1857 -52580 1667 1767 -52580 1789 1902 -52580 1605 1636 -52580 1645 1756 -52580 1825 1477 -52580 1683 1525 -52580 1562 1593 -52580 1600 1681 -52580 1522 1524 -52580 1599 1655 -52580 1677 1701 -52580 1871 1517 -52580 1681 1525 -52580 1681 1683 -52580 1650 1668 -52600 1549 1683 -52600 1550 1552 -52600 1562 1685 -52600 1617 1441 -52600 1617 1857 -52600 1667 1767 -52600 1789 1902 -52600 1512 1531 -52600 1626 1761 -52600 1716 1808 -52600 1761 1467 -52600 1605 1636 -52600 1626 1467 -52600 1629 1911 -52600 1645 1756 -52600 1825 1477 -52600 1600 1525 -52600 1683 1525 -52600 1538 1522 -52600 1562 1593 -52600 1600 1681 -52600 1522 1524 -52600 1599 1655 -52600 1677 1701 -52600 1871 1517 -52600 1681 1525 -52600 1681 1683 -52600 1650 1668 -52620 1626 1761 -52620 1635 1517 -52620 1716 1808 -52620 1761 1467 -52620 1566 1453 -52620 1605 1636 -52620 1626 1467 -52620 1629 1911 -52620 1630 1740 -52620 1645 1756 -52620 1825 1477 -52620 1600 1525 -52620 1683 1525 -52620 1579 1501 -52620 1538 1522 -52620 1562 1593 -52620 1600 1681 -52620 1600 1683 -52620 1522 1524 -52620 1599 1655 -52620 1677 1701 -52620 1871 1517 -52620 1681 1525 -52620 1681 1683 -52620 1650 1668 -52640 1543 1700 -52640 1550 1552 -52640 1550 1872 -52640 1563 1699 -52640 1566 1453 -52640 1605 1636 -52640 1626 1467 -52640 1629 1911 -52640 1630 1740 -52640 1645 1756 -52640 1707 1764 -52640 1597 1526 -52640 1630 1761 -52640 1825 1477 -52640 1600 1525 -52640 1683 1525 -52640 1579 1501 -52640 1601 1911 -52640 1538 1522 -52640 1562 1593 -52640 1600 1681 -52640 1600 1683 -52640 1522 1524 -52640 1599 1655 -52640 1677 1701 -52640 1871 1517 -52640 1667 1767 -52640 1681 1525 -52640 1681 1683 -52640 1650 1668 -52660 1562 1685 -52660 1597 1526 -52660 1626 1630 -52660 1630 1761 -52660 1740 1467 -52660 1825 1477 -52660 1600 1525 -52660 1683 1525 -52660 1538 1524 -52660 1579 1501 -52660 1601 1911 -52660 1630 1467 -52660 1538 1522 -52660 1562 1593 -52660 1600 1681 -52660 1600 1683 -52660 1669 1754 -52660 1522 1524 -52660 1825 1469 -52660 1599 1655 -52660 1677 1701 -52660 1871 1517 -52660 1667 1767 -52660 1681 1525 -52660 1681 1683 -52660 1650 1668 -52680 1600 1525 -52680 1683 1525 -52680 1512 1531 -52680 1538 1524 -52680 1579 1501 -52680 1601 1911 -52680 1630 1467 -52680 1538 1522 -52680 1547 1716 -52680 1645 1756 -52680 1707 1764 -52680 1716 1808 -52680 1562 1593 -52680 1600 1681 -52680 1549 1600 -52680 1600 1683 -52680 1669 1754 -52680 1522 1524 -52680 1617 1441 -52680 1626 1467 -52680 1825 1469 -52680 1599 1655 -52680 1677 1701 -52680 1871 1517 -52680 1667 1767 -52680 1681 1525 -52680 1681 1683 -52680 1650 1668 -52700 1538 1524 -52700 1543 1783 -52700 1553 1600 -52700 1566 1453 -52700 1579 1501 -52700 1601 1911 -52700 1630 1467 -52700 1468 1516 -52700 1507 1522 -52700 1538 1522 -52700 1547 1716 -52700 1645 1756 -52700 1707 1764 -52700 1716 1808 -52700 1507 1524 -52700 1562 1593 -52700 1600 1681 -52700 1549 1600 -52700 1600 1683 -52700 1626 1630 -52700 1669 1754 -52700 1522 1524 -52700 1477 1519 -52700 1617 1441 -52700 1626 1467 -52700 1825 1469 -52700 1599 1655 -52700 1677 1701 -52700 1871 1517 -52700 1667 1767 -52700 1681 1525 -52700 1681 1683 -52700 1650 1668 -52720 1538 1522 -52720 1547 1716 -52720 1600 1525 -52720 1645 1756 -52720 1698 1707 -52720 1700 1783 -52720 1707 1764 -52720 1716 1808 -52720 1507 1524 -52720 1512 1531 -52720 1562 1593 -52720 1600 1681 -52720 1683 1525 -52720 1501 1507 -52720 1549 1600 -52720 1600 1683 -52720 1626 1630 -52720 1669 1754 -52720 1522 1524 -52720 1477 1519 -52720 1617 1441 -52720 1626 1467 -52720 1825 1469 -52720 1599 1655 -52720 1677 1701 -52720 1871 1517 -52720 1667 1767 -52720 1681 1525 -52720 1681 1683 -52720 1650 1668 -52740 1562 1593 -52740 1600 1681 -52740 1605 1636 -52740 1683 1525 -52740 1501 1507 -52740 1538 1524 -52740 1549 1600 -52740 1600 1683 -52740 1626 1630 -52740 1648 1819 -52740 1669 1754 -52740 1501 1522 -52740 1501 1524 -52740 1522 1524 -52740 1477 1519 -52740 1617 1441 -52740 1626 1467 -52740 1541 1691 -52740 1825 1469 -52740 1599 1655 -52740 1677 1701 -52740 1871 1517 -52740 1630 1467 -52740 1667 1767 -52740 1681 1525 -52740 1681 1683 -52740 1650 1668 -52760 1538 1524 -52760 1549 1600 -52760 1600 1683 -52760 1626 1630 -52760 1648 1819 -52760 1669 1754 -52760 1803 1902 -52760 1501 1522 -52760 1501 1524 -52760 1507 1522 -52760 1522 1524 -52760 1538 1522 -52760 1477 1519 -52760 1549 1681 -52760 1562 1579 -52760 1562 1574 -52760 1617 1441 -52760 1574 1579 -52760 1626 1467 -52760 1541 1691 -52760 1825 1469 -52760 1599 1655 -52760 1677 1701 -52760 1871 1517 -52760 1630 1467 -52760 1667 1767 -52760 1449 1477 -52760 1681 1525 -52760 1681 1683 -52760 1650 1668 -52780 1538 1522 -52780 1538 1501 -52780 1547 1716 -52780 1553 1600 -52780 1707 1764 -52780 1789 1902 -52780 1477 1519 -52780 1549 1681 -52780 1562 1579 -52780 1562 1574 -52780 1617 1441 -52780 1507 1524 -52780 1574 1579 -52780 1626 1467 -52780 1541 1691 -52780 1566 1453 -52780 1825 1469 -52780 1599 1655 -52780 1677 1701 -52780 1501 1507 -52780 1549 1683 -52780 1871 1517 -52780 1630 1467 -52780 1667 1767 -52780 1683 1525 -52780 1645 1756 -52780 1449 1477 -52780 1681 1525 -52780 1681 1683 -52780 1650 1668 -52800 1549 1681 -52800 1550 1552 -52800 1562 1579 -52800 1562 1574 -52800 1617 1441 -52800 1783 1526 -52800 1501 1522 -52800 1507 1524 -52800 1574 1579 -52800 1626 1467 -52800 1541 1691 -52800 1566 1453 -52800 1550 1872 -52800 1825 1469 -52800 1599 1655 -52800 1677 1701 -52800 1501 1507 -52800 1549 1683 -52800 1600 1681 -52800 1871 1517 -52800 1630 1467 -52800 1667 1767 -52800 1683 1525 -52800 1600 1683 -52800 1645 1756 -52800 1449 1477 -52800 1681 1525 -52800 1681 1683 -52800 1650 1668 -52820 1553 1600 -52820 1574 1579 -52820 1574 1453 -52820 1657 1769 -52820 1698 1707 -52820 1825 1477 -52820 1921 1531 -52820 1512 1531 -52820 1538 1524 -52820 1626 1467 -52820 1630 1707 -52820 1698 1467 -52820 1707 1467 -52820 1921 1512 -52820 1522 1524 -52820 1541 1691 -52820 1547 1716 -52820 1566 1453 -52820 1538 1522 -52820 1669 1754 -52820 1550 1872 -52820 1789 1902 -52820 1825 1469 -52820 1599 1655 -52820 1677 1701 -52820 1501 1507 -52820 1549 1600 -52820 1549 1683 -52820 1562 1453 -52820 1562 1566 -52820 1600 1681 -52820 1871 1517 -52820 1630 1467 -52820 1667 1767 -52820 1683 1525 -52820 1600 1683 -52820 1645 1756 -52820 1449 1477 -52820 1681 1525 -52820 1681 1683 -52820 1650 1668 -52840 1538 1524 -52840 1553 1683 -52840 1597 1526 -52840 1626 1467 -52840 1626 1707 -52840 1630 1707 -52840 1698 1467 -52840 1707 1467 -52840 1921 1512 -52840 1468 1516 -52840 1522 1524 -52840 1541 1691 -52840 1547 1716 -52840 1549 1681 -52840 1566 1453 -52840 1600 1525 -52840 1617 1441 -52840 1538 1522 -52840 1669 1754 -52840 1550 1872 -52840 1789 1803 -52840 1789 1902 -52840 1825 1469 -52840 1599 1655 -52840 1677 1701 -52840 1501 1507 -52840 1549 1600 -52840 1549 1683 -52840 1562 1453 -52840 1562 1566 -52840 1600 1681 -52840 1871 1517 -52840 1477 1519 -52840 1630 1467 -52840 1449 1519 -52840 1667 1767 -52840 1683 1525 -52840 1600 1683 -52840 1645 1756 -52840 1449 1477 -52840 1681 1525 -52840 1681 1683 -52840 1650 1668 -52860 1541 1691 -52860 1547 1716 -52860 1549 1681 -52860 1566 1453 -52860 1574 1465 -52860 1600 1525 -52860 1617 1441 -52860 1699 1826 -52860 1707 1764 -52860 1716 1808 -52860 1787 1521 -52860 1825 1449 -52860 1921 1531 -52860 1462 1531 -52860 1501 1522 -52860 1501 1524 -52860 1538 1522 -52860 1669 1754 -52860 1825 1477 -52860 1550 1872 -52860 1789 1803 -52860 1789 1902 -52860 1825 1469 -52860 1599 1655 -52860 1677 1701 -52860 1501 1507 -52860 1549 1600 -52860 1549 1683 -52860 1562 1453 -52860 1562 1566 -52860 1600 1681 -52860 1626 1630 -52860 1871 1517 -52860 1477 1519 -52860 1630 1467 -52860 1449 1519 -52860 1667 1767 -52860 1683 1525 -52860 1600 1683 -52860 1645 1756 -52860 1449 1477 -52860 1681 1525 -52860 1681 1683 -52860 1650 1668 -52880 1538 1522 -52880 1550 1552 -52880 1669 1754 -52880 1825 1477 -52880 1826 1871 -52880 1857 1441 -52880 1441 1467 -52880 1550 1872 -52880 1789 1803 -52880 1789 1902 -52880 1825 1469 -52880 1599 1655 -52880 1677 1701 -52880 1468 1516 -52880 1501 1507 -52880 1549 1600 -52880 1549 1683 -52880 1562 1453 -52880 1562 1566 -52880 1600 1681 -52880 1626 1630 -52880 1871 1517 -52880 1477 1519 -52880 1630 1467 -52880 1449 1519 -52880 1667 1767 -52880 1683 1525 -52880 1600 1683 -52880 1645 1756 -52880 1449 1477 -52880 1681 1525 -52880 1681 1683 -52880 1650 1668 -52900 1538 1501 -52900 1545 1430 -52900 1550 1872 -52900 1630 1857 -52900 1698 1764 -52900 1787 1521 -52900 1789 1803 -52900 1789 1902 -52900 1803 1902 -52900 1825 1469 -52900 1847 1921 -52900 1921 1462 -52900 1922 1517 -52900 1566 1453 -52900 1599 1655 -52900 1677 1701 -52900 1698 1707 -52900 1819 1911 -52900 1826 1517 -52900 1468 1516 -52900 1501 1507 -52900 1549 1600 -52900 1549 1683 -52900 1562 1453 -52900 1562 1566 -52900 1600 1681 -52900 1600 1525 -52900 1626 1630 -52900 1871 1517 -52900 1477 1519 -52900 1549 1681 -52900 1630 1467 -52900 1449 1519 -52900 1667 1767 -52900 1683 1525 -52900 1600 1683 -52900 1645 1756 -52900 1449 1477 -52900 1681 1525 -52900 1681 1683 -52900 1650 1668 -52920 1541 1691 -52920 1545 1428 -52920 1546 1516 -52920 1566 1453 -52920 1599 1655 -52920 1677 1701 -52920 1698 1707 -52920 1819 1911 -52920 1826 1517 -52920 1826 1871 -52920 1468 1516 -52920 1501 1507 -52920 1507 1524 -52920 1549 1600 -52920 1549 1683 -52920 1562 1453 -52920 1562 1566 -52920 1600 1681 -52920 1600 1525 -52920 1626 1630 -52920 1501 1524 -52920 1871 1517 -52920 1477 1519 -52920 1512 1531 -52920 1549 1681 -52920 1630 1467 -52920 1449 1519 -52920 1617 1857 -52920 1667 1767 -52920 1683 1525 -52920 1600 1683 -52920 1645 1756 -52920 1669 1754 -52920 1449 1477 -52920 1681 1525 -52920 1681 1683 -52920 1650 1668 -52940 1545 1430 -52940 1549 1600 -52940 1549 1683 -52940 1562 1453 -52940 1562 1566 -52940 1563 1605 -52940 1566 1579 -52940 1575 1679 -52940 1600 1681 -52940 1600 1525 -52940 1626 1630 -52940 1825 1477 -52940 1501 1522 -52940 1501 1524 -52940 1522 1524 -52940 1789 1803 -52940 1871 1517 -52940 1477 1519 -52940 1512 1531 -52940 1549 1681 -52940 1630 1467 -52940 1449 1519 -52940 1617 1857 -52940 1667 1767 -52940 1683 1525 -52940 1803 1902 -52940 1600 1683 -52940 1825 1469 -52940 1538 1522 -52940 1645 1756 -52940 1669 1754 -52940 1449 1477 -52940 1681 1525 -52940 1681 1683 -52940 1650 1668 -52960 1605 1636 -52960 1687 1702 -52960 1789 1803 -52960 1819 1920 -52960 1871 1517 -52960 1921 1462 -52960 1431 1516 -52960 1468 1516 -52960 1477 1519 -52960 1507 1524 -52960 1512 1531 -52960 1549 1681 -52960 1630 1467 -52960 1449 1519 -52960 1541 1691 -52960 1617 1857 -52960 1667 1767 -52960 1683 1525 -52960 1789 1902 -52960 1803 1902 -52960 1600 1683 -52960 1825 1469 -52960 1538 1522 -52960 1671 1684 -52960 1645 1756 -52960 1669 1754 -52960 1449 1477 -52960 1599 1655 -52960 1681 1525 -52960 1681 1683 -52960 1650 1668 -52980 1549 1681 -52980 1562 1566 -52980 1605 1462 -52980 1626 1467 -52980 1626 1630 -52980 1630 1467 -52980 1688 1477 -52980 1698 1707 -52980 1707 1764 -52980 1740 1839 -52980 1764 1771 -52980 1819 1911 -52980 1922 1517 -52980 1449 1519 -52980 1449 1469 -52980 1469 1519 -52980 1501 1507 -52980 1541 1691 -52980 1549 1683 -52980 1553 1600 -52980 1716 1808 -52980 1617 1857 -52980 1667 1767 -52980 1683 1525 -52980 1789 1902 -52980 1803 1902 -52980 1522 1524 -52980 1549 1600 -52980 1600 1681 -52980 1600 1683 -52980 1825 1469 -52980 1538 1522 -52980 1671 1684 -52980 1645 1756 -52980 1669 1754 -52980 1449 1477 -52980 1599 1655 -52980 1681 1525 -52980 1681 1683 -52980 1650 1668 -53000 1541 1691 -53000 1545 1579 -53000 1549 1683 -53000 1553 1600 -53000 1575 1679 -53000 1595 1654 -53000 1678 1731 -53000 1687 1702 -53000 1698 1764 -53000 1716 1808 -53000 1871 1517 -53000 1431 1516 -53000 1545 1430 -53000 1550 1826 -53000 1562 1430 -53000 1617 1857 -53000 1667 1767 -53000 1683 1525 -53000 1688 1769 -53000 1767 1840 -53000 1789 1803 -53000 1789 1902 -53000 1803 1902 -53000 1522 1524 -53000 1549 1600 -53000 1577 1655 -53000 1600 1681 -53000 1600 1683 -53000 1825 1469 -53000 1538 1522 -53000 1563 1688 -53000 1671 1684 -53000 1577 1599 -53000 1645 1756 -53000 1669 1754 -53000 1449 1477 -53000 1599 1655 -53000 1681 1525 -53000 1681 1683 -53000 1650 1668 -53020 1541 1555 -53020 1545 1430 -53020 1550 1826 -53020 1555 1691 -53020 1562 1430 -53020 1563 1769 -53020 1617 1857 -53020 1667 1840 -53020 1667 1767 -53020 1679 1921 -53020 1683 1525 -53020 1688 1769 -53020 1767 1840 -53020 1778 1466 -53020 1789 1803 -53020 1789 1902 -53020 1803 1902 -53020 1507 1524 -53020 1512 1531 -53020 1522 1524 -53020 1549 1600 -53020 1562 1566 -53020 1577 1655 -53020 1600 1525 -53020 1549 1681 -53020 1600 1681 -53020 1600 1683 -53020 1825 1469 -53020 1538 1522 -53020 1563 1688 -53020 1671 1684 -53020 1577 1599 -53020 1630 1467 -53020 1677 1701 -53020 1501 1507 -53020 1645 1756 -53020 1669 1754 -53020 1921 1462 -53020 1698 1707 -53020 1449 1477 -53020 1599 1655 -53020 1681 1525 -53020 1681 1683 -53020 1650 1668 -53040 1549 1600 -53040 1549 1683 -53040 1553 1600 -53040 1562 1566 -53040 1577 1655 -53040 1600 1525 -53040 1707 1764 -53040 1477 1519 -53040 1538 1524 -53040 1549 1681 -53040 1600 1681 -53040 1600 1683 -53040 1606 1516 -53040 1767 1441 -53040 1825 1469 -53040 1840 1441 -53040 1538 1522 -53040 1563 1688 -53040 1657 1688 -53040 1671 1684 -53040 1577 1599 -53040 1630 1467 -53040 1677 1701 -53040 1871 1517 -53040 1501 1507 -53040 1645 1756 -53040 1669 1754 -53040 1921 1462 -53040 1698 1707 -53040 1563 1657 -53040 1449 1477 -53040 1599 1655 -53040 1681 1525 -53040 1681 1683 -53040 1650 1668 -53060 1538 1524 -53060 1546 1606 -53060 1549 1681 -53060 1600 1681 -53060 1600 1683 -53060 1606 1516 -53060 1606 1431 -53060 1626 1630 -53060 1667 1771 -53060 1667 1677 -53060 1684 1701 -53060 1767 1840 -53060 1767 1441 -53060 1803 1902 -53060 1825 1469 -53060 1826 1853 -53060 1840 1441 -53060 1507 1524 -53060 1512 1531 -53060 1538 1522 -53060 1563 1688 -53060 1657 1688 -53060 1671 1684 -53060 1688 1769 -53060 1699 1707 -53060 1707 1517 -53060 1716 1808 -53060 1771 1462 -53060 1496 1505 -53060 1577 1599 -53060 1630 1467 -53060 1677 1701 -53060 1871 1517 -53060 1501 1507 -53060 1645 1756 -53060 1669 1754 -53060 1501 1522 -53060 1921 1462 -53060 1522 1524 -53060 1698 1707 -53060 1563 1657 -53060 1449 1477 -53060 1599 1655 -53060 1681 1525 -53060 1683 1525 -53060 1681 1683 -53060 1650 1668 -53080 1538 1522 -53080 1538 1501 -53080 1563 1688 -53080 1563 1769 -53080 1563 1803 -53080 1657 1688 -53080 1671 1684 -53080 1687 1702 -53080 1688 1769 -53080 1688 1803 -53080 1688 1902 -53080 1698 1699 -53080 1699 1707 -53080 1699 1764 -53080 1707 1517 -53080 1707 1871 -53080 1716 1808 -53080 1771 1462 -53080 1789 1826 -53080 1431 1516 -53080 1496 1505 -53080 1541 1691 -53080 1577 1599 -53080 1617 1441 -53080 1630 1467 -53080 1677 1701 -53080 1702 1842 -53080 1871 1517 -53080 1501 1507 -53080 1617 1857 -53080 1645 1756 -53080 1669 1754 -53080 1501 1522 -53080 1921 1462 -53080 1477 1519 -53080 1522 1524 -53080 1577 1655 -53080 1698 1707 -53080 1501 1524 -53080 1563 1657 -53080 1449 1477 -53080 1599 1655 -53080 1681 1525 -53080 1683 1525 -53080 1681 1683 -53080 1650 1668 -53100 1539 1789 -53100 1541 1691 -53100 1546 1606 -53100 1546 1558 -53100 1550 1552 -53100 1550 1761 -53100 1577 1599 -53100 1617 1441 -53100 1626 1467 -53100 1626 1630 -53100 1630 1467 -53100 1677 1701 -53100 1688 1707 -53100 1699 1517 -53100 1699 1871 -53100 1702 1842 -53100 1707 1761 -53100 1707 1803 -53100 1761 1764 -53100 1761 1517 -53100 1761 1871 -53100 1764 1517 -53100 1764 1871 -53100 1803 1902 -53100 1825 1477 -53100 1857 1441 -53100 1871 1517 -53100 1501 1507 -53100 1507 1524 -53100 1617 1857 -53100 1645 1756 -53100 1669 1754 -53100 1501 1522 -53100 1553 1683 -53100 1921 1462 -53100 1477 1519 -53100 1522 1524 -53100 1577 1655 -53100 1684 1701 -53100 1698 1707 -53100 1698 1764 -53100 1819 1920 -53100 1677 1684 -53100 1501 1524 -53100 1563 1657 -53100 1449 1477 -53100 1599 1655 -53100 1671 1767 -53100 1825 1469 -53100 1681 1525 -53100 1683 1525 -53100 1681 1683 -53100 1650 1668 -53120 1563 1592 -53120 1568 1694 -53120 1600 1683 -53120 1617 1857 -53120 1645 1756 -53120 1669 1754 -53120 1688 1771 -53120 1698 1769 -53120 1707 1769 -53120 1707 1789 -53120 1756 1505 -53120 1772 1874 -53120 1789 1803 -53120 1501 1522 -53120 1553 1683 -53120 1921 1462 -53120 1449 1519 -53120 1477 1519 -53120 1522 1524 -53120 1577 1655 -53120 1684 1701 -53120 1716 1808 -53120 1698 1707 -53120 1698 1764 -53120 1819 1920 -53120 1677 1684 -53120 1501 1524 -53120 1563 1657 -53120 1449 1477 -53120 1599 1655 -53120 1671 1767 -53120 1707 1764 -53120 1825 1469 -53120 1681 1525 -53120 1683 1525 -53120 1681 1683 -53120 1650 1668 -53140 1538 1593 -53140 1553 1683 -53140 1702 1466 -53140 1761 1853 -53140 1871 1517 -53140 1921 1462 -53140 1449 1519 -53140 1477 1519 -53140 1522 1524 -53140 1577 1655 -53140 1630 1467 -53140 1677 1701 -53140 1684 1701 -53140 1716 1808 -53140 1541 1691 -53140 1698 1707 -53140 1698 1764 -53140 1819 1920 -53140 1677 1684 -53140 1501 1524 -53140 1563 1657 -53140 1449 1477 -53140 1599 1655 -53140 1671 1767 -53140 1563 1769 -53140 1707 1764 -53140 1825 1469 -53140 1681 1525 -53140 1683 1525 -53140 1681 1683 -53140 1650 1668 -53160 1546 1558 -53160 1546 1606 -53160 1577 1655 -53160 1606 1431 -53160 1625 1659 -53160 1626 1630 -53160 1630 1467 -53160 1635 1458 -53160 1657 1769 -53160 1677 1701 -53160 1684 1701 -53160 1688 1694 -53160 1699 1771 -53160 1716 1808 -53160 1771 1789 -53160 1541 1691 -53160 1669 1754 -53160 1698 1707 -53160 1698 1764 -53160 1667 1857 -53160 1716 1457 -53160 1819 1920 -53160 1617 1667 -53160 1677 1684 -53160 1699 1902 -53160 1501 1524 -53160 1563 1657 -53160 1449 1477 -53160 1599 1655 -53160 1501 1522 -53160 1671 1767 -53160 1563 1769 -53160 1707 1764 -53160 1825 1469 -53160 1681 1525 -53160 1683 1525 -53160 1681 1683 -53160 1650 1668 -53180 1541 1691 -53180 1669 1754 -53180 1698 1707 -53180 1698 1764 -53180 1699 1803 -53180 1550 1872 -53180 1604 1649 -53180 1667 1857 -53180 1676 1700 -53180 1716 1457 -53180 1819 1920 -53180 1617 1667 -53180 1754 1789 -53180 1921 1462 -53180 1677 1684 -53180 1699 1902 -53180 1501 1524 -53180 1563 1657 -53180 1449 1477 -53180 1599 1655 -53180 1501 1522 -53180 1840 1453 -53180 1671 1767 -53180 1563 1769 -53180 1707 1764 -53180 1825 1469 -53180 1681 1525 -53180 1683 1525 -53180 1681 1683 -53180 1650 1668 -53200 1550 1872 -53200 1604 1649 -53200 1625 1659 -53200 1667 1857 -53200 1676 1700 -53200 1677 1701 -53200 1716 1457 -53200 1803 1902 -53200 1819 1920 -53200 1439 1526 -53200 1577 1655 -53200 1617 1667 -53200 1716 1808 -53200 1754 1789 -53200 1921 1462 -53200 1496 1505 -53200 1677 1684 -53200 1699 1902 -53200 1501 1524 -53200 1563 1657 -53200 1449 1477 -53200 1599 1655 -53200 1501 1522 -53200 1840 1453 -53200 1671 1767 -53200 1563 1769 -53200 1707 1764 -53200 1825 1469 -53200 1681 1525 -53200 1683 1525 -53200 1681 1683 -53200 1650 1668 -53220 1541 1606 -53220 1545 1604 -53220 1545 1430 -53220 1577 1655 -53220 1617 1667 -53220 1707 1871 -53220 1716 1808 -53220 1754 1789 -53220 1772 1874 -53220 1825 1477 -53220 1921 1462 -53220 1449 1519 -53220 1468 1516 -53220 1477 1519 -53220 1496 1505 -53220 1541 1642 -53220 1630 1467 -53220 1677 1684 -53220 1699 1902 -53220 1501 1524 -53220 1563 1657 -53220 1449 1477 -53220 1599 1655 -53220 1501 1522 -53220 1840 1453 -53220 1671 1767 -53220 1563 1769 -53220 1707 1764 -53220 1825 1469 -53220 1681 1525 -53220 1683 1525 -53220 1681 1683 -53220 1650 1668 -53240 1541 1642 -53240 1630 1467 -53240 1669 1754 -53240 1677 1684 -53240 1677 1701 -53240 1699 1902 -53240 1700 1526 -53240 1716 1440 -53240 1771 1853 -53240 1501 1524 -53240 1545 1616 -53240 1545 1649 -53240 1563 1657 -53240 1626 1630 -53240 1684 1701 -53240 1449 1477 -53240 1522 1524 -53240 1604 1430 -53240 1874 1466 -53240 1599 1655 -53240 1501 1522 -53240 1840 1453 -53240 1671 1767 -53240 1563 1769 -53240 1707 1764 -53240 1825 1469 -53240 1681 1525 -53240 1683 1525 -53240 1681 1683 -53240 1650 1668 -53260 1541 1431 -53260 1545 1616 -53260 1545 1649 -53260 1555 1691 -53260 1558 1606 -53260 1562 1593 -53260 1563 1657 -53260 1606 1468 -53260 1626 1630 -53260 1684 1701 -53260 1871 1517 -53260 1449 1477 -53260 1477 1519 -53260 1522 1524 -53260 1604 1430 -53260 1871 1458 -53260 1874 1466 -53260 1921 1462 -53260 1546 1606 -53260 1599 1655 -53260 1754 1789 -53260 1501 1522 -53260 1840 1453 -53260 1671 1767 -53260 1563 1769 -53260 1707 1764 -53260 1698 1707 -53260 1825 1469 -53260 1681 1525 -53260 1683 1525 -53260 1681 1683 -53260 1650 1668 -53280 1550 1872 -53280 1602 1702 -53280 1604 1430 -53280 1613 1633 -53280 1619 1700 -53280 1691 1765 -53280 1700 1528 -53280 1765 1874 -53280 1771 1853 -53280 1871 1458 -53280 1874 1466 -53280 1921 1462 -53280 1545 1604 -53280 1546 1606 -53280 1577 1655 -53280 1599 1655 -53280 1671 1701 -53280 1699 1803 -53280 1699 1902 -53280 1840 1477 -53280 1754 1789 -53280 1501 1522 -53280 1840 1453 -53280 1671 1767 -53280 1563 1769 -53280 1698 1764 -53280 1716 1808 -53280 1707 1764 -53280 1698 1707 -53280 1825 1469 -53280 1681 1525 -53280 1683 1525 -53280 1681 1683 -53280 1650 1668 -53300 1545 1604 -53300 1546 1606 -53300 1577 1655 -53300 1577 1599 -53300 1592 1458 -53300 1599 1655 -53300 1606 1431 -53300 1671 1701 -53300 1676 1700 -53300 1677 1701 -53300 1699 1803 -53300 1699 1902 -53300 1772 1874 -53300 1840 1477 -53300 1617 1677 -53300 1634 1504 -53300 1754 1789 -53300 1501 1522 -53300 1819 1920 -53300 1840 1453 -53300 1671 1767 -53300 1563 1657 -53300 1563 1769 -53300 1698 1764 -53300 1716 1808 -53300 1707 1764 -53300 1698 1707 -53300 1825 1469 -53300 1681 1525 -53300 1683 1525 -53300 1681 1683 -53300 1650 1668 -53320 1546 1431 -53320 1617 1677 -53320 1617 1510 -53320 1634 1504 -53320 1667 1477 -53320 1671 1441 -53320 1754 1789 -53320 1771 1853 -53320 1501 1522 -53320 1522 1524 -53320 1574 1466 -53320 1819 1920 -53320 1501 1524 -53320 1840 1453 -53320 1671 1767 -53320 1563 1657 -53320 1563 1769 -53320 1698 1764 -53320 1716 1808 -53320 1707 1764 -53320 1698 1707 -53320 1825 1469 -53320 1681 1525 -53320 1683 1525 -53320 1617 1701 -53320 1681 1683 -53320 1650 1668 -53340 1574 1466 -53340 1700 1770 -53340 1819 1920 -53340 1501 1524 -53340 1840 1453 -53340 1600 1683 -53340 1667 1519 -53340 1671 1767 -53340 1560 1699 -53340 1677 1701 -53340 1441 1510 -53340 1541 1555 -53340 1669 1754 -53340 1563 1657 -53340 1563 1769 -53340 1772 1874 -53340 1698 1764 -53340 1716 1808 -53340 1707 1764 -53340 1698 1707 -53340 1699 1803 -53340 1825 1469 -53340 1681 1525 -53340 1683 1525 -53340 1617 1701 -53340 1681 1683 -53340 1650 1668 -53360 1546 1431 -53360 1592 1458 -53360 1599 1655 -53360 1600 1681 -53360 1600 1667 -53360 1634 1866 -53360 1691 1501 -53360 1840 1453 -53360 1851 1521 -53360 1871 1517 -53360 1600 1683 -53360 1667 1449 -53360 1667 1519 -53360 1671 1767 -53360 1560 1699 -53360 1657 1769 -53360 1677 1701 -53360 1699 1902 -53360 1441 1510 -53360 1541 1555 -53360 1669 1754 -53360 1803 1902 -53360 1921 1462 -53360 1563 1657 -53360 1563 1769 -53360 1772 1874 -53360 1698 1764 -53360 1716 1808 -53360 1449 1519 -53360 1707 1764 -53360 1698 1707 -53360 1699 1803 -53360 1825 1469 -53360 1681 1525 -53360 1683 1525 -53360 1617 1701 -53360 1681 1683 -53360 1650 1668 -53380 1546 1558 -53380 1558 1516 -53380 1600 1683 -53380 1634 1438 -53380 1667 1449 -53380 1667 1477 -53380 1667 1519 -53380 1671 1767 -53380 1468 1516 -53380 1477 1519 -53380 1501 1504 -53380 1560 1699 -53380 1657 1769 -53380 1677 1701 -53380 1699 1902 -53380 1819 1920 -53380 1441 1510 -53380 1501 1524 -53380 1541 1555 -53380 1669 1754 -53380 1803 1902 -53380 1921 1462 -53380 1563 1657 -53380 1563 1769 -53380 1772 1874 -53380 1698 1764 -53380 1716 1808 -53380 1449 1519 -53380 1707 1764 -53380 1698 1707 -53380 1699 1803 -53380 1825 1469 -53380 1681 1525 -53380 1683 1525 -53380 1617 1701 -53380 1681 1683 -53380 1650 1668 -53400 1560 1699 -53400 1562 1593 -53400 1657 1769 -53400 1661 1853 -53400 1667 1921 -53400 1671 1684 -53400 1677 1857 -53400 1677 1701 -53400 1688 1531 -53400 1699 1902 -53400 1819 1920 -53400 1441 1510 -53400 1457 1458 -53400 1501 1524 -53400 1541 1555 -53400 1617 1857 -53400 1669 1754 -53400 1699 1458 -53400 1767 1441 -53400 1803 1902 -53400 1921 1462 -53400 1563 1657 -53400 1563 1769 -53400 1772 1874 -53400 1698 1764 -53400 1716 1808 -53400 1449 1519 -53400 1707 1764 -53400 1698 1707 -53400 1699 1803 -53400 1825 1469 -53400 1840 1453 -53400 1681 1525 -53400 1683 1525 -53400 1599 1655 -53400 1477 1480 -53400 1617 1701 -53400 1681 1683 -53400 1650 1668 -53420 1541 1555 -53420 1617 1857 -53420 1669 1754 -53420 1699 1458 -53420 1701 1857 -53420 1767 1441 -53420 1803 1902 -53420 1866 1501 -53420 1921 1462 -53420 1541 1691 -53420 1563 1657 -53420 1563 1769 -53420 1772 1874 -53420 1698 1764 -53420 1716 1808 -53420 1449 1519 -53420 1707 1764 -53420 1698 1707 -53420 1699 1803 -53420 1825 1469 -53420 1840 1453 -53420 1681 1525 -53420 1683 1525 -53420 1599 1655 -53420 1477 1480 -53420 1617 1701 -53420 1681 1683 -53420 1650 1668 -53440 1541 1691 -53440 1546 1516 -53440 1563 1657 -53440 1563 1769 -53440 1577 1655 -53440 1772 1874 -53440 1441 1510 -53440 1538 1501 -53440 1550 1872 -53440 1603 1700 -53440 1603 1613 -53440 1698 1764 -53440 1716 1808 -53440 1767 1857 -53440 1857 1441 -53440 1449 1519 -53440 1546 1606 -53440 1613 1700 -53440 1707 1764 -53440 1894 1480 -53440 1698 1707 -53440 1699 1803 -53440 1825 1469 -53440 1840 1453 -53440 1681 1525 -53440 1683 1525 -53440 1599 1655 -53440 1894 1477 -53440 1477 1480 -53440 1617 1701 -53440 1681 1683 -53440 1650 1668 -53460 1538 1501 -53460 1550 1872 -53460 1563 1592 -53460 1573 1452 -53460 1603 1700 -53460 1603 1613 -53460 1606 1431 -53460 1613 1688 -53460 1617 1677 -53460 1677 1701 -53460 1698 1764 -53460 1716 1808 -53460 1767 1857 -53460 1803 1902 -53460 1857 1441 -53460 1449 1519 -53460 1501 1507 -53460 1501 1524 -53460 1546 1606 -53460 1595 1654 -53460 1613 1700 -53460 1688 1700 -53460 1707 1764 -53460 1767 1441 -53460 1894 1480 -53460 1538 1522 -53460 1541 1555 -53460 1553 1683 -53460 1698 1707 -53460 1546 1431 -53460 1671 1857 -53460 1699 1803 -53460 1825 1469 -53460 1840 1453 -53460 1566 1531 -53460 1681 1525 -53460 1683 1525 -53460 1501 1522 -53460 1599 1655 -53460 1894 1477 -53460 1477 1480 -53460 1617 1701 -53460 1681 1683 -53460 1650 1668 -53480 1543 1452 -53480 1546 1558 -53480 1546 1606 -53480 1595 1654 -53480 1603 1779 -53480 1613 1700 -53480 1623 1458 -53480 1642 1531 -53480 1677 1441 -53480 1688 1700 -53480 1707 1764 -53480 1767 1441 -53480 1894 1480 -53480 1431 1516 -53480 1538 1522 -53480 1538 1524 -53480 1541 1555 -53480 1553 1683 -53480 1603 1452 -53480 1698 1707 -53480 1871 1517 -53480 1522 1524 -53480 1546 1431 -53480 1671 1857 -53480 1699 1803 -53480 1699 1902 -53480 1825 1469 -53480 1840 1453 -53480 1566 1531 -53480 1681 1525 -53480 1683 1525 -53480 1669 1754 -53480 1501 1522 -53480 1507 1524 -53480 1599 1655 -53480 1894 1477 -53480 1477 1480 -53480 1617 1701 -53480 1681 1683 -53480 1650 1668 -53500 1538 1522 -53500 1538 1524 -53500 1541 1555 -53500 1541 1691 -53500 1553 1683 -53500 1563 1922 -53500 1574 1783 -53500 1603 1452 -53500 1698 1707 -53500 1699 1789 -53500 1787 1851 -53500 1840 1477 -53500 1871 1517 -53500 1449 1519 -53500 1501 1507 -53500 1501 1524 -53500 1522 1524 -53500 1543 1526 -53500 1546 1431 -53500 1671 1441 -53500 1671 1857 -53500 1699 1803 -53500 1699 1902 -53500 1803 1902 -53500 1825 1469 -53500 1840 1453 -53500 1857 1441 -53500 1566 1531 -53500 1603 1526 -53500 1681 1525 -53500 1683 1525 -53500 1669 1754 -53500 1501 1522 -53500 1507 1524 -53500 1599 1655 -53500 1894 1477 -53500 1477 1480 -53500 1617 1701 -53500 1543 1603 -53500 1677 1767 -53500 1681 1683 -53500 1650 1668 -53520 1543 1526 -53520 1546 1431 -53520 1577 1655 -53520 1657 1769 -53520 1671 1441 -53520 1671 1857 -53520 1699 1803 -53520 1699 1902 -53520 1803 1902 -53520 1825 1469 -53520 1831 1871 -53520 1840 1453 -53520 1857 1441 -53520 1566 1531 -53520 1603 1526 -53520 1625 1863 -53520 1681 1525 -53520 1683 1525 -53520 1698 1764 -53520 1547 1716 -53520 1669 1754 -53520 1501 1522 -53520 1507 1524 -53520 1599 1655 -53520 1894 1480 -53520 1894 1477 -53520 1477 1480 -53520 1626 1630 -53520 1617 1701 -53520 1543 1603 -53520 1677 1767 -53520 1707 1764 -53520 1681 1683 -53520 1650 1668 -53540 1541 1555 -53540 1566 1531 -53540 1603 1526 -53540 1623 1840 -53540 1625 1863 -53540 1681 1525 -53540 1683 1525 -53540 1698 1764 -53540 1732 1512 -53540 1805 1831 -53540 1921 1462 -53540 1501 1524 -53540 1547 1716 -53540 1669 1754 -53540 1698 1707 -53540 1501 1522 -53540 1565 1684 -53540 1507 1524 -53540 1599 1655 -53540 1894 1480 -53540 1894 1477 -53540 1477 1480 -53540 1538 1522 -53540 1626 1630 -53540 1617 1701 -53540 1543 1603 -53540 1871 1517 -53540 1677 1767 -53540 1707 1764 -53540 1681 1683 -53540 1650 1668 -53560 1538 1501 -53560 1541 1691 -53560 1546 1431 -53560 1547 1716 -53560 1669 1754 -53560 1698 1707 -53560 1699 1902 -53560 1840 1448 -53560 1431 1516 -53560 1448 1477 -53560 1501 1522 -53560 1538 1524 -53560 1565 1684 -53560 1623 1650 -53560 1699 1789 -53560 1825 1469 -53560 1857 1441 -53560 1522 1524 -53560 1552 1453 -53560 1507 1524 -53560 1599 1655 -53560 1699 1803 -53560 1894 1480 -53560 1894 1477 -53560 1477 1480 -53560 1538 1522 -53560 1626 1630 -53560 1617 1701 -53560 1543 1603 -53560 1871 1517 -53560 1677 1767 -53560 1707 1764 -53560 1681 1683 -53560 1650 1668 -53580 1538 1524 -53580 1565 1684 -53580 1623 1650 -53580 1657 1769 -53580 1687 1702 -53580 1698 1764 -53580 1699 1789 -53580 1825 1469 -53580 1857 1441 -53580 1522 1524 -53580 1552 1453 -53580 1573 1452 -53580 1507 1524 -53580 1599 1655 -53580 1630 1467 -53580 1699 1803 -53580 1894 1480 -53580 1894 1477 -53580 1477 1480 -53580 1538 1522 -53580 1590 1517 -53580 1626 1630 -53580 1617 1701 -53580 1921 1462 -53580 1543 1603 -53580 1871 1517 -53580 1677 1767 -53580 1707 1764 -53580 1681 1683 -53580 1650 1668 -53600 1539 1448 -53600 1552 1453 -53600 1563 1448 -53600 1573 1452 -53600 1573 1765 -53600 1630 1427 -53600 1669 1754 -53600 1699 1902 -53600 1765 1452 -53600 1501 1522 -53600 1507 1524 -53600 1541 1691 -53600 1547 1808 -53600 1599 1655 -53600 1625 1863 -53600 1630 1467 -53600 1699 1803 -53600 1894 1480 -53600 1894 1477 -53600 1477 1480 -53600 1538 1522 -53600 1590 1517 -53600 1590 1871 -53600 1626 1630 -53600 1449 1519 -53600 1617 1701 -53600 1836 1512 -53600 1831 1453 -53600 1921 1462 -53600 1543 1603 -53600 1871 1517 -53600 1698 1707 -53600 1677 1767 -53600 1707 1764 -53600 1681 1683 -53600 1650 1668 -53620 1541 1691 -53620 1547 1808 -53620 1547 1770 -53620 1599 1655 -53620 1625 1863 -53620 1630 1467 -53620 1657 1769 -53620 1699 1803 -53620 1699 1789 -53620 1840 1480 -53620 1894 1480 -53620 1894 1477 -53620 1477 1480 -53620 1522 1524 -53620 1538 1522 -53620 1590 1517 -53620 1590 1871 -53620 1626 1630 -53620 1449 1519 -53620 1546 1516 -53620 1546 1431 -53620 1617 1701 -53620 1836 1512 -53620 1831 1453 -53620 1921 1462 -53620 1543 1603 -53620 1698 1764 -53620 1871 1517 -53620 1698 1707 -53620 1677 1767 -53620 1707 1764 -53620 1681 1683 -53620 1650 1668 -53640 1538 1522 -53640 1553 1683 -53640 1585 1752 -53640 1590 1517 -53640 1590 1871 -53640 1603 1528 -53640 1626 1630 -53640 1699 1902 -53640 1765 1533 -53640 1770 1438 -53640 1772 1874 -53640 1449 1519 -53640 1507 1524 -53640 1546 1516 -53640 1546 1431 -53640 1566 1531 -53640 1617 1701 -53640 1752 1766 -53640 1789 1803 -53640 1836 1512 -53640 1501 1524 -53640 1831 1453 -53640 1921 1462 -53640 1543 1603 -53640 1789 1902 -53640 1698 1764 -53640 1871 1517 -53640 1698 1707 -53640 1677 1767 -53640 1707 1764 -53640 1681 1683 -53640 1650 1668 -53660 1538 1524 -53660 1546 1516 -53660 1546 1431 -53660 1552 1453 -53660 1558 1431 -53660 1563 1922 -53660 1566 1531 -53660 1617 1701 -53660 1642 1480 -53660 1657 1769 -53660 1752 1766 -53660 1789 1803 -53660 1836 1512 -53660 1857 1480 -53660 1501 1524 -53660 1626 1427 -53660 1831 1453 -53660 1921 1462 -53660 1431 1516 -53660 1543 1603 -53660 1789 1902 -53660 1477 1517 -53660 1698 1764 -53660 1871 1517 -53660 1698 1707 -53660 1501 1522 -53660 1547 1770 -53660 1677 1767 -53660 1707 1764 -53660 1681 1683 -53660 1650 1668 -53680 1563 1894 -53680 1603 1526 -53680 1626 1427 -53680 1684 1448 -53680 1699 1803 -53680 1831 1453 -53680 1921 1462 -53680 1431 1516 -53680 1543 1528 -53680 1543 1603 -53680 1699 1789 -53680 1789 1902 -53680 1477 1517 -53680 1507 1524 -53680 1595 1654 -53680 1698 1764 -53680 1854 1477 -53680 1871 1517 -53680 1698 1707 -53680 1501 1522 -53680 1547 1770 -53680 1677 1767 -53680 1707 1764 -53680 1681 1683 -53680 1650 1668 -53700 1538 1524 -53700 1543 1528 -53700 1543 1603 -53700 1543 1526 -53700 1558 1516 -53700 1560 1667 -53700 1699 1789 -53700 1699 1902 -53700 1789 1803 -53700 1789 1902 -53700 1803 1902 -53700 1825 1469 -53700 1854 1517 -53700 1477 1517 -53700 1501 1507 -53700 1507 1524 -53700 1595 1654 -53700 1698 1764 -53700 1566 1603 -53700 1854 1477 -53700 1871 1517 -53700 1698 1707 -53700 1501 1522 -53700 1522 1524 -53700 1538 1522 -53700 1599 1655 -53700 1617 1701 -53700 1906 1477 -53700 1547 1770 -53700 1677 1767 -53700 1707 1764 -53700 1681 1683 -53700 1650 1668 -53720 1541 1691 -53720 1563 1679 -53720 1577 1655 -53720 1595 1654 -53720 1623 1519 -53720 1698 1764 -53720 1854 1906 -53720 1921 1462 -53720 1427 1453 -53720 1566 1603 -53720 1854 1477 -53720 1871 1517 -53720 1625 1863 -53720 1698 1707 -53720 1431 1516 -53720 1501 1522 -53720 1522 1524 -53720 1538 1522 -53720 1543 1783 -53720 1599 1655 -53720 1617 1701 -53720 1906 1477 -53720 1547 1770 -53720 1677 1767 -53720 1707 1764 -53720 1681 1683 -53720 1650 1668 -53740 1538 1501 -53740 1548 1516 -53740 1566 1603 -53740 1606 1516 -53740 1630 1467 -53740 1667 1857 -53740 1789 1803 -53740 1854 1477 -53740 1871 1517 -53740 1448 1458 -53740 1501 1507 -53740 1616 1518 -53740 1625 1863 -53740 1698 1707 -53740 1857 1441 -53740 1431 1516 -53740 1501 1522 -53740 1522 1524 -53740 1538 1522 -53740 1543 1783 -53740 1599 1655 -53740 1617 1701 -53740 1676 1770 -53740 1906 1477 -53740 1547 1770 -53740 1563 1592 -53740 1477 1517 -53740 1677 1767 -53740 1707 1764 -53740 1657 1769 -53740 1681 1683 -53740 1650 1668 -53760 1541 1691 -53760 1546 1516 -53760 1552 1453 -53760 1616 1518 -53760 1625 1863 -53760 1698 1707 -53760 1772 1874 -53760 1789 1902 -53760 1857 1441 -53760 1431 1516 -53760 1453 1493 -53760 1501 1522 -53760 1522 1524 -53760 1538 1522 -53760 1543 1783 -53760 1547 1676 -53760 1599 1655 -53760 1617 1701 -53760 1676 1770 -53760 1698 1764 -53760 1770 1808 -53760 1906 1477 -53760 1921 1462 -53760 1543 1504 -53760 1547 1770 -53760 1678 1900 -53760 1563 1592 -53760 1477 1517 -53760 1677 1767 -53760 1538 1524 -53760 1707 1764 -53760 1657 1769 -53760 1547 1560 -53760 1681 1683 -53760 1650 1668 -53780 1538 1522 -53780 1538 1501 -53780 1543 1783 -53780 1547 1676 -53780 1599 1655 -53780 1617 1701 -53780 1667 1441 -53780 1676 1770 -53780 1698 1764 -53780 1770 1808 -53780 1906 1477 -53780 1921 1462 -53780 1504 1531 -53780 1543 1504 -53780 1543 1531 -53780 1547 1770 -53780 1566 1603 -53780 1678 1900 -53780 1871 1517 -53780 1563 1592 -53780 1477 1517 -53780 1677 1767 -53780 1538 1524 -53780 1707 1764 -53780 1657 1769 -53780 1547 1560 -53780 1681 1683 -53780 1650 1668 -53800 1543 1504 -53800 1543 1531 -53800 1547 1770 -53800 1566 1603 -53800 1603 1731 -53800 1626 1630 -53800 1635 1771 -53800 1669 1754 -53800 1676 1458 -53800 1770 1458 -53800 1501 1524 -53800 1630 1467 -53800 1678 1900 -53800 1871 1517 -53800 1563 1592 -53800 1477 1517 -53800 1501 1507 -53800 1677 1767 -53800 1507 1524 -53800 1538 1524 -53800 1707 1764 -53800 1625 1863 -53800 1501 1522 -53800 1657 1769 -53800 1789 1803 -53800 1547 1560 -53800 1783 1531 -53800 1681 1683 -53800 1650 1668 -53820 1562 1593 -53820 1600 1519 -53820 1630 1467 -53820 1678 1900 -53820 1684 1698 -53820 1803 1902 -53820 1842 1528 -53820 1871 1517 -53820 1563 1592 -53820 1477 1517 -53820 1501 1507 -53820 1538 1522 -53820 1599 1655 -53820 1677 1767 -53820 1906 1517 -53820 1507 1524 -53820 1538 1524 -53820 1707 1764 -53820 1725 1906 -53820 1497 1505 -53820 1725 1477 -53820 1906 1477 -53820 1552 1453 -53820 1625 1863 -53820 1501 1522 -53820 1657 1769 -53820 1789 1803 -53820 1547 1560 -53820 1783 1531 -53820 1698 1707 -53820 1681 1683 -53820 1650 1668 -53840 1563 1592 -53840 1700 1480 -53840 1921 1462 -53840 1476 1477 -53840 1477 1517 -53840 1501 1507 -53840 1538 1522 -53840 1599 1655 -53840 1677 1767 -53840 1906 1517 -53840 1507 1524 -53840 1538 1524 -53840 1707 1764 -53840 1725 1906 -53840 1497 1505 -53840 1725 1476 -53840 1725 1477 -53840 1725 1517 -53840 1906 1476 -53840 1906 1477 -53840 1425 1512 -53840 1698 1764 -53840 1552 1453 -53840 1625 1863 -53840 1920 1504 -53840 1501 1522 -53840 1657 1769 -53840 1789 1803 -53840 1547 1560 -53840 1783 1531 -53840 1698 1707 -53840 1681 1683 -53840 1650 1668 -53860 1538 1522 -53860 1552 1676 -53860 1563 1699 -53860 1599 1655 -53860 1677 1767 -53860 1688 1480 -53860 1872 1453 -53860 1906 1517 -53860 1476 1517 -53860 1501 1524 -53860 1507 1524 -53860 1522 1524 -53860 1538 1524 -53860 1707 1764 -53860 1725 1906 -53860 1774 1787 -53860 1497 1505 -53860 1725 1476 -53860 1725 1477 -53860 1725 1517 -53860 1906 1476 -53860 1906 1477 -53860 1425 1512 -53860 1538 1501 -53860 1698 1764 -53860 1552 1453 -53860 1625 1863 -53860 1920 1504 -53860 1501 1522 -53860 1566 1603 -53860 1657 1769 -53860 1789 1803 -53860 1547 1560 -53860 1783 1531 -53860 1698 1707 -53860 1681 1683 -53860 1650 1668 -53880 1538 1524 -53880 1701 1464 -53880 1707 1764 -53880 1725 1906 -53880 1774 1787 -53880 1787 1512 -53880 1789 1902 -53880 1803 1902 -53880 1854 1906 -53880 1497 1505 -53880 1725 1476 -53880 1725 1477 -53880 1725 1517 -53880 1725 1519 -53880 1906 1476 -53880 1906 1477 -53880 1425 1512 -53880 1439 1531 -53880 1538 1501 -53880 1698 1764 -53880 1477 1517 -53880 1501 1507 -53880 1552 1453 -53880 1625 1863 -53880 1920 1504 -53880 1501 1522 -53880 1566 1603 -53880 1657 1769 -53880 1789 1803 -53880 1547 1560 -53880 1476 1477 -53880 1783 1531 -53880 1698 1707 -53880 1681 1683 -53880 1650 1668 -53900 1538 1522 -53900 1539 1699 -53900 1568 1831 -53900 1600 1469 -53900 1656 1682 -53900 1669 1754 -53900 1671 1701 -53900 1676 1770 -53900 1725 1921 -53900 1725 1476 -53900 1725 1477 -53900 1725 1517 -53900 1725 1871 -53900 1725 1519 -53900 1854 1477 -53900 1871 1921 -53900 1906 1476 -53900 1906 1477 -53900 1425 1512 -53900 1439 1531 -53900 1538 1501 -53900 1604 1725 -53900 1616 1725 -53900 1677 1464 -53900 1698 1764 -53900 1825 1469 -53900 1477 1517 -53900 1501 1507 -53900 1501 1524 -53900 1552 1453 -53900 1625 1863 -53900 1671 1464 -53900 1507 1524 -53900 1700 1480 -53900 1920 1504 -53900 1501 1522 -53900 1600 1517 -53900 1566 1603 -53900 1657 1769 -53900 1789 1803 -53900 1547 1560 -53900 1476 1477 -53900 1783 1531 -53900 1698 1707 -53900 1681 1683 -53900 1650 1668 -53920 1538 1501 -53920 1604 1725 -53920 1616 1725 -53920 1671 1677 -53920 1677 1464 -53920 1698 1764 -53920 1825 1469 -53920 1872 1453 -53920 1477 1517 -53920 1497 1505 -53920 1501 1507 -53920 1501 1524 -53920 1552 1453 -53920 1625 1863 -53920 1671 1464 -53920 1507 1524 -53920 1604 1616 -53920 1700 1480 -53920 1920 1504 -53920 1501 1522 -53920 1600 1517 -53920 1566 1603 -53920 1657 1769 -53920 1789 1803 -53920 1547 1560 -53920 1476 1477 -53920 1783 1531 -53920 1698 1707 -53920 1681 1683 -53920 1650 1668 -53940 1538 1522 -53940 1552 1453 -53940 1593 1521 -53940 1604 1767 -53940 1625 1863 -53940 1671 1464 -53940 1701 1754 -53940 1899 1439 -53940 1507 1524 -53940 1522 1524 -53940 1604 1616 -53940 1700 1480 -53940 1767 1900 -53940 1920 1504 -53940 1501 1522 -53940 1600 1517 -53940 1630 1467 -53940 1566 1603 -53940 1669 1754 -53940 1657 1769 -53940 1789 1803 -53940 1547 1560 -53940 1803 1902 -53940 1476 1477 -53940 1783 1531 -53940 1698 1707 -53940 1681 1683 -53940 1650 1668 -53960 1600 1866 -53960 1604 1616 -53960 1626 1467 -53960 1700 1480 -53960 1767 1900 -53960 1854 1477 -53960 1920 1504 -53960 1501 1522 -53960 1501 1507 -53960 1600 1517 -53960 1626 1630 -53960 1630 1467 -53960 1656 1682 -53960 1857 1441 -53960 1698 1764 -53960 1566 1603 -53960 1669 1754 -53960 1657 1769 -53960 1789 1803 -53960 1547 1560 -53960 1803 1902 -53960 1476 1477 -53960 1783 1531 -53960 1698 1707 -53960 1681 1683 -53960 1650 1668 -53980 1564 1441 -53980 1600 1871 -53980 1600 1477 -53980 1600 1517 -53980 1626 1630 -53980 1630 1467 -53980 1656 1682 -53980 1671 1464 -53980 1857 1441 -53980 1866 1871 -53980 1477 1517 -53980 1507 1524 -53980 1538 1522 -53980 1688 1457 -53980 1694 1699 -53980 1698 1764 -53980 1834 1517 -53980 1871 1517 -53980 1522 1524 -53980 1566 1603 -53980 1669 1754 -53980 1657 1769 -53980 1789 1803 -53980 1547 1560 -53980 1707 1764 -53980 1803 1902 -53980 1476 1477 -53980 1783 1531 -53980 1698 1707 -53980 1825 1469 -53980 1681 1683 -53980 1650 1668 -54000 1538 1522 -54000 1538 1524 -54000 1583 1600 -54000 1590 1657 -54000 1600 1476 -54000 1604 1725 -54000 1676 1698 -54000 1688 1457 -54000 1694 1699 -54000 1698 1764 -54000 1834 1517 -54000 1866 1894 -54000 1871 1517 -54000 1476 1517 -54000 1522 1524 -54000 1566 1603 -54000 1669 1754 -54000 1657 1769 -54000 1789 1803 -54000 1547 1560 -54000 1707 1764 -54000 1803 1902 -54000 1476 1477 -54000 1783 1531 -54000 1698 1707 -54000 1825 1469 -54000 1700 1480 -54000 1681 1683 -54000 1650 1668 -54020 1541 1691 -54020 1547 1676 -54020 1566 1603 -54020 1590 1769 -54020 1603 1466 -54020 1604 1616 -54020 1604 1767 -54020 1669 1754 -54020 1671 1725 -54020 1687 1702 -54020 1789 1518 -54020 1840 1854 -54020 1871 1476 -54020 1920 1526 -54020 1921 1462 -54020 1657 1769 -54020 1789 1803 -54020 1547 1560 -54020 1707 1764 -54020 1803 1902 -54020 1476 1477 -54020 1599 1655 -54020 1783 1531 -54020 1698 1707 -54020 1625 1659 -54020 1825 1469 -54020 1700 1480 -54020 1681 1683 -54020 1650 1668 -54040 1617 1427 -54040 1626 1467 -54040 1635 1698 -54040 1635 1707 -54040 1657 1769 -54040 1789 1803 -54040 1538 1522 -54040 1547 1560 -54040 1707 1764 -54040 1803 1902 -54040 1507 1524 -54040 1522 1524 -54040 1476 1477 -54040 1562 1593 -54040 1599 1655 -54040 1783 1531 -54040 1698 1707 -54040 1698 1764 -54040 1625 1659 -54040 1825 1469 -54040 1700 1480 -54040 1681 1683 -54040 1650 1668 -54060 1538 1522 -54060 1547 1560 -54060 1558 1468 -54060 1568 1831 -54060 1590 1657 -54060 1590 1769 -54060 1677 1464 -54060 1688 1457 -54060 1707 1764 -54060 1767 1900 -54060 1803 1902 -54060 1879 1531 -54060 1507 1524 -54060 1522 1524 -54060 1546 1606 -54060 1603 1531 -54060 1604 1616 -54060 1476 1477 -54060 1562 1593 -54060 1599 1655 -54060 1626 1630 -54060 1783 1531 -54060 1630 1467 -54060 1698 1707 -54060 1698 1764 -54060 1600 1517 -54060 1625 1659 -54060 1825 1469 -54060 1700 1480 -54060 1681 1683 -54060 1650 1668 -54080 1546 1606 -54080 1562 1521 -54080 1568 1701 -54080 1603 1531 -54080 1604 1616 -54080 1701 1754 -54080 1707 1462 -54080 1825 1517 -54080 1476 1477 -54080 1562 1593 -54080 1599 1655 -54080 1626 1630 -54080 1783 1531 -54080 1630 1467 -54080 1698 1707 -54080 1698 1764 -54080 1600 1517 -54080 1625 1659 -54080 1825 1469 -54080 1604 1767 -54080 1700 1480 -54080 1681 1683 -54080 1650 1668 -54100 1547 1635 -54100 1562 1593 -54100 1583 1477 -54100 1599 1655 -54100 1626 1630 -54100 1642 1694 -54100 1687 1702 -54100 1688 1457 -54100 1767 1518 -54100 1772 1874 -54100 1783 1531 -54100 1847 1462 -54100 1921 1462 -54100 1477 1519 -54100 1625 1863 -54100 1630 1467 -54100 1564 1441 -54100 1698 1707 -54100 1698 1764 -54100 1600 1517 -54100 1600 1871 -54100 1625 1659 -54100 1825 1469 -54100 1604 1767 -54100 1700 1480 -54100 1871 1517 -54100 1681 1683 -54100 1650 1668 -54120 1546 1524 -54120 1546 1516 -54120 1568 1678 -54120 1577 1655 -54120 1603 1531 -54120 1616 1767 -54120 1625 1863 -54120 1630 1467 -54120 1469 1477 -54120 1564 1441 -54120 1604 1840 -54120 1698 1707 -54120 1698 1764 -54120 1707 1764 -54120 1600 1517 -54120 1600 1871 -54120 1603 1783 -54120 1625 1659 -54120 1825 1469 -54120 1604 1767 -54120 1700 1480 -54120 1871 1517 -54120 1681 1683 -54120 1650 1668 -54140 1789 1902 -54140 1921 1471 -54140 1564 1441 -54140 1604 1840 -54140 1617 1857 -54140 1669 1754 -54140 1698 1707 -54140 1698 1764 -54140 1707 1764 -54140 1803 1902 -54140 1600 1517 -54140 1600 1871 -54140 1603 1783 -54140 1789 1819 -54140 1625 1659 -54140 1825 1469 -54140 1604 1767 -54140 1700 1480 -54140 1871 1517 -54140 1681 1683 -54140 1650 1668 -54160 1546 1524 -54160 1564 1441 -54160 1599 1655 -54160 1604 1840 -54160 1617 1857 -54160 1669 1754 -54160 1671 1684 -54160 1698 1707 -54160 1698 1764 -54160 1707 1764 -54160 1767 1840 -54160 1772 1874 -54160 1803 1902 -54160 1600 1517 -54160 1600 1871 -54160 1603 1783 -54160 1789 1819 -54160 1562 1593 -54160 1604 1616 -54160 1625 1659 -54160 1825 1469 -54160 1626 1630 -54160 1630 1467 -54160 1656 1682 -54160 1604 1767 -54160 1700 1480 -54160 1871 1517 -54160 1681 1683 -54160 1650 1668 -54180 1538 1522 -54180 1577 1599 -54180 1600 1517 -54180 1600 1871 -54180 1603 1501 -54180 1603 1783 -54180 1642 1853 -54180 1669 1675 -54180 1703 1920 -54180 1725 1441 -54180 1789 1819 -54180 1562 1593 -54180 1604 1616 -54180 1625 1659 -54180 1687 1702 -54180 1687 1439 -54180 1825 1469 -54180 1626 1630 -54180 1630 1467 -54180 1656 1682 -54180 1604 1767 -54180 1700 1480 -54180 1871 1517 -54180 1681 1683 -54180 1650 1668 -54200 1547 1635 -54200 1556 1701 -54200 1562 1593 -54200 1604 1616 -54200 1625 1659 -54200 1687 1702 -54200 1687 1439 -54200 1789 1902 -54200 1825 1469 -54200 1871 1489 -54200 1904 1477 -54200 1489 1517 -54200 1616 1767 -54200 1696 1811 -54200 1626 1630 -54200 1627 1461 -54200 1630 1467 -54200 1656 1682 -54200 1599 1655 -54200 1604 1767 -54200 1564 1441 -54200 1700 1480 -54200 1871 1517 -54200 1681 1683 -54200 1650 1668 -54220 1553 1600 -54220 1603 1783 -54220 1609 1921 -54220 1616 1767 -54220 1626 1467 -54220 1669 1675 -54220 1696 1811 -54220 1427 1493 -54220 1626 1630 -54220 1627 1461 -54220 1630 1467 -54220 1635 1517 -54220 1656 1682 -54220 1701 1770 -54220 1562 1521 -54220 1599 1655 -54220 1604 1767 -54220 1564 1441 -54220 1700 1480 -54220 1871 1517 -54220 1840 1489 -54220 1657 1769 -54220 1681 1683 -54220 1650 1668 -54240 1552 1630 -54240 1556 1701 -54240 1604 1489 -54240 1767 1840 -54240 1626 1630 -54240 1627 1461 -54240 1675 1754 -54240 1552 1469 -54240 1577 1655 -54240 1630 1467 -54240 1635 1517 -54240 1656 1682 -54240 1701 1770 -54240 1767 1489 -54240 1562 1521 -54240 1562 1593 -54240 1599 1655 -54240 1604 1767 -54240 1564 1441 -54240 1700 1480 -54240 1871 1517 -54240 1840 1489 -54240 1657 1769 -54240 1681 1683 -54240 1650 1668 -54260 1626 1467 -54260 1626 1630 -54260 1627 1461 -54260 1675 1754 -54260 1772 1874 -54260 1552 1469 -54260 1577 1655 -54260 1593 1521 -54260 1630 1467 -54260 1635 1517 -54260 1656 1682 -54260 1701 1770 -54260 1767 1489 -54260 1562 1521 -54260 1562 1593 -54260 1599 1655 -54260 1604 1767 -54260 1564 1441 -54260 1669 1675 -54260 1700 1480 -54260 1863 1477 -54260 1871 1517 -54260 1840 1489 -54260 1657 1769 -54260 1681 1683 -54260 1650 1668 -54280 1538 1522 -54280 1546 1524 -54280 1552 1469 -54280 1556 1701 -54280 1568 1462 -54280 1577 1655 -54280 1593 1521 -54280 1604 1489 -54280 1630 1467 -54280 1635 1517 -54280 1656 1682 -54280 1701 1770 -54280 1767 1489 -54280 1825 1519 -54280 1904 1477 -54280 1562 1521 -54280 1562 1593 -54280 1599 1655 -54280 1604 1767 -54280 1616 1489 -54280 1564 1441 -54280 1669 1675 -54280 1700 1480 -54280 1863 1904 -54280 1863 1477 -54280 1871 1517 -54280 1840 1489 -54280 1617 1857 -54280 1657 1769 -54280 1681 1683 -54280 1650 1668 -54300 1562 1521 -54300 1562 1593 -54300 1592 1894 -54300 1599 1655 -54300 1604 1767 -54300 1616 1489 -54300 1627 1461 -54300 1847 1920 -54300 1564 1441 -54300 1600 1519 -54300 1669 1675 -54300 1700 1480 -54300 1863 1904 -54300 1863 1477 -54300 1871 1517 -54300 1767 1840 -54300 1840 1489 -54300 1617 1857 -54300 1657 1769 -54300 1681 1683 -54300 1650 1668 -54320 1539 1770 -54320 1552 1469 -54320 1564 1441 -54320 1597 1678 -54320 1600 1519 -54320 1604 1871 -54320 1616 1871 -54320 1669 1675 -54320 1681 1477 -54320 1696 1819 -54320 1700 1480 -54320 1702 1439 -54320 1772 1874 -54320 1863 1904 -54320 1863 1477 -54320 1871 1517 -54320 1767 1840 -54320 1767 1489 -54320 1840 1489 -54320 1656 1682 -54320 1676 1528 -54320 1477 1519 -54320 1547 1808 -54320 1617 1857 -54320 1657 1769 -54320 1681 1683 -54320 1650 1668 -54340 1537 1471 -54340 1600 1477 -54340 1625 1659 -54340 1725 1857 -54340 1767 1840 -54340 1767 1489 -54340 1840 1489 -54340 1656 1682 -54340 1676 1528 -54340 1477 1519 -54340 1547 1808 -54340 1617 1441 -54340 1617 1857 -54340 1657 1769 -54340 1556 1819 -54340 1563 1770 -54340 1681 1683 -54340 1650 1668 -54360 1543 1614 -54360 1577 1655 -54360 1597 1701 -54360 1606 1425 -54360 1626 1467 -54360 1630 1467 -54360 1656 1682 -54360 1669 1675 -54360 1676 1528 -54360 1682 1696 -54360 1477 1519 -54360 1547 1808 -54360 1617 1441 -54360 1617 1857 -54360 1657 1769 -54360 1675 1754 -54360 1556 1819 -54360 1563 1770 -54360 1599 1655 -54360 1681 1683 -54360 1650 1668 -54380 1538 1522 -54380 1538 1524 -54380 1539 1770 -54380 1543 1700 -54380 1547 1808 -54380 1600 1683 -54380 1466 1501 -54380 1537 1471 -54380 1678 1510 -54380 1700 1480 -54380 1617 1441 -54380 1617 1857 -54380 1657 1769 -54380 1675 1754 -54380 1857 1441 -54380 1684 1725 -54380 1669 1754 -54380 1556 1819 -54380 1563 1770 -54380 1599 1655 -54380 1681 1683 -54380 1650 1668 -54400 1537 1471 -54400 1573 1452 -54400 1656 1682 -54400 1671 1489 -54400 1678 1510 -54400 1700 1480 -54400 1617 1441 -54400 1617 1857 -54400 1645 1756 -54400 1657 1769 -54400 1840 1489 -54400 1600 1519 -54400 1675 1754 -54400 1857 1441 -54400 1684 1725 -54400 1669 1754 -54400 1547 1642 -54400 1556 1819 -54400 1563 1770 -54400 1599 1655 -54400 1681 1683 -54400 1650 1668 -54420 1562 1521 -54420 1603 1466 -54420 1617 1441 -54420 1617 1857 -54420 1645 1756 -54420 1657 1769 -54420 1840 1489 -54420 1600 1683 -54420 1600 1519 -54420 1675 1754 -54420 1688 1457 -54420 1857 1441 -54420 1684 1725 -54420 1698 1707 -54420 1669 1754 -54420 1547 1642 -54420 1556 1819 -54420 1563 1770 -54420 1599 1655 -54420 1681 1683 -54420 1650 1668 -54440 1537 1471 -54440 1577 1655 -54440 1600 1683 -54440 1600 1519 -54440 1625 1659 -54440 1667 1754 -54440 1675 1754 -54440 1688 1457 -54440 1707 1764 -54440 1749 1476 -54440 1767 1489 -54440 1857 1441 -54440 1684 1725 -54440 1698 1707 -54440 1669 1754 -54440 1547 1642 -54440 1556 1819 -54440 1563 1770 -54440 1599 1655 -54440 1681 1683 -54440 1650 1668 -54460 1539 1770 -54460 1590 1441 -54460 1671 1489 -54460 1675 1840 -54460 1684 1725 -54460 1698 1707 -54460 1840 1489 -54460 1512 1531 -54460 1669 1754 -54460 1547 1642 -54460 1556 1819 -54460 1563 1770 -54460 1599 1655 -54460 1681 1683 -54460 1650 1668 -54480 1548 1516 -54480 1558 1516 -54480 1698 1764 -54480 1725 1489 -54480 1512 1531 -54480 1600 1519 -54480 1669 1754 -54480 1547 1642 -54480 1556 1819 -54480 1563 1770 -54480 1599 1655 -54480 1681 1683 -54480 1650 1668 -54500 1600 1519 -54500 1617 1441 -54500 1669 1754 -54500 1684 1489 -54500 1694 1791 -54500 1767 1489 -54500 1857 1502 -54500 1452 1531 -54500 1547 1642 -54500 1556 1819 -54500 1563 1770 -54500 1599 1655 -54500 1681 1683 -54500 1650 1668 -54520 1547 1642 -54520 1547 1590 -54520 1556 1819 -54520 1675 1489 -54520 1698 1707 -54520 1707 1764 -54520 1707 1487 -54520 1592 1442 -54520 1603 1466 -54520 1772 1874 -54520 1512 1531 -54520 1675 1767 -54520 1563 1770 -54520 1599 1655 -54520 1840 1489 -54520 1681 1683 -54520 1650 1668 -54540 1552 1626 -54540 1592 1442 -54540 1600 1825 -54540 1603 1466 -54540 1671 1489 -54540 1767 1840 -54540 1772 1874 -54540 1791 1493 -54540 1512 1531 -54540 1552 1467 -54540 1652 1747 -54540 1675 1767 -54540 1563 1770 -54540 1599 1655 -54540 1669 1754 -54540 1840 1489 -54540 1681 1683 -54540 1650 1668 -54560 1546 1558 -54560 1617 1857 -54560 1657 1769 -54560 1675 1489 -54560 1767 1489 -54560 1857 1502 -54560 1512 1531 -54560 1546 1516 -54560 1552 1467 -54560 1652 1747 -54560 1675 1767 -54560 1563 1770 -54560 1599 1655 -54560 1669 1754 -54560 1840 1489 -54560 1681 1683 -54560 1650 1668 -54580 1546 1516 -54580 1552 1467 -54580 1558 1516 -54580 1577 1655 -54580 1600 1825 -54580 1603 1466 -54580 1630 1467 -54580 1652 1747 -54580 1671 1489 -54580 1468 1516 -54580 1617 1441 -54580 1675 1767 -54580 1563 1770 -54580 1599 1655 -54580 1669 1754 -54580 1840 1489 -54580 1681 1683 -54580 1650 1668 -54600 1538 1524 -54600 1564 1716 -54600 1617 1441 -54600 1683 1467 -54600 1767 1489 -54600 1547 1808 -54600 1675 1767 -54600 1857 1502 -54600 1563 1770 -54600 1599 1655 -54600 1669 1754 -54600 1840 1489 -54600 1512 1531 -54600 1681 1683 -54600 1650 1668 -54620 1547 1808 -54620 1671 1489 -54620 1675 1489 -54620 1675 1767 -54620 1825 1467 -54620 1857 1502 -54620 1904 1467 -54620 1467 1477 -54620 1467 1519 -54620 1477 1519 -54620 1563 1770 -54620 1599 1655 -54620 1617 1857 -54620 1669 1754 -54620 1840 1489 -54620 1512 1531 -54620 1681 1683 -54620 1650 1668 -54640 1538 1524 -54640 1563 1770 -54640 1577 1655 -54640 1772 1874 -54640 1599 1655 -54640 1617 1857 -54640 1669 1754 -54640 1617 1441 -54640 1840 1489 -54640 1512 1531 -54640 1681 1683 -54640 1650 1668 -54660 1599 1655 -54660 1600 1477 -54660 1604 1616 -54660 1617 1857 -54660 1657 1769 -54660 1669 1754 -54660 1767 1489 -54660 1547 1438 -54660 1563 1592 -54660 1675 1767 -54660 1857 1502 -54660 1617 1441 -54660 1477 1519 -54660 1840 1489 -54660 1512 1531 -54660 1681 1683 -54660 1650 1668 -54680 1538 1524 -54680 1547 1438 -54680 1549 1825 -54680 1563 1592 -54680 1630 1679 -54680 1458 1471 -54680 1675 1767 -54680 1857 1502 -54680 1573 1819 -54680 1617 1441 -54680 1477 1519 -54680 1840 1489 -54680 1512 1531 -54680 1681 1683 -54680 1650 1668 -54700 1599 1655 -54700 1652 1747 -54700 1675 1767 -54700 1857 1502 -54700 1772 1874 -54700 1573 1819 -54700 1767 1840 -54700 1651 1905 -54700 1675 1489 -54700 1791 1493 -54700 1617 1441 -54700 1767 1489 -54700 1477 1519 -54700 1840 1489 -54700 1512 1531 -54700 1681 1683 -54700 1650 1668 -54720 1563 1592 -54720 1725 1783 -54720 1772 1874 -54720 1884 1519 -54720 1547 1808 -54720 1573 1819 -54720 1767 1840 -54720 1575 1667 -54720 1651 1905 -54720 1675 1489 -54720 1791 1493 -54720 1617 1441 -54720 1767 1489 -54720 1477 1519 -54720 1840 1489 -54720 1512 1531 -54720 1681 1683 -54720 1650 1668 -54740 1537 1471 -54740 1538 1522 -54740 1547 1808 -54740 1573 1819 -54740 1608 1530 -54740 1767 1840 -54740 1575 1667 -54740 1603 1467 -54740 1651 1905 -54740 1652 1747 -54740 1675 1489 -54740 1791 1493 -54740 1617 1441 -54740 1657 1769 -54740 1767 1489 -54740 1675 1767 -54740 1477 1519 -54740 1840 1489 -54740 1512 1531 -54740 1681 1683 -54740 1650 1668 -54760 1575 1667 -54760 1603 1467 -54760 1651 1905 -54760 1652 1747 -54760 1671 1677 -54760 1675 1489 -54760 1772 1874 -54760 1791 1493 -54760 1562 1521 -54760 1669 1754 -54760 1448 1453 -54760 1617 1441 -54760 1657 1769 -54760 1767 1489 -54760 1675 1767 -54760 1477 1519 -54760 1840 1489 -54760 1512 1531 -54760 1681 1683 -54760 1650 1668 -54780 1549 1825 -54780 1562 1521 -54780 1573 1635 -54780 1627 1461 -54780 1669 1754 -54780 1448 1453 -54780 1608 1530 -54780 1617 1441 -54780 1657 1769 -54780 1677 1903 -54780 1767 1489 -54780 1604 1616 -54780 1675 1767 -54780 1477 1519 -54780 1635 1819 -54780 1840 1489 -54780 1512 1531 -54780 1681 1683 -54780 1650 1668 -54800 1573 1819 -54800 1577 1599 -54800 1608 1530 -54800 1617 1441 -54800 1630 1866 -54800 1652 1747 -54800 1657 1769 -54800 1677 1903 -54800 1767 1489 -54800 1791 1493 -54800 1825 1884 -54800 1825 1477 -54800 1836 1471 -54800 1604 1616 -54800 1675 1767 -54800 1477 1519 -54800 1547 1808 -54800 1630 1872 -54800 1635 1819 -54800 1840 1489 -54800 1676 1528 -54800 1512 1531 -54800 1681 1683 -54800 1650 1668 -54820 1538 1522 -54820 1604 1616 -54820 1675 1767 -54820 1678 1727 -54820 1477 1519 -54820 1547 1808 -54820 1630 1872 -54820 1635 1819 -54820 1767 1840 -54820 1840 1489 -54820 1683 1477 -54820 1675 1840 -54820 1676 1528 -54820 1512 1531 -54820 1681 1683 -54820 1650 1668 -54840 1537 1471 -54840 1547 1808 -54840 1573 1819 -54840 1597 1679 -54840 1630 1872 -54840 1635 1819 -54840 1657 1769 -54840 1767 1840 -54840 1825 1477 -54840 1840 1489 -54840 1683 1477 -54840 1608 1530 -54840 1675 1840 -54840 1676 1528 -54840 1512 1531 -54840 1681 1683 -54840 1650 1668 -54860 1543 1635 -54860 1577 1599 -54860 1678 1727 -54860 1683 1477 -54860 1608 1530 -54860 1675 1840 -54860 1652 1747 -54860 1676 1528 -54860 1512 1531 -54860 1617 1441 -54860 1604 1616 -54860 1655 1477 -54860 1681 1683 -54860 1650 1668 -54880 1608 1530 -54880 1616 1635 -54880 1630 1872 -54880 1667 1866 -54880 1669 1848 -54880 1675 1840 -54880 1772 1874 -54880 1652 1747 -54880 1676 1528 -54880 1767 1840 -54880 1512 1531 -54880 1617 1441 -54880 1604 1616 -54880 1655 1477 -54880 1681 1683 -54880 1650 1668 -54900 1652 1747 -54900 1655 1884 -54900 1669 1754 -54900 1676 1528 -54900 1767 1840 -54900 1767 1489 -54900 1791 1493 -54900 1857 1526 -54900 1512 1531 -54900 1603 1874 -54900 1617 1441 -54900 1630 1493 -54900 1604 1616 -54900 1630 1791 -54900 1678 1727 -54900 1655 1477 -54900 1681 1683 -54900 1650 1668 -54920 1608 1530 -54920 1652 1525 -54920 1659 1673 -54920 1667 1866 -54920 1840 1489 -54920 1512 1531 -54920 1603 1874 -54920 1617 1441 -54920 1627 1461 -54920 1630 1493 -54920 1669 1848 -54920 1851 1449 -54920 1604 1616 -54920 1630 1791 -54920 1678 1727 -54920 1655 1477 -54920 1681 1683 -54920 1650 1668 -54940 1603 1874 -54940 1617 1441 -54940 1627 1461 -54940 1630 1493 -54940 1669 1848 -54940 1671 1441 -54940 1767 1840 -54940 1851 1449 -54940 1857 1469 -54940 1604 1616 -54940 1630 1791 -54940 1678 1727 -54940 1655 1477 -54940 1681 1683 -54940 1650 1668 -54960 1538 1524 -54960 1604 1616 -54960 1616 1635 -54960 1630 1791 -54960 1652 1747 -54960 1652 1453 -54960 1667 1866 -54960 1678 1727 -54960 1655 1477 -54960 1681 1683 -54960 1650 1668 -54980 1675 1767 -54980 1678 1727 -54980 1749 1464 -54980 1840 1489 -54980 1884 1477 -54980 1604 1635 -54980 1655 1477 -54980 1679 1464 -54980 1681 1683 -54980 1650 1668 -55000 1537 1471 -55000 1551 1269 -55000 1600 1655 -55000 1604 1635 -55000 1635 1684 -55000 1655 1477 -55000 1679 1464 -55000 1655 1825 -55000 1798 1825 -55000 1441 1526 -55000 1655 1798 -55000 1681 1683 -55000 1650 1668 -55020 1575 1464 -55020 1600 1825 -55020 1600 1798 -55020 1655 1825 -55020 1675 1767 -55020 1767 1840 -55020 1798 1825 -55020 1866 1434 -55020 1441 1526 -55020 1604 1616 -55020 1699 1440 -55020 1905 1467 -55020 1512 1531 -55020 1678 1727 -55020 1655 1798 -55020 1681 1683 -55020 1650 1668 -55040 1664 1821 -55040 1825 1884 -55040 1538 1524 -55040 1604 1616 -55040 1699 1440 -55040 1905 1467 -55040 1600 1477 -55040 1655 1862 -55040 1798 1862 -55040 1512 1531 -55040 1652 1747 -55040 1678 1727 -55040 1655 1798 -55040 1681 1683 -55040 1650 1668 -55060 1538 1522 -55060 1538 1524 -55060 1604 1616 -55060 1604 1448 -55060 1616 1448 -55060 1657 1769 -55060 1684 1448 -55060 1699 1440 -55060 1747 1525 -55060 1905 1467 -55060 1453 1525 -55060 1600 1477 -55060 1675 1767 -55060 1655 1862 -55060 1798 1862 -55060 1512 1531 -55060 1652 1747 -55060 1678 1727 -55060 1655 1798 -55060 1681 1683 -55060 1650 1668 -55080 1549 1477 -55080 1600 1477 -55080 1675 1767 -55080 1655 1862 -55080 1798 1862 -55080 1851 1874 -55080 1512 1531 -55080 1701 1906 -55080 1652 1747 -55080 1684 1441 -55080 1678 1727 -55080 1655 1798 -55080 1681 1683 -55080 1650 1668 -55100 1655 1862 -55100 1657 1769 -55100 1699 1440 -55100 1798 1862 -55100 1851 1874 -55100 1449 1531 -55100 1453 1525 -55100 1512 1531 -55100 1543 1848 -55100 1616 1448 -55100 1655 1825 -55100 1701 1906 -55100 1652 1747 -55100 1684 1441 -55100 1678 1727 -55100 1655 1798 -55100 1681 1683 -55100 1650 1668 -55120 1538 1522 -55120 1543 1848 -55120 1549 1657 -55120 1553 1683 -55120 1603 1635 -55120 1604 1616 -55120 1616 1448 -55120 1617 1441 -55120 1655 1825 -55120 1669 1754 -55120 1675 1767 -55120 1681 1884 -55120 1701 1906 -55120 1825 1884 -55120 1825 1862 -55120 1652 1747 -55120 1767 1489 -55120 1684 1441 -55120 1678 1727 -55120 1767 1840 -55120 1840 1489 -55120 1655 1798 -55120 1453 1466 -55120 1681 1683 -55120 1650 1668 -55140 1547 1532 -55140 1598 1469 -55140 1652 1747 -55140 1716 1532 -55140 1767 1489 -55140 1798 1862 -55140 1879 1471 -55140 1684 1441 -55140 1757 1848 -55140 1905 1467 -55140 1678 1727 -55140 1767 1840 -55140 1543 1679 -55140 1840 1489 -55140 1655 1798 -55140 1655 1862 -55140 1453 1466 -55140 1681 1683 -55140 1650 1668 -55160 1598 1819 -55160 1604 1655 -55160 1616 1655 -55160 1684 1441 -55160 1757 1848 -55160 1905 1467 -55160 1604 1616 -55160 1678 1727 -55160 1767 1840 -55160 1547 1716 -55160 1489 1526 -55160 1543 1679 -55160 1840 1489 -55160 1655 1798 -55160 1655 1862 -55160 1453 1466 -55160 1681 1683 -55160 1650 1668 -55180 1563 1772 -55180 1566 1848 -55180 1577 1599 -55180 1604 1616 -55180 1678 1727 -55180 1681 1884 -55180 1683 1884 -55180 1684 1448 -55180 1767 1840 -55180 1879 1471 -55180 1547 1716 -55180 1616 1477 -55180 1489 1526 -55180 1507 1522 -55180 1543 1679 -55180 1857 1441 -55180 1617 1441 -55180 1840 1489 -55180 1655 1798 -55180 1655 1862 -55180 1453 1466 -55180 1627 1461 -55180 1681 1683 -55180 1650 1668 -55200 1547 1716 -55200 1616 1529 -55200 1616 1477 -55200 1657 1769 -55200 1669 1754 -55200 1684 1783 -55200 1919 1468 -55200 1489 1526 -55200 1507 1522 -55200 1543 1679 -55200 1547 1808 -55200 1857 1441 -55200 1617 1441 -55200 1840 1489 -55200 1477 1529 -55200 1477 1485 -55200 1655 1798 -55200 1655 1862 -55200 1798 1862 -55200 1512 1531 -55200 1453 1466 -55200 1627 1461 -55200 1681 1683 -55200 1650 1668 -55220 1543 1679 -55220 1547 1808 -55220 1683 1825 -55220 1857 1441 -55220 1617 1441 -55220 1840 1489 -55220 1477 1529 -55220 1477 1485 -55220 1485 1529 -55220 1655 1798 -55220 1655 1862 -55220 1798 1862 -55220 1512 1531 -55220 1453 1466 -55220 1627 1461 -55220 1681 1683 -55220 1650 1668 -55240 1563 1461 -55240 1652 1448 -55240 1655 1519 -55240 1673 1428 -55240 1701 1754 -55240 1767 1489 -55240 1798 1477 -55240 1857 1441 -55240 1519 1525 -55240 1608 1530 -55240 1617 1441 -55240 1840 1489 -55240 1477 1529 -55240 1477 1485 -55240 1485 1529 -55240 1652 1747 -55240 1655 1798 -55240 1655 1862 -55240 1684 1783 -55240 1798 1862 -55240 1919 1468 -55240 1681 1884 -55240 1512 1531 -55240 1489 1526 -55240 1453 1466 -55240 1616 1477 -55240 1627 1461 -55240 1681 1683 -55240 1650 1668 -55260 1608 1530 -55260 1617 1441 -55260 1683 1529 -55260 1767 1840 -55260 1840 1489 -55260 1840 1526 -55260 1477 1529 -55260 1477 1485 -55260 1547 1716 -55260 1549 1825 -55260 1485 1529 -55260 1652 1747 -55260 1655 1798 -55260 1655 1862 -55260 1684 1783 -55260 1798 1862 -55260 1919 1468 -55260 1681 1884 -55260 1683 1884 -55260 1512 1531 -55260 1489 1526 -55260 1453 1466 -55260 1604 1477 -55260 1616 1477 -55260 1627 1461 -55260 1604 1616 -55260 1681 1683 -55260 1650 1668 -55280 1547 1442 -55280 1547 1716 -55280 1549 1825 -55280 1566 1477 -55280 1747 1857 -55280 1767 1489 -55280 1485 1529 -55280 1652 1857 -55280 1652 1747 -55280 1655 1798 -55280 1655 1862 -55280 1684 1783 -55280 1798 1862 -55280 1919 1468 -55280 1681 1884 -55280 1683 1884 -55280 1512 1531 -55280 1489 1526 -55280 1453 1466 -55280 1604 1477 -55280 1616 1477 -55280 1627 1461 -55280 1604 1616 -55280 1681 1683 -55280 1650 1668 -55300 1652 1857 -55300 1652 1747 -55300 1655 1798 -55300 1655 1862 -55300 1655 1477 -55300 1684 1783 -55300 1798 1825 -55300 1798 1862 -55300 1840 1489 -55300 1577 1599 -55300 1655 1825 -55300 1919 1468 -55300 1681 1884 -55300 1683 1884 -55300 1512 1531 -55300 1617 1441 -55300 1489 1526 -55300 1616 1655 -55300 1453 1466 -55300 1604 1477 -55300 1616 1477 -55300 1627 1461 -55300 1604 1655 -55300 1604 1616 -55300 1681 1683 -55300 1650 1668 -55320 1577 1599 -55320 1655 1825 -55320 1669 1754 -55320 1754 1798 -55320 1919 1468 -55320 1681 1884 -55320 1683 1884 -55320 1512 1531 -55320 1551 1819 -55320 1617 1441 -55320 1489 1526 -55320 1616 1655 -55320 1453 1466 -55320 1604 1477 -55320 1616 1477 -55320 1627 1461 -55320 1604 1655 -55320 1604 1616 -55320 1681 1683 -55320 1650 1668 -55340 1547 1808 -55340 1671 1862 -55340 1681 1884 -55340 1683 1884 -55340 1269 1819 -55340 1485 1529 -55340 1512 1531 -55340 1551 1819 -55340 1617 1441 -55340 1489 1526 -55340 1684 1783 -55340 1673 1747 -55340 1616 1655 -55340 1453 1466 -55340 1604 1477 -55340 1616 1477 -55340 1627 1461 -55340 1604 1655 -55340 1604 1616 -55340 1681 1683 -55340 1650 1668 -55360 1551 1819 -55360 1617 1441 -55360 1699 1440 -55360 1857 1428 -55360 1489 1526 -55360 1608 1530 -55360 1655 1477 -55360 1684 1783 -55360 1547 1608 -55360 1549 1525 -55360 1862 1489 -55360 1673 1747 -55360 1616 1655 -55360 1453 1466 -55360 1604 1477 -55360 1616 1477 -55360 1627 1461 -55360 1669 1754 -55360 1604 1655 -55360 1604 1616 -55360 1681 1683 -55360 1650 1668 -55380 1566 1603 -55380 1608 1530 -55380 1655 1477 -55380 1671 1489 -55380 1677 1485 -55380 1684 1783 -55380 1754 1487 -55380 1547 1608 -55380 1549 1525 -55380 1862 1489 -55380 1485 1529 -55380 1512 1531 -55380 1673 1747 -55380 1616 1655 -55380 1683 1884 -55380 1453 1466 -55380 1604 1477 -55380 1616 1477 -55380 1627 1461 -55380 1669 1754 -55380 1604 1655 -55380 1604 1616 -55380 1681 1683 -55380 1650 1668 -55400 1547 1608 -55400 1547 1716 -55400 1549 1525 -55400 1563 1592 -55400 1699 1757 -55400 1862 1489 -55400 1485 1529 -55400 1512 1531 -55400 1547 1808 -55400 1673 1747 -55400 1681 1884 -55400 1551 1819 -55400 1616 1655 -55400 1683 1884 -55400 1453 1466 -55400 1604 1477 -55400 1616 1477 -55400 1627 1461 -55400 1669 1754 -55400 1604 1655 -55400 1604 1616 -55400 1681 1683 -55400 1650 1668 -55420 1538 1774 -55420 1547 1808 -55420 1627 1757 -55420 1667 1487 -55420 1671 1489 -55420 1673 1747 -55420 1684 1783 -55420 1757 1461 -55420 1467 1476 -55420 1489 1529 -55420 1566 1634 -55420 1566 1603 -55420 1677 1857 -55420 1681 1884 -55420 1551 1819 -55420 1616 1655 -55420 1683 1884 -55420 1453 1466 -55420 1604 1477 -55420 1616 1477 -55420 1627 1461 -55420 1669 1754 -55420 1604 1655 -55420 1767 1489 -55420 1604 1616 -55420 1681 1683 -55420 1650 1668 -55440 1547 1608 -55440 1566 1634 -55440 1566 1603 -55440 1652 1673 -55440 1657 1769 -55440 1671 1677 -55440 1677 1857 -55440 1677 1489 -55440 1677 1767 -55440 1681 1884 -55440 1512 1531 -55440 1551 1819 -55440 1590 1678 -55440 1616 1655 -55440 1683 1884 -55440 1453 1466 -55440 1604 1477 -55440 1616 1477 -55440 1627 1461 -55440 1655 1477 -55440 1669 1754 -55440 1604 1655 -55440 1767 1489 -55440 1604 1616 -55440 1681 1683 -55440 1650 1668 -55460 1667 1840 -55460 1671 1862 -55460 1840 1428 -55460 1551 1819 -55460 1590 1678 -55460 1616 1655 -55460 1683 1884 -55460 1453 1466 -55460 1604 1477 -55460 1616 1477 -55460 1627 1461 -55460 1655 1477 -55460 1657 1487 -55460 1669 1754 -55460 1769 1487 -55460 1604 1655 -55460 1767 1489 -55460 1604 1616 -55460 1681 1683 -55460 1650 1668 -55480 1538 1706 -55480 1538 1524 -55480 1543 1727 -55480 1551 1819 -55480 1681 1884 -55480 1706 1524 -55480 1269 1819 -55480 1840 1489 -55480 1512 1531 -55480 1590 1678 -55480 1616 1655 -55480 1667 1529 -55480 1683 1884 -55480 1767 1840 -55480 1453 1466 -55480 1604 1477 -55480 1616 1477 -55480 1627 1461 -55480 1655 1477 -55480 1657 1487 -55480 1669 1754 -55480 1769 1487 -55480 1604 1655 -55480 1767 1489 -55480 1604 1616 -55480 1681 1683 -55480 1650 1668 -55500 1590 1678 -55500 1592 1453 -55500 1616 1655 -55500 1667 1529 -55500 1671 1862 -55500 1683 1884 -55500 1767 1840 -55500 1912 1916 -55500 1453 1466 -55500 1604 1477 -55500 1616 1477 -55500 1627 1461 -55500 1655 1477 -55500 1657 1487 -55500 1669 1754 -55500 1769 1487 -55500 1604 1655 -55500 1767 1489 -55500 1652 1673 -55500 1657 1769 -55500 1604 1616 -55500 1681 1683 -55500 1650 1668 -55520 1551 1819 -55520 1563 1434 -55520 1604 1477 -55520 1616 1477 -55520 1627 1461 -55520 1655 1477 -55520 1657 1487 -55520 1706 1524 -55520 1840 1489 -55520 1449 1512 -55520 1485 1529 -55520 1616 1825 -55520 1669 1754 -55520 1769 1487 -55520 1604 1655 -55520 1767 1489 -55520 1684 1783 -55520 1652 1673 -55520 1657 1769 -55520 1604 1616 -55520 1681 1683 -55520 1650 1668 -55540 1546 1857 -55540 1582 1592 -55540 1616 1825 -55540 1655 1825 -55540 1669 1754 -55540 1767 1840 -55540 1769 1487 -55540 1787 1851 -55540 1851 1524 -55540 1919 1485 -55540 1507 1522 -55540 1604 1655 -55540 1616 1655 -55540 1767 1489 -55540 1546 1606 -55540 1671 1862 -55540 1683 1884 -55540 1489 1526 -55540 1603 1453 -55540 1684 1783 -55540 1652 1673 -55540 1657 1769 -55540 1604 1616 -55540 1681 1683 -55540 1650 1668 -55560 1537 1471 -55560 1547 1716 -55560 1566 1634 -55560 1566 1453 -55560 1597 1489 -55560 1599 1512 -55560 1604 1504 -55560 1604 1655 -55560 1616 1655 -55560 1627 1461 -55560 1767 1489 -55560 1769 1489 -55560 1840 1489 -55560 1546 1606 -55560 1671 1862 -55560 1683 1884 -55560 1269 1819 -55560 1485 1529 -55560 1489 1526 -55560 1603 1453 -55560 1684 1783 -55560 1616 1477 -55560 1652 1673 -55560 1617 1441 -55560 1551 1819 -55560 1657 1769 -55560 1604 1616 -55560 1604 1477 -55560 1543 1727 -55560 1597 1767 -55560 1681 1683 -55560 1650 1668 -55580 1546 1606 -55580 1671 1862 -55580 1683 1884 -55580 1683 1487 -55580 1269 1819 -55580 1787 1851 -55580 1485 1529 -55580 1489 1526 -55580 1603 1453 -55580 1684 1783 -55580 1616 1477 -55580 1652 1673 -55580 1617 1441 -55580 1551 1819 -55580 1657 1769 -55580 1604 1616 -55580 1604 1477 -55580 1543 1727 -55580 1657 1840 -55580 1597 1767 -55580 1912 1916 -55580 1769 1840 -55580 1681 1683 -55580 1650 1668 -55600 1546 1840 -55600 1546 1671 -55600 1549 1919 -55600 1590 1673 -55600 1599 1893 -55600 1603 1453 -55600 1616 1919 -55600 1627 1461 -55600 1657 1489 -55600 1684 1783 -55600 1566 1603 -55600 1616 1477 -55600 1652 1673 -55600 1825 1919 -55600 1597 1489 -55600 1617 1441 -55600 1551 1819 -55600 1657 1769 -55600 1767 1489 -55600 1769 1489 -55600 1604 1616 -55600 1604 1477 -55600 1543 1727 -55600 1657 1840 -55600 1597 1767 -55600 1669 1754 -55600 1912 1916 -55600 1769 1840 -55600 1681 1683 -55600 1650 1668 -55620 1538 1524 -55620 1566 1603 -55620 1616 1477 -55620 1652 1673 -55620 1655 1898 -55620 1673 1747 -55620 1825 1919 -55620 1597 1489 -55620 1617 1441 -55620 1683 1487 -55620 1537 1471 -55620 1551 1819 -55620 1657 1769 -55620 1767 1489 -55620 1769 1489 -55620 1840 1489 -55620 1604 1616 -55620 1604 1477 -55620 1543 1727 -55620 1657 1840 -55620 1485 1529 -55620 1597 1767 -55620 1669 1754 -55620 1912 1916 -55620 1634 1504 -55620 1769 1840 -55620 1681 1683 -55620 1650 1668 -55640 1564 1437 -55640 1597 1489 -55640 1603 1453 -55640 1617 1441 -55640 1627 1461 -55640 1683 1466 -55640 1683 1487 -55640 1879 1471 -55640 1537 1471 -55640 1549 1583 -55640 1551 1819 -55640 1562 1521 -55640 1657 1769 -55640 1657 1489 -55640 1706 1524 -55640 1767 1489 -55640 1769 1489 -55640 1269 1819 -55640 1840 1489 -55640 1562 1449 -55640 1604 1616 -55640 1604 1477 -55640 1543 1727 -55640 1657 1840 -55640 1485 1529 -55640 1597 1767 -55640 1669 1754 -55640 1912 1916 -55640 1634 1504 -55640 1769 1840 -55640 1893 1474 -55640 1681 1683 -55640 1650 1668 -55660 1537 1471 -55660 1549 1583 -55660 1551 1819 -55660 1562 1521 -55660 1657 1769 -55660 1657 1489 -55660 1671 1489 -55660 1706 1524 -55660 1767 1489 -55660 1769 1489 -55660 1269 1819 -55660 1840 1489 -55660 1562 1449 -55660 1566 1603 -55660 1604 1616 -55660 1604 1477 -55660 1543 1727 -55660 1657 1840 -55660 1485 1529 -55660 1597 1767 -55660 1669 1754 -55660 1912 1916 -55660 1655 1898 -55660 1634 1504 -55660 1769 1840 -55660 1825 1919 -55660 1893 1474 -55660 1681 1683 -55660 1650 1668 -55680 1543 1701 -55680 1547 1608 -55680 1547 1808 -55680 1562 1449 -55680 1566 1603 -55680 1603 1469 -55680 1604 1616 -55680 1604 1477 -55680 1604 1655 -55680 1808 1530 -55680 1449 1521 -55680 1543 1727 -55680 1546 1701 -55680 1657 1840 -55680 1485 1529 -55680 1603 1453 -55680 1655 1919 -55680 1683 1487 -55680 1597 1767 -55680 1669 1754 -55680 1912 1916 -55680 1655 1898 -55680 1898 1477 -55680 1655 1477 -55680 1634 1504 -55680 1769 1840 -55680 1825 1919 -55680 1893 1474 -55680 1681 1683 -55680 1650 1668 -55700 1539 1546 -55700 1543 1727 -55700 1546 1701 -55700 1562 1521 -55700 1657 1840 -55700 1683 1466 -55700 1485 1529 -55700 1603 1453 -55700 1655 1919 -55700 1683 1487 -55700 1551 1819 -55700 1597 1767 -55700 1669 1754 -55700 1767 1840 -55700 1912 1916 -55700 1547 1716 -55700 1655 1898 -55700 1898 1477 -55700 1655 1477 -55700 1919 1477 -55700 1634 1504 -55700 1769 1840 -55700 1657 1769 -55700 1825 1919 -55700 1893 1474 -55700 1681 1683 -55700 1650 1668 -55720 1562 1593 -55720 1590 1453 -55720 1603 1453 -55720 1655 1919 -55720 1673 1747 -55720 1683 1487 -55720 1684 1526 -55720 1825 1477 -55720 1898 1919 -55720 1549 1583 -55720 1551 1819 -55720 1597 1767 -55720 1608 1530 -55720 1669 1754 -55720 1767 1840 -55720 1912 1916 -55720 1547 1716 -55720 1655 1898 -55720 1898 1477 -55720 1655 1477 -55720 1919 1477 -55720 1604 1616 -55720 1634 1504 -55720 1269 1819 -55720 1769 1840 -55720 1657 1769 -55720 1825 1919 -55720 1893 1474 -55720 1681 1683 -55720 1650 1668 -55740 1549 1583 -55740 1551 1819 -55740 1551 1269 -55740 1597 1767 -55740 1608 1530 -55740 1669 1754 -55740 1767 1840 -55740 1912 1916 -55740 1537 1471 -55740 1547 1716 -55740 1655 1898 -55740 1898 1477 -55740 1655 1477 -55740 1657 1840 -55740 1919 1477 -55740 1604 1616 -55740 1634 1504 -55740 1269 1819 -55740 1769 1840 -55740 1657 1769 -55740 1549 1525 -55740 1825 1919 -55740 1893 1474 -55740 1681 1683 -55740 1650 1668 -55760 1537 1471 -55760 1547 1716 -55760 1655 1898 -55760 1671 1684 -55760 1767 1769 -55760 1783 1489 -55760 1898 1477 -55760 1593 1521 -55760 1655 1477 -55760 1657 1840 -55760 1919 1477 -55760 1604 1616 -55760 1634 1504 -55760 1269 1819 -55760 1769 1840 -55760 1657 1769 -55760 1549 1525 -55760 1825 1919 -55760 1893 1474 -55760 1681 1683 -55760 1650 1668 -55780 1543 1727 -55780 1593 1521 -55780 1593 1449 -55780 1655 1477 -55780 1657 1840 -55780 1767 1489 -55780 1770 1791 -55780 1879 1471 -55780 1919 1477 -55780 1583 1884 -55780 1597 1767 -55780 1604 1616 -55780 1634 1504 -55780 1769 1489 -55780 1269 1819 -55780 1840 1489 -55780 1437 1453 -55780 1769 1840 -55780 1485 1529 -55780 1657 1769 -55780 1684 1526 -55780 1434 1453 -55780 1549 1525 -55780 1825 1919 -55780 1893 1474 -55780 1681 1683 -55780 1650 1668 -55800 1546 1634 -55800 1583 1884 -55800 1597 1767 -55800 1604 1616 -55800 1627 1461 -55800 1655 1530 -55800 1706 1524 -55800 1898 1477 -55800 1634 1504 -55800 1769 1489 -55800 1269 1819 -55800 1783 1489 -55800 1840 1489 -55800 1912 1916 -55800 1437 1453 -55800 1769 1840 -55800 1485 1529 -55800 1617 1857 -55800 1657 1769 -55800 1684 1526 -55800 1434 1453 -55800 1547 1716 -55800 1549 1525 -55800 1825 1919 -55800 1893 1474 -55800 1681 1683 -55800 1650 1668 -55820 1546 1606 -55820 1593 1521 -55820 1617 1441 -55820 1634 1504 -55820 1688 1467 -55820 1712 1467 -55820 1767 1769 -55820 1769 1489 -55820 1269 1819 -55820 1783 1489 -55820 1840 1489 -55820 1912 1916 -55820 1919 1477 -55820 1437 1453 -55820 1825 1477 -55820 1769 1840 -55820 1485 1529 -55820 1551 1819 -55820 1617 1857 -55820 1857 1441 -55820 1597 1489 -55820 1657 1769 -55820 1684 1526 -55820 1434 1453 -55820 1547 1716 -55820 1767 1489 -55820 1549 1525 -55820 1825 1919 -55820 1893 1474 -55820 1681 1683 -55820 1650 1668 -55840 1550 1443 -55840 1551 1269 -55840 1597 1767 -55840 1627 1461 -55840 1825 1477 -55840 1443 1527 -55840 1769 1840 -55840 1485 1529 -55840 1551 1819 -55840 1562 1603 -55840 1617 1857 -55840 1857 1441 -55840 1434 1437 -55840 1597 1489 -55840 1657 1769 -55840 1684 1526 -55840 1434 1453 -55840 1547 1716 -55840 1767 1489 -55840 1549 1525 -55840 1825 1919 -55840 1893 1474 -55840 1681 1683 -55840 1650 1668 -55860 1603 1449 -55860 1604 1616 -55860 1617 1441 -55860 1769 1840 -55860 1769 1489 -55860 1912 1916 -55860 1485 1529 -55860 1551 1819 -55860 1562 1603 -55860 1617 1857 -55860 1857 1441 -55860 1434 1437 -55860 1597 1489 -55860 1657 1769 -55860 1684 1526 -55860 1269 1819 -55860 1434 1453 -55860 1437 1453 -55860 1547 1716 -55860 1657 1840 -55860 1767 1489 -55860 1549 1525 -55860 1825 1919 -55860 1893 1474 -55860 1681 1683 -55860 1650 1668 -55880 1551 1819 -55880 1562 1603 -55880 1590 1634 -55880 1592 1772 -55880 1617 1857 -55880 1783 1489 -55880 1857 1441 -55880 1434 1437 -55880 1551 1269 -55880 1597 1489 -55880 1657 1769 -55880 1684 1526 -55880 1269 1819 -55880 1434 1453 -55880 1437 1453 -55880 1543 1727 -55880 1791 1489 -55880 1547 1716 -55880 1657 1840 -55880 1767 1489 -55880 1549 1525 -55880 1825 1919 -55880 1893 1474 -55880 1681 1683 -55880 1650 1668 -55900 1551 1269 -55900 1597 1489 -55900 1604 1616 -55900 1657 1769 -55900 1684 1526 -55900 1269 1819 -55900 1434 1453 -55900 1437 1453 -55900 1543 1727 -55900 1546 1606 -55900 1857 1526 -55900 1791 1489 -55900 1840 1489 -55900 1547 1716 -55900 1617 1441 -55900 1657 1840 -55900 1769 1840 -55900 1767 1489 -55900 1919 1477 -55900 1549 1525 -55900 1825 1919 -55900 1893 1474 -55900 1681 1683 -55900 1650 1668 -55920 1543 1727 -55920 1546 1606 -55920 1627 1461 -55920 1671 1857 -55920 1671 1684 -55920 1683 1518 -55920 1898 1477 -55920 1550 1443 -55920 1563 1524 -55920 1684 1857 -55920 1857 1526 -55920 1791 1489 -55920 1840 1489 -55920 1547 1716 -55920 1617 1441 -55920 1657 1840 -55920 1769 1840 -55920 1767 1489 -55920 1919 1477 -55920 1549 1525 -55920 1825 1919 -55920 1893 1474 -55920 1681 1683 -55920 1650 1668 -55940 1550 1443 -55940 1563 1524 -55940 1590 1530 -55940 1597 1767 -55940 1655 1740 -55940 1655 1772 -55940 1448 1466 -55940 1604 1616 -55940 1669 1754 -55940 1684 1857 -55940 1684 1526 -55940 1857 1526 -55940 1791 1489 -55940 1840 1489 -55940 1547 1716 -55940 1617 1441 -55940 1657 1840 -55940 1769 1840 -55940 1767 1489 -55940 1919 1477 -55940 1549 1525 -55940 1825 1919 -55940 1893 1474 -55940 1681 1683 -55940 1650 1668 -55960 1549 1884 -55960 1575 1434 -55960 1604 1616 -55960 1783 1489 -55960 1884 1519 -55960 1563 1592 -55960 1652 1747 -55960 1655 1892 -55960 1655 1477 -55960 1669 1754 -55960 1684 1857 -55960 1684 1526 -55960 1767 1769 -55960 1857 1526 -55960 1791 1489 -55960 1543 1727 -55960 1627 1461 -55960 1840 1489 -55960 1912 1916 -55960 1547 1716 -55960 1617 1441 -55960 1657 1840 -55960 1769 1840 -55960 1767 1489 -55960 1919 1477 -55960 1549 1525 -55960 1825 1919 -55960 1893 1474 -55960 1681 1683 -55960 1650 1668 -55980 1546 1606 -55980 1563 1592 -55980 1652 1673 -55980 1652 1747 -55980 1655 1892 -55980 1655 1477 -55980 1657 1767 -55980 1669 1754 -55980 1671 1857 -55980 1684 1857 -55980 1684 1526 -55980 1698 1725 -55980 1767 1840 -55980 1767 1769 -55980 1857 1526 -55980 1547 1808 -55980 1678 1525 -55980 1716 1808 -55980 1769 1489 -55980 1791 1489 -55980 1892 1898 -55980 1898 1477 -55980 1543 1727 -55980 1627 1461 -55980 1840 1489 -55980 1912 1916 -55980 1547 1716 -55980 1617 1441 -55980 1657 1840 -55980 1769 1840 -55980 1767 1489 -55980 1919 1477 -55980 1549 1525 -55980 1825 1919 -55980 1655 1890 -55980 1893 1474 -55980 1892 1477 -55980 1681 1683 -55980 1650 1668 -56000 1547 1808 -56000 1647 1762 -56000 1657 1769 -56000 1678 1525 -56000 1678 1519 -56000 1683 1519 -56000 1698 1765 -56000 1716 1808 -56000 1769 1489 -56000 1783 1840 -56000 1791 1489 -56000 1857 1489 -56000 1892 1898 -56000 1898 1919 -56000 1898 1477 -56000 1898 1519 -56000 1543 1434 -56000 1543 1727 -56000 1627 1461 -56000 1783 1489 -56000 1485 1529 -56000 1840 1489 -56000 1912 1916 -56000 1547 1716 -56000 1617 1441 -56000 1617 1857 -56000 1657 1840 -56000 1769 1840 -56000 1767 1489 -56000 1919 1477 -56000 1549 1525 -56000 1825 1919 -56000 1655 1890 -56000 1893 1474 -56000 1892 1477 -56000 1681 1683 -56000 1650 1668 -56020 1543 1434 -56020 1543 1727 -56020 1547 1504 -56020 1550 1443 -56020 1590 1530 -56020 1627 1461 -56020 1703 1920 -56020 1783 1489 -56020 1808 1504 -56020 1485 1529 -56020 1840 1489 -56020 1857 1441 -56020 1912 1916 -56020 1547 1716 -56020 1669 1754 -56020 1684 1783 -56020 1617 1441 -56020 1617 1857 -56020 1657 1840 -56020 1769 1840 -56020 1767 1489 -56020 1919 1477 -56020 1549 1525 -56020 1825 1919 -56020 1655 1890 -56020 1893 1474 -56020 1892 1477 -56020 1681 1683 -56020 1650 1668 -56040 1657 1489 -56040 1684 1840 -56040 1698 1707 -56040 1716 1808 -56040 1791 1840 -56040 1791 1489 -56040 1840 1489 -56040 1857 1441 -56040 1912 1916 -56040 1919 1519 -56040 1547 1716 -56040 1669 1754 -56040 1684 1783 -56040 1684 1791 -56040 1767 1840 -56040 1767 1769 -56040 1617 1441 -56040 1617 1857 -56040 1657 1840 -56040 1769 1840 -56040 1767 1489 -56040 1919 1477 -56040 1549 1525 -56040 1657 1769 -56040 1825 1919 -56040 1655 1890 -56040 1893 1474 -56040 1892 1477 -56040 1547 1808 -56040 1681 1683 -56040 1650 1668 -56060 1547 1716 -56060 1580 1527 -56060 1590 1530 -56060 1669 1754 -56060 1684 1489 -56060 1684 1783 -56060 1684 1791 -56060 1767 1840 -56060 1767 1769 -56060 1783 1791 -56060 1787 1521 -56060 1905 1467 -56060 1617 1441 -56060 1617 1857 -56060 1657 1840 -56060 1769 1840 -56060 1890 1466 -56060 1767 1489 -56060 1919 1477 -56060 1549 1525 -56060 1657 1769 -56060 1825 1919 -56060 1593 1453 -56060 1655 1890 -56060 1893 1474 -56060 1892 1477 -56060 1547 1808 -56060 1681 1683 -56060 1650 1668 -56080 1543 1434 -56080 1617 1441 -56080 1617 1857 -56080 1627 1461 -56080 1645 1756 -56080 1655 1466 -56080 1657 1840 -56080 1691 1811 -56080 1769 1840 -56080 1840 1489 -56080 1847 1894 -56080 1857 1441 -56080 1890 1466 -56080 1657 1489 -56080 1703 1900 -56080 1767 1489 -56080 1769 1489 -56080 1892 1919 -56080 1919 1477 -56080 1549 1525 -56080 1657 1769 -56080 1825 1919 -56080 1593 1453 -56080 1655 1890 -56080 1893 1474 -56080 1892 1477 -56080 1547 1808 -56080 1681 1683 -56080 1650 1668 -56100 1657 1489 -56100 1702 1811 -56100 1703 1900 -56100 1762 1783 -56100 1767 1489 -56100 1769 1489 -56100 1892 1919 -56100 1919 1477 -56100 1547 1716 -56100 1791 1489 -56100 1669 1754 -56100 1549 1525 -56100 1657 1769 -56100 1825 1919 -56100 1593 1453 -56100 1655 1890 -56100 1893 1474 -56100 1892 1477 -56100 1547 1808 -56100 1681 1683 -56100 1650 1668 -56120 1547 1716 -56120 1617 1529 -56120 1617 1441 -56120 1684 1489 -56120 1684 1791 -56120 1767 1769 -56120 1769 1840 -56120 1791 1489 -56120 1862 1466 -56120 1441 1529 -56120 1441 1489 -56120 1669 1754 -56120 1549 1525 -56120 1657 1769 -56120 1825 1919 -56120 1593 1453 -56120 1655 1890 -56120 1893 1474 -56120 1892 1477 -56120 1547 1808 -56120 1681 1683 -56120 1650 1668 -56140 1657 1840 -56140 1834 1439 -56140 1441 1489 -56140 1669 1754 -56140 1840 1489 -56140 1912 1916 -56140 1549 1525 -56140 1657 1769 -56140 1825 1919 -56140 1593 1453 -56140 1655 1890 -56140 1893 1474 -56140 1892 1477 -56140 1547 1808 -56140 1681 1683 -56140 1650 1668 -56160 1617 1857 -56160 1669 1754 -56160 1767 1791 -56160 1840 1489 -56160 1912 1916 -56160 1919 1477 -56160 1449 1531 -56160 1549 1525 -56160 1657 1769 -56160 1825 1919 -56160 1593 1453 -56160 1627 1461 -56160 1617 1441 -56160 1485 1529 -56160 1655 1890 -56160 1893 1474 -56160 1892 1898 -56160 1892 1477 -56160 1547 1716 -56160 1547 1808 -56160 1681 1683 -56160 1650 1668 -56180 1549 1525 -56180 1657 1769 -56180 1825 1919 -56180 1593 1453 -56180 1617 1671 -56180 1627 1461 -56180 1671 1441 -56180 1617 1441 -56180 1684 1526 -56180 1485 1529 -56180 1655 1890 -56180 1657 1840 -56180 1898 1477 -56180 1893 1474 -56180 1767 1489 -56180 1791 1489 -56180 1543 1434 -56180 1892 1898 -56180 1892 1477 -56180 1547 1716 -56180 1547 1808 -56180 1681 1683 -56180 1650 1668 -56200 1593 1453 -56200 1617 1671 -56200 1627 1461 -56200 1671 1441 -56200 1767 1769 -56200 1769 1489 -56200 1840 1489 -56200 1458 1467 -56200 1617 1441 -56200 1684 1526 -56200 1688 1457 -56200 1485 1529 -56200 1655 1890 -56200 1657 1840 -56200 1767 1840 -56200 1898 1477 -56200 1657 1767 -56200 1892 1919 -56200 1893 1474 -56200 1919 1477 -56200 1767 1489 -56200 1898 1919 -56200 1791 1489 -56200 1543 1434 -56200 1892 1898 -56200 1892 1477 -56200 1547 1716 -56200 1547 1808 -56200 1681 1683 -56200 1650 1668 -56220 1617 1441 -56220 1669 1754 -56220 1684 1526 -56220 1688 1457 -56220 1787 1531 -56220 1857 1441 -56220 1920 1462 -56220 1485 1529 -56220 1539 1699 -56220 1617 1857 -56220 1635 1688 -56220 1655 1890 -56220 1657 1840 -56220 1767 1840 -56220 1898 1477 -56220 1657 1767 -56220 1892 1919 -56220 1449 1531 -56220 1893 1474 -56220 1919 1477 -56220 1767 1489 -56220 1898 1919 -56220 1791 1489 -56220 1441 1461 -56220 1543 1434 -56220 1892 1898 -56220 1892 1477 -56220 1547 1716 -56220 1547 1808 -56220 1681 1683 -56220 1650 1668 -56240 1537 1725 -56240 1539 1699 -56240 1549 1890 -56240 1549 1759 -56240 1608 1530 -56240 1617 1857 -56240 1617 1627 -56240 1635 1688 -56240 1635 1462 -56240 1635 1902 -56240 1655 1890 -56240 1655 1759 -56240 1657 1840 -56240 1701 1770 -56240 1767 1840 -56240 1767 1769 -56240 1898 1477 -56240 1458 1467 -56240 1657 1489 -56240 1657 1767 -56240 1759 1890 -56240 1769 1489 -56240 1840 1489 -56240 1884 1890 -56240 1892 1919 -56240 1449 1531 -56240 1593 1453 -56240 1893 1474 -56240 1919 1477 -56240 1767 1489 -56240 1898 1919 -56240 1791 1489 -56240 1441 1461 -56240 1543 1434 -56240 1892 1898 -56240 1892 1477 -56240 1547 1716 -56240 1547 1808 -56240 1681 1683 -56240 1650 1668 -56260 1580 1527 -56260 1617 1529 -56260 1657 1489 -56260 1657 1769 -56260 1657 1767 -56260 1701 1912 -56260 1701 1916 -56260 1759 1890 -56260 1769 1489 -56260 1840 1489 -56260 1884 1890 -56260 1669 1754 -56260 1892 1919 -56260 1449 1531 -56260 1485 1529 -56260 1593 1453 -56260 1893 1474 -56260 1919 1477 -56260 1767 1489 -56260 1898 1919 -56260 1791 1489 -56260 1441 1461 -56260 1543 1434 -56260 1892 1898 -56260 1892 1477 -56260 1547 1716 -56260 1547 1808 -56260 1681 1683 -56260 1650 1668 -56280 1554 1847 -56280 1669 1754 -56280 1735 1465 -56280 1892 1919 -56280 1449 1531 -56280 1485 1529 -56280 1549 1890 -56280 1593 1453 -56280 1767 1840 -56280 1893 1474 -56280 1919 1477 -56280 1767 1489 -56280 1898 1919 -56280 1791 1489 -56280 1441 1461 -56280 1543 1434 -56280 1892 1898 -56280 1892 1477 -56280 1547 1716 -56280 1547 1808 -56280 1898 1477 -56280 1681 1683 -56280 1650 1668 -56300 1549 1890 -56300 1593 1453 -56300 1599 1474 -56300 1599 1893 -56300 1727 1819 -56300 1767 1840 -56300 1893 1474 -56300 1919 1477 -56300 1657 1769 -56300 1688 1457 -56300 1767 1489 -56300 1898 1919 -56300 1791 1489 -56300 1441 1461 -56300 1543 1434 -56300 1892 1898 -56300 1892 1477 -56300 1627 1441 -56300 1547 1716 -56300 1547 1808 -56300 1898 1477 -56300 1681 1683 -56300 1650 1668 -56320 1544 1600 -56320 1657 1769 -56320 1657 1684 -56320 1688 1457 -56320 1767 1489 -56320 1898 1919 -56320 1458 1467 -56320 1583 1884 -56320 1600 1659 -56320 1684 1769 -56320 1791 1489 -56320 1441 1461 -56320 1449 1531 -56320 1543 1434 -56320 1892 1898 -56320 1892 1477 -56320 1627 1441 -56320 1547 1716 -56320 1547 1808 -56320 1898 1477 -56320 1681 1683 -56320 1650 1668 -56340 1583 1884 -56340 1600 1659 -56340 1627 1857 -56340 1684 1769 -56340 1791 1489 -56340 1892 1919 -56340 1441 1461 -56340 1449 1531 -56340 1543 1434 -56340 1727 1819 -56340 1892 1898 -56340 1892 1477 -56340 1617 1627 -56340 1627 1441 -56340 1840 1489 -56340 1547 1716 -56340 1770 1916 -56340 1547 1808 -56340 1898 1477 -56340 1681 1683 -56340 1650 1668 -56360 1543 1434 -56360 1593 1521 -56360 1727 1819 -56360 1892 1898 -56360 1892 1477 -56360 1458 1467 -56360 1617 1627 -56360 1627 1441 -56360 1840 1489 -56360 1919 1477 -56360 1547 1716 -56360 1770 1916 -56360 1898 1919 -56360 1617 1857 -56360 1547 1808 -56360 1678 1900 -56360 1898 1477 -56360 1544 1890 -56360 1544 1683 -56360 1683 1890 -56360 1681 1683 -56360 1650 1668 -56380 1617 1627 -56380 1627 1441 -56380 1840 1489 -56380 1919 1477 -56380 1547 1716 -56380 1770 1916 -56380 1898 1919 -56380 1617 1857 -56380 1684 1769 -56380 1485 1529 -56380 1547 1808 -56380 1657 1684 -56380 1678 1900 -56380 1544 1681 -56380 1898 1477 -56380 1544 1890 -56380 1544 1683 -56380 1441 1461 -56380 1683 1890 -56380 1681 1683 -56380 1650 1668 -56400 1547 1716 -56400 1627 1461 -56400 1770 1916 -56400 1892 1477 -56400 1898 1919 -56400 1503 1524 -56400 1543 1434 -56400 1617 1857 -56400 1627 1857 -56400 1684 1769 -56400 1485 1529 -56400 1547 1808 -56400 1657 1684 -56400 1678 1900 -56400 1544 1681 -56400 1767 1840 -56400 1898 1477 -56400 1544 1890 -56400 1544 1683 -56400 1441 1461 -56400 1683 1890 -56400 1767 1489 -56400 1681 1683 -56400 1650 1668 -56420 1543 1434 -56420 1617 1857 -56420 1627 1857 -56420 1684 1769 -56420 1872 1503 -56420 1485 1529 -56420 1547 1808 -56420 1657 1684 -56420 1593 1787 -56420 1678 1900 -56420 1840 1489 -56420 1544 1681 -56420 1767 1840 -56420 1898 1477 -56420 1544 1890 -56420 1544 1683 -56420 1441 1461 -56420 1683 1890 -56420 1767 1489 -56420 1681 1683 -56420 1650 1668 -56440 1553 1890 -56440 1684 1769 -56440 1716 1808 -56440 1872 1503 -56440 1485 1529 -56440 1547 1808 -56440 1657 1684 -56440 1593 1787 -56440 1678 1900 -56440 1840 1489 -56440 1544 1681 -56440 1767 1840 -56440 1898 1477 -56440 1544 1890 -56440 1544 1683 -56440 1655 1885 -56440 1703 1863 -56440 1441 1461 -56440 1683 1890 -56440 1767 1489 -56440 1547 1716 -56440 1681 1683 -56440 1650 1668 -56460 1617 1857 -56460 1627 1857 -56460 1485 1529 -56460 1485 1489 -56460 1489 1529 -56460 1449 1531 -56460 1547 1808 -56460 1657 1684 -56460 1681 1890 -56460 1593 1787 -56460 1678 1900 -56460 1840 1489 -56460 1544 1681 -56460 1767 1840 -56460 1898 1477 -56460 1544 1890 -56460 1544 1683 -56460 1655 1885 -56460 1703 1863 -56460 1441 1461 -56460 1683 1890 -56460 1767 1489 -56460 1547 1716 -56460 1681 1683 -56460 1650 1668 -56480 1545 1649 -56480 1545 1430 -56480 1627 1441 -56480 1657 1769 -56480 1449 1531 -56480 1547 1808 -56480 1657 1684 -56480 1919 1477 -56480 1681 1890 -56480 1684 1769 -56480 1593 1787 -56480 1655 1872 -56480 1678 1900 -56480 1840 1489 -56480 1544 1681 -56480 1767 1840 -56480 1898 1477 -56480 1898 1919 -56480 1544 1890 -56480 1544 1683 -56480 1655 1885 -56480 1703 1863 -56480 1441 1461 -56480 1683 1890 -56480 1767 1489 -56480 1547 1716 -56480 1681 1683 -56480 1650 1668 -56500 1544 1553 -56500 1547 1808 -56500 1553 1890 -56500 1627 1461 -56500 1657 1684 -56500 1919 1477 -56500 1681 1890 -56500 1684 1769 -56500 1593 1787 -56500 1655 1872 -56500 1678 1900 -56500 1840 1489 -56500 1872 1885 -56500 1544 1681 -56500 1617 1857 -56500 1767 1840 -56500 1898 1477 -56500 1898 1919 -56500 1539 1772 -56500 1544 1890 -56500 1544 1683 -56500 1655 1792 -56500 1655 1885 -56500 1703 1863 -56500 1441 1461 -56500 1485 1529 -56500 1683 1890 -56500 1767 1489 -56500 1547 1716 -56500 1681 1683 -56500 1650 1668 -56520 1657 1769 -56520 1681 1890 -56520 1684 1769 -56520 1912 1916 -56520 1527 1532 -56520 1593 1787 -56520 1655 1872 -56520 1678 1900 -56520 1716 1808 -56520 1840 1489 -56520 1872 1885 -56520 1544 1681 -56520 1617 1857 -56520 1767 1840 -56520 1898 1477 -56520 1898 1919 -56520 1539 1772 -56520 1544 1890 -56520 1544 1683 -56520 1655 1792 -56520 1655 1885 -56520 1825 1919 -56520 1627 1441 -56520 1703 1863 -56520 1441 1461 -56520 1485 1529 -56520 1683 1890 -56520 1767 1489 -56520 1547 1716 -56520 1681 1683 -56520 1650 1668 -56540 1547 1808 -56540 1593 1787 -56540 1655 1872 -56540 1678 1900 -56540 1716 1808 -56540 1825 1898 -56540 1840 1489 -56540 1872 1885 -56540 1544 1681 -56540 1617 1857 -56540 1767 1840 -56540 1792 1885 -56540 1898 1477 -56540 1898 1919 -56540 1539 1772 -56540 1544 1890 -56540 1544 1683 -56540 1655 1792 -56540 1655 1885 -56540 1825 1919 -56540 1627 1441 -56540 1703 1863 -56540 1441 1461 -56540 1485 1529 -56540 1683 1890 -56540 1767 1489 -56540 1627 1461 -56540 1547 1716 -56540 1681 1683 -56540 1650 1668 -56560 1544 1681 -56560 1617 1857 -56560 1684 1489 -56560 1767 1840 -56560 1792 1885 -56560 1898 1477 -56560 1898 1919 -56560 1539 1772 -56560 1544 1890 -56560 1544 1683 -56560 1655 1792 -56560 1655 1885 -56560 1825 1919 -56560 1627 1441 -56560 1703 1863 -56560 1441 1461 -56560 1819 1920 -56560 1485 1529 -56560 1683 1890 -56560 1767 1489 -56560 1681 1890 -56560 1627 1461 -56560 1547 1716 -56560 1912 1916 -56560 1681 1683 -56560 1650 1668 -56580 1539 1772 -56580 1544 1890 -56580 1544 1683 -56580 1655 1792 -56580 1655 1885 -56580 1684 1526 -56580 1825 1919 -56580 1884 1527 -56580 1593 1787 -56580 1627 1441 -56580 1703 1863 -56580 1441 1461 -56580 1819 1920 -56580 1840 1489 -56580 1485 1529 -56580 1683 1890 -56580 1767 1489 -56580 1681 1890 -56580 1627 1461 -56580 1547 1716 -56580 1912 1916 -56580 1681 1683 -56580 1650 1668 -56600 1593 1521 -56600 1593 1787 -56600 1627 1441 -56600 1655 1924 -56600 1703 1863 -56600 1787 1521 -56600 1441 1461 -56600 1553 1890 -56600 1819 1920 -56600 1840 1489 -56600 1485 1529 -56600 1683 1890 -56600 1767 1489 -56600 1681 1890 -56600 1617 1857 -56600 1627 1461 -56600 1547 1716 -56600 1912 1916 -56600 1681 1683 -56600 1650 1668 -56620 1538 1524 -56620 1539 1772 -56620 1553 1890 -56620 1819 1920 -56620 1825 1884 -56620 1840 1489 -56620 1892 1477 -56620 1485 1529 -56620 1683 1890 -56620 1767 1489 -56620 1681 1890 -56620 1617 1857 -56620 1683 1825 -56620 1627 1461 -56620 1892 1898 -56620 1547 1808 -56620 1547 1716 -56620 1898 1477 -56620 1912 1916 -56620 1681 1683 -56620 1650 1668 -56640 1545 1430 -56640 1683 1890 -56640 1767 1489 -56640 1825 1890 -56640 1527 1532 -56640 1681 1825 -56640 1681 1890 -56640 1703 1863 -56640 1617 1857 -56640 1683 1825 -56640 1593 1521 -56640 1627 1441 -56640 1627 1461 -56640 1441 1461 -56640 1892 1898 -56640 1547 1808 -56640 1547 1716 -56640 1898 1477 -56640 1912 1916 -56640 1681 1683 -56640 1650 1668 -56660 1538 1524 -56660 1599 1463 -56660 1655 1463 -56660 1681 1825 -56660 1681 1890 -56660 1703 1863 -56660 1716 1808 -56660 1617 1857 -56660 1683 1825 -56660 1593 1521 -56660 1599 1655 -56660 1627 1441 -56660 1627 1461 -56660 1441 1461 -56660 1460 1499 -56660 1892 1898 -56660 1547 1808 -56660 1547 1716 -56660 1898 1477 -56660 1912 1916 -56660 1599 1890 -56660 1681 1683 -56660 1650 1668 -56680 1617 1857 -56680 1683 1825 -56680 1593 1521 -56680 1599 1655 -56680 1627 1441 -56680 1627 1461 -56680 1441 1461 -56680 1460 1499 -56680 1469 1498 -56680 1892 1898 -56680 1485 1529 -56680 1819 1920 -56680 1547 1808 -56680 1547 1716 -56680 1890 1655 -56680 1898 1477 -56680 1912 1916 -56680 1599 1890 -56680 1681 1683 -56680 1650 1668 -56700 1593 1521 -56700 1599 1655 -56700 1627 1441 -56700 1627 1461 -56700 1441 1461 -56700 1460 1499 -56700 1469 1498 -56700 1539 1772 -56700 1892 1898 -56700 1892 1477 -56700 1485 1529 -56700 1684 1526 -56700 1819 1920 -56700 1547 1808 -56700 1547 1716 -56700 1890 1655 -56700 1898 1477 -56700 1912 1916 -56700 1599 1890 -56700 1681 1683 -56700 1650 1668 -56720 1539 1772 -56720 1857 1874 -56720 1892 1898 -56720 1892 1477 -56720 1485 1529 -56720 1678 1461 -56720 1681 1825 -56720 1683 1825 -56720 1684 1526 -56720 1819 1920 -56720 1857 1441 -56720 1547 1808 -56720 1547 1716 -56720 1890 1655 -56720 1617 1857 -56720 1898 1477 -56720 1912 1916 -56720 1703 1863 -56720 1599 1890 -56720 1681 1683 -56720 1650 1668 -56740 1617 1441 -56740 1678 1461 -56740 1681 1825 -56740 1683 1825 -56740 1684 1526 -56740 1716 1808 -56740 1819 1920 -56740 1840 1489 -56740 1857 1441 -56740 1898 1919 -56740 1538 1524 -56740 1627 1461 -56740 1547 1808 -56740 1547 1716 -56740 1890 1655 -56740 1617 1857 -56740 1898 1477 -56740 1912 1916 -56740 1703 1863 -56740 1599 1890 -56740 1681 1683 -56740 1464 1489 -56740 1650 1668 -56760 1538 1524 -56760 1627 1461 -56760 1669 1754 -56760 1683 1519 -56760 1825 1519 -56760 1547 1808 -56760 1547 1716 -56760 1890 1655 -56760 1617 1857 -56760 1898 1892 -56760 1898 1477 -56760 1599 1655 -56760 1912 1916 -56760 1703 1863 -56760 1599 1890 -56760 1681 1683 -56760 1464 1489 -56760 1650 1668 -56780 1920 1819 -56780 1599 1898 -56780 1499 1460 -56780 1547 1808 -56780 1547 1716 -56780 1549 1519 -56780 1890 1655 -56780 1617 1857 -56780 1898 1892 -56780 1898 1477 -56780 1599 1655 -56780 1912 1916 -56780 1703 1863 -56780 1599 1890 -56780 1681 1683 -56780 1464 1489 -56780 1650 1668 -56800 1547 1808 -56800 1547 1716 -56800 1549 1519 -56800 1681 1519 -56800 1485 1529 -56800 1549 1919 -56800 1890 1655 -56800 1617 1857 -56800 1898 1892 -56800 1898 1477 -56800 1599 1655 -56800 1825 1919 -56800 1912 1916 -56800 1477 1892 -56800 1703 1863 -56800 1599 1890 -56800 1681 1683 -56800 1464 1489 -56800 1650 1668 -56820 1549 1919 -56820 1890 1655 -56820 1683 1519 -56820 1683 1919 -56820 1617 1857 -56820 1898 1892 -56820 1898 1477 -56820 1519 1919 -56820 1599 1655 -56820 1825 1919 -56820 1912 1916 -56820 1538 1524 -56820 1460 1499 -56820 1477 1892 -56820 1703 1863 -56820 1599 1890 -56820 1681 1683 -56820 1464 1489 -56820 1650 1668 -56840 1681 1919 -56840 1683 1519 -56840 1683 1919 -56840 1840 1464 -56840 1617 1857 -56840 1598 1659 -56840 1599 1756 -56840 1898 1892 -56840 1898 1477 -56840 1519 1919 -56840 1599 1655 -56840 1825 1919 -56840 1912 1916 -56840 1538 1524 -56840 1547 1808 -56840 1460 1499 -56840 1593 1521 -56840 1477 1892 -56840 1703 1863 -56840 1599 1890 -56840 1547 1716 -56840 1840 1489 -56840 1681 1683 -56840 1464 1489 -56840 1650 1668 -56860 1920 1819 -56860 1669 1754 -56860 1598 1600 -56860 1825 1519 -56860 1898 1892 -56860 1898 1477 -56860 1617 1441 -56860 1519 1919 -56860 1599 1655 -56860 1825 1919 -56860 1912 1916 -56860 1538 1524 -56860 1547 1808 -56860 1460 1499 -56860 1593 1521 -56860 1477 1892 -56860 1703 1863 -56860 1599 1890 -56860 1547 1716 -56860 1840 1489 -56860 1681 1683 -56860 1464 1489 -56860 1650 1668 -56880 1684 1857 -56880 1825 1519 -56880 1898 1892 -56880 1898 1477 -56880 1469 1498 -56880 1617 1441 -56880 1519 1919 -56880 1599 1655 -56880 1825 1919 -56880 1912 1916 -56880 1538 1524 -56880 1547 1808 -56880 1460 1499 -56880 1593 1521 -56880 1477 1892 -56880 1703 1863 -56880 1544 1598 -56880 1599 1890 -56880 1547 1716 -56880 1840 1489 -56880 1681 1683 -56880 1464 1489 -56880 1650 1668 -56900 1683 1825 -56900 1583 1825 -56900 1599 1655 -56900 1890 1655 -56900 1825 1919 -56900 1912 1916 -56900 1538 1524 -56900 1547 1808 -56900 1890 1519 -56900 1460 1499 -56900 1593 1521 -56900 1477 1892 -56900 1703 1863 -56900 1544 1598 -56900 1599 1890 -56900 1547 1716 -56900 1840 1489 -56900 1681 1683 -56900 1464 1489 -56900 1650 1668 -56920 1808 1716 -56920 1583 1919 -56920 1469 1498 -56920 1599 1772 -56920 1683 1919 -56920 1684 1617 -56920 1825 1919 -56920 1912 1916 -56920 1538 1524 -56920 1547 1808 -56920 1890 1519 -56920 1441 1857 -56920 1460 1499 -56920 1669 1754 -56920 1593 1521 -56920 1477 1892 -56920 1703 1863 -56920 1544 1598 -56920 1599 1890 -56920 1547 1716 -56920 1840 1489 -56920 1681 1683 -56920 1464 1489 -56920 1650 1668 -56940 1683 1919 -56940 1684 1617 -56940 1825 1919 -56940 1599 1519 -56940 1912 1916 -56940 1538 1524 -56940 1547 1808 -56940 1890 1519 -56940 1777 1655 -56940 1441 1857 -56940 1460 1499 -56940 1669 1754 -56940 1840 1464 -56940 1593 1521 -56940 1477 1892 -56940 1703 1863 -56940 1544 1598 -56940 1599 1890 -56940 1547 1716 -56940 1840 1489 -56940 1681 1683 -56940 1464 1489 -56940 1650 1668 -56960 1538 1524 -56960 1547 1808 -56960 1890 1519 -56960 1777 1655 -56960 1437 1582 -56960 1840 1919 -56960 1681 1599 -56960 1441 1857 -56960 1460 1499 -56960 1669 1754 -56960 1840 1464 -56960 1593 1521 -56960 1477 1892 -56960 1681 1890 -56960 1703 1863 -56960 1544 1598 -56960 1599 1890 -56960 1547 1716 -56960 1857 1617 -56960 1683 1599 -56960 1840 1489 -56960 1681 1683 -56960 1683 1890 -56960 1464 1489 -56960 1650 1668 -56980 1808 1716 -56980 1437 1582 -56980 1825 1519 -56980 1840 1919 -56980 1599 1519 -56980 1681 1599 -56980 1441 1857 -56980 1460 1499 -56980 1669 1754 -56980 1840 1464 -56980 1593 1521 -56980 1477 1892 -56980 1681 1890 -56980 1703 1863 -56980 1544 1598 -56980 1599 1890 -56980 1916 1912 -56980 1547 1716 -56980 1441 1919 -56980 1857 1617 -56980 1683 1599 -56980 1840 1489 -56980 1681 1683 -56980 1683 1890 -56980 1464 1489 -56980 1650 1668 -57000 1920 1819 -57000 1681 1599 -57000 1441 1857 -57000 1460 1499 -57000 1857 1919 -57000 1519 1525 -57000 1669 1754 -57000 1840 1464 -57000 1593 1521 -57000 1477 1892 -57000 1617 1919 -57000 1681 1890 -57000 1703 1863 -57000 1544 1598 -57000 1599 1890 -57000 1916 1912 -57000 1547 1716 -57000 1441 1919 -57000 1857 1617 -57000 1683 1599 -57000 1840 1489 -57000 1681 1683 -57000 1683 1890 -57000 1464 1489 -57000 1650 1668 -57020 1669 1754 -57020 1819 1598 -57020 1437 1582 -57020 1825 1525 -57020 1840 1464 -57020 1593 1521 -57020 1477 1892 -57020 1617 1919 -57020 1681 1890 -57020 1703 1863 -57020 1544 1598 -57020 1599 1890 -57020 1916 1912 -57020 1547 1808 -57020 1547 1716 -57020 1441 1919 -57020 1857 1617 -57020 1683 1599 -57020 1840 1489 -57020 1681 1683 -57020 1683 1890 -57020 1464 1489 -57020 1650 1668 -57040 1681 1599 -57040 1600 1659 -57040 1681 1890 -57040 1825 1890 -57040 1703 1863 -57040 1544 1598 -57040 1599 1890 -57040 1681 1825 -57040 1683 1825 -57040 1599 1825 -57040 1916 1912 -57040 1547 1808 -57040 1547 1716 -57040 1441 1919 -57040 1892 1898 -57040 1857 1617 -57040 1683 1599 -57040 1840 1489 -57040 1681 1683 -57040 1683 1890 -57040 1464 1489 -57040 1650 1668 -57060 1920 1544 -57060 1920 1600 -57060 1681 1890 -57060 1825 1890 -57060 1703 1863 -57060 1840 1464 -57060 1920 1598 -57060 1544 1598 -57060 1441 1783 -57060 1599 1890 -57060 1681 1825 -57060 1683 1825 -57060 1599 1825 -57060 1916 1912 -57060 1547 1808 -57060 1547 1716 -57060 1477 1898 -57060 1441 1919 -57060 1892 1898 -57060 1857 1617 -57060 1683 1599 -57060 1840 1489 -57060 1920 1819 -57060 1924 1655 -57060 1681 1683 -57060 1683 1890 -57060 1464 1489 -57060 1650 1668 -57080 1920 1598 -57080 1544 1598 -57080 1808 1716 -57080 1441 1783 -57080 1599 1890 -57080 1600 1519 -57080 1681 1825 -57080 1683 1825 -57080 1599 1825 -57080 1916 1912 -57080 1547 1808 -57080 1547 1716 -57080 1681 1599 -57080 1477 1898 -57080 1441 1919 -57080 1892 1898 -57080 1857 1617 -57080 1683 1599 -57080 1840 1489 -57080 1920 1819 -57080 1924 1655 -57080 1681 1683 -57080 1683 1890 -57080 1464 1489 -57080 1650 1668 -57100 1681 1825 -57100 1683 1825 -57100 1692 1660 -57100 1599 1825 -57100 1916 1912 -57100 1547 1808 -57100 1547 1716 -57100 1681 1599 -57100 1477 1898 -57100 1441 1919 -57100 1892 1898 -57100 1857 1617 -57100 1478 1655 -57100 1683 1599 -57100 1840 1489 -57100 1920 1819 -57100 1924 1655 -57100 1703 1863 -57100 1477 1892 -57100 1681 1683 -57100 1683 1890 -57100 1464 1489 -57100 1650 1668 -57120 1924 1599 -57120 1547 1808 -57120 1808 1716 -57120 1681 1890 -57120 1825 1890 -57120 1825 1655 -57120 1825 1583 -57120 1460 1499 -57120 1547 1716 -57120 1681 1599 -57120 1477 1898 -57120 1441 1919 -57120 1892 1898 -57120 1857 1617 -57120 1478 1655 -57120 1683 1599 -57120 1840 1489 -57120 1920 1819 -57120 1924 1655 -57120 1703 1863 -57120 1477 1892 -57120 1681 1683 -57120 1683 1890 -57120 1544 1600 -57120 1599 1890 -57120 1464 1489 -57120 1650 1668 -57140 1544 1525 -57140 1547 1716 -57140 1681 1599 -57140 1683 1924 -57140 1924 1460 -57140 1460 1655 -57140 1477 1898 -57140 1441 1919 -57140 1892 1898 -57140 1441 1617 -57140 1857 1617 -57140 1478 1655 -57140 1669 1754 -57140 1683 1599 -57140 1840 1489 -57140 1920 1819 -57140 1924 1478 -57140 1924 1655 -57140 1703 1863 -57140 1477 1892 -57140 1681 1683 -57140 1683 1890 -57140 1544 1600 -57140 1599 1890 -57140 1464 1489 -57140 1650 1668 -57160 1808 1716 -57160 1694 1724 -57160 1441 1617 -57160 1441 1857 -57160 1857 1617 -57160 1478 1655 -57160 1669 1754 -57160 1681 1890 -57160 1683 1599 -57160 1840 1489 -57160 1920 1819 -57160 1924 1478 -57160 1924 1655 -57160 1703 1863 -57160 1477 1892 -57160 1681 1683 -57160 1683 1890 -57160 1544 1600 -57160 1825 1525 -57160 1599 1890 -57160 1464 1489 -57160 1650 1668 -57180 1669 1754 -57180 1546 1548 -57180 1549 1825 -57180 1681 1890 -57180 1683 1599 -57180 1840 1489 -57180 1920 1819 -57180 1924 1478 -57180 1924 1655 -57180 1703 1863 -57180 1477 1892 -57180 1681 1683 -57180 1683 1890 -57180 1681 1599 -57180 1544 1600 -57180 1825 1525 -57180 1599 1890 -57180 1464 1489 -57180 1650 1668 -57200 1668 1463 -57200 1478 1655 -57200 1617 1441 -57200 1683 1599 -57200 1840 1489 -57200 1920 1819 -57200 1924 1478 -57200 1924 1655 -57200 1703 1863 -57200 1857 1441 -57200 1477 1892 -57200 1681 1683 -57200 1683 1890 -57200 1547 1716 -57200 1681 1599 -57200 1544 1600 -57200 1825 1525 -57200 1599 1890 -57200 1464 1489 -57200 1650 1668 -57220 1683 1599 -57220 1840 1464 -57220 1840 1489 -57220 1599 1655 -57220 1920 1819 -57220 1549 1525 -57220 1924 1478 -57220 1924 1655 -57220 1703 1863 -57220 1857 1441 -57220 1477 1892 -57220 1681 1890 -57220 1681 1683 -57220 1683 1890 -57220 1547 1716 -57220 1681 1599 -57220 1900 1754 -57220 1544 1600 -57220 1825 1525 -57220 1599 1890 -57220 1464 1489 -57220 1650 1668 -57240 1920 1819 -57240 1920 1598 -57240 1549 1825 -57240 1549 1525 -57240 1924 1478 -57240 1924 1655 -57240 1669 1754 -57240 1703 1863 -57240 1857 1441 -57240 1477 1892 -57240 1681 1890 -57240 1681 1683 -57240 1683 1890 -57240 1547 1716 -57240 1681 1599 -57240 1900 1754 -57240 1544 1600 -57240 1825 1525 -57240 1599 1890 -57240 1464 1489 -57240 1547 1808 -57240 1650 1668 -57260 1924 1655 -57260 1669 1754 -57260 1692 1660 -57260 1703 1863 -57260 1600 1655 -57260 1857 1441 -57260 1477 1892 -57260 1783 1526 -57260 1538 1524 -57260 1544 1519 -57260 1681 1890 -57260 1681 1683 -57260 1683 1600 -57260 1683 1890 -57260 1683 1599 -57260 1683 1655 -57260 1547 1716 -57260 1681 1599 -57260 1599 1655 -57260 1890 1655 -57260 1920 1671 -57260 1900 1754 -57260 1544 1600 -57260 1825 1525 -57260 1599 1890 -57260 1464 1489 -57260 1547 1808 -57260 1650 1668 -57280 1538 1524 -57280 1544 1519 -57280 1681 1600 -57280 1681 1890 -57280 1681 1683 -57280 1683 1600 -57280 1683 1890 -57280 1683 1599 -57280 1683 1655 -57280 1840 1489 -57280 1599 1600 -57280 1547 1716 -57280 1808 1716 -57280 1681 1655 -57280 1681 1599 -57280 1599 1655 -57280 1890 1655 -57280 1920 1671 -57280 1900 1754 -57280 1544 1600 -57280 1825 1525 -57280 1599 1890 -57280 1464 1489 -57280 1547 1808 -57280 1650 1668 -57300 1671 1819 -57300 1772 1703 -57300 1547 1716 -57300 1808 1716 -57300 1553 1655 -57300 1681 1655 -57300 1681 1599 -57300 1583 1655 -57300 1599 1655 -57300 1600 1519 -57300 1890 1655 -57300 1920 1671 -57300 1900 1754 -57300 1437 1857 -57300 1477 1892 -57300 1544 1600 -57300 1825 1525 -57300 1599 1890 -57300 1464 1489 -57300 1703 1863 -57300 1547 1808 -57300 1650 1668 -57320 1920 1671 -57320 1538 1524 -57320 1900 1754 -57320 1684 1526 -57320 1813 1598 -57320 1437 1857 -57320 1437 1617 -57320 1599 1600 -57320 1477 1892 -57320 1469 1498 -57320 1669 1754 -57320 1544 1600 -57320 1857 1617 -57320 1825 1525 -57320 1599 1890 -57320 1464 1489 -57320 1840 1489 -57320 1703 1863 -57320 1547 1808 -57320 1650 1668 -57340 1920 1598 -57340 1669 1754 -57340 1544 1600 -57340 1549 1525 -57340 1808 1716 -57340 1441 1857 -57340 1600 1519 -57340 1825 1884 -57340 1857 1617 -57340 1825 1525 -57340 1599 1890 -57340 1464 1489 -57340 1840 1489 -57340 1441 1617 -57340 1547 1716 -57340 1703 1863 -57340 1547 1808 -57340 1650 1668 -57360 1920 1819 -57360 1825 1884 -57360 1463 1628 -57360 1857 1617 -57360 1469 1498 -57360 1884 1525 -57360 1825 1525 -57360 1544 1890 -57360 1599 1890 -57360 1464 1489 -57360 1840 1489 -57360 1441 1617 -57360 1547 1716 -57360 1703 1863 -57360 1547 1808 -57360 1650 1668 -57380 1538 1524 -57380 1671 1819 -57380 1825 1525 -57380 1598 1772 -57380 1600 1890 -57380 1544 1890 -57380 1544 1599 -57380 1808 1716 -57380 1583 1890 -57380 1599 1890 -57380 1600 1519 -57380 1477 1898 -57380 1920 1671 -57380 1464 1489 -57380 1840 1489 -57380 1441 1617 -57380 1547 1716 -57380 1703 1863 -57380 1669 1754 -57380 1547 1808 -57380 1890 1519 -57380 1650 1668 -57400 1544 1890 -57400 1544 1549 -57400 1544 1599 -57400 1808 1716 -57400 1452 1598 -57400 1583 1890 -57400 1599 1890 -57400 1600 1519 -57400 1477 1898 -57400 1920 1671 -57400 1464 1489 -57400 1840 1489 -57400 1441 1617 -57400 1469 1498 -57400 1857 1617 -57400 1547 1716 -57400 1920 1819 -57400 1703 1863 -57400 1669 1754 -57400 1547 1808 -57400 1890 1519 -57400 1650 1668 -57420 1920 1671 -57420 1538 1524 -57420 1668 1628 -57420 1692 1660 -57420 1449 1787 -57420 1464 1489 -57420 1600 1890 -57420 1655 1512 -57420 1840 1489 -57420 1477 1892 -57420 1617 1526 -57420 1441 1857 -57420 1441 1526 -57420 1441 1617 -57420 1469 1498 -57420 1857 1526 -57420 1857 1617 -57420 1547 1716 -57420 1920 1819 -57420 1703 1863 -57420 1669 1754 -57420 1547 1808 -57420 1890 1519 -57420 1650 1668 -57440 1549 1890 -57440 1825 1890 -57440 1840 1489 -57440 1600 1884 -57440 1477 1892 -57440 1617 1526 -57440 1549 1519 -57440 1441 1857 -57440 1441 1526 -57440 1441 1617 -57440 1583 1890 -57440 1469 1498 -57440 1857 1526 -57440 1857 1617 -57440 1547 1716 -57440 1477 1898 -57440 1920 1819 -57440 1544 1599 -57440 1703 1863 -57440 1669 1754 -57440 1547 1808 -57440 1890 1519 -57440 1650 1668 -57460 1549 1519 -57460 1441 1857 -57460 1441 1526 -57460 1441 1617 -57460 1583 1890 -57460 1469 1498 -57460 1600 1890 -57460 1857 1526 -57460 1857 1617 -57460 1890 1783 -57460 1890 1884 -57460 1547 1716 -57460 1477 1898 -57460 1920 1819 -57460 1544 1599 -57460 1703 1863 -57460 1669 1754 -57460 1547 1808 -57460 1890 1519 -57460 1650 1668 -57480 1547 1716 -57480 1825 1890 -57480 1628 1463 -57480 1477 1898 -57480 1920 1819 -57480 1544 1599 -57480 1703 1863 -57480 1669 1754 -57480 1547 1808 -57480 1890 1519 -57480 1840 1489 -57480 1650 1668 -57500 1920 1819 -57500 1544 1599 -57500 1668 1628 -57500 1599 1890 -57500 1857 1617 -57500 1857 1489 -57500 1692 1660 -57500 1703 1863 -57500 1549 1890 -57500 1669 1754 -57500 1547 1808 -57500 1890 1519 -57500 1840 1489 -57500 1650 1668 -57520 1538 1524 -57520 1692 1660 -57520 1825 1469 -57520 1583 1599 -57520 1600 1890 -57520 1617 1526 -57520 1441 1617 -57520 1703 1863 -57520 1549 1890 -57520 1547 1716 -57520 1669 1754 -57520 1547 1808 -57520 1890 1519 -57520 1840 1489 -57520 1650 1668 -57540 1808 1716 -57540 1441 1617 -57540 1703 1863 -57540 1593 1787 -57540 1549 1890 -57540 1547 1716 -57540 1669 1754 -57540 1547 1808 -57540 1890 1519 -57540 1840 1489 -57540 1650 1668 -57560 1549 1890 -57560 1628 1463 -57560 1600 1519 -57560 1547 1716 -57560 1600 1890 -57560 1669 1754 -57560 1547 1808 -57560 1628 1598 -57560 1890 1519 -57560 1840 1489 -57560 1650 1668 -57580 1668 1598 -57580 1668 1463 -57580 1547 1716 -57580 1684 1660 -57580 1692 1489 -57580 1463 1650 -57580 1599 1825 -57580 1600 1825 -57580 1600 1890 -57580 1825 1890 -57580 1703 1863 -57580 1669 1754 -57580 1547 1808 -57580 1544 1599 -57580 1808 1716 -57580 1628 1598 -57580 1890 1519 -57580 1840 1489 -57580 1650 1668 -57600 1668 1628 -57600 1549 1890 -57600 1600 1825 -57600 1600 1890 -57600 1825 1890 -57600 1884 1890 -57600 1774 1655 -57600 1660 1628 -57600 1703 1863 -57600 1692 1598 -57600 1463 1660 -57600 1598 1660 -57600 1600 1519 -57600 1669 1754 -57600 1547 1808 -57600 1692 1660 -57600 1544 1599 -57600 1808 1716 -57600 1599 1525 -57600 1628 1598 -57600 1890 1519 -57600 1840 1489 -57600 1650 1668 -57620 1703 1863 -57620 1692 1628 -57620 1692 1754 -57620 1692 1598 -57620 1692 1463 -57620 1463 1660 -57620 1598 1660 -57620 1600 1519 -57620 1669 1754 -57620 1538 1524 -57620 1547 1808 -57620 1692 1660 -57620 1544 1599 -57620 1547 1716 -57620 1808 1716 -57620 1599 1525 -57620 1628 1598 -57620 1890 1519 -57620 1840 1489 -57620 1650 1668 -57640 1669 1754 -57640 1825 1600 -57640 1825 1890 -57640 1825 1884 -57640 1884 1890 -57640 1538 1524 -57640 1547 1808 -57640 1692 1660 -57640 1544 1599 -57640 1547 1716 -57640 1808 1716 -57640 1884 1600 -57640 1599 1525 -57640 1628 1598 -57640 1857 1617 -57640 1890 1519 -57640 1840 1489 -57640 1600 1890 -57640 1650 1668 -57660 1538 1524 -57660 1547 1808 -57660 1684 1464 -57660 1692 1660 -57660 1544 1599 -57660 1547 1716 -57660 1808 1716 -57660 1884 1600 -57660 1599 1525 -57660 1628 1598 -57660 1857 1617 -57660 1549 1890 -57660 1890 1519 -57660 1840 1489 -57660 1600 1890 -57660 1650 1668 -57680 1544 1599 -57680 1547 1716 -57680 1808 1716 -57680 1825 1600 -57680 1884 1600 -57680 1599 1525 -57680 1600 1519 -57680 1628 1598 -57680 1857 1617 -57680 1703 1863 -57680 1549 1890 -57680 1890 1519 -57680 1840 1489 -57680 1669 1754 -57680 1600 1890 -57680 1650 1668 -57700 1538 1857 -57700 1547 1808 -57700 1692 1660 -57700 1628 1598 -57700 1617 1524 -57700 1538 1524 -57700 1857 1617 -57700 1857 1524 -57700 1703 1863 -57700 1549 1890 -57700 1890 1519 -57700 1840 1489 -57700 1669 1754 -57700 1600 1890 -57700 1650 1668 -57720 1538 1617 -57720 1538 1524 -57720 1808 1716 -57720 1825 1600 -57720 1857 1617 -57720 1857 1524 -57720 1703 1863 -57720 1549 1890 -57720 1890 1519 -57720 1840 1489 -57720 1669 1754 -57720 1600 1890 -57720 1650 1668 -57740 1544 1549 -57740 1547 1808 -57740 1703 1863 -57740 1549 1553 -57740 1549 1890 -57740 1825 1884 -57740 1890 1519 -57740 1840 1489 -57740 1669 1754 -57740 1600 1890 -57740 1650 1668 -57760 1703 1863 -57760 1549 1553 -57760 1549 1890 -57760 1825 1890 -57760 1825 1884 -57760 1520 1660 -57760 1538 1524 -57760 1890 1519 -57760 1884 1890 -57760 1617 1524 -57760 1840 1489 -57760 1600 1884 -57760 1692 1660 -57760 1669 1754 -57760 1600 1890 -57760 1650 1668 -57780 1538 1524 -57780 1890 1519 -57780 1825 1600 -57780 1884 1890 -57780 1547 1808 -57780 1617 1524 -57780 1840 1489 -57780 1600 1884 -57780 1692 1660 -57780 1669 1754 -57780 1600 1890 -57780 1650 1668 -57800 1553 1890 -57800 1553 1599 -57800 1825 1600 -57800 1884 1890 -57800 1547 1808 -57800 1617 1524 -57800 1598 1783 -57800 1840 1489 -57800 1600 1884 -57800 1692 1660 -57800 1599 1918 -57800 1669 1754 -57800 1600 1890 -57800 1650 1668 -57820 1538 1524 -57820 1547 1808 -57820 1825 1884 -57820 1593 1787 -57820 1617 1524 -57820 1598 1783 -57820 1840 1489 -57820 1600 1884 -57820 1692 1660 -57820 1599 1918 -57820 1669 1754 -57820 1600 1890 -57820 1441 1634 -57820 1650 1668 -57840 1598 1918 -57840 1598 1783 -57840 1549 1825 -57840 1825 1600 -57840 1840 1489 -57840 1600 1884 -57840 1692 1660 -57840 1599 1918 -57840 1669 1754 -57840 1600 1890 -57840 1441 1634 -57840 1650 1668 -57860 1549 1825 -57860 1724 1857 -57860 1599 1525 -57860 1825 1600 -57860 1825 1884 -57860 1840 1489 -57860 1600 1884 -57860 1617 1524 -57860 1692 1660 -57860 1538 1524 -57860 1599 1918 -57860 1669 1754 -57860 1600 1890 -57860 1441 1634 -57860 1650 1668 -57880 1544 1599 -57880 1825 1600 -57880 1825 1884 -57880 1840 1489 -57880 1851 1521 -57880 1772 1787 -57880 1600 1884 -57880 1617 1524 -57880 1692 1660 -57880 1538 1524 -57880 1599 1918 -57880 1669 1754 -57880 1600 1890 -57880 1441 1634 -57880 1650 1668 -57900 1772 1787 -57900 1808 1582 -57900 1840 1724 -57900 1600 1884 -57900 1617 1524 -57900 1547 1808 -57900 1593 1521 -57900 1549 1825 -57900 1692 1660 -57900 1851 1772 -57900 1538 1524 -57900 1599 1918 -57900 1669 1754 -57900 1600 1890 -57900 1441 1634 -57900 1890 1519 -57900 1547 1582 -57900 1650 1668 -57920 1544 1918 -57920 1544 1599 -57920 1547 1808 -57920 1840 1489 -57920 1593 1521 -57920 1593 1851 -57920 1549 1825 -57920 1692 1660 -57920 1851 1772 -57920 1600 1825 -57920 1475 1655 -57920 1538 1524 -57920 1671 1598 -57920 1825 1890 -57920 1599 1918 -57920 1669 1754 -57920 1600 1890 -57920 1441 1634 -57920 1890 1519 -57920 1547 1582 -57920 1650 1668 -57940 1924 1478 -57940 1549 1825 -57940 1692 1660 -57940 1851 1772 -57940 1600 1825 -57940 1600 1519 -57940 1475 1655 -57940 1538 1524 -57940 1671 1598 -57940 1544 1525 -57940 1825 1890 -57940 1599 1918 -57940 1669 1754 -57940 1600 1890 -57940 1441 1634 -57940 1890 1519 -57940 1547 1582 -57940 1650 1668 -57960 1538 1524 -57960 1671 1598 -57960 1544 1525 -57960 1825 1890 -57960 1825 1519 -57960 1617 1524 -57960 1599 1918 -57960 1669 1754 -57960 1600 1890 -57960 1441 1634 -57960 1890 1519 -57960 1547 1582 -57960 1650 1668 -57980 1825 1600 -57980 1699 1598 -57980 1617 1524 -57980 1599 1918 -57980 1669 1754 -57980 1692 1660 -57980 1547 1808 -57980 1600 1890 -57980 1441 1634 -57980 1890 1519 -57980 1547 1582 -57980 1650 1668 -58000 1671 1598 -58000 1655 1660 -58000 1617 1524 -58000 1599 1918 -58000 1669 1754 -58000 1600 1884 -58000 1692 1660 -58000 1698 1707 -58000 1547 1808 -58000 1600 1890 -58000 1441 1634 -58000 1890 1519 -58000 1547 1582 -58000 1650 1668 -58020 1825 1884 -58020 1684 1489 -58020 1707 1764 -58020 1544 1600 -58020 1544 1890 -58020 1599 1918 -58020 1669 1754 -58020 1600 1884 -58020 1544 1825 -58020 1549 1825 -58020 1692 1660 -58020 1698 1707 -58020 1547 1808 -58020 1600 1890 -58020 1441 1634 -58020 1890 1519 -58020 1547 1582 -58020 1650 1668 -58040 1544 1600 -58040 1544 1890 -58040 1684 1857 -58040 1825 1600 -58040 1599 1918 -58040 1538 1524 -58040 1669 1754 -58040 1600 1884 -58040 1544 1825 -58040 1549 1825 -58040 1692 1660 -58040 1698 1707 -58040 1547 1808 -58040 1600 1890 -58040 1441 1634 -58040 1599 1655 -58040 1890 1519 -58040 1547 1582 -58040 1650 1668 -58060 1538 1524 -58060 1669 1754 -58060 1549 1463 -58060 1600 1884 -58060 1884 1519 -58060 1671 1699 -58060 1544 1825 -58060 1549 1825 -58060 1692 1660 -58060 1698 1707 -58060 1825 1884 -58060 1547 1808 -58060 1600 1890 -58060 1441 1634 -58060 1599 1655 -58060 1890 1519 -58060 1547 1582 -58060 1650 1668 -58080 1671 1699 -58080 1544 1825 -58080 1549 1825 -58080 1684 1857 -58080 1692 1660 -58080 1698 1707 -58080 1825 1884 -58080 1890 1884 -58080 1547 1808 -58080 1600 1890 -58080 1441 1634 -58080 1825 1600 -58080 1601 1911 -58080 1851 1787 -58080 1599 1655 -58080 1890 1519 -58080 1547 1582 -58080 1650 1668 -58100 1920 1601 -58100 1547 1808 -58100 1600 1890 -58100 1441 1634 -58100 1544 1600 -58100 1825 1600 -58100 1601 1911 -58100 1851 1787 -58100 1599 1655 -58100 1890 1519 -58100 1547 1582 -58100 1650 1668 -58120 1544 1600 -58120 1825 1600 -58120 1600 1519 -58120 1920 1911 -58120 1684 1617 -58120 1707 1764 -58120 1601 1911 -58120 1851 1787 -58120 1599 1655 -58120 1890 1519 -58120 1671 1699 -58120 1617 1857 -58120 1547 1582 -58120 1650 1668 -58140 1920 1911 -58140 1544 1890 -58140 1553 1599 -58140 1684 1617 -58140 1692 1660 -58140 1692 1582 -58140 1707 1764 -58140 1601 1911 -58140 1684 1857 -58140 1851 1787 -58140 1599 1655 -58140 1890 1519 -58140 1671 1699 -58140 1547 1808 -58140 1441 1634 -58140 1617 1857 -58140 1547 1582 -58140 1840 1489 -58140 1698 1707 -58140 1650 1668 -58160 1684 1857 -58160 1924 1599 -58160 1851 1787 -58160 1599 1655 -58160 1890 1519 -58160 1671 1699 -58160 1547 1808 -58160 1441 1634 -58160 1617 1857 -58160 1547 1582 -58160 1840 1489 -58160 1698 1707 -58160 1650 1668 -58180 1544 1890 -58180 1698 1764 -58180 1890 1519 -58180 1671 1699 -58180 1684 1660 -58180 1707 1764 -58180 1547 1808 -58180 1544 1463 -58180 1441 1634 -58180 1911 1601 -58180 1617 1857 -58180 1684 1692 -58180 1692 1660 -58180 1547 1582 -58180 1840 1489 -58180 1698 1707 -58180 1650 1668 -58200 1671 1699 -58200 1684 1660 -58200 1692 1582 -58200 1825 1890 -58200 1707 1764 -58200 1600 1890 -58200 1544 1884 -58200 1547 1808 -58200 1544 1463 -58200 1441 1634 -58200 1911 1601 -58200 1617 1857 -58200 1684 1692 -58200 1692 1660 -58200 1547 1582 -58200 1840 1489 -58200 1698 1707 -58200 1650 1668 -58220 1920 1911 -58220 1544 1884 -58220 1547 1808 -58220 1544 1463 -58220 1441 1634 -58220 1911 1601 -58220 1617 1857 -58220 1684 1692 -58220 1692 1660 -58220 1547 1582 -58220 1698 1764 -58220 1840 1489 -58220 1698 1707 -58220 1650 1668 -58240 1544 1884 -58240 1547 1808 -58240 1544 1463 -58240 1441 1634 -58240 1911 1601 -58240 1600 1526 -58240 1617 1857 -58240 1684 1692 -58240 1692 1660 -58240 1547 1582 -58240 1698 1764 -58240 1840 1489 -58240 1698 1707 -58240 1650 1668 -58260 1920 1911 -58260 1671 1699 -58260 1544 1890 -58260 1544 1463 -58260 1441 1634 -58260 1911 1601 -58260 1851 1787 -58260 1600 1526 -58260 1890 1519 -58260 1617 1857 -58260 1617 1634 -58260 1684 1692 -58260 1692 1660 -58260 1547 1582 -58260 1698 1764 -58260 1441 1617 -58260 1840 1489 -58260 1698 1707 -58260 1650 1668 -58280 1684 1660 -58280 1463 1650 -58280 1599 1655 -58280 1544 1884 -58280 1707 1764 -58280 1684 1692 -58280 1692 1660 -58280 1547 1582 -58280 1698 1764 -58280 1441 1617 -58280 1840 1489 -58280 1698 1707 -58280 1650 1668 -58300 1668 1463 -58300 1544 1884 -58300 1547 1808 -58300 1599 1521 -58300 1890 1519 -58300 1707 1764 -58300 1544 1890 -58300 1463 1526 -58300 1650 1526 -58300 1538 1524 -58300 1684 1692 -58300 1692 1660 -58300 1600 1890 -58300 1547 1582 -58300 1698 1764 -58300 1441 1617 -58300 1441 1634 -58300 1840 1489 -58300 1698 1707 -58300 1650 1668 -58320 1707 1764 -58320 1668 1628 -58320 1544 1890 -58320 1696 1851 -58320 1463 1526 -58320 1601 1911 -58320 1628 1650 -58320 1650 1526 -58320 1538 1524 -58320 1684 1692 -58320 1884 1600 -58320 1851 1521 -58320 1692 1660 -58320 1600 1890 -58320 1671 1699 -58320 1547 1582 -58320 1698 1764 -58320 1628 1526 -58320 1441 1617 -58320 1441 1634 -58320 1840 1489 -58320 1698 1707 -58320 1650 1668 -58340 1538 1524 -58340 1544 1519 -58340 1684 1692 -58340 1884 1600 -58340 1884 1890 -58340 1851 1521 -58340 1599 1521 -58340 1600 1519 -58340 1692 1660 -58340 1851 1593 -58340 1617 1634 -58340 1463 1628 -58340 1600 1890 -58340 1671 1699 -58340 1547 1808 -58340 1547 1582 -58340 1698 1764 -58340 1890 1519 -58340 1628 1526 -58340 1441 1617 -58340 1441 1634 -58340 1840 1489 -58340 1698 1707 -58340 1650 1668 -58360 1692 1660 -58360 1694 1900 -58360 1463 1526 -58360 1851 1593 -58360 1617 1634 -58360 1628 1650 -58360 1668 1628 -58360 1463 1628 -58360 1600 1890 -58360 1671 1699 -58360 1547 1808 -58360 1547 1582 -58360 1698 1764 -58360 1890 1519 -58360 1628 1526 -58360 1441 1617 -58360 1441 1634 -58360 1599 1655 -58360 1840 1489 -58360 1698 1707 -58360 1650 1668 -58380 1707 1764 -58380 1668 1628 -58380 1825 1890 -58380 1884 1600 -58380 1463 1628 -58380 1600 1890 -58380 1671 1699 -58380 1544 1890 -58380 1547 1808 -58380 1547 1582 -58380 1698 1764 -58380 1650 1526 -58380 1890 1519 -58380 1628 1526 -58380 1441 1617 -58380 1441 1634 -58380 1599 1655 -58380 1840 1489 -58380 1698 1707 -58380 1650 1668 -58400 1671 1699 -58400 1544 1890 -58400 1544 1519 -58400 1547 1808 -58400 1547 1582 -58400 1684 1692 -58400 1684 1660 -58400 1698 1764 -58400 1884 1519 -58400 1650 1526 -58400 1538 1524 -58400 1599 1593 -58400 1890 1519 -58400 1628 1526 -58400 1441 1617 -58400 1634 1617 -58400 1441 1634 -58400 1599 1655 -58400 1840 1489 -58400 1698 1707 -58400 1650 1668 -58420 1538 1524 -58420 1924 1593 -58420 1668 1628 -58420 1599 1593 -58420 1600 1825 -58420 1600 1890 -58420 1890 1519 -58420 1808 1582 -58420 1628 1650 -58420 1628 1526 -58420 1441 1617 -58420 1634 1617 -58420 1547 1684 -58420 1441 1634 -58420 1599 1655 -58420 1840 1489 -58420 1698 1707 -58420 1660 1692 -58420 1650 1668 -58440 1668 1526 -58440 1808 1582 -58440 1825 1519 -58440 1650 1526 -58440 1698 1764 -58440 1628 1650 -58440 1628 1526 -58440 1463 1526 -58440 1599 1521 -58440 1441 1617 -58440 1634 1617 -58440 1547 1684 -58440 1441 1634 -58440 1599 1655 -58440 1840 1489 -58440 1707 1764 -58440 1698 1707 -58440 1660 1692 -58440 1650 1668 -58460 1671 1703 -58460 1698 1764 -58460 1628 1650 -58460 1628 1526 -58460 1463 1526 -58460 1851 1787 -58460 1679 1520 -58460 1463 1628 -58460 1599 1521 -58460 1441 1617 -58460 1634 1617 -58460 1547 1684 -58460 1890 1519 -58460 1441 1634 -58460 1599 1655 -58460 1840 1489 -58460 1707 1764 -58460 1698 1707 -58460 1660 1692 -58460 1650 1668 -58480 1538 1524 -58480 1544 1890 -58480 1679 1520 -58480 1707 1659 -58480 1463 1628 -58480 1825 1519 -58480 1544 1519 -58480 1599 1521 -58480 1441 1617 -58480 1634 1617 -58480 1668 1628 -58480 1547 1684 -58480 1890 1519 -58480 1441 1634 -58480 1599 1655 -58480 1840 1489 -58480 1707 1764 -58480 1599 1484 -58480 1698 1707 -58480 1660 1692 -58480 1650 1668 -58500 1544 1519 -58500 1825 1890 -58500 1851 1787 -58500 1599 1521 -58500 1441 1617 -58500 1628 1650 -58500 1634 1617 -58500 1668 1628 -58500 1547 1684 -58500 1808 1582 -58500 1544 1884 -58500 1698 1764 -58500 1890 1519 -58500 1441 1634 -58500 1599 1655 -58500 1840 1489 -58500 1707 1764 -58500 1599 1484 -58500 1655 1484 -58500 1698 1707 -58500 1660 1692 -58500 1650 1668 -58520 1668 1628 -58520 1547 1684 -58520 1679 1520 -58520 1808 1582 -58520 1825 1519 -58520 1593 1521 -58520 1884 1519 -58520 1544 1884 -58520 1679 1575 -58520 1698 1764 -58520 1484 1521 -58520 1890 1519 -58520 1628 1526 -58520 1441 1634 -58520 1599 1655 -58520 1840 1489 -58520 1707 1764 -58520 1599 1484 -58520 1655 1484 -58520 1698 1707 -58520 1660 1692 -58520 1650 1668 -58540 1544 1884 -58540 1679 1575 -58540 1698 1764 -58540 1857 1617 -58540 1484 1521 -58540 1890 1519 -58540 1924 1593 -58540 1628 1526 -58540 1441 1634 -58540 1599 1655 -58540 1840 1489 -58540 1707 1764 -58540 1599 1484 -58540 1655 1484 -58540 1698 1707 -58540 1660 1692 -58540 1650 1668 -58560 1924 1593 -58560 1668 1628 -58560 1655 1774 -58560 1628 1650 -58560 1628 1526 -58560 1547 1808 -58560 1441 1634 -58560 1599 1655 -58560 1840 1489 -58560 1707 1764 -58560 1599 1484 -58560 1655 1484 -58560 1698 1707 -58560 1660 1692 -58560 1650 1668 -58580 1920 1669 -58580 1547 1808 -58580 1441 1634 -58580 1599 1655 -58580 1484 1521 -58580 1840 1489 -58580 1707 1764 -58580 1599 1484 -58580 1655 1484 -58580 1698 1707 -58580 1660 1692 -58580 1650 1668 -58600 1544 1525 -58600 1684 1437 -58600 1840 1489 -58600 1911 1629 -58600 1629 1601 -58600 1707 1764 -58600 1599 1484 -58600 1655 1484 -58600 1698 1707 -58600 1698 1764 -58600 1660 1692 -58600 1650 1668 -58620 1547 1808 -58620 1684 1437 -58620 1463 1628 -58620 1851 1787 -58620 1707 1660 -58620 1669 1754 -58620 1840 1489 -58620 1911 1629 -58620 1629 1601 -58620 1526 1628 -58620 1463 1526 -58620 1707 1764 -58620 1599 1484 -58620 1655 1484 -58620 1698 1707 -58620 1599 1655 -58620 1698 1764 -58620 1660 1692 -58620 1650 1668 -58640 1669 1754 -58640 1441 1857 -58640 1840 1489 -58640 1628 1650 -58640 1911 1629 -58640 1629 1601 -58640 1526 1628 -58640 1463 1526 -58640 1707 1764 -58640 1724 1441 -58640 1599 1484 -58640 1655 1484 -58640 1698 1707 -58640 1599 1655 -58640 1698 1764 -58640 1660 1692 -58640 1650 1668 -58660 1668 1628 -58660 1629 1601 -58660 1884 1525 -58660 1526 1628 -58660 1463 1526 -58660 1707 1764 -58660 1724 1441 -58660 1599 1484 -58660 1655 1484 -58660 1698 1707 -58660 1599 1655 -58660 1698 1764 -58660 1660 1692 -58660 1650 1668 -58680 1544 1525 -58680 1840 1857 -58680 1707 1660 -58680 1884 1525 -58680 1526 1628 -58680 1463 1526 -58680 1707 1764 -58680 1724 1441 -58680 1599 1484 -58680 1655 1484 -58680 1698 1707 -58680 1599 1655 -58680 1698 1764 -58680 1660 1692 -58680 1650 1668 -58700 1544 1890 -58700 1601 1629 -58700 1684 1840 -58700 1463 1526 -58700 1707 1764 -58700 1724 1441 -58700 1599 1484 -58700 1655 1484 -58700 1698 1707 -58700 1599 1655 -58700 1890 1519 -58700 1698 1764 -58700 1660 1692 -58700 1650 1668 -58720 1684 1840 -58720 1437 1840 -58720 1463 1526 -58720 1707 1764 -58720 1724 1441 -58720 1599 1484 -58720 1655 1484 -58720 1593 1521 -58720 1698 1707 -58720 1599 1655 -58720 1890 1519 -58720 1698 1764 -58720 1660 1692 -58720 1650 1668 -58740 1544 1600 -58740 1544 1525 -58740 1707 1764 -58740 1724 1441 -58740 1884 1525 -58740 1629 1911 -58740 1547 1808 -58740 1599 1484 -58740 1655 1484 -58740 1593 1521 -58740 1669 1754 -58740 1698 1707 -58740 1599 1655 -58740 1890 1519 -58740 1698 1764 -58740 1660 1692 -58740 1650 1668 -58760 1544 1825 -58760 1547 1808 -58760 1437 1840 -58760 1599 1484 -58760 1655 1484 -58760 1484 1786 -58760 1593 1521 -58760 1774 1786 -58760 1669 1754 -58760 1698 1707 -58760 1599 1655 -58760 1601 1629 -58760 1463 1526 -58760 1600 1890 -58760 1890 1519 -58760 1698 1764 -58760 1660 1692 -58760 1650 1668 -58780 1669 1754 -58780 1698 1707 -58780 1707 1764 -58780 1599 1655 -58780 1911 1629 -58780 1601 1629 -58780 1463 1526 -58780 1600 1890 -58780 1890 1519 -58780 1441 1724 -58780 1698 1764 -58780 1660 1692 -58780 1650 1668 -58800 1484 1786 -58800 1599 1655 -58800 1911 1629 -58800 1601 1629 -58800 1463 1526 -58800 1600 1890 -58800 1890 1519 -58800 1441 1724 -58800 1698 1764 -58800 1660 1692 -58800 1650 1668 -58820 1851 1521 -58820 1599 1655 -58820 1600 1884 -58820 1475 1628 -58820 1911 1629 -58820 1679 1634 -58820 1601 1629 -58820 1884 1519 -58820 1694 1857 -58820 1586 1851 -58820 1463 1526 -58820 1600 1890 -58820 1890 1519 -58820 1441 1724 -58820 1698 1764 -58820 1660 1692 -58820 1650 1668 -58840 1679 1634 -58840 1601 1629 -58840 1593 1521 -58840 1884 1519 -58840 1650 1526 -58840 1694 1857 -58840 1586 1851 -58840 1463 1526 -58840 1600 1890 -58840 1601 1911 -58840 1890 1519 -58840 1441 1724 -58840 1698 1764 -58840 1660 1692 -58840 1650 1668 -58860 1698 1707 -58860 1694 1857 -58860 1586 1851 -58860 1600 1525 -58860 1600 1519 -58860 1463 1526 -58860 1600 1890 -58860 1601 1911 -58860 1890 1519 -58860 1441 1724 -58860 1698 1764 -58860 1660 1692 -58860 1650 1668 -58880 1519 1525 -58880 1694 1857 -58880 1586 1851 -58880 1600 1525 -58880 1600 1519 -58880 1825 1884 -58880 1463 1526 -58880 1600 1890 -58880 1884 1519 -58880 1669 1754 -58880 1601 1911 -58880 1890 1519 -58880 1629 1601 -58880 1441 1724 -58880 1698 1764 -58880 1629 1911 -58880 1660 1692 -58880 1650 1668 -58900 1851 1758 -58900 1599 1655 -58900 1600 1825 -58900 1600 1884 -58900 1600 1525 -58900 1600 1519 -58900 1857 1617 -58900 1825 1884 -58900 1825 1525 -58900 1593 1521 -58900 1767 1489 -58900 1924 1478 -58900 1463 1526 -58900 1600 1890 -58900 1884 1519 -58900 1669 1754 -58900 1694 1617 -58900 1601 1911 -58900 1890 1519 -58900 1629 1601 -58900 1441 1724 -58900 1698 1764 -58900 1629 1911 -58900 1660 1692 -58900 1650 1668 -58920 1924 1478 -58920 1463 1526 -58920 1600 1890 -58920 1884 1519 -58920 1519 1525 -58920 1669 1754 -58920 1694 1617 -58920 1601 1911 -58920 1890 1519 -58920 1629 1601 -58920 1441 1724 -58920 1698 1764 -58920 1629 1911 -58920 1660 1692 -58920 1650 1668 -58940 1669 1754 -58940 1698 1707 -58940 1707 1764 -58940 1924 1469 -58940 1890 1884 -58940 1519 1600 -58940 1694 1617 -58940 1601 1911 -58940 1890 1519 -58940 1629 1601 -58940 1441 1724 -58940 1698 1764 -58940 1629 1911 -58940 1660 1692 -58940 1650 1668 -58960 1519 1600 -58960 1694 1617 -58960 1851 1758 -58960 1601 1911 -58960 1890 1519 -58960 1840 1489 -58960 1629 1601 -58960 1441 1724 -58960 1698 1764 -58960 1884 1519 -58960 1629 1911 -58960 1660 1692 -58960 1650 1668 -58980 1538 1524 -58980 1669 1754 -58980 1441 1641 -58980 1617 1489 -58980 1890 1519 -58980 1573 1452 -58980 1840 1489 -58980 1629 1601 -58980 1825 1525 -58980 1698 1707 -58980 1441 1724 -58980 1698 1764 -58980 1884 1519 -58980 1629 1911 -58980 1660 1692 -58980 1650 1668 -59000 1573 1452 -59000 1547 1808 -59000 1840 1489 -59000 1547 1609 -59000 1694 1617 -59000 1629 1601 -59000 1911 1601 -59000 1825 1525 -59000 1698 1707 -59000 1441 1724 -59000 1698 1764 -59000 1884 1519 -59000 1629 1911 -59000 1825 1884 -59000 1660 1692 -59000 1650 1668 -59020 1547 1808 -59020 1840 1489 -59020 1547 1609 -59020 1694 1617 -59020 1629 1601 -59020 1911 1601 -59020 1678 1520 -59020 1825 1525 -59020 1698 1707 -59020 1441 1724 -59020 1698 1764 -59020 1884 1519 -59020 1890 1519 -59020 1629 1911 -59020 1825 1884 -59020 1660 1692 -59020 1650 1668 -59040 1451 1478 -59040 1547 1609 -59040 1519 1825 -59040 1694 1617 -59040 1825 1890 -59040 1655 1599 -59040 1669 1754 -59040 1629 1601 -59040 1911 1601 -59040 1617 1767 -59040 1463 1526 -59040 1678 1520 -59040 1825 1525 -59040 1698 1707 -59040 1441 1724 -59040 1698 1764 -59040 1884 1519 -59040 1890 1519 -59040 1629 1911 -59040 1825 1884 -59040 1660 1692 -59040 1650 1668 -59060 1451 1924 -59060 1669 1754 -59060 1629 1601 -59060 1911 1601 -59060 1851 1787 -59060 1617 1767 -59060 1463 1526 -59060 1678 1520 -59060 1840 1489 -59060 1825 1525 -59060 1698 1707 -59060 1441 1724 -59060 1698 1764 -59060 1884 1519 -59060 1890 1519 -59060 1629 1911 -59060 1825 1884 -59060 1660 1692 -59060 1650 1668 -59080 1694 1617 -59080 1707 1764 -59080 1463 1526 -59080 1678 1520 -59080 1840 1489 -59080 1840 1767 -59080 1655 1599 -59080 1767 1489 -59080 1825 1525 -59080 1698 1707 -59080 1441 1724 -59080 1698 1764 -59080 1884 1519 -59080 1890 1519 -59080 1629 1911 -59080 1825 1884 -59080 1660 1692 -59080 1650 1668 -59100 1678 1520 -59100 1840 1489 -59100 1840 1767 -59100 1655 1599 -59100 1890 1884 -59100 1890 1525 -59100 1767 1489 -59100 1519 1525 -59100 1825 1525 -59100 1698 1707 -59100 1441 1724 -59100 1698 1764 -59100 1857 1489 -59100 1884 1519 -59100 1890 1519 -59100 1629 1911 -59100 1825 1884 -59100 1660 1692 -59100 1650 1668 -59120 1451 1478 -59120 1825 1890 -59120 1825 1525 -59120 1698 1707 -59120 1628 1475 -59120 1924 1478 -59120 1441 1724 -59120 1698 1764 -59120 1857 1617 -59120 1857 1489 -59120 1884 1519 -59120 1617 1489 -59120 1890 1519 -59120 1629 1911 -59120 1825 1884 -59120 1660 1692 -59120 1650 1668 -59140 1441 1641 -59140 1441 1724 -59140 1840 1767 -59140 1471 1503 -59140 1787 1512 -59140 1679 1575 -59140 1884 1890 -59140 1890 1525 -59140 1698 1764 -59140 1669 1754 -59140 1857 1617 -59140 1857 1489 -59140 1884 1519 -59140 1617 1489 -59140 1890 1519 -59140 1538 1524 -59140 1629 1911 -59140 1825 1884 -59140 1601 1629 -59140 1601 1911 -59140 1547 1808 -59140 1660 1692 -59140 1650 1668 -59160 1679 1575 -59160 1519 1825 -59160 1463 1648 -59160 1628 1475 -59160 1924 1609 -59160 1884 1890 -59160 1890 1525 -59160 1698 1764 -59160 1669 1754 -59160 1857 1617 -59160 1857 1489 -59160 1884 1519 -59160 1707 1764 -59160 1617 1489 -59160 1890 1519 -59160 1538 1524 -59160 1629 1911 -59160 1825 1884 -59160 1601 1629 -59160 1601 1911 -59160 1547 1808 -59160 1698 1707 -59160 1660 1692 -59160 1650 1668 -59180 1698 1660 -59180 1698 1764 -59180 1851 1787 -59180 1469 1609 -59180 1669 1754 -59180 1857 1617 -59180 1857 1489 -59180 1884 1519 -59180 1707 1764 -59180 1617 1489 -59180 1890 1519 -59180 1538 1524 -59180 1629 1911 -59180 1825 1884 -59180 1601 1629 -59180 1601 1911 -59180 1547 1808 -59180 1698 1707 -59180 1660 1692 -59180 1650 1668 -59200 1669 1754 -59200 1857 1617 -59200 1857 1489 -59200 1884 1519 -59200 1707 1764 -59200 1452 1503 -59200 1463 1648 -59200 1475 1628 -59200 1825 1519 -59200 1617 1489 -59200 1890 1519 -59200 1538 1524 -59200 1629 1911 -59200 1825 1884 -59200 1601 1629 -59200 1601 1911 -59200 1825 1890 -59200 1547 1808 -59200 1698 1707 -59200 1660 1692 -59200 1890 1525 -59200 1650 1668 -59220 1538 1524 -59220 1451 1924 -59220 1471 1489 -59220 1600 1890 -59220 1441 1641 -59220 1629 1911 -59220 1840 1767 -59220 1884 1890 -59220 1767 1489 -59220 1655 1599 -59220 1825 1884 -59220 1601 1629 -59220 1601 1911 -59220 1825 1890 -59220 1840 1489 -59220 1441 1617 -59220 1547 1808 -59220 1698 1707 -59220 1660 1692 -59220 1890 1525 -59220 1650 1668 -59240 1544 1890 -59240 1840 1767 -59240 1884 1890 -59240 1475 1628 -59240 1463 1648 -59240 1767 1489 -59240 1655 1599 -59240 1698 1764 -59240 1707 1764 -59240 1825 1884 -59240 1601 1629 -59240 1601 1911 -59240 1825 1890 -59240 1825 1519 -59240 1840 1489 -59240 1441 1617 -59240 1684 1698 -59240 1547 1808 -59240 1698 1707 -59240 1684 1707 -59240 1857 1526 -59240 1660 1692 -59240 1890 1525 -59240 1650 1668 -59260 1924 1478 -59260 1884 1890 -59260 1475 1628 -59260 1463 1648 -59260 1767 1489 -59260 1890 1519 -59260 1655 1599 -59260 1684 1764 -59260 1698 1764 -59260 1707 1764 -59260 1825 1884 -59260 1884 1519 -59260 1601 1629 -59260 1601 1911 -59260 1825 1890 -59260 1825 1519 -59260 1840 1489 -59260 1441 1617 -59260 1684 1698 -59260 1452 1503 -59260 1547 1808 -59260 1698 1707 -59260 1684 1707 -59260 1857 1526 -59260 1660 1692 -59260 1890 1525 -59260 1650 1668 -59280 1684 1764 -59280 1698 1764 -59280 1707 1764 -59280 1825 1884 -59280 1884 1519 -59280 1601 1629 -59280 1601 1911 -59280 1825 1890 -59280 1825 1519 -59280 1629 1911 -59280 1840 1489 -59280 1441 1617 -59280 1684 1698 -59280 1452 1503 -59280 1547 1808 -59280 1698 1707 -59280 1684 1707 -59280 1857 1526 -59280 1660 1692 -59280 1890 1525 -59280 1650 1668 -59300 1538 1524 -59300 1573 1503 -59300 1601 1629 -59300 1601 1911 -59300 1669 1754 -59300 1698 1489 -59300 1707 1840 -59300 1707 1489 -59300 1825 1890 -59300 1825 1519 -59300 1544 1890 -59300 1544 1525 -59300 1629 1911 -59300 1840 1489 -59300 1441 1617 -59300 1767 1489 -59300 1684 1698 -59300 1452 1503 -59300 1655 1599 -59300 1547 1808 -59300 1698 1707 -59300 1484 1655 -59300 1684 1707 -59300 1857 1526 -59300 1660 1692 -59300 1890 1525 -59300 1650 1668 -59320 1544 1890 -59320 1544 1525 -59320 1599 1484 -59320 1629 1911 -59320 1707 1764 -59320 1840 1489 -59320 1441 1617 -59320 1767 1489 -59320 1684 1698 -59320 1452 1503 -59320 1655 1599 -59320 1547 1808 -59320 1698 1707 -59320 1475 1628 -59320 1484 1655 -59320 1684 1707 -59320 1573 1452 -59320 1857 1526 -59320 1660 1692 -59320 1890 1525 -59320 1650 1668 -59340 1538 1524 -59340 1684 1764 -59340 1698 1764 -59340 1840 1489 -59340 1586 1851 -59340 1441 1617 -59340 1767 1489 -59340 1519 1525 -59340 1684 1698 -59340 1573 1503 -59340 1452 1503 -59340 1601 1911 -59340 1655 1599 -59340 1547 1808 -59340 1698 1707 -59340 1475 1628 -59340 1484 1655 -59340 1684 1707 -59340 1573 1452 -59340 1857 1526 -59340 1660 1692 -59340 1669 1754 -59340 1890 1525 -59340 1650 1668 -59360 1684 1698 -59360 1573 1503 -59360 1452 1503 -59360 1601 1911 -59360 1655 1599 -59360 1547 1808 -59360 1698 1707 -59360 1707 1767 -59360 1437 1471 -59360 1475 1628 -59360 1484 1655 -59360 1684 1707 -59360 1573 1452 -59360 1857 1526 -59360 1660 1692 -59360 1669 1754 -59360 1890 1525 -59360 1650 1668 -59380 1668 1463 -59380 1547 1808 -59380 1698 1707 -59380 1707 1767 -59380 1437 1471 -59380 1840 1767 -59380 1617 1441 -59380 1463 1650 -59380 1601 1629 -59380 1475 1628 -59380 1684 1764 -59380 1698 1764 -59380 1707 1764 -59380 1484 1655 -59380 1684 1707 -59380 1573 1452 -59380 1857 1526 -59380 1660 1692 -59380 1669 1754 -59380 1890 1525 -59380 1650 1668 -59400 1684 1764 -59400 1698 1764 -59400 1924 1451 -59400 1924 1478 -59400 1707 1764 -59400 1911 1629 -59400 1484 1655 -59400 1684 1707 -59400 1840 1489 -59400 1463 1648 -59400 1884 1519 -59400 1573 1452 -59400 1857 1526 -59400 1452 1503 -59400 1684 1698 -59400 1573 1503 -59400 1660 1692 -59400 1669 1754 -59400 1890 1525 -59400 1650 1668 -59420 1684 1707 -59420 1840 1489 -59420 1463 1648 -59420 1628 1475 -59420 1601 1629 -59420 1601 1911 -59420 1609 1524 -59420 1884 1519 -59420 1767 1489 -59420 1573 1452 -59420 1857 1526 -59420 1452 1503 -59420 1684 1698 -59420 1573 1503 -59420 1617 1857 -59420 1660 1692 -59420 1617 1441 -59420 1669 1754 -59420 1698 1707 -59420 1890 1525 -59420 1650 1668 -59440 1573 1452 -59440 1598 1920 -59440 1601 1689 -59440 1629 1689 -59440 1857 1526 -59440 1437 1471 -59440 1452 1503 -59440 1684 1698 -59440 1573 1503 -59440 1617 1857 -59440 1660 1692 -59440 1857 1441 -59440 1617 1441 -59440 1669 1754 -59440 1698 1707 -59440 1547 1808 -59440 1890 1525 -59440 1707 1764 -59440 1650 1668 -59460 1601 1609 -59460 1601 1694 -59460 1684 1698 -59460 1698 1489 -59460 1573 1503 -59460 1840 1489 -59460 1463 1668 -59460 1767 1489 -59460 1629 1911 -59460 1617 1857 -59460 1660 1692 -59460 1857 1441 -59460 1617 1441 -59460 1669 1754 -59460 1698 1707 -59460 1547 1808 -59460 1890 1525 -59460 1707 1764 -59460 1650 1668 -59480 1565 1699 -59480 1617 1857 -59480 1628 1475 -59480 1660 1692 -59480 1857 1441 -59480 1884 1519 -59480 1890 1519 -59480 1452 1503 -59480 1617 1441 -59480 1669 1754 -59480 1684 1764 -59480 1698 1707 -59480 1547 1808 -59480 1890 1525 -59480 1707 1764 -59480 1601 1629 -59480 1601 1911 -59480 1650 1668 -59500 1617 1441 -59500 1669 1754 -59500 1684 1764 -59500 1698 1764 -59500 1789 1902 -59500 1684 1698 -59500 1698 1707 -59500 1547 1808 -59500 1684 1707 -59500 1890 1525 -59500 1707 1764 -59500 1629 1911 -59500 1601 1629 -59500 1601 1911 -59500 1650 1668 -59520 1601 1609 -59520 1684 1698 -59520 1767 1489 -59520 1452 1503 -59520 1698 1707 -59520 1547 1808 -59520 1684 1489 -59520 1684 1707 -59520 1890 1525 -59520 1707 1764 -59520 1629 1911 -59520 1601 1629 -59520 1601 1911 -59520 1660 1692 -59520 1650 1668 -59540 1600 1890 -59540 1617 1441 -59540 1669 1754 -59540 1674 1489 -59540 1680 1728 -59540 1698 1764 -59540 1628 1475 -59540 1660 1767 -59540 1698 1489 -59540 1698 1707 -59540 1547 1808 -59540 1684 1489 -59540 1684 1707 -59540 1692 1767 -59540 1890 1525 -59540 1707 1764 -59540 1629 1911 -59540 1601 1629 -59540 1601 1911 -59540 1660 1692 -59540 1650 1668 -59560 1628 1475 -59560 1660 1767 -59560 1698 1489 -59560 1698 1707 -59560 1547 1808 -59560 1684 1489 -59560 1641 1857 -59560 1684 1707 -59560 1692 1767 -59560 1890 1525 -59560 1707 1764 -59560 1629 1911 -59560 1601 1629 -59560 1601 1911 -59560 1660 1692 -59560 1650 1668 -59580 1547 1808 -59580 1575 1679 -59580 1583 1600 -59580 1586 1851 -59580 1622 1660 -59580 1625 1920 -59580 1684 1489 -59580 1641 1857 -59580 1617 1441 -59580 1684 1707 -59580 1890 1519 -59580 1519 1525 -59580 1669 1754 -59580 1692 1767 -59580 1890 1525 -59580 1707 1764 -59580 1629 1911 -59580 1601 1629 -59580 1601 1911 -59580 1660 1692 -59580 1650 1668 -59600 1609 1625 -59600 1641 1857 -59600 1787 1851 -59600 1617 1441 -59600 1684 1698 -59600 1684 1707 -59600 1684 1764 -59600 1890 1519 -59600 1452 1503 -59600 1519 1525 -59600 1669 1754 -59600 1698 1707 -59600 1692 1767 -59600 1890 1525 -59600 1707 1764 -59600 1629 1911 -59600 1601 1629 -59600 1601 1911 -59600 1660 1692 -59600 1650 1668 -59620 1617 1441 -59620 1644 1894 -59620 1684 1698 -59620 1684 1707 -59620 1684 1764 -59620 1857 1441 -59620 1884 1890 -59620 1890 1519 -59620 1452 1503 -59620 1519 1525 -59620 1669 1754 -59620 1698 1707 -59620 1692 1767 -59620 1648 1696 -59620 1890 1525 -59620 1707 1764 -59620 1629 1911 -59620 1601 1629 -59620 1660 1767 -59620 1601 1911 -59620 1660 1692 -59620 1650 1668 -59640 1669 1754 -59640 1674 1707 -59640 1698 1489 -59640 1698 1707 -59640 1707 1489 -59640 1764 1489 -59640 1787 1851 -59640 1871 1894 -59640 1884 1519 -59640 1924 1478 -59640 1684 1489 -59640 1692 1767 -59640 1707 1441 -59640 1648 1696 -59640 1890 1525 -59640 1707 1764 -59640 1599 1671 -59640 1622 1526 -59640 1617 1857 -59640 1629 1911 -59640 1601 1629 -59640 1660 1767 -59640 1601 1911 -59640 1660 1692 -59640 1650 1668 -59660 1549 1625 -59660 1684 1489 -59660 1692 1767 -59660 1707 1441 -59660 1728 1531 -59660 1764 1441 -59660 1851 1458 -59660 1452 1503 -59660 1648 1696 -59660 1789 1902 -59660 1890 1525 -59660 1670 1754 -59660 1707 1764 -59660 1787 1458 -59660 1599 1671 -59660 1674 1489 -59660 1622 1526 -59660 1617 1857 -59660 1629 1911 -59660 1601 1629 -59660 1660 1767 -59660 1601 1911 -59660 1660 1692 -59660 1650 1668 -59680 1648 1696 -59680 1787 1851 -59680 1789 1902 -59680 1890 1525 -59680 1670 1754 -59680 1680 1458 -59680 1698 1707 -59680 1698 1764 -59680 1707 1764 -59680 1787 1458 -59680 1890 1519 -59680 1924 1478 -59680 1599 1671 -59680 1674 1489 -59680 1622 1526 -59680 1617 1857 -59680 1629 1911 -59680 1601 1629 -59680 1660 1767 -59680 1871 1517 -59680 1601 1911 -59680 1660 1692 -59680 1650 1668 -59700 1553 1519 -59700 1600 1890 -59700 1669 1754 -59700 1670 1754 -59700 1680 1458 -59700 1680 1851 -59700 1698 1707 -59700 1698 1764 -59700 1707 1764 -59700 1787 1458 -59700 1851 1458 -59700 1890 1519 -59700 1924 1478 -59700 1599 1671 -59700 1655 1484 -59700 1674 1489 -59700 1770 1773 -59700 1622 1526 -59700 1684 1441 -59700 1617 1857 -59700 1629 1911 -59700 1549 1525 -59700 1601 1629 -59700 1660 1767 -59700 1871 1517 -59700 1601 1911 -59700 1660 1692 -59700 1650 1668 -59720 1599 1774 -59720 1599 1671 -59720 1617 1707 -59720 1641 1770 -59720 1648 1890 -59720 1655 1484 -59720 1674 1489 -59720 1770 1773 -59720 1789 1902 -59720 1622 1526 -59720 1684 1441 -59720 1441 1489 -59720 1617 1857 -59720 1629 1911 -59720 1549 1525 -59720 1601 1629 -59720 1660 1767 -59720 1871 1517 -59720 1601 1911 -59720 1660 1692 -59720 1650 1668 -59740 1547 1808 -59740 1583 1600 -59740 1583 1525 -59740 1600 1525 -59740 1622 1526 -59740 1684 1441 -59740 1707 1437 -59740 1441 1489 -59740 1617 1857 -59740 1629 1911 -59740 1598 1890 -59740 1549 1525 -59740 1684 1489 -59740 1601 1629 -59740 1660 1767 -59740 1871 1517 -59740 1601 1911 -59740 1660 1692 -59740 1650 1668 -59760 1601 1789 -59760 1617 1857 -59760 1617 1707 -59760 1629 1911 -59760 1655 1484 -59760 1692 1767 -59760 1698 1707 -59760 1789 1902 -59760 1598 1890 -59760 1707 1764 -59760 1549 1525 -59760 1684 1489 -59760 1601 1629 -59760 1660 1767 -59760 1871 1517 -59760 1601 1911 -59760 1660 1692 -59760 1650 1668 -59780 1598 1890 -59780 1601 1728 -59780 1648 1696 -59780 1679 1884 -59780 1707 1764 -59780 1549 1525 -59780 1599 1774 -59780 1641 1698 -59780 1684 1489 -59780 1641 1707 -59780 1601 1629 -59780 1660 1767 -59780 1871 1517 -59780 1601 1911 -59780 1660 1692 -59780 1650 1668 -59800 1549 1525 -59800 1583 1600 -59800 1599 1774 -59800 1641 1698 -59800 1655 1484 -59800 1674 1698 -59800 1684 1489 -59800 1698 1764 -59800 1918 1475 -59800 1629 1911 -59800 1641 1707 -59800 1789 1902 -59800 1698 1707 -59800 1900 1471 -59800 1692 1767 -59800 1601 1629 -59800 1660 1767 -59800 1871 1517 -59800 1601 1911 -59800 1660 1692 -59800 1650 1668 -59820 1573 1452 -59820 1583 1890 -59820 1629 1911 -59820 1641 1707 -59820 1707 1773 -59820 1789 1902 -59820 1698 1707 -59820 1900 1471 -59820 1924 1478 -59820 1692 1767 -59820 1601 1629 -59820 1660 1767 -59820 1441 1489 -59820 1871 1517 -59820 1601 1911 -59820 1707 1764 -59820 1660 1692 -59820 1650 1668 -59840 1641 1444 -59840 1698 1707 -59840 1900 1471 -59840 1924 1478 -59840 1547 1808 -59840 1599 1681 -59840 1894 1531 -59840 1692 1767 -59840 1601 1629 -59840 1660 1767 -59840 1441 1489 -59840 1641 1458 -59840 1871 1517 -59840 1601 1911 -59840 1707 1764 -59840 1660 1692 -59840 1650 1668 -59860 1547 1808 -59860 1573 1698 -59860 1573 1707 -59860 1599 1681 -59860 1641 1707 -59860 1641 1764 -59860 1681 1484 -59860 1765 1442 -59860 1786 1819 -59860 1894 1531 -59860 1598 1648 -59860 1617 1857 -59860 1692 1767 -59860 1601 1629 -59860 1629 1911 -59860 1660 1767 -59860 1773 1444 -59860 1441 1489 -59860 1641 1458 -59860 1871 1517 -59860 1601 1911 -59860 1707 1764 -59860 1660 1692 -59860 1650 1668 -59880 1546 1548 -59880 1549 1553 -59880 1573 1444 -59880 1582 1598 -59880 1598 1648 -59880 1598 1526 -59880 1599 1774 -59880 1617 1857 -59880 1648 1696 -59880 1692 1767 -59880 1789 1902 -59880 1601 1629 -59880 1629 1911 -59880 1660 1767 -59880 1773 1444 -59880 1441 1489 -59880 1641 1458 -59880 1871 1517 -59880 1601 1911 -59880 1707 1764 -59880 1660 1692 -59880 1650 1668 -59900 1554 1613 -59900 1598 1920 -59900 1598 1825 -59900 1600 1808 -59900 1601 1471 -59900 1601 1629 -59900 1614 1526 -59900 1629 1911 -59900 1660 1767 -59900 1667 1866 -59900 1669 1754 -59900 1773 1444 -59900 1900 1471 -59900 1918 1475 -59900 1441 1489 -59900 1641 1458 -59900 1541 1691 -59900 1871 1517 -59900 1601 1911 -59900 1698 1764 -59900 1707 1764 -59900 1660 1692 -59900 1698 1707 -59900 1650 1668 -59920 1601 1622 -59920 1617 1857 -59920 1622 1629 -59920 1622 1911 -59920 1641 1458 -59920 1652 1747 -59920 1660 1811 -59920 1698 1458 -59920 1786 1789 -59920 1825 1525 -59920 1850 1484 -59920 1857 1441 -59920 1871 1531 -59920 1541 1691 -59920 1549 1525 -59920 1598 1526 -59920 1871 1517 -59920 1601 1911 -59920 1698 1764 -59920 1707 1764 -59920 1547 1808 -59920 1617 1441 -59920 1660 1692 -59920 1698 1707 -59920 1650 1668 -59940 1541 1691 -59940 1574 1627 -59940 1583 1884 -59940 1601 1629 -59940 1674 1458 -59940 1774 1484 -59940 1811 1441 -59940 1441 1458 -59940 1549 1525 -59940 1598 1526 -59940 1648 1696 -59940 1659 1689 -59940 1825 1884 -59940 1871 1517 -59940 1914 1484 -59940 1601 1911 -59940 1698 1764 -59940 1707 1764 -59940 1547 1808 -59940 1921 1462 -59940 1617 1441 -59940 1629 1911 -59940 1692 1767 -59940 1660 1692 -59940 1512 1531 -59940 1698 1707 -59940 1650 1668 -59960 1549 1525 -59960 1598 1526 -59960 1613 1756 -59960 1617 1857 -59960 1623 1688 -59960 1641 1894 -59960 1648 1696 -59960 1659 1689 -59960 1660 1767 -59960 1669 1754 -59960 1688 1457 -59960 1692 1839 -59960 1703 1519 -59960 1707 1921 -59960 1725 1752 -59960 1752 1766 -59960 1774 1901 -59960 1787 1851 -59960 1789 1902 -59960 1825 1884 -59960 1857 1441 -59960 1871 1517 -59960 1894 1921 -59960 1901 1484 -59960 1914 1484 -59960 1918 1475 -59960 1546 1548 -59960 1601 1911 -59960 1641 1921 -59960 1652 1673 -59960 1698 1764 -59960 1707 1764 -59960 1547 1808 -59960 1599 1901 -59960 1599 1774 -59960 1641 1462 -59960 1880 1484 -59960 1921 1462 -59960 1617 1441 -59960 1629 1911 -59960 1703 1517 -59960 1692 1767 -59960 1660 1692 -59960 1512 1531 -59960 1698 1707 -59960 1651 1703 -59960 1650 1668 -59980 1546 1548 -59980 1583 1600 -59980 1598 1614 -59980 1599 1880 -59980 1600 1825 -59980 1601 1911 -59980 1629 1458 -59980 1641 1921 -59980 1644 1503 -59980 1652 1673 -59980 1652 1747 -59980 1674 1437 -59980 1676 1761 -59980 1698 1764 -59980 1707 1764 -59980 1547 1808 -59980 1599 1841 -59980 1599 1901 -59980 1599 1774 -59980 1641 1462 -59980 1841 1901 -59980 1872 1531 -59980 1880 1484 -59980 1921 1462 -59980 1601 1629 -59980 1617 1441 -59980 1629 1911 -59980 1703 1517 -59980 1825 1519 -59980 1692 1767 -59980 1660 1692 -59980 1512 1531 -59980 1698 1707 -59980 1651 1703 -59980 1650 1668 -60000 1541 1531 -60000 1547 1808 -60000 1554 1579 -60000 1554 1531 -60000 1562 1695 -60000 1579 1448 -60000 1579 1466 -60000 1579 1731 -60000 1579 1879 -60000 1599 1841 -60000 1599 1901 -60000 1599 1774 -60000 1619 1641 -60000 1622 1471 -60000 1641 1462 -60000 1660 1767 -60000 1683 1484 -60000 1691 1778 -60000 1691 1531 -60000 1765 1778 -60000 1841 1484 -60000 1841 1901 -60000 1872 1531 -60000 1880 1484 -60000 1921 1462 -60000 1466 1531 -60000 1541 1765 -60000 1601 1629 -60000 1617 1441 -60000 1629 1911 -60000 1703 1517 -60000 1825 1519 -60000 1543 1545 -60000 1692 1767 -60000 1918 1475 -60000 1545 1528 -60000 1541 1691 -60000 1660 1692 -60000 1512 1531 -60000 1698 1707 -60000 1871 1517 -60000 1651 1703 -60000 1650 1668 -60020 1541 1578 -60020 1541 1765 -60020 1547 1466 -60020 1563 1786 -60020 1563 1579 -60020 1569 1520 -60020 1590 1530 -60020 1599 1484 -60020 1601 1458 -60020 1601 1629 -60020 1617 1441 -60020 1629 1911 -60020 1684 1798 -60020 1691 1765 -60020 1699 1469 -60020 1703 1517 -60020 1725 1765 -60020 1731 1765 -60020 1765 1487 -60020 1765 1779 -60020 1794 1484 -60020 1825 1519 -60020 1831 1467 -60020 1448 1531 -60020 1543 1545 -60020 1549 1525 -60020 1599 1897 -60020 1692 1767 -60020 1706 1467 -60020 1884 1519 -60020 1437 1462 -60020 1648 1696 -60020 1678 1906 -60020 1918 1475 -60020 1547 1665 -60020 1545 1528 -60020 1541 1691 -60020 1698 1764 -60020 1707 1764 -60020 1660 1692 -60020 1546 1548 -60020 1512 1531 -60020 1698 1707 -60020 1871 1517 -60020 1651 1703 -60020 1650 1668 -60040 1537 1517 -60040 1543 1545 -60040 1549 1525 -60040 1550 1531 -60040 1550 1765 -60040 1568 1699 -60040 1579 1496 -60040 1585 1766 -60040 1590 1761 -60040 1592 1688 -60040 1599 1897 -60040 1599 1774 -60040 1652 1673 -60040 1655 1774 -60040 1659 1786 -60040 1670 1917 -60040 1688 1871 -60040 1692 1767 -60040 1698 1905 -60040 1706 1467 -60040 1724 1531 -60040 1725 1752 -60040 1779 1531 -60040 1851 1434 -60040 1884 1519 -60040 1890 1476 -60040 1437 1462 -60040 1648 1696 -60040 1664 1821 -60040 1678 1906 -60040 1851 1529 -60040 1918 1475 -60040 1547 1665 -60040 1787 1529 -60040 1545 1528 -60040 1660 1767 -60040 1541 1691 -60040 1698 1764 -60040 1707 1764 -60040 1660 1692 -60040 1546 1548 -60040 1512 1531 -60040 1698 1707 -60040 1871 1517 -60040 1651 1703 -60040 1650 1668 -60060 1547 1725 -60060 1550 1752 -60060 1554 1476 -60060 1563 1622 -60060 1568 1582 -60060 1579 1613 -60060 1599 1855 -60060 1601 1458 -60060 1613 1673 -60060 1613 1756 -60060 1629 1458 -60060 1648 1696 -60060 1655 1484 -60060 1664 1731 -60060 1664 1821 -60060 1678 1906 -60060 1678 1919 -60060 1711 1825 -60060 1711 1890 -60060 1742 1520 -60060 1752 1916 -60060 1752 1428 -60060 1787 1851 -60060 1811 1462 -60060 1825 1890 -60060 1851 1529 -60060 1855 1484 -60060 1918 1475 -60060 1427 1531 -60060 1547 1665 -60060 1617 1857 -60060 1787 1529 -60060 1545 1528 -60060 1598 1648 -60060 1660 1767 -60060 1749 1757 -60060 1541 1691 -60060 1698 1764 -60060 1707 1764 -60060 1890 1519 -60060 1660 1692 -60060 1825 1519 -60060 1546 1548 -60060 1512 1531 -60060 1698 1707 -60060 1871 1517 -60060 1651 1703 -60060 1650 1668 -60080 1537 1517 -60080 1538 1694 -60080 1539 1613 -60080 1547 1665 -60080 1547 1747 -60080 1563 1592 -60080 1585 1613 -60080 1585 1766 -60080 1599 1774 -60080 1600 1890 -60080 1608 1470 -60080 1613 1752 -60080 1617 1857 -60080 1617 1725 -60080 1641 1487 -60080 1655 1491 -60080 1655 1774 -60080 1659 1428 -60080 1669 1754 -60080 1698 1725 -60080 1698 1487 -60080 1725 1866 -60080 1725 1773 -60080 1752 1531 -60080 1756 1531 -60080 1779 1428 -60080 1786 1915 -60080 1787 1529 -60080 1841 1901 -60080 1877 1890 -60080 1484 1491 -60080 1537 1703 -60080 1541 1901 -60080 1545 1528 -60080 1598 1648 -60080 1642 1854 -60080 1660 1767 -60080 1684 1798 -60080 1688 1694 -60080 1749 1757 -60080 1923 1484 -60080 1433 1503 -60080 1503 1535 -60080 1541 1691 -60080 1652 1747 -60080 1655 1893 -60080 1698 1764 -60080 1707 1764 -60080 1752 1766 -60080 1854 1437 -60080 1890 1519 -60080 1660 1692 -60080 1825 1519 -60080 1546 1548 -60080 1778 1920 -60080 1664 1808 -60080 1538 1524 -60080 1512 1531 -60080 1692 1767 -60080 1698 1707 -60080 1871 1517 -60080 1651 1703 -60080 1650 1668 -60100 1537 1703 -60100 1541 1901 -60100 1545 1528 -60100 1547 1756 -60100 1572 1914 -60100 1585 1752 -60100 1592 1471 -60100 1598 1648 -60100 1599 1474 -60100 1599 1923 -60100 1599 1893 -60100 1601 1458 -60100 1602 1731 -60100 1602 1613 -60100 1613 1535 -60100 1619 1441 -60100 1622 1917 -60100 1622 1703 -60100 1625 1471 -60100 1628 1688 -60100 1642 1854 -60100 1655 1482 -60100 1660 1767 -60100 1670 1877 -60100 1673 1460 -60100 1676 1731 -60100 1678 1919 -60100 1684 1798 -60100 1688 1694 -60100 1691 1901 -60100 1711 1877 -60100 1747 1460 -60100 1749 1752 -60100 1749 1531 -60100 1749 1757 -60100 1749 1766 -60100 1890 1490 -60100 1905 1526 -60100 1923 1484 -60100 1433 1503 -60100 1438 1517 -60100 1476 1496 -60100 1503 1535 -60100 1531 1533 -60100 1541 1691 -60100 1547 1664 -60100 1599 1775 -60100 1641 1673 -60100 1645 1756 -60100 1652 1747 -60100 1655 1835 -60100 1655 1893 -60100 1698 1764 -60100 1707 1764 -60100 1752 1766 -60100 1825 1890 -60100 1825 1490 -60100 1854 1437 -60100 1890 1519 -60100 1490 1519 -60100 1660 1692 -60100 1825 1519 -60100 1485 1529 -60100 1546 1548 -60100 1778 1920 -60100 1664 1808 -60100 1538 1524 -60100 1574 1439 -60100 1512 1531 -60100 1692 1767 -60100 1598 1696 -60100 1698 1707 -60100 1871 1517 -60100 1725 1462 -60100 1651 1703 -60100 1650 1668 -60120 1541 1691 -60120 1541 1678 -60120 1544 1510 -60120 1545 1498 -60120 1547 1664 -60120 1547 1808 -60120 1547 1602 -60120 1547 1850 -60120 1549 1525 -60120 1550 1641 -60120 1550 1773 -60120 1555 1531 -60120 1562 1585 -60120 1562 1766 -60120 1563 1592 -60120 1570 1655 -60120 1579 1706 -60120 1579 1898 -60120 1582 1872 -60120 1585 1749 -60120 1585 1766 -60120 1599 1774 -60120 1599 1775 -60120 1641 1673 -60120 1641 1747 -60120 1641 1460 -60120 1645 1756 -60120 1652 1747 -60120 1655 1835 -60120 1655 1893 -60120 1659 1853 -60120 1661 1747 -60120 1670 1912 -60120 1673 1747 -60120 1676 1831 -60120 1681 1731 -60120 1698 1764 -60120 1707 1764 -60120 1707 1794 -60120 1725 1811 -60120 1749 1853 -60120 1752 1757 -60120 1752 1766 -60120 1779 1903 -60120 1789 1902 -60120 1825 1890 -60120 1825 1490 -60120 1841 1901 -60120 1853 1531 -60120 1854 1437 -60120 1884 1890 -60120 1890 1519 -60120 1893 1474 -60120 1490 1519 -60120 1545 1626 -60120 1579 1828 -60120 1599 1887 -60120 1600 1825 -60120 1648 1696 -60120 1655 1785 -60120 1660 1692 -60120 1825 1519 -60120 1485 1529 -60120 1546 1548 -60120 1778 1920 -60120 1664 1808 -60120 1538 1524 -60120 1574 1439 -60120 1890 1479 -60120 1512 1531 -60120 1692 1767 -60120 1598 1696 -60120 1698 1707 -60120 1871 1517 -60120 1550 1572 -60120 1725 1462 -60120 1642 1437 -60120 1651 1703 -60120 1650 1668 -60140 1545 1626 -60140 1546 1554 -60140 1547 1613 -60140 1562 1452 -60140 1579 1828 -60140 1579 1527 -60140 1582 1623 -60140 1585 1428 -60140 1598 1648 -60140 1599 1887 -60140 1600 1825 -60140 1600 1519 -60140 1602 1698 -60140 1613 1649 -60140 1617 1652 -60140 1617 1821 -60140 1641 1707 -60140 1648 1696 -60140 1649 1681 -60140 1655 1785 -60140 1660 1692 -60140 1670 1877 -60140 1673 1698 -60140 1673 1707 -60140 1674 1825 -60140 1678 1906 -60140 1695 1831 -60140 1698 1794 -60140 1707 1821 -60140 1731 1470 -60140 1742 1520 -60140 1749 1757 -60140 1752 1428 -60140 1766 1428 -60140 1770 1811 -60140 1785 1484 -60140 1825 1519 -60140 1857 1441 -60140 1871 1890 -60140 1906 1533 -60140 1916 1917 -60140 1485 1529 -60140 1546 1548 -60140 1550 1645 -60140 1601 1458 -60140 1602 1641 -60140 1629 1458 -60140 1645 1914 -60140 1655 1886 -60140 1711 1479 -60140 1778 1920 -60140 1804 1884 -60140 1585 1752 -60140 1664 1808 -60140 1711 1890 -60140 1538 1524 -60140 1821 1441 -60140 1574 1439 -60140 1678 1919 -60140 1890 1479 -60140 1512 1531 -60140 1562 1622 -60140 1692 1767 -60140 1598 1696 -60140 1698 1707 -60140 1871 1517 -60140 1550 1572 -60140 1725 1462 -60140 1642 1437 -60140 1651 1703 -60140 1650 1668 -60160 1546 1548 -60160 1550 1773 -60160 1550 1645 -60160 1551 1269 -60160 1590 1831 -60160 1600 1674 -60160 1601 1458 -60160 1601 1629 -60160 1602 1641 -60160 1613 1698 -60160 1629 1458 -60160 1641 1850 -60160 1645 1914 -60160 1649 1664 -60160 1655 1875 -60160 1655 1717 -60160 1655 1886 -60160 1664 1707 -60160 1673 1747 -60160 1681 1707 -60160 1684 1489 -60160 1698 1850 -60160 1706 1501 -60160 1707 1850 -60160 1711 1479 -60160 1731 1455 -60160 1747 1914 -60160 1747 1773 -60160 1774 1786 -60160 1775 1434 -60160 1778 1920 -60160 1786 1887 -60160 1789 1902 -60160 1789 1471 -60160 1804 1884 -60160 1828 1527 -60160 1912 1916 -60160 1442 1455 -60160 1547 1649 -60160 1579 1706 -60160 1579 1501 -60160 1585 1752 -60160 1585 1766 -60160 1613 1707 -60160 1664 1808 -60160 1711 1890 -60160 1731 1761 -60160 1752 1766 -60160 1889 1484 -60160 1470 1533 -60160 1538 1524 -60160 1547 1664 -60160 1660 1767 -60160 1821 1441 -60160 1898 1477 -60160 1574 1439 -60160 1678 1919 -60160 1890 1479 -60160 1512 1531 -60160 1562 1622 -60160 1692 1767 -60160 1598 1696 -60160 1655 1868 -60160 1698 1707 -60160 1840 1489 -60160 1871 1517 -60160 1918 1475 -60160 1550 1572 -60160 1725 1462 -60160 1642 1437 -60160 1651 1703 -60160 1841 1901 -60160 1650 1668 -60180 1547 1649 -60180 1547 1828 -60180 1562 1505 -60180 1573 1452 -60180 1579 1706 -60180 1579 1501 -60180 1585 1752 -60180 1585 1766 -60180 1590 1698 -60180 1590 1707 -60180 1608 1470 -60180 1613 1707 -60180 1619 1681 -60180 1619 1756 -60180 1641 1914 -60180 1648 1696 -60180 1652 1747 -60180 1664 1808 -60180 1665 1894 -60180 1670 1711 -60180 1674 1825 -60180 1674 1519 -60180 1678 1901 -60180 1683 1880 -60180 1711 1890 -60180 1711 1908 -60180 1713 1762 -60180 1731 1761 -60180 1752 1766 -60180 1786 1873 -60180 1871 1505 -60180 1889 1484 -60180 1898 1522 -60180 1426 1501 -60180 1470 1533 -60180 1538 1524 -60180 1547 1664 -60180 1547 1707 -60180 1590 1649 -60180 1660 1767 -60180 1695 1831 -60180 1749 1892 -60180 1773 1914 -60180 1821 1441 -60180 1877 1908 -60180 1890 1908 -60180 1898 1477 -60180 1908 1479 -60180 1438 1517 -60180 1568 1623 -60180 1574 1439 -60180 1655 1873 -60180 1660 1692 -60180 1678 1919 -60180 1890 1479 -60180 1512 1531 -60180 1547 1698 -60180 1562 1622 -60180 1877 1890 -60180 1692 1767 -60180 1598 1696 -60180 1599 1889 -60180 1655 1868 -60180 1629 1911 -60180 1698 1707 -60180 1711 1877 -60180 1840 1489 -60180 1871 1517 -60180 1918 1475 -60180 1550 1572 -60180 1725 1462 -60180 1541 1678 -60180 1642 1437 -60180 1651 1703 -60180 1841 1901 -60180 1650 1668 -60200 1538 1524 -60200 1542 1619 -60200 1543 1528 -60200 1544 1438 -60200 1547 1664 -60200 1547 1707 -60200 1560 1835 -60200 1562 1619 -60200 1563 1476 -60200 1590 1649 -60200 1602 1617 -60200 1602 1483 -60200 1606 1622 -60200 1619 1872 -60200 1619 1622 -60200 1649 1664 -60200 1660 1767 -60200 1664 1698 -60200 1673 1747 -60200 1676 1831 -60200 1695 1831 -60200 1725 1490 -60200 1749 1892 -60200 1749 1477 -60200 1752 1527 -60200 1761 1831 -60200 1764 1441 -60200 1773 1914 -60200 1773 1828 -60200 1789 1504 -60200 1789 1917 -60200 1821 1441 -60200 1825 1519 -60200 1831 1530 -60200 1835 1915 -60200 1853 1471 -60200 1871 1908 -60200 1875 1887 -60200 1877 1908 -60200 1890 1908 -60200 1892 1920 -60200 1892 1505 -60200 1898 1477 -60200 1898 1527 -60200 1908 1479 -60200 1912 1496 -60200 1438 1517 -60200 1546 1548 -60200 1568 1623 -60200 1574 1439 -60200 1655 1873 -60200 1660 1692 -60200 1664 1831 -60200 1676 1761 -60200 1678 1919 -60200 1707 1808 -60200 1752 1522 -60200 1766 1892 -60200 1789 1908 -60200 1868 1873 -60200 1890 1479 -60200 1512 1531 -60200 1541 1906 -60200 1547 1698 -60200 1562 1622 -60200 1695 1761 -60200 1877 1890 -60200 1577 1531 -60200 1692 1767 -60200 1892 1477 -60200 1598 1696 -60200 1599 1889 -60200 1655 1868 -60200 1834 1863 -60200 1629 1911 -60200 1698 1707 -60200 1711 1877 -60200 1840 1489 -60200 1871 1517 -60200 1912 1916 -60200 1918 1475 -60200 1550 1572 -60200 1725 1462 -60200 1698 1808 -60200 1541 1678 -60200 1642 1437 -60200 1651 1703 -60200 1841 1901 -60200 1650 1668 -60220 1546 1548 -60220 1568 1623 -60220 1574 1439 -60220 1576 1752 -60220 1585 1522 -60220 1585 1766 -60220 1587 1634 -60220 1592 1471 -60220 1619 1871 -60220 1655 1873 -60220 1655 1786 -60220 1655 1886 -60220 1660 1692 -60220 1664 1692 -60220 1664 1831 -60220 1665 1894 -60220 1676 1761 -60220 1678 1919 -60220 1683 1880 -60220 1707 1808 -60220 1725 1747 -60220 1747 1845 -60220 1752 1522 -60220 1752 1455 -60220 1756 1466 -60220 1766 1507 -60220 1766 1892 -60220 1789 1908 -60220 1789 1517 -60220 1831 1448 -60220 1831 1917 -60220 1868 1873 -60220 1890 1479 -60220 1908 1517 -60220 1431 1516 -60220 1441 1487 -60220 1512 1531 -60220 1541 1906 -60220 1547 1698 -60220 1562 1622 -60220 1617 1857 -60220 1676 1731 -60220 1695 1761 -60220 1718 1889 -60220 1877 1890 -60220 1892 1522 -60220 1577 1531 -60220 1601 1458 -60220 1655 1865 -60220 1692 1767 -60220 1752 1766 -60220 1892 1477 -60220 1507 1522 -60220 1598 1696 -60220 1599 1889 -60220 1599 1492 -60220 1599 1718 -60220 1655 1868 -60220 1749 1757 -60220 1573 1452 -60220 1834 1863 -60220 1850 1441 -60220 1617 1764 -60220 1629 1911 -60220 1698 1707 -60220 1711 1877 -60220 1585 1752 -60220 1676 1775 -60220 1840 1489 -60220 1871 1517 -60220 1912 1916 -60220 1918 1475 -60220 1550 1572 -60220 1725 1462 -60220 1698 1808 -60220 1541 1678 -60220 1642 1437 -60220 1651 1703 -60220 1841 1901 -60220 1650 1668 -60240 1541 1906 -60240 1547 1698 -60240 1547 1707 -60240 1562 1622 -60240 1565 1688 -60240 1585 1831 -60240 1606 1884 -60240 1617 1857 -60240 1641 1470 -60240 1651 1766 -60240 1655 1829 -60240 1655 1774 -60240 1670 1711 -60240 1676 1887 -60240 1676 1731 -60240 1695 1761 -60240 1703 1766 -60240 1718 1889 -60240 1725 1487 -60240 1731 1887 -60240 1752 1505 -60240 1752 1831 -60240 1774 1492 -60240 1785 1470 -60240 1831 1477 -60240 1866 1871 -60240 1877 1890 -60240 1877 1479 -60240 1890 1908 -60240 1890 1517 -60240 1892 1522 -60240 1908 1479 -60240 1919 1473 -60240 1538 1524 -60240 1566 1467 -60240 1577 1531 -60240 1601 1458 -60240 1655 1865 -60240 1659 1727 -60240 1673 1747 -60240 1692 1767 -60240 1752 1766 -60240 1804 1510 -60240 1889 1492 -60240 1892 1898 -60240 1892 1477 -60240 1484 1492 -60240 1507 1522 -60240 1598 1696 -60240 1599 1889 -60240 1599 1492 -60240 1599 1718 -60240 1655 1868 -60240 1749 1757 -60240 1877 1908 -60240 1573 1452 -60240 1711 1908 -60240 1752 1501 -60240 1773 1835 -60240 1834 1863 -60240 1850 1441 -60240 1617 1764 -60240 1629 1911 -60240 1698 1707 -60240 1711 1877 -60240 1585 1752 -60240 1676 1775 -60240 1840 1489 -60240 1871 1517 -60240 1912 1916 -60240 1918 1475 -60240 1550 1572 -60240 1725 1462 -60240 1698 1808 -60240 1541 1678 -60240 1642 1437 -60240 1651 1703 -60240 1841 1901 -60240 1598 1635 -60240 1650 1668 -60260 1537 1912 -60260 1538 1524 -60260 1560 1664 -60260 1566 1467 -60260 1574 1439 -60260 1577 1531 -60260 1590 1473 -60260 1590 1649 -60260 1600 1674 -60260 1601 1458 -60260 1622 1879 -60260 1648 1696 -60260 1655 1865 -60260 1659 1727 -60260 1660 1767 -60260 1664 1835 -60260 1669 1754 -60260 1673 1747 -60260 1674 1519 -60260 1678 1717 -60260 1683 1464 -60260 1691 1906 -60260 1692 1767 -60260 1713 1762 -60260 1717 1775 -60260 1718 1492 -60260 1718 1774 -60260 1752 1766 -60260 1752 1527 -60260 1766 1527 -60260 1804 1510 -60260 1831 1522 -60260 1857 1470 -60260 1866 1908 -60260 1871 1527 -60260 1889 1492 -60260 1892 1898 -60260 1892 1477 -60260 1449 1512 -60260 1470 1483 -60260 1484 1492 -60260 1501 1505 -60260 1501 1522 -60260 1507 1522 -60260 1517 1527 -60260 1537 1689 -60260 1543 1528 -60260 1546 1548 -60260 1598 1696 -60260 1599 1889 -60260 1599 1492 -60260 1599 1718 -60260 1655 1868 -60260 1747 1465 -60260 1749 1757 -60260 1766 1871 -60260 1802 1865 -60260 1831 1505 -60260 1835 1894 -60260 1877 1908 -60260 1889 1484 -60260 1573 1452 -60260 1711 1908 -60260 1752 1501 -60260 1773 1835 -60260 1834 1863 -60260 1850 1441 -60260 1512 1531 -60260 1617 1764 -60260 1629 1911 -60260 1676 1498 -60260 1678 1906 -60260 1698 1707 -60260 1711 1877 -60260 1485 1529 -60260 1585 1752 -60260 1599 1484 -60260 1676 1775 -60260 1840 1489 -60260 1871 1517 -60260 1912 1916 -60260 1918 1475 -60260 1550 1572 -60260 1449 1531 -60260 1725 1462 -60260 1775 1498 -60260 1547 1590 -60260 1641 1664 -60260 1698 1808 -60260 1541 1678 -60260 1660 1692 -60260 1642 1437 -60260 1651 1703 -60260 1841 1901 -60260 1598 1635 -60260 1650 1668 -60280 1537 1689 -60280 1543 1528 -60280 1546 1548 -60280 1562 1875 -60280 1570 1731 -60280 1572 1470 -60280 1583 1890 -60280 1585 1517 -60280 1585 1879 -60280 1598 1696 -60280 1599 1889 -60280 1599 1734 -60280 1599 1774 -60280 1599 1492 -60280 1599 1718 -60280 1600 1890 -60280 1600 1519 -60280 1622 1875 -60280 1629 1458 -60280 1641 1919 -60280 1644 1473 -60280 1652 1725 -60280 1655 1868 -60280 1655 1734 -60280 1676 1480 -60280 1699 1496 -60280 1703 1434 -60280 1703 1501 -60280 1711 1479 -60280 1747 1465 -60280 1749 1757 -60280 1761 1775 -60280 1766 1871 -60280 1767 1855 -60280 1774 1889 -60280 1802 1865 -60280 1829 1886 -60280 1831 1505 -60280 1835 1894 -60280 1845 1437 -60280 1875 1448 -60280 1877 1908 -60280 1889 1484 -60280 1568 1582 -60280 1573 1452 -60280 1695 1761 -60280 1711 1908 -60280 1717 1906 -60280 1752 1501 -60280 1773 1835 -60280 1829 1873 -60280 1834 1863 -60280 1850 1441 -60280 1854 1527 -60280 1898 1477 -60280 1512 1531 -60280 1599 1907 -60280 1617 1764 -60280 1629 1911 -60280 1655 1907 -60280 1676 1498 -60280 1678 1906 -60280 1698 1707 -60280 1711 1877 -60280 1485 1529 -60280 1562 1622 -60280 1585 1752 -60280 1599 1484 -60280 1676 1775 -60280 1766 1879 -60280 1840 1489 -60280 1871 1517 -60280 1912 1916 -60280 1918 1475 -60280 1550 1572 -60280 1449 1531 -60280 1725 1462 -60280 1775 1498 -60280 1547 1590 -60280 1641 1664 -60280 1698 1808 -60280 1707 1808 -60280 1541 1678 -60280 1660 1692 -60280 1642 1437 -60280 1651 1703 -60280 1547 1649 -60280 1841 1901 -60280 1608 1894 -60280 1598 1635 -60280 1650 1668 -60300 1547 1644 -60300 1550 1887 -60300 1563 1592 -60300 1564 1470 -60300 1568 1582 -60300 1573 1452 -60300 1574 1439 -60300 1579 1761 -60300 1583 1519 -60300 1585 1501 -60300 1587 1634 -60300 1601 1831 -60300 1623 1706 -60300 1670 1908 -60300 1676 1531 -60300 1692 1887 -60300 1695 1761 -60300 1711 1866 -60300 1711 1908 -60300 1711 1890 -60300 1717 1906 -60300 1747 1831 -60300 1752 1501 -60300 1752 1879 -60300 1757 1501 -60300 1761 1480 -60300 1766 1501 -60300 1773 1835 -60300 1804 1510 -60300 1829 1873 -60300 1834 1863 -60300 1850 1441 -60300 1854 1527 -60300 1857 1887 -60300 1866 1890 -60300 1877 1890 -60300 1879 1501 -60300 1890 1908 -60300 1898 1477 -60300 1501 1517 -60300 1512 1531 -60300 1566 1467 -60300 1572 1887 -60300 1599 1907 -60300 1617 1764 -60300 1629 1911 -60300 1645 1756 -60300 1655 1907 -60300 1670 1711 -60300 1676 1498 -60300 1678 1906 -60300 1692 1731 -60300 1698 1707 -60300 1711 1877 -60300 1866 1908 -60300 1485 1529 -60300 1507 1522 -60300 1562 1622 -60300 1585 1752 -60300 1599 1484 -60300 1600 1674 -60300 1676 1775 -60300 1766 1879 -60300 1840 1489 -60300 1871 1517 -60300 1912 1916 -60300 1918 1475 -60300 1550 1572 -60300 1655 1774 -60300 1898 1920 -60300 1449 1531 -60300 1655 1484 -60300 1725 1462 -60300 1775 1498 -60300 1547 1590 -60300 1641 1664 -60300 1698 1808 -60300 1707 1808 -60300 1752 1766 -60300 1541 1678 -60300 1660 1692 -60300 1642 1437 -60300 1857 1441 -60300 1651 1703 -60300 1547 1649 -60300 1652 1747 -60300 1841 1901 -60300 1608 1894 -60300 1598 1635 -60300 1650 1668 -60320 1566 1467 -60320 1572 1887 -60320 1574 1734 -60320 1579 1717 -60320 1599 1907 -60320 1617 1835 -60320 1617 1764 -60320 1626 1742 -60320 1628 1871 -60320 1629 1911 -60320 1645 1756 -60320 1648 1696 -60320 1655 1907 -60320 1660 1731 -60320 1664 1845 -60320 1664 1773 -60320 1670 1711 -60320 1673 1747 -60320 1676 1498 -60320 1678 1906 -60320 1678 1901 -60320 1692 1731 -60320 1692 1863 -60320 1698 1707 -60320 1711 1877 -60320 1711 1479 -60320 1713 1762 -60320 1731 1835 -60320 1764 1857 -60320 1764 1835 -60320 1773 1845 -60320 1785 1811 -60320 1789 1902 -60320 1804 1438 -60320 1835 1441 -60320 1835 1857 -60320 1866 1908 -60320 1866 1527 -60320 1877 1908 -60320 1887 1437 -60320 1890 1519 -60320 1894 1914 -60320 1904 1501 -60320 1908 1519 -60320 1485 1529 -60320 1485 1531 -60320 1507 1522 -60320 1562 1622 -60320 1585 1752 -60320 1599 1484 -60320 1600 1674 -60320 1659 1727 -60320 1676 1775 -60320 1718 1851 -60320 1764 1850 -60320 1766 1879 -60320 1835 1887 -60320 1840 1489 -60320 1855 1480 -60320 1871 1517 -60320 1912 1916 -60320 1918 1475 -60320 1473 1533 -60320 1550 1572 -60320 1599 1655 -60320 1617 1857 -60320 1617 1850 -60320 1648 1749 -60320 1655 1774 -60320 1850 1857 -60320 1898 1920 -60320 1449 1531 -60320 1655 1484 -60320 1725 1462 -60320 1775 1498 -60320 1547 1590 -60320 1641 1664 -60320 1698 1808 -60320 1707 1808 -60320 1752 1766 -60320 1541 1678 -60320 1660 1692 -60320 1642 1437 -60320 1857 1441 -60320 1651 1703 -60320 1674 1890 -60320 1547 1649 -60320 1613 1644 -60320 1652 1747 -60320 1841 1901 -60320 1608 1894 -60320 1598 1635 -60320 1650 1668 -60340 1546 1548 -60340 1562 1622 -60340 1582 1656 -60340 1585 1752 -60340 1591 1858 -60340 1599 1484 -60340 1600 1890 -60340 1600 1674 -60340 1601 1458 -60340 1602 1811 -60340 1602 1725 -60340 1617 1664 -60340 1650 1825 -60340 1651 1897 -60340 1659 1727 -60340 1664 1764 -60340 1668 1825 -60340 1676 1775 -60340 1711 1819 -60340 1711 1908 -60340 1718 1851 -60340 1761 1775 -60340 1764 1850 -60340 1766 1879 -60340 1767 1787 -60340 1774 1484 -60340 1828 1465 -60340 1835 1887 -60340 1840 1489 -60340 1855 1480 -60340 1866 1877 -60340 1871 1517 -60340 1877 1527 -60340 1898 1477 -60340 1908 1527 -60340 1912 1916 -60340 1918 1475 -60340 1433 1448 -60340 1473 1533 -60340 1483 1485 -60340 1501 1517 -60340 1550 1572 -60340 1590 1649 -60340 1599 1655 -60340 1617 1857 -60340 1617 1850 -60340 1628 1875 -60340 1648 1749 -60340 1655 1774 -60340 1706 1501 -60340 1850 1857 -60340 1898 1920 -60340 1449 1531 -60340 1569 1742 -60340 1587 1634 -60340 1617 1441 -60340 1655 1786 -60340 1655 1484 -60340 1695 1761 -60340 1725 1462 -60340 1775 1498 -60340 1775 1439 -60340 1547 1590 -60340 1623 1501 -60340 1641 1664 -60340 1698 1808 -60340 1707 1808 -60340 1752 1766 -60340 1541 1678 -60340 1660 1692 -60340 1676 1439 -60340 1642 1437 -60340 1857 1441 -60340 1651 1703 -60340 1674 1890 -60340 1547 1649 -60340 1613 1644 -60340 1652 1747 -60340 1841 1901 -60340 1608 1894 -60340 1598 1635 -60340 1650 1668 -60360 1547 1713 -60360 1550 1572 -60360 1550 1622 -60360 1562 1692 -60360 1566 1467 -60360 1572 1731 -60360 1573 1725 -60360 1590 1649 -60360 1599 1655 -60360 1602 1452 -60360 1617 1857 -60360 1617 1850 -60360 1617 1731 -60360 1628 1875 -60360 1641 1485 -60360 1645 1756 -60360 1648 1897 -60360 1648 1749 -60360 1655 1774 -60360 1664 1731 -60360 1698 1713 -60360 1706 1501 -60360 1713 1533 -60360 1731 1441 -60360 1731 1857 -60360 1749 1897 -60360 1775 1513 -60360 1804 1510 -60360 1850 1857 -60360 1887 1437 -60360 1894 1529 -60360 1898 1920 -60360 1906 1513 -60360 1914 1533 -60360 1437 1496 -60360 1439 1513 -60360 1449 1531 -60360 1496 1505 -60360 1507 1524 -60360 1541 1906 -60360 1569 1742 -60360 1587 1634 -60360 1600 1825 -60360 1617 1441 -60360 1655 1786 -60360 1655 1484 -60360 1664 1773 -60360 1676 1498 -60360 1678 1906 -60360 1683 1897 -60360 1695 1761 -60360 1725 1462 -60360 1752 1879 -60360 1775 1498 -60360 1775 1439 -60360 1789 1902 -60360 1877 1908 -60360 1547 1590 -60360 1623 1501 -60360 1641 1664 -60360 1698 1808 -60360 1698 1717 -60360 1707 1808 -60360 1727 1779 -60360 1752 1766 -60360 1439 1498 -60360 1541 1678 -60360 1660 1692 -60360 1835 1437 -60360 1438 1519 -60360 1676 1439 -60360 1804 1438 -60360 1585 1766 -60360 1642 1437 -60360 1857 1441 -60360 1651 1703 -60360 1674 1890 -60360 1547 1649 -60360 1613 1644 -60360 1622 1731 -60360 1829 1886 -60360 1652 1747 -60360 1841 1901 -60360 1608 1894 -60360 1754 1821 -60360 1598 1635 -60360 1650 1668 -60380 1541 1906 -60380 1564 1619 -60380 1569 1742 -60380 1587 1634 -60380 1600 1825 -60380 1600 1890 -60380 1602 1725 -60380 1617 1441 -60380 1622 1845 -60380 1623 1706 -60380 1626 1742 -60380 1655 1786 -60380 1655 1484 -60380 1659 1727 -60380 1664 1773 -60380 1676 1498 -60380 1678 1906 -60380 1683 1880 -60380 1683 1897 -60380 1695 1761 -60380 1696 1897 -60380 1707 1717 -60380 1711 1908 -60380 1711 1877 -60380 1717 1808 -60380 1725 1465 -60380 1725 1462 -60380 1731 1773 -60380 1752 1879 -60380 1775 1498 -60380 1775 1439 -60380 1789 1902 -60380 1798 1840 -60380 1798 1485 -60380 1819 1897 -60380 1829 1873 -60380 1875 1470 -60380 1877 1908 -60380 1912 1916 -60380 1916 1491 -60380 1918 1475 -60380 1428 1431 -60380 1547 1590 -60380 1623 1501 -60380 1641 1664 -60380 1676 1775 -60380 1698 1808 -60380 1698 1717 -60380 1698 1535 -60380 1707 1808 -60380 1727 1779 -60380 1752 1766 -60380 1835 1887 -60380 1439 1498 -60380 1485 1529 -60380 1522 1524 -60380 1541 1678 -60380 1554 1853 -60380 1660 1692 -60380 1835 1437 -60380 1438 1519 -60380 1676 1439 -60380 1804 1438 -60380 1585 1766 -60380 1642 1437 -60380 1546 1548 -60380 1857 1441 -60380 1601 1458 -60380 1651 1703 -60380 1674 1890 -60380 1698 1707 -60380 1547 1649 -60380 1613 1644 -60380 1622 1731 -60380 1829 1886 -60380 1652 1747 -60380 1841 1901 -60380 1871 1517 -60380 1608 1894 -60380 1754 1821 -60380 1598 1635 -60380 1650 1668 -60400 1538 1522 -60400 1547 1590 -60400 1560 1526 -60400 1585 1438 -60400 1599 1774 -60400 1602 1798 -60400 1604 1858 -60400 1609 1908 -60400 1609 1877 -60400 1613 1513 -60400 1613 1845 -60400 1623 1501 -60400 1641 1664 -60400 1651 1749 -60400 1655 1721 -60400 1655 1774 -60400 1656 1501 -60400 1664 1771 -60400 1669 1754 -60400 1676 1775 -60400 1683 1464 -60400 1698 1808 -60400 1698 1717 -60400 1698 1535 -60400 1703 1749 -60400 1703 1455 -60400 1707 1808 -60400 1717 1830 -60400 1717 1535 -60400 1727 1779 -60400 1749 1819 -60400 1752 1766 -60400 1761 1439 -60400 1773 1473 -60400 1835 1887 -60400 1840 1489 -60400 1439 1498 -60400 1449 1531 -60400 1485 1529 -60400 1517 1525 -60400 1522 1524 -60400 1541 1678 -60400 1554 1853 -60400 1660 1692 -60400 1835 1437 -60400 1853 1470 -60400 1898 1517 -60400 1438 1519 -60400 1496 1505 -60400 1507 1522 -60400 1550 1513 -60400 1641 1771 -60400 1676 1439 -60400 1804 1438 -60400 1585 1752 -60400 1585 1766 -60400 1642 1437 -60400 1546 1548 -60400 1857 1441 -60400 1601 1458 -60400 1651 1703 -60400 1674 1890 -60400 1438 1510 -60400 1698 1707 -60400 1547 1649 -60400 1920 1517 -60400 1613 1644 -60400 1622 1731 -60400 1829 1886 -60400 1652 1747 -60400 1841 1901 -60400 1554 1470 -60400 1871 1517 -60400 1608 1894 -60400 1754 1821 -60400 1598 1635 -60400 1650 1668 -60420 1541 1698 -60420 1541 1678 -60420 1547 1808 -60420 1547 1717 -60420 1550 1473 -60420 1554 1853 -60420 1601 1911 -60420 1619 1673 -60420 1622 1771 -60420 1625 1875 -60420 1642 1835 -60420 1655 1786 -60420 1659 1779 -60420 1660 1692 -60420 1673 1866 -60420 1698 1480 -60420 1698 1855 -60420 1707 1480 -60420 1711 1908 -60420 1711 1877 -60420 1717 1808 -60420 1717 1775 -60420 1721 1786 -60420 1787 1851 -60420 1804 1510 -60420 1835 1496 -60420 1835 1437 -60420 1853 1470 -60420 1884 1438 -60420 1898 1920 -60420 1898 1517 -60420 1898 1477 -60420 1908 1916 -60420 1438 1519 -60420 1473 1513 -60420 1496 1505 -60420 1501 1525 -60420 1507 1522 -60420 1547 1775 -60420 1550 1513 -60420 1550 1572 -60420 1590 1513 -60420 1599 1721 -60420 1626 1742 -60420 1641 1771 -60420 1676 1841 -60420 1676 1439 -60420 1721 1774 -60420 1804 1438 -60420 1449 1512 -60420 1512 1531 -60420 1541 1906 -60420 1585 1752 -60420 1585 1766 -60420 1642 1437 -60420 1678 1906 -60420 1829 1873 -60420 1873 1886 -60420 1546 1548 -60420 1619 1866 -60420 1676 1498 -60420 1857 1441 -60420 1601 1458 -60420 1651 1703 -60420 1674 1890 -60420 1691 1906 -60420 1438 1510 -60420 1698 1707 -60420 1547 1649 -60420 1871 1920 -60420 1920 1517 -60420 1613 1644 -60420 1622 1731 -60420 1829 1886 -60420 1775 1808 -60420 1652 1747 -60420 1841 1901 -60420 1554 1470 -60420 1871 1517 -60420 1608 1894 -60420 1754 1821 -60420 1598 1635 -60420 1650 1668 -60440 1537 1522 -60440 1537 1524 -60440 1540 1625 -60440 1547 1775 -60440 1550 1513 -60440 1550 1572 -60440 1562 1764 -60440 1590 1513 -60440 1599 1721 -60440 1601 1495 -60440 1602 1828 -60440 1617 1835 -60440 1622 1462 -60440 1626 1742 -60440 1641 1771 -60440 1642 1887 -60440 1649 1775 -60440 1674 1825 -60440 1676 1841 -60440 1676 1718 -60440 1676 1439 -60440 1695 1761 -60440 1718 1749 -60440 1721 1774 -60440 1727 1779 -60440 1804 1438 -60440 1845 1480 -60440 1850 1441 -60440 1907 1513 -60440 1449 1512 -60440 1471 1487 -60440 1482 1498 -60440 1485 1529 -60440 1512 1531 -60440 1522 1524 -60440 1541 1906 -60440 1549 1525 -60440 1585 1752 -60440 1585 1766 -60440 1642 1437 -60440 1655 1816 -60440 1678 1906 -60440 1829 1873 -60440 1873 1886 -60440 1431 1516 -60440 1546 1548 -60440 1569 1742 -60440 1619 1866 -60440 1676 1498 -60440 1676 1482 -60440 1857 1441 -60440 1601 1458 -60440 1616 1462 -60440 1651 1703 -60440 1674 1890 -60440 1691 1906 -60440 1438 1510 -60440 1678 1710 -60440 1698 1707 -60440 1845 1434 -60440 1547 1649 -60440 1871 1920 -60440 1920 1517 -60440 1613 1644 -60440 1622 1731 -60440 1829 1886 -60440 1775 1808 -60440 1652 1747 -60440 1789 1902 -60440 1841 1901 -60440 1554 1470 -60440 1871 1517 -60440 1608 1894 -60440 1501 1527 -60440 1754 1821 -60440 1598 1635 -60440 1650 1668 -60460 1541 1906 -60460 1549 1525 -60460 1572 1473 -60460 1572 1773 -60460 1576 1689 -60460 1585 1752 -60460 1585 1766 -60460 1601 1911 -60460 1617 1441 -60460 1641 1462 -60460 1642 1437 -60460 1655 1816 -60460 1655 1786 -60460 1678 1906 -60460 1683 1897 -60460 1683 1858 -60460 1711 1487 -60460 1718 1855 -60460 1721 1882 -60460 1752 1766 -60460 1773 1473 -60460 1825 1510 -60460 1829 1873 -60460 1847 1517 -60460 1847 1871 -60460 1866 1496 -60460 1873 1886 -60460 1431 1516 -60460 1546 1548 -60460 1569 1742 -60460 1600 1825 -60460 1619 1866 -60460 1628 1485 -60460 1676 1498 -60460 1676 1482 -60460 1717 1808 -60460 1786 1882 -60460 1857 1441 -60460 1877 1908 -60460 1898 1477 -60460 1462 1533 -60460 1540 1875 -60460 1585 1884 -60460 1591 1858 -60460 1601 1458 -60460 1616 1462 -60460 1641 1533 -60460 1651 1703 -60460 1674 1890 -60460 1691 1906 -60460 1718 1889 -60460 1438 1510 -60460 1622 1513 -60460 1655 1721 -60460 1678 1710 -60460 1698 1707 -60460 1845 1434 -60460 1547 1649 -60460 1655 1774 -60460 1871 1920 -60460 1920 1517 -60460 1541 1678 -60460 1613 1644 -60460 1622 1731 -60460 1829 1886 -60460 1775 1808 -60460 1433 1519 -60460 1652 1747 -60460 1789 1902 -60460 1841 1901 -60460 1554 1470 -60460 1600 1438 -60460 1871 1517 -60460 1608 1894 -60460 1660 1692 -60460 1501 1527 -60460 1507 1522 -60460 1754 1821 -60460 1598 1635 -60460 1650 1668 -60480 1546 1548 -60480 1563 1487 -60480 1569 1742 -60480 1600 1825 -60480 1600 1890 -60480 1606 1477 -60480 1617 1857 -60480 1619 1866 -60480 1626 1742 -60480 1628 1485 -60480 1642 1866 -60480 1652 1811 -60480 1659 1779 -60480 1670 1877 -60480 1676 1498 -60480 1676 1482 -60480 1676 1439 -60480 1695 1761 -60480 1711 1908 -60480 1711 1877 -60480 1717 1808 -60480 1717 1855 -60480 1717 1775 -60480 1718 1492 -60480 1735 1428 -60480 1752 1914 -60480 1752 1527 -60480 1786 1882 -60480 1857 1441 -60480 1877 1908 -60480 1879 1522 -60480 1898 1477 -60480 1912 1916 -60480 1918 1475 -60480 1462 1533 -60480 1476 1487 -60480 1485 1529 -60480 1540 1875 -60480 1547 1775 -60480 1585 1884 -60480 1591 1858 -60480 1601 1458 -60480 1616 1462 -60480 1641 1533 -60480 1649 1775 -60480 1651 1703 -60480 1674 1890 -60480 1691 1906 -60480 1718 1889 -60480 1847 1897 -60480 1438 1510 -60480 1439 1482 -60480 1439 1498 -60480 1482 1498 -60480 1622 1513 -60480 1655 1721 -60480 1678 1710 -60480 1698 1707 -60480 1731 1513 -60480 1845 1434 -60480 1522 1524 -60480 1547 1649 -60480 1619 1496 -60480 1655 1774 -60480 1825 1438 -60480 1871 1920 -60480 1920 1517 -60480 1541 1678 -60480 1613 1644 -60480 1622 1731 -60480 1829 1886 -60480 1775 1808 -60480 1433 1519 -60480 1449 1531 -60480 1652 1747 -60480 1789 1902 -60480 1841 1901 -60480 1554 1470 -60480 1600 1438 -60480 1871 1517 -60480 1608 1894 -60480 1550 1572 -60480 1660 1692 -60480 1501 1527 -60480 1507 1522 -60480 1754 1821 -60480 1598 1635 -60480 1650 1668 -60500 1537 1847 -60500 1540 1875 -60500 1547 1855 -60500 1547 1775 -60500 1549 1914 -60500 1562 1839 -60500 1585 1884 -60500 1591 1858 -60500 1591 1847 -60500 1599 1816 -60500 1599 1721 -60500 1600 1650 -60500 1601 1458 -60500 1616 1462 -60500 1625 1629 -60500 1641 1533 -60500 1644 1717 -60500 1649 1775 -60500 1651 1703 -60500 1655 1882 -60500 1674 1890 -60500 1691 1906 -60500 1692 1535 -60500 1698 1886 -60500 1718 1889 -60500 1761 1841 -60500 1771 1480 -60500 1847 1897 -60500 1847 1858 -60500 1847 1879 -60500 1858 1897 -60500 1858 1477 -60500 1887 1437 -60500 1897 1477 -60500 1431 1516 -60500 1438 1510 -60500 1439 1482 -60500 1439 1498 -60500 1482 1498 -60500 1582 1527 -60500 1622 1513 -60500 1655 1816 -60500 1655 1721 -60500 1678 1710 -60500 1698 1707 -60500 1727 1779 -60500 1731 1513 -60500 1766 1884 -60500 1845 1434 -60500 1522 1524 -60500 1544 1890 -60500 1546 1431 -60500 1547 1649 -60500 1619 1496 -60500 1655 1774 -60500 1825 1438 -60500 1825 1510 -60500 1871 1920 -60500 1920 1517 -60500 1541 1678 -60500 1613 1644 -60500 1622 1731 -60500 1829 1886 -60500 1840 1489 -60500 1585 1766 -60500 1775 1808 -60500 1829 1873 -60500 1433 1519 -60500 1449 1531 -60500 1652 1747 -60500 1789 1902 -60500 1841 1901 -60500 1554 1470 -60500 1600 1438 -60500 1871 1517 -60500 1608 1894 -60500 1550 1572 -60500 1660 1692 -60500 1501 1527 -60500 1507 1522 -60500 1754 1821 -60500 1598 1635 -60500 1650 1668 -60520 1537 1728 -60520 1551 1894 -60520 1576 1752 -60520 1582 1501 -60520 1582 1527 -60520 1583 1525 -60520 1591 1897 -60520 1602 1617 -60520 1622 1480 -60520 1622 1513 -60520 1655 1796 -60520 1655 1881 -60520 1655 1816 -60520 1655 1721 -60520 1659 1779 -60520 1659 1903 -60520 1676 1498 -60520 1678 1901 -60520 1678 1710 -60520 1688 1728 -60520 1698 1707 -60520 1717 1480 -60520 1727 1779 -60520 1731 1513 -60520 1742 1517 -60520 1742 1871 -60520 1752 1858 -60520 1752 1501 -60520 1752 1902 -60520 1766 1884 -60520 1766 1527 -60520 1786 1881 -60520 1789 1858 -60520 1804 1825 -60520 1835 1919 -60520 1845 1434 -60520 1881 1882 -60520 1522 1524 -60520 1544 1890 -60520 1546 1431 -60520 1547 1649 -60520 1550 1773 -60520 1566 1467 -60520 1599 1774 -60520 1619 1496 -60520 1619 1866 -60520 1628 1485 -60520 1655 1774 -60520 1655 1807 -60520 1676 1482 -60520 1718 1503 -60520 1819 1920 -60520 1825 1438 -60520 1825 1510 -60520 1871 1920 -60520 1877 1908 -60520 1884 1525 -60520 1920 1517 -60520 1541 1678 -60520 1613 1644 -60520 1622 1731 -60520 1805 1888 -60520 1828 1452 -60520 1829 1886 -60520 1840 1489 -60520 1544 1674 -60520 1585 1766 -60520 1775 1808 -60520 1829 1873 -60520 1480 1513 -60520 1433 1519 -60520 1449 1531 -60520 1652 1747 -60520 1789 1902 -60520 1841 1901 -60520 1554 1470 -60520 1599 1796 -60520 1600 1438 -60520 1871 1517 -60520 1608 1894 -60520 1550 1572 -60520 1660 1692 -60520 1501 1527 -60520 1507 1522 -60520 1754 1821 -60520 1598 1635 -60520 1650 1668 -60540 1541 1710 -60540 1543 1528 -60540 1544 1890 -60540 1546 1431 -60540 1547 1649 -60540 1550 1773 -60540 1566 1467 -60540 1582 1728 -60540 1582 1847 -60540 1585 1752 -60540 1585 1689 -60540 1585 1434 -60540 1585 1525 -60540 1591 1890 -60540 1591 1858 -60540 1599 1774 -60540 1616 1462 -60540 1619 1496 -60540 1619 1866 -60540 1628 1485 -60540 1655 1774 -60540 1655 1807 -60540 1676 1482 -60540 1711 1908 -60540 1718 1503 -60540 1728 1847 -60540 1735 1428 -60540 1752 1766 -60540 1752 1487 -60540 1752 1527 -60540 1752 1784 -60540 1761 1841 -60540 1766 1525 -60540 1766 1845 -60540 1786 1882 -60540 1808 1855 -60540 1819 1920 -60540 1825 1438 -60540 1825 1510 -60540 1866 1496 -60540 1871 1920 -60540 1871 1425 -60540 1873 1886 -60540 1877 1908 -60540 1884 1525 -60540 1897 1487 -60540 1920 1517 -60540 1541 1678 -60540 1613 1644 -60540 1622 1731 -60540 1699 1904 -60540 1805 1888 -60540 1828 1452 -60540 1829 1886 -60540 1840 1489 -60540 1858 1890 -60540 1920 1425 -60540 1463 1485 -60540 1544 1674 -60540 1585 1766 -60540 1645 1756 -60540 1689 1752 -60540 1775 1808 -60540 1829 1873 -60540 1480 1513 -60540 1651 1703 -60540 1775 1855 -60540 1857 1441 -60540 1433 1519 -60540 1449 1531 -60540 1652 1747 -60540 1789 1902 -60540 1898 1477 -60540 1674 1890 -60540 1841 1901 -60540 1554 1470 -60540 1599 1796 -60540 1600 1438 -60540 1655 1512 -60540 1871 1517 -60540 1608 1894 -60540 1648 1696 -60540 1550 1572 -60540 1660 1692 -60540 1501 1527 -60540 1507 1522 -60540 1754 1821 -60540 1598 1635 -60540 1650 1668 -60560 1541 1678 -60560 1562 1660 -60560 1573 1828 -60560 1582 1425 -60560 1587 1634 -60560 1591 1845 -60560 1591 1519 -60560 1613 1644 -60560 1622 1731 -60560 1649 1676 -60560 1683 1734 -60560 1689 1884 -60560 1689 1525 -60560 1699 1904 -60560 1742 1487 -60560 1779 1903 -60560 1805 1888 -60560 1828 1452 -60560 1829 1886 -60560 1835 1858 -60560 1840 1489 -60560 1858 1890 -60560 1887 1437 -60560 1920 1425 -60560 1463 1485 -60560 1544 1674 -60560 1585 1766 -60560 1591 1434 -60560 1600 1897 -60560 1613 1641 -60560 1613 1894 -60560 1645 1756 -60560 1669 1754 -60560 1678 1710 -60560 1689 1752 -60560 1711 1877 -60560 1775 1808 -60560 1829 1873 -60560 1480 1513 -60560 1651 1703 -60560 1752 1884 -60560 1775 1855 -60560 1857 1441 -60560 1433 1519 -60560 1449 1531 -60560 1652 1747 -60560 1789 1902 -60560 1898 1477 -60560 1522 1524 -60560 1546 1548 -60560 1674 1890 -60560 1841 1901 -60560 1554 1470 -60560 1599 1796 -60560 1655 1882 -60560 1600 1438 -60560 1655 1512 -60560 1871 1517 -60560 1608 1894 -60560 1648 1696 -60560 1550 1572 -60560 1660 1692 -60560 1501 1527 -60560 1507 1522 -60560 1754 1821 -60560 1598 1635 -60560 1650 1668 -60580 1541 1649 -60580 1541 1906 -60580 1543 1531 -60580 1544 1674 -60580 1547 1649 -60580 1550 1622 -60580 1552 1676 -60580 1583 1897 -60580 1585 1766 -60580 1591 1434 -60580 1600 1897 -60580 1601 1458 -60580 1613 1641 -60580 1613 1676 -60580 1613 1894 -60580 1613 1535 -60580 1614 1897 -60580 1619 1773 -60580 1628 1437 -60580 1641 1676 -60580 1645 1756 -60580 1659 1779 -60580 1659 1727 -60580 1669 1754 -60580 1678 1710 -60580 1688 1477 -60580 1689 1752 -60580 1711 1908 -60580 1711 1877 -60580 1764 1448 -60580 1766 1858 -60580 1775 1808 -60580 1786 1882 -60580 1808 1855 -60580 1819 1920 -60580 1825 1897 -60580 1825 1890 -60580 1825 1438 -60580 1829 1873 -60580 1842 1471 -60580 1845 1858 -60580 1847 1501 -60580 1847 1487 -60580 1854 1487 -60580 1857 1868 -60580 1858 1897 -60580 1858 1519 -60580 1862 1437 -60580 1897 1438 -60580 1480 1513 -60580 1485 1489 -60580 1485 1529 -60580 1487 1501 -60580 1617 1665 -60580 1626 1742 -60580 1641 1535 -60580 1651 1703 -60580 1688 1898 -60580 1752 1884 -60580 1775 1855 -60580 1787 1851 -60580 1845 1434 -60580 1850 1441 -60580 1850 1857 -60580 1857 1441 -60580 1433 1519 -60580 1449 1531 -60580 1642 1756 -60580 1652 1747 -60580 1789 1902 -60580 1868 1441 -60580 1898 1477 -60580 1522 1524 -60580 1546 1548 -60580 1674 1890 -60580 1573 1452 -60580 1841 1901 -60580 1554 1470 -60580 1599 1796 -60580 1616 1462 -60580 1655 1882 -60580 1600 1438 -60580 1655 1512 -60580 1591 1525 -60580 1871 1517 -60580 1608 1894 -60580 1648 1696 -60580 1591 1858 -60580 1550 1572 -60580 1660 1692 -60580 1501 1527 -60580 1507 1522 -60580 1754 1821 -60580 1598 1635 -60580 1650 1668 -60600 1541 1602 -60600 1544 1897 -60600 1547 1855 -60600 1550 1480 -60600 1576 1766 -60600 1591 1752 -60600 1591 1884 -60600 1602 1480 -60600 1602 1619 -60600 1608 1613 -60600 1617 1665 -60600 1619 1480 -60600 1619 1857 -60600 1623 1706 -60600 1626 1742 -60600 1641 1535 -60600 1651 1703 -60600 1670 1711 -60600 1684 1489 -60600 1688 1898 -60600 1688 1789 -60600 1688 1902 -60600 1688 1847 -60600 1734 1779 -60600 1752 1858 -60600 1752 1884 -60600 1752 1525 -60600 1775 1855 -60600 1787 1851 -60600 1805 1888 -60600 1829 1886 -60600 1835 1517 -60600 1845 1434 -60600 1850 1441 -60600 1850 1857 -60600 1857 1441 -60600 1914 1478 -60600 1433 1519 -60600 1449 1531 -60600 1613 1773 -60600 1642 1756 -60600 1652 1747 -60600 1688 1501 -60600 1734 1819 -60600 1752 1766 -60600 1789 1902 -60600 1807 1467 -60600 1825 1510 -60600 1868 1441 -60600 1877 1908 -60600 1898 1477 -60600 1522 1524 -60600 1546 1548 -60600 1613 1439 -60600 1674 1897 -60600 1674 1890 -60600 1573 1452 -60600 1841 1901 -60600 1889 1492 -60600 1554 1470 -60600 1599 1796 -60600 1616 1462 -60600 1655 1882 -60600 1887 1437 -60600 1890 1897 -60600 1600 1438 -60600 1655 1512 -60600 1734 1920 -60600 1775 1528 -60600 1858 1525 -60600 1543 1528 -60600 1591 1525 -60600 1871 1517 -60600 1608 1894 -60600 1648 1696 -60600 1591 1858 -60600 1543 1775 -60600 1840 1489 -60600 1550 1572 -60600 1541 1547 -60600 1660 1692 -60600 1501 1527 -60600 1507 1522 -60600 1754 1821 -60600 1598 1635 -60600 1650 1668 -60620 1537 1853 -60620 1549 1919 -60620 1585 1766 -60620 1585 1703 -60620 1591 1527 -60620 1592 1789 -60620 1613 1773 -60620 1622 1469 -60620 1641 1676 -60620 1642 1756 -60620 1652 1747 -60620 1677 1683 -60620 1677 1701 -60620 1688 1897 -60620 1688 1519 -60620 1688 1501 -60620 1688 1527 -60620 1711 1877 -60620 1725 1490 -60620 1728 1425 -60620 1734 1473 -60620 1734 1819 -60620 1752 1766 -60620 1766 1433 -60620 1789 1902 -60620 1807 1467 -60620 1825 1510 -60620 1868 1441 -60620 1877 1908 -60620 1898 1477 -60620 1912 1480 -60620 1425 1431 -60620 1431 1516 -60620 1460 1499 -60620 1485 1529 -60620 1522 1524 -60620 1525 1527 -60620 1546 1548 -60620 1547 1691 -60620 1578 1480 -60620 1582 1622 -60620 1613 1439 -60620 1674 1897 -60620 1674 1890 -60620 1835 1871 -60620 1862 1916 -60620 1573 1452 -60620 1602 1513 -60620 1613 1498 -60620 1841 1901 -60620 1889 1492 -60620 1554 1470 -60620 1599 1796 -60620 1616 1462 -60620 1655 1882 -60620 1887 1437 -60620 1890 1897 -60620 1566 1467 -60620 1600 1438 -60620 1655 1512 -60620 1734 1920 -60620 1775 1528 -60620 1786 1512 -60620 1858 1525 -60620 1543 1528 -60620 1591 1525 -60620 1622 1761 -60620 1871 1517 -60620 1608 1894 -60620 1648 1696 -60620 1591 1858 -60620 1543 1775 -60620 1840 1489 -60620 1550 1572 -60620 1541 1547 -60620 1660 1692 -60620 1501 1527 -60620 1507 1522 -60620 1544 1674 -60620 1754 1821 -60620 1598 1635 -60620 1650 1668 -60640 1544 1897 -60640 1546 1898 -60640 1546 1548 -60640 1547 1691 -60640 1548 1425 -60640 1563 1592 -60640 1569 1626 -60640 1578 1480 -60640 1582 1622 -60640 1590 1688 -60640 1590 1764 -60640 1600 1919 -60640 1604 1740 -60640 1613 1439 -60640 1619 1516 -60640 1622 1924 -60640 1626 1742 -60640 1649 1857 -60640 1660 1816 -60640 1670 1908 -60640 1674 1897 -60640 1674 1890 -60640 1689 1858 -60640 1692 1816 -60640 1701 1703 -60640 1718 1482 -60640 1728 1752 -60640 1783 1453 -60640 1825 1919 -60640 1835 1871 -60640 1862 1916 -60640 1879 1898 -60640 1902 1522 -60640 1920 1473 -60640 1485 1516 -60640 1573 1452 -60640 1602 1513 -60640 1613 1498 -60640 1617 1665 -60640 1628 1676 -60640 1696 1522 -60640 1703 1835 -60640 1721 1816 -60640 1728 1897 -60640 1728 1890 -60640 1841 1901 -60640 1889 1492 -60640 1449 1531 -60640 1554 1470 -60640 1599 1796 -60640 1616 1462 -60640 1655 1882 -60640 1887 1437 -60640 1890 1897 -60640 1566 1467 -60640 1591 1884 -60640 1600 1438 -60640 1655 1512 -60640 1734 1920 -60640 1775 1528 -60640 1786 1512 -60640 1858 1525 -60640 1919 1510 -60640 1919 1438 -60640 1543 1528 -60640 1591 1525 -60640 1622 1761 -60640 1858 1884 -60640 1871 1517 -60640 1608 1894 -60640 1648 1696 -60640 1591 1858 -60640 1543 1775 -60640 1808 1855 -60640 1840 1489 -60640 1550 1572 -60640 1541 1547 -60640 1546 1425 -60640 1660 1692 -60640 1501 1527 -60640 1507 1522 -60640 1544 1674 -60640 1754 1821 -60640 1598 1635 -60640 1650 1668 -60660 1562 1816 -60660 1573 1452 -60660 1582 1761 -60660 1590 1489 -60660 1592 1626 -60660 1592 1470 -60660 1602 1513 -60660 1613 1498 -60660 1617 1665 -60660 1619 1701 -60660 1628 1676 -60660 1655 1786 -60660 1696 1522 -60660 1703 1835 -60660 1721 1816 -60660 1728 1448 -60660 1728 1897 -60660 1728 1890 -60660 1740 1487 -60660 1761 1453 -60660 1779 1819 -60660 1787 1851 -60660 1789 1902 -60660 1841 1901 -60660 1884 1525 -60660 1887 1480 -60660 1889 1492 -60660 1898 1425 -60660 1898 1477 -60660 1912 1916 -60660 1437 1480 -60660 1449 1531 -60660 1489 1516 -60660 1554 1470 -60660 1599 1796 -60660 1616 1462 -60660 1655 1882 -60660 1711 1908 -60660 1734 1819 -60660 1779 1903 -60660 1866 1496 -60660 1887 1437 -60660 1890 1897 -60660 1566 1467 -60660 1582 1453 -60660 1591 1884 -60660 1600 1438 -60660 1622 1453 -60660 1655 1512 -60660 1734 1920 -60660 1775 1528 -60660 1786 1512 -60660 1835 1874 -60660 1858 1525 -60660 1919 1510 -60660 1919 1438 -60660 1543 1528 -60660 1591 1525 -60660 1622 1761 -60660 1858 1884 -60660 1868 1441 -60660 1871 1517 -60660 1608 1894 -60660 1648 1696 -60660 1877 1908 -60660 1433 1519 -60660 1591 1858 -60660 1613 1695 -60660 1522 1524 -60660 1543 1775 -60660 1601 1458 -60660 1660 1688 -60660 1688 1692 -60660 1808 1855 -60660 1840 1489 -60660 1857 1441 -60660 1541 1683 -60660 1550 1572 -60660 1676 1439 -60660 1541 1547 -60660 1546 1425 -60660 1585 1752 -60660 1660 1692 -60660 1547 1683 -60660 1501 1527 -60660 1507 1522 -60660 1544 1674 -60660 1754 1821 -60660 1598 1635 -60660 1650 1668 -60680 1537 1480 -60680 1537 1578 -60680 1537 1731 -60680 1537 1613 -60680 1547 1855 -60680 1554 1470 -60680 1572 1731 -60680 1583 1825 -60680 1585 1766 -60680 1592 1798 -60680 1599 1796 -60680 1608 1480 -60680 1609 1879 -60680 1613 1773 -60680 1616 1462 -60680 1628 1463 -60680 1655 1882 -60680 1674 1890 -60680 1679 1505 -60680 1683 1691 -60680 1703 1475 -60680 1711 1908 -60680 1725 1490 -60680 1731 1480 -60680 1734 1819 -60680 1779 1903 -60680 1785 1448 -60680 1816 1866 -60680 1816 1823 -60680 1821 1489 -60680 1829 1873 -60680 1829 1487 -60680 1850 1868 -60680 1862 1912 -60680 1866 1496 -60680 1882 1512 -60680 1887 1437 -60680 1890 1897 -60680 1894 1480 -60680 1914 1478 -60680 1455 1463 -60680 1485 1529 -60680 1566 1467 -60680 1582 1453 -60680 1591 1884 -60680 1600 1438 -60680 1622 1453 -60680 1655 1512 -60680 1701 1835 -60680 1734 1920 -60680 1775 1528 -60680 1786 1512 -60680 1825 1510 -60680 1835 1874 -60680 1850 1857 -60680 1858 1525 -60680 1919 1510 -60680 1919 1438 -60680 1543 1528 -60680 1591 1525 -60680 1622 1761 -60680 1718 1482 -60680 1850 1441 -60680 1858 1884 -60680 1868 1441 -60680 1871 1517 -60680 1608 1894 -60680 1648 1696 -60680 1877 1908 -60680 1433 1519 -60680 1591 1858 -60680 1613 1695 -60680 1522 1524 -60680 1543 1775 -60680 1601 1458 -60680 1660 1688 -60680 1677 1701 -60680 1688 1692 -60680 1752 1766 -60680 1783 1518 -60680 1808 1855 -60680 1840 1489 -60680 1857 1441 -60680 1541 1683 -60680 1550 1572 -60680 1676 1439 -60680 1541 1547 -60680 1546 1425 -60680 1585 1752 -60680 1660 1692 -60680 1547 1683 -60680 1501 1527 -60680 1507 1522 -60680 1544 1674 -60680 1754 1821 -60680 1598 1635 -60680 1650 1668 -60700 1550 1731 -60700 1566 1467 -60700 1566 1453 -60700 1582 1761 -60700 1582 1453 -60700 1591 1592 -60700 1591 1884 -60700 1592 1858 -60700 1600 1438 -60700 1606 1489 -60700 1622 1453 -60700 1641 1480 -60700 1655 1512 -60700 1673 1725 -60700 1678 1475 -60700 1692 1496 -60700 1692 1866 -60700 1692 1491 -60700 1701 1835 -60700 1703 1473 -60700 1725 1811 -60700 1728 1448 -60700 1734 1920 -60700 1734 1779 -60700 1740 1503 -60700 1761 1453 -60700 1775 1528 -60700 1779 1835 -60700 1786 1512 -60700 1825 1510 -60700 1835 1874 -60700 1850 1857 -60700 1858 1525 -60700 1898 1471 -60700 1912 1916 -60700 1919 1510 -60700 1919 1438 -60700 1543 1528 -60700 1591 1525 -60700 1622 1761 -60700 1628 1455 -60700 1655 1818 -60700 1689 1924 -60700 1718 1482 -60700 1734 1752 -60700 1775 1866 -60700 1828 1458 -60700 1850 1441 -60700 1858 1884 -60700 1868 1441 -60700 1871 1517 -60700 1608 1894 -60700 1648 1696 -60700 1651 1905 -60700 1697 1906 -60700 1877 1908 -60700 1433 1519 -60700 1453 1467 -60700 1548 1425 -60700 1591 1858 -60700 1613 1695 -60700 1522 1524 -60700 1543 1775 -60700 1601 1458 -60700 1660 1688 -60700 1677 1701 -60700 1688 1692 -60700 1752 1766 -60700 1783 1518 -60700 1808 1855 -60700 1840 1489 -60700 1857 1441 -60700 1541 1683 -60700 1550 1572 -60700 1676 1439 -60700 1752 1835 -60700 1541 1547 -60700 1546 1425 -60700 1585 1752 -60700 1766 1835 -60700 1660 1692 -60700 1547 1683 -60700 1501 1527 -60700 1507 1522 -60700 1544 1674 -60700 1804 1510 -60700 1717 1513 -60700 1754 1821 -60700 1598 1635 -60700 1650 1668 -60720 1537 1452 -60720 1543 1528 -60720 1543 1496 -60720 1566 1582 -60720 1576 1585 -60720 1576 1874 -60720 1578 1857 -60720 1578 1441 -60720 1579 1740 -60720 1585 1766 -60720 1591 1525 -60720 1599 1774 -60720 1616 1462 -60720 1622 1761 -60720 1628 1455 -60720 1655 1882 -60720 1655 1755 -60720 1655 1818 -60720 1665 1785 -60720 1674 1890 -60720 1689 1924 -60720 1692 1816 -60720 1692 1721 -60720 1711 1877 -60720 1718 1482 -60720 1734 1752 -60720 1761 1449 -60720 1775 1496 -60720 1775 1866 -60720 1777 1923 -60720 1779 1903 -60720 1785 1816 -60720 1804 1825 -60720 1819 1920 -60720 1828 1458 -60720 1828 1495 -60720 1850 1441 -60720 1858 1884 -60720 1866 1496 -60720 1868 1441 -60720 1871 1517 -60720 1887 1480 -60720 1457 1527 -60720 1550 1578 -60720 1551 1269 -60720 1553 1919 -60720 1590 1914 -60720 1608 1894 -60720 1648 1696 -60720 1651 1905 -60720 1688 1816 -60720 1697 1906 -60720 1734 1835 -60720 1877 1908 -60720 1433 1519 -60720 1453 1467 -60720 1548 1425 -60720 1591 1858 -60720 1613 1695 -60720 1522 1524 -60720 1543 1775 -60720 1601 1458 -60720 1660 1688 -60720 1677 1701 -60720 1688 1692 -60720 1752 1766 -60720 1783 1518 -60720 1808 1855 -60720 1840 1489 -60720 1857 1441 -60720 1889 1492 -60720 1541 1683 -60720 1550 1572 -60720 1613 1773 -60720 1676 1439 -60720 1752 1835 -60720 1541 1547 -60720 1546 1425 -60720 1585 1752 -60720 1585 1835 -60720 1766 1835 -60720 1660 1692 -60720 1898 1477 -60720 1547 1683 -60720 1501 1527 -60720 1507 1522 -60720 1544 1674 -60720 1804 1510 -60720 1717 1513 -60720 1754 1821 -60720 1598 1635 -60720 1650 1668 -60740 1547 1691 -60740 1550 1578 -60740 1551 1269 -60740 1553 1919 -60740 1562 1816 -60740 1562 1692 -60740 1566 1467 -60740 1578 1649 -60740 1590 1914 -60740 1591 1426 -60740 1608 1894 -60740 1628 1442 -60740 1648 1696 -60740 1651 1905 -60740 1668 1463 -60740 1688 1816 -60740 1697 1906 -60740 1718 1503 -60740 1724 1734 -60740 1734 1835 -60740 1755 1882 -60740 1755 1774 -60740 1798 1897 -60740 1816 1881 -60740 1816 1893 -60740 1841 1901 -60740 1858 1457 -60740 1877 1908 -60740 1893 1496 -60740 1911 1458 -60740 1433 1519 -60740 1453 1467 -60740 1546 1548 -60740 1548 1425 -60740 1585 1734 -60740 1591 1858 -60740 1592 1525 -60740 1613 1695 -60740 1660 1816 -60740 1706 1457 -60740 1721 1881 -60740 1798 1448 -60740 1522 1524 -60740 1543 1775 -60740 1601 1458 -60740 1655 1774 -60740 1660 1688 -60740 1677 1701 -60740 1688 1692 -60740 1718 1492 -60740 1752 1766 -60740 1783 1518 -60740 1808 1855 -60740 1840 1489 -60740 1857 1441 -60740 1889 1492 -60740 1541 1683 -60740 1550 1572 -60740 1598 1667 -60740 1626 1742 -60740 1635 1667 -60740 1582 1467 -60740 1613 1773 -60740 1676 1439 -60740 1752 1835 -60740 1431 1516 -60740 1541 1547 -60740 1546 1425 -60740 1585 1752 -60740 1585 1835 -60740 1766 1835 -60740 1455 1463 -60740 1660 1692 -60740 1898 1477 -60740 1547 1683 -60740 1501 1527 -60740 1507 1522 -60740 1544 1674 -60740 1804 1510 -60740 1717 1513 -60740 1652 1747 -60740 1754 1821 -60740 1598 1635 -60740 1650 1668 -60760 1546 1548 -60760 1548 1425 -60760 1562 1449 -60760 1562 1453 -60760 1573 1470 -60760 1582 1453 -60760 1585 1734 -60760 1591 1858 -60760 1592 1525 -60760 1606 1516 -60760 1613 1695 -60760 1617 1857 -60760 1628 1455 -60760 1652 1831 -60760 1655 1755 -60760 1660 1816 -60760 1695 1773 -60760 1706 1457 -60760 1706 1426 -60760 1711 1479 -60760 1721 1881 -60760 1728 1433 -60760 1728 1470 -60760 1761 1866 -60760 1761 1453 -60760 1798 1448 -60760 1798 1858 -60760 1829 1886 -60760 1847 1471 -60760 1877 1923 -60760 1507 1524 -60760 1522 1524 -60760 1543 1775 -60760 1547 1855 -60760 1550 1649 -60760 1566 1731 -60760 1601 1458 -60760 1649 1731 -60760 1655 1774 -60760 1660 1688 -60760 1677 1701 -60760 1688 1692 -60760 1689 1924 -60760 1692 1816 -60760 1718 1492 -60760 1725 1490 -60760 1734 1752 -60760 1752 1766 -60760 1775 1528 -60760 1783 1518 -60760 1808 1855 -60760 1840 1489 -60760 1857 1441 -60760 1889 1492 -60760 1912 1437 -60760 1541 1683 -60760 1550 1572 -60760 1554 1853 -60760 1598 1667 -60760 1626 1742 -60760 1635 1667 -60760 1721 1816 -60760 1819 1920 -60760 1582 1467 -60760 1613 1773 -60760 1676 1439 -60760 1718 1889 -60760 1752 1835 -60760 1768 1818 -60760 1431 1516 -60760 1541 1547 -60760 1655 1786 -60760 1546 1425 -60760 1585 1752 -60760 1585 1835 -60760 1585 1766 -60760 1766 1835 -60760 1455 1463 -60760 1619 1920 -60760 1660 1692 -60760 1674 1890 -60760 1898 1477 -60760 1543 1528 -60760 1547 1683 -60760 1501 1527 -60760 1507 1522 -60760 1544 1674 -60760 1804 1510 -60760 1717 1513 -60760 1652 1747 -60760 1754 1821 -60760 1598 1635 -60760 1871 1517 -60760 1650 1668 -60780 1543 1775 -60780 1547 1855 -60780 1550 1649 -60780 1550 1566 -60780 1562 1531 -60780 1566 1731 -60780 1569 1626 -60780 1576 1874 -60780 1591 1821 -60780 1601 1458 -60780 1602 1489 -60780 1648 1696 -60780 1649 1731 -60780 1655 1774 -60780 1656 1712 -60780 1656 1517 -60780 1660 1688 -60780 1670 1908 -60780 1677 1701 -60780 1688 1816 -60780 1688 1692 -60780 1689 1924 -60780 1692 1816 -60780 1711 1471 -60780 1718 1492 -60780 1718 1503 -60780 1725 1490 -60780 1728 1519 -60780 1734 1752 -60780 1752 1766 -60780 1755 1786 -60780 1761 1467 -60780 1775 1528 -60780 1783 1518 -60780 1796 1816 -60780 1808 1855 -60780 1840 1489 -60780 1857 1441 -60780 1889 1492 -60780 1898 1471 -60780 1912 1437 -60780 1924 1478 -60780 1538 1522 -60780 1541 1683 -60780 1549 1525 -60780 1550 1572 -60780 1554 1853 -60780 1598 1667 -60780 1608 1894 -60780 1626 1742 -60780 1635 1667 -60780 1655 1715 -60780 1655 1882 -60780 1681 1526 -60780 1715 1768 -60780 1715 1882 -60780 1721 1816 -60780 1819 1920 -60780 1449 1531 -60780 1582 1467 -60780 1613 1773 -60780 1628 1442 -60780 1651 1905 -60780 1655 1768 -60780 1676 1439 -60780 1718 1889 -60780 1752 1835 -60780 1768 1818 -60780 1431 1516 -60780 1541 1547 -60780 1547 1691 -60780 1655 1786 -60780 1546 1425 -60780 1585 1752 -60780 1585 1835 -60780 1585 1766 -60780 1766 1835 -60780 1789 1902 -60780 1455 1463 -60780 1619 1920 -60780 1655 1818 -60780 1660 1692 -60780 1674 1890 -60780 1898 1477 -60780 1543 1528 -60780 1547 1683 -60780 1501 1527 -60780 1507 1522 -60780 1877 1908 -60780 1544 1674 -60780 1804 1510 -60780 1717 1513 -60780 1652 1747 -60780 1754 1821 -60780 1598 1635 -60780 1871 1517 -60780 1650 1668 -60800 1537 1735 -60800 1538 1522 -60800 1541 1688 -60800 1541 1683 -60800 1549 1525 -60800 1550 1572 -60800 1551 1269 -60800 1554 1853 -60800 1591 1731 -60800 1598 1667 -60800 1608 1613 -60800 1608 1894 -60800 1613 1894 -60800 1617 1916 -60800 1626 1742 -60800 1635 1667 -60800 1652 1811 -60800 1655 1715 -60800 1655 1882 -60800 1656 1761 -60800 1681 1526 -60800 1688 1845 -60800 1688 1717 -60800 1692 1740 -60800 1692 1761 -60800 1703 1845 -60800 1715 1768 -60800 1715 1786 -60800 1715 1882 -60800 1721 1816 -60800 1761 1492 -60800 1768 1786 -60800 1786 1882 -60800 1816 1845 -60800 1819 1920 -60800 1829 1467 -60800 1880 1464 -60800 1919 1476 -60800 1449 1531 -60800 1544 1890 -60800 1577 1471 -60800 1582 1467 -60800 1613 1773 -60800 1617 1894 -60800 1628 1442 -60800 1651 1905 -60800 1655 1768 -60800 1676 1439 -60800 1718 1889 -60800 1752 1835 -60800 1768 1818 -60800 1798 1448 -60800 1825 1510 -60800 1431 1516 -60800 1433 1519 -60800 1438 1519 -60800 1541 1547 -60800 1547 1691 -60800 1563 1592 -60800 1655 1786 -60800 1850 1868 -60800 1546 1425 -60800 1585 1752 -60800 1585 1835 -60800 1585 1766 -60800 1766 1835 -60800 1789 1902 -60800 1829 1886 -60800 1455 1463 -60800 1619 1920 -60800 1655 1818 -60800 1660 1692 -60800 1665 1441 -60800 1674 1890 -60800 1706 1426 -60800 1841 1901 -60800 1898 1477 -60800 1522 1524 -60800 1543 1528 -60800 1547 1683 -60800 1501 1527 -60800 1507 1522 -60800 1649 1887 -60800 1877 1908 -60800 1544 1674 -60800 1613 1498 -60800 1804 1510 -60800 1717 1513 -60800 1652 1747 -60800 1754 1821 -60800 1598 1635 -60800 1871 1517 -60800 1470 1517 -60800 1650 1668 -60820 1537 1458 -60820 1544 1890 -60820 1566 1922 -60820 1577 1471 -60820 1582 1467 -60820 1583 1919 -60820 1591 1613 -60820 1608 1845 -60820 1613 1688 -60820 1613 1773 -60820 1613 1887 -60820 1616 1462 -60820 1617 1441 -60820 1617 1894 -60820 1628 1442 -60820 1641 1533 -60820 1651 1905 -60820 1655 1768 -60820 1676 1688 -60820 1676 1439 -60820 1688 1887 -60820 1688 1773 -60820 1703 1796 -60820 1706 1457 -60820 1718 1889 -60820 1718 1492 -60820 1725 1770 -60820 1725 1735 -60820 1728 1476 -60820 1731 1452 -60820 1734 1752 -60820 1747 1811 -60820 1752 1835 -60820 1755 1865 -60820 1761 1872 -60820 1768 1818 -60820 1775 1528 -60820 1786 1818 -60820 1798 1448 -60820 1825 1510 -60820 1431 1516 -60820 1433 1519 -60820 1438 1519 -60820 1541 1547 -60820 1547 1691 -60820 1550 1566 -60820 1563 1592 -60820 1581 1667 -60820 1591 1858 -60820 1655 1786 -60820 1667 1752 -60820 1684 1798 -60820 1783 1518 -60820 1850 1868 -60820 1912 1441 -60820 1916 1441 -60820 1546 1425 -60820 1585 1752 -60820 1585 1835 -60820 1585 1766 -60820 1655 1774 -60820 1752 1766 -60820 1766 1835 -60820 1789 1902 -60820 1829 1886 -60820 1455 1463 -60820 1619 1920 -60820 1655 1818 -60820 1660 1692 -60820 1665 1857 -60820 1665 1441 -60820 1674 1890 -60820 1706 1426 -60820 1841 1901 -60820 1898 1477 -60820 1439 1480 -60820 1522 1524 -60820 1543 1528 -60820 1547 1683 -60820 1601 1458 -60820 1501 1527 -60820 1725 1490 -60820 1755 1802 -60820 1802 1865 -60820 1507 1522 -60820 1649 1887 -60820 1857 1441 -60820 1877 1908 -60820 1544 1674 -60820 1613 1498 -60820 1804 1510 -60820 1717 1513 -60820 1652 1747 -60820 1754 1821 -60820 1543 1775 -60820 1598 1635 -60820 1871 1517 -60820 1470 1517 -60820 1650 1668 -60840 1541 1547 -60840 1541 1683 -60840 1547 1691 -60840 1549 1761 -60840 1550 1721 -60840 1550 1572 -60840 1550 1566 -60840 1551 1842 -60840 1563 1592 -60840 1566 1916 -60840 1578 1725 -60840 1581 1667 -60840 1591 1858 -60840 1652 1811 -60840 1655 1786 -60840 1663 1786 -60840 1667 1752 -60840 1670 1908 -60840 1684 1798 -60840 1688 1754 -60840 1697 1906 -60840 1735 1811 -60840 1735 1747 -60840 1783 1518 -60840 1850 1868 -60840 1912 1441 -60840 1912 1916 -60840 1916 1441 -60840 1441 1482 -60840 1451 1485 -60840 1546 1425 -60840 1546 1471 -60840 1585 1752 -60840 1585 1835 -60840 1585 1766 -60840 1600 1438 -60840 1602 1489 -60840 1655 1774 -60840 1703 1808 -60840 1715 1755 -60840 1752 1766 -60840 1766 1835 -60840 1789 1902 -60840 1805 1888 -60840 1829 1886 -60840 1871 1470 -60840 1455 1463 -60840 1582 1504 -60840 1619 1920 -60840 1655 1818 -60840 1655 1663 -60840 1655 1882 -60840 1660 1692 -60840 1665 1857 -60840 1665 1441 -60840 1674 1890 -60840 1706 1426 -60840 1841 1901 -60840 1889 1492 -60840 1898 1477 -60840 1439 1480 -60840 1522 1524 -60840 1543 1528 -60840 1547 1683 -60840 1601 1458 -60840 1711 1908 -60840 1721 1816 -60840 1501 1527 -60840 1677 1701 -60840 1725 1490 -60840 1755 1802 -60840 1802 1865 -60840 1507 1522 -60840 1649 1887 -60840 1857 1441 -60840 1877 1908 -60840 1544 1674 -60840 1613 1498 -60840 1804 1510 -60840 1888 1467 -60840 1717 1513 -60840 1652 1747 -60840 1754 1821 -60840 1543 1775 -60840 1598 1635 -60840 1871 1517 -60840 1470 1517 -60840 1650 1668 -60860 1539 1724 -60860 1543 1829 -60860 1543 1893 -60860 1546 1425 -60860 1546 1548 -60860 1546 1471 -60860 1547 1855 -60860 1548 1471 -60860 1554 1613 -60860 1554 1591 -60860 1585 1752 -60860 1585 1835 -60860 1585 1701 -60860 1585 1766 -60860 1591 1613 -60860 1599 1786 -60860 1600 1438 -60860 1602 1489 -60860 1613 1887 -60860 1616 1462 -60860 1655 1774 -60860 1667 1471 -60860 1673 1761 -60860 1684 1489 -60860 1688 1761 -60860 1688 1427 -60860 1689 1924 -60860 1701 1752 -60860 1701 1835 -60860 1701 1766 -60860 1703 1808 -60860 1715 1865 -60860 1715 1802 -60860 1715 1755 -60860 1752 1835 -60860 1752 1766 -60860 1766 1874 -60860 1766 1835 -60860 1773 1498 -60860 1789 1902 -60860 1804 1825 -60860 1805 1888 -60860 1829 1886 -60860 1871 1470 -60860 1884 1919 -60860 1916 1482 -60860 1455 1463 -60860 1537 1828 -60860 1547 1595 -60860 1548 1425 -60860 1549 1884 -60860 1581 1712 -60860 1582 1504 -60860 1591 1617 -60860 1619 1920 -60860 1626 1742 -60860 1641 1480 -60860 1652 1735 -60860 1655 1818 -60860 1655 1663 -60860 1655 1882 -60860 1660 1692 -60860 1663 1882 -60860 1665 1857 -60860 1665 1441 -60860 1674 1890 -60860 1676 1887 -60860 1706 1426 -60860 1841 1901 -60860 1889 1492 -60860 1898 1477 -60860 1439 1480 -60860 1522 1524 -60860 1543 1528 -60860 1547 1683 -60860 1601 1458 -60860 1663 1818 -60860 1711 1908 -60860 1711 1877 -60860 1721 1816 -60860 1755 1865 -60860 1884 1427 -60860 1501 1527 -60860 1547 1775 -60860 1550 1816 -60860 1677 1701 -60860 1725 1490 -60860 1755 1802 -60860 1802 1865 -60860 1507 1522 -60860 1649 1887 -60860 1775 1845 -60860 1857 1441 -60860 1877 1908 -60860 1544 1674 -60860 1613 1498 -60860 1804 1510 -60860 1888 1467 -60860 1599 1655 -60860 1717 1513 -60860 1652 1747 -60860 1835 1874 -60860 1754 1821 -60860 1543 1775 -60860 1598 1635 -60860 1871 1517 -60860 1470 1517 -60860 1650 1668 -60880 1537 1828 -60880 1538 1522 -60880 1539 1829 -60880 1547 1595 -60880 1547 1703 -60880 1548 1425 -60880 1549 1427 -60880 1549 1884 -60880 1550 1572 -60880 1569 1626 -60880 1573 1491 -60880 1576 1835 -60880 1581 1712 -60880 1582 1504 -60880 1591 1617 -60880 1597 1622 -60880 1599 1774 -60880 1617 1862 -60880 1619 1920 -60880 1626 1742 -60880 1626 1425 -60880 1628 1442 -60880 1641 1480 -60880 1647 1460 -60880 1648 1696 -60880 1652 1735 -60880 1655 1818 -60880 1655 1663 -60880 1655 1882 -60880 1660 1692 -60880 1663 1882 -60880 1665 1857 -60880 1665 1441 -60880 1674 1890 -60880 1676 1887 -60880 1683 1808 -60880 1683 1703 -60880 1706 1426 -60880 1718 1889 -60880 1724 1513 -60880 1734 1789 -60880 1752 1919 -60880 1796 1816 -60880 1816 1441 -60880 1841 1901 -60880 1855 1480 -60880 1889 1492 -60880 1898 1477 -60880 1912 1916 -60880 1439 1480 -60880 1451 1485 -60880 1507 1524 -60880 1522 1524 -60880 1541 1691 -60880 1543 1528 -60880 1547 1683 -60880 1599 1818 -60880 1599 1663 -60880 1601 1458 -60880 1663 1818 -60880 1688 1527 -60880 1706 1457 -60880 1711 1908 -60880 1711 1877 -60880 1721 1816 -60880 1721 1823 -60880 1755 1865 -60880 1773 1441 -60880 1884 1427 -60880 1433 1519 -60880 1449 1531 -60880 1501 1527 -60880 1547 1775 -60880 1550 1816 -60880 1677 1701 -60880 1725 1490 -60880 1755 1802 -60880 1802 1865 -60880 1507 1522 -60880 1543 1845 -60880 1550 1566 -60880 1645 1756 -60880 1649 1887 -60880 1775 1845 -60880 1857 1441 -60880 1877 1908 -60880 1544 1674 -60880 1613 1498 -60880 1804 1510 -60880 1888 1467 -60880 1599 1655 -60880 1651 1905 -60880 1717 1513 -60880 1652 1747 -60880 1798 1448 -60880 1835 1874 -60880 1754 1821 -60880 1543 1775 -60880 1598 1635 -60880 1840 1489 -60880 1871 1517 -60880 1613 1439 -60880 1470 1517 -60880 1650 1668 -60900 1538 1524 -60900 1541 1691 -60900 1543 1528 -60900 1544 1890 -60900 1547 1683 -60900 1550 1721 -60900 1581 1701 -60900 1591 1441 -60900 1591 1796 -60900 1591 1857 -60900 1599 1818 -60900 1599 1882 -60900 1599 1663 -60900 1601 1458 -60900 1606 1516 -60900 1608 1434 -60900 1619 1675 -60900 1619 1829 -60900 1628 1455 -60900 1660 1901 -60900 1663 1818 -60900 1663 1774 -60900 1673 1761 -60900 1676 1761 -60900 1688 1789 -60900 1688 1527 -60900 1692 1841 -60900 1692 1901 -60900 1694 1908 -60900 1706 1457 -60900 1711 1908 -60900 1711 1877 -60900 1715 1802 -60900 1721 1816 -60900 1721 1773 -60900 1721 1823 -60900 1752 1821 -60900 1755 1865 -60900 1761 1850 -60900 1761 1831 -60900 1773 1816 -60900 1773 1441 -60900 1775 1901 -60900 1786 1818 -60900 1796 1857 -60900 1816 1823 -60900 1825 1510 -60900 1847 1425 -60900 1853 1879 -60900 1884 1427 -60900 1905 1526 -60900 1433 1519 -60900 1449 1531 -60900 1501 1527 -60900 1547 1775 -60900 1550 1816 -60900 1617 1480 -60900 1629 1923 -60900 1655 1786 -60900 1677 1701 -60900 1725 1490 -60900 1755 1802 -60900 1802 1865 -60900 1835 1886 -60900 1868 1495 -60900 1879 1505 -60900 1439 1498 -60900 1507 1522 -60900 1543 1845 -60900 1550 1566 -60900 1645 1756 -60900 1649 1887 -60900 1752 1766 -60900 1775 1845 -60900 1857 1441 -60900 1877 1908 -60900 1544 1674 -60900 1613 1498 -60900 1652 1811 -60900 1661 1840 -60900 1747 1811 -60900 1804 1510 -60900 1842 1853 -60900 1888 1467 -60900 1599 1786 -60900 1599 1655 -60900 1651 1905 -60900 1717 1513 -60900 1652 1747 -60900 1798 1448 -60900 1835 1874 -60900 1754 1821 -60900 1853 1505 -60900 1871 1470 -60900 1543 1775 -60900 1598 1635 -60900 1840 1489 -60900 1871 1517 -60900 1613 1439 -60900 1829 1886 -60900 1470 1517 -60900 1650 1668 -60920 1547 1775 -60920 1550 1816 -60920 1551 1898 -60920 1552 1761 -60920 1553 1525 -60920 1568 1629 -60920 1581 1602 -60920 1585 1455 -60920 1591 1863 -60920 1600 1438 -60920 1600 1519 -60920 1608 1463 -60920 1617 1480 -60920 1628 1442 -60920 1629 1923 -60920 1655 1786 -60920 1655 1774 -60920 1667 1898 -60920 1676 1831 -60920 1677 1701 -60920 1688 1471 -60920 1692 1740 -60920 1694 1877 -60920 1717 1816 -60920 1718 1889 -60920 1721 1513 -60920 1725 1490 -60920 1734 1829 -60920 1755 1802 -60920 1761 1887 -60920 1802 1865 -60920 1835 1886 -60920 1868 1495 -60920 1879 1505 -60920 1880 1464 -60920 1912 1513 -60920 1425 1427 -60920 1439 1498 -60920 1471 1501 -60920 1507 1522 -60920 1507 1524 -60920 1522 1524 -60920 1543 1845 -60920 1550 1566 -60920 1568 1923 -60920 1645 1756 -60920 1649 1887 -60920 1701 1886 -60920 1703 1808 -60920 1735 1465 -60920 1735 1831 -60920 1752 1766 -60920 1775 1845 -60920 1857 1441 -60920 1877 1908 -60920 1544 1674 -60920 1549 1884 -60920 1613 1498 -60920 1652 1811 -60920 1661 1840 -60920 1673 1676 -60920 1747 1811 -60920 1804 1510 -60920 1842 1853 -60920 1888 1467 -60920 1485 1529 -60920 1599 1786 -60920 1599 1655 -60920 1613 1528 -60920 1651 1905 -60920 1660 1692 -60920 1717 1513 -60920 1652 1747 -60920 1798 1448 -60920 1835 1874 -60920 1754 1821 -60920 1853 1505 -60920 1871 1470 -60920 1543 1775 -60920 1598 1635 -60920 1840 1489 -60920 1871 1517 -60920 1688 1501 -60920 1613 1439 -60920 1684 1901 -60920 1438 1519 -60920 1601 1911 -60920 1829 1886 -60920 1470 1517 -60920 1650 1668 -60940 1538 1886 -60940 1543 1845 -60940 1548 1425 -60940 1550 1566 -60940 1551 1269 -60940 1568 1923 -60940 1581 1887 -60940 1583 1525 -60940 1585 1766 -60940 1595 1863 -60940 1626 1742 -60940 1641 1533 -60940 1645 1756 -60940 1649 1887 -60940 1650 1463 -60940 1665 1914 -60940 1688 1734 -60940 1688 1701 -60940 1701 1886 -60940 1703 1808 -60940 1706 1426 -60940 1711 1898 -60940 1718 1503 -60940 1735 1465 -60940 1735 1831 -60940 1752 1480 -60940 1752 1766 -60940 1775 1845 -60940 1828 1480 -60940 1853 1879 -60940 1857 1441 -60940 1877 1908 -60940 1887 1455 -60940 1889 1492 -60940 1911 1458 -60940 1425 1501 -60940 1425 1525 -60940 1425 1471 -60940 1544 1674 -60940 1549 1884 -60940 1563 1592 -60940 1613 1498 -60940 1652 1811 -60940 1661 1840 -60940 1673 1676 -60940 1706 1457 -60940 1747 1811 -60940 1796 1441 -60940 1804 1510 -60940 1825 1510 -60940 1842 1853 -60940 1888 1467 -60940 1439 1528 -60940 1485 1529 -60940 1546 1425 -60940 1599 1786 -60940 1599 1655 -60940 1613 1528 -60940 1651 1905 -60940 1660 1692 -60940 1717 1513 -60940 1721 1816 -60940 1541 1691 -60940 1652 1747 -60940 1798 1448 -60940 1835 1874 -60940 1924 1478 -60940 1590 1609 -60940 1601 1458 -60940 1754 1821 -60940 1853 1505 -60940 1871 1470 -60940 1543 1775 -60940 1598 1635 -60940 1840 1489 -60940 1871 1517 -60940 1688 1501 -60940 1613 1439 -60940 1684 1901 -60940 1438 1519 -60940 1601 1911 -60940 1829 1886 -60940 1591 1872 -60940 1470 1517 -60940 1650 1668 -60960 1544 1674 -60960 1549 1884 -60960 1563 1592 -60960 1566 1828 -60960 1576 1835 -60960 1577 1886 -60960 1613 1441 -60960 1613 1498 -60960 1649 1527 -60960 1652 1811 -60960 1661 1840 -60960 1673 1676 -60960 1706 1457 -60960 1710 1906 -60960 1747 1811 -60960 1752 1754 -60960 1754 1766 -60960 1796 1441 -60960 1804 1510 -60960 1825 1510 -60960 1842 1853 -60960 1888 1467 -60960 1439 1528 -60960 1439 1498 -60960 1448 1480 -60960 1449 1531 -60960 1485 1529 -60960 1546 1425 -60960 1599 1786 -60960 1599 1780 -60960 1599 1655 -60960 1613 1528 -60960 1651 1905 -60960 1660 1692 -60960 1674 1890 -60960 1678 1768 -60960 1717 1513 -60960 1721 1816 -60960 1879 1505 -60960 1901 1489 -60960 1541 1691 -60960 1652 1747 -60960 1798 1448 -60960 1835 1874 -60960 1898 1477 -60960 1924 1478 -60960 1590 1609 -60960 1601 1458 -60960 1655 1786 -60960 1754 1821 -60960 1796 1857 -60960 1853 1505 -60960 1871 1470 -60960 1887 1437 -60960 1543 1775 -60960 1598 1635 -60960 1808 1816 -60960 1840 1489 -60960 1871 1517 -60960 1688 1501 -60960 1544 1890 -60960 1613 1439 -60960 1684 1901 -60960 1438 1519 -60960 1601 1911 -60960 1829 1886 -60960 1591 1872 -60960 1470 1517 -60960 1650 1668 -60980 1546 1425 -60980 1547 1492 -60980 1550 1773 -60980 1550 1566 -60980 1551 1269 -60980 1566 1857 -60980 1599 1786 -60980 1599 1780 -60980 1599 1655 -60980 1608 1789 -60980 1613 1528 -60980 1651 1905 -60980 1660 1692 -60980 1667 1908 -60980 1674 1890 -60980 1676 1526 -60980 1678 1768 -60980 1681 1770 -60980 1688 1471 -60980 1701 1842 -60980 1703 1513 -60980 1717 1513 -60980 1721 1816 -60980 1724 1784 -60980 1725 1834 -60980 1735 1766 -60980 1784 1845 -60980 1804 1501 -60980 1853 1879 -60980 1879 1505 -60980 1889 1492 -60980 1901 1489 -60980 1911 1458 -60980 1501 1510 -60980 1541 1691 -60980 1645 1756 -60980 1652 1747 -60980 1695 1725 -60980 1798 1448 -60980 1805 1467 -60980 1835 1874 -60980 1898 1477 -60980 1924 1478 -60980 1471 1501 -60980 1543 1845 -60980 1590 1609 -60980 1601 1458 -60980 1626 1742 -60980 1655 1786 -60980 1754 1821 -60980 1796 1857 -60980 1853 1505 -60980 1871 1470 -60980 1887 1437 -60980 1543 1775 -60980 1598 1635 -60980 1808 1816 -60980 1840 1489 -60980 1871 1517 -60980 1688 1501 -60980 1877 1908 -60980 1544 1890 -60980 1888 1524 -60980 1585 1766 -60980 1613 1439 -60980 1684 1901 -60980 1775 1845 -60980 1734 1444 -60980 1438 1519 -60980 1437 1455 -60980 1601 1911 -60980 1829 1886 -60980 1591 1872 -60980 1470 1517 -60980 1650 1668 -61000 1538 1777 -61000 1541 1691 -61000 1546 1489 -61000 1547 1808 -61000 1547 1816 -61000 1547 1775 -61000 1548 1425 -61000 1593 1449 -61000 1598 1470 -61000 1628 1463 -61000 1645 1756 -61000 1649 1735 -61000 1652 1747 -61000 1667 1877 -61000 1695 1725 -61000 1718 1503 -61000 1731 1770 -61000 1752 1789 -61000 1779 1903 -61000 1798 1448 -61000 1802 1865 -61000 1805 1467 -61000 1835 1874 -61000 1857 1441 -61000 1858 1441 -61000 1888 1522 -61000 1890 1525 -61000 1898 1477 -61000 1924 1478 -61000 1437 1527 -61000 1448 1480 -61000 1471 1501 -61000 1543 1916 -61000 1543 1845 -61000 1547 1721 -61000 1590 1609 -61000 1593 1531 -61000 1601 1458 -61000 1604 1791 -61000 1626 1742 -61000 1655 1786 -61000 1670 1877 -61000 1688 1835 -61000 1754 1821 -61000 1796 1857 -61000 1845 1916 -61000 1853 1505 -61000 1871 1470 -61000 1887 1437 -61000 1439 1498 -61000 1449 1531 -61000 1543 1775 -61000 1598 1635 -61000 1808 1816 -61000 1840 1489 -61000 1840 1901 -61000 1871 1517 -61000 1887 1527 -61000 1425 1489 -61000 1688 1501 -61000 1877 1908 -61000 1544 1890 -61000 1825 1426 -61000 1888 1524 -61000 1585 1766 -61000 1613 1439 -61000 1684 1901 -61000 1775 1845 -61000 1734 1444 -61000 1438 1519 -61000 1437 1455 -61000 1601 1911 -61000 1825 1525 -61000 1426 1525 -61000 1829 1886 -61000 1591 1872 -61000 1470 1517 -61000 1650 1668 -61020 1543 1916 -61020 1543 1845 -61020 1546 1840 -61020 1547 1721 -61020 1551 1269 -61020 1566 1857 -61020 1590 1609 -61020 1591 1473 -61020 1593 1531 -61020 1601 1458 -61020 1604 1791 -61020 1626 1742 -61020 1628 1821 -61020 1652 1530 -61020 1655 1786 -61020 1655 1882 -61020 1661 1840 -61020 1667 1711 -61020 1670 1877 -61020 1688 1835 -61020 1703 1916 -61020 1724 1901 -61020 1725 1770 -61020 1725 1731 -61020 1754 1821 -61020 1768 1828 -61020 1775 1916 -61020 1796 1857 -61020 1816 1823 -61020 1835 1501 -61020 1845 1916 -61020 1853 1505 -61020 1871 1470 -61020 1872 1473 -61020 1887 1437 -61020 1889 1492 -61020 1912 1916 -61020 1439 1528 -61020 1439 1498 -61020 1449 1531 -61020 1543 1775 -61020 1569 1742 -61020 1598 1635 -61020 1676 1526 -61020 1684 1724 -61020 1721 1816 -61020 1808 1816 -61020 1821 1463 -61020 1840 1489 -61020 1840 1901 -61020 1871 1517 -61020 1887 1527 -61020 1425 1489 -61020 1485 1529 -61020 1498 1528 -61020 1546 1425 -61020 1648 1696 -61020 1688 1501 -61020 1877 1908 -61020 1544 1890 -61020 1825 1426 -61020 1888 1524 -61020 1585 1766 -61020 1613 1528 -61020 1613 1439 -61020 1684 1901 -61020 1689 1752 -61020 1775 1845 -61020 1547 1768 -61020 1734 1444 -61020 1438 1519 -61020 1689 1766 -61020 1752 1766 -61020 1437 1455 -61020 1601 1911 -61020 1655 1774 -61020 1825 1525 -61020 1613 1498 -61020 1426 1525 -61020 1829 1886 -61020 1660 1692 -61020 1591 1872 -61020 1470 1517 -61020 1650 1668 -61040 1543 1775 -61040 1550 1773 -61040 1569 1742 -61040 1585 1752 -61040 1592 1847 -61040 1598 1635 -61040 1602 1688 -61040 1649 1752 -61040 1652 1458 -61040 1655 1760 -61040 1661 1489 -61040 1667 1877 -61040 1676 1526 -61040 1684 1724 -61040 1706 1448 -61040 1710 1906 -61040 1721 1816 -61040 1728 1448 -61040 1747 1465 -61040 1747 1811 -61040 1752 1858 -61040 1767 1775 -61040 1779 1903 -61040 1783 1521 -61040 1805 1467 -61040 1808 1816 -61040 1821 1448 -61040 1821 1463 -61040 1828 1916 -61040 1840 1489 -61040 1840 1901 -61040 1841 1901 -61040 1853 1879 -61040 1871 1517 -61040 1887 1527 -61040 1901 1425 -61040 1911 1458 -61040 1425 1489 -61040 1431 1516 -61040 1437 1527 -61040 1485 1529 -61040 1498 1528 -61040 1541 1691 -61040 1546 1425 -61040 1549 1688 -61040 1593 1521 -61040 1648 1696 -61040 1667 1908 -61040 1688 1501 -61040 1715 1755 -61040 1786 1882 -61040 1877 1908 -61040 1544 1890 -61040 1675 1798 -61040 1825 1426 -61040 1835 1874 -61040 1888 1524 -61040 1585 1766 -61040 1613 1528 -61040 1613 1439 -61040 1684 1901 -61040 1689 1752 -61040 1775 1845 -61040 1547 1768 -61040 1734 1444 -61040 1898 1477 -61040 1438 1519 -61040 1689 1766 -61040 1740 1863 -61040 1752 1766 -61040 1796 1441 -61040 1437 1455 -61040 1601 1911 -61040 1655 1774 -61040 1825 1525 -61040 1613 1498 -61040 1426 1525 -61040 1829 1886 -61040 1660 1692 -61040 1591 1872 -61040 1470 1517 -61040 1650 1668 -61060 1537 1850 -61060 1541 1691 -61060 1543 1513 -61060 1546 1425 -61060 1549 1688 -61060 1553 1924 -61060 1566 1857 -61060 1593 1521 -61060 1626 1742 -61060 1646 1655 -61060 1648 1696 -61060 1667 1908 -61060 1688 1448 -61060 1688 1884 -61060 1688 1501 -61060 1708 1774 -61060 1711 1908 -61060 1711 1877 -61060 1715 1755 -61060 1725 1465 -61060 1725 1731 -61060 1747 1831 -61060 1767 1901 -61060 1779 1835 -61060 1786 1882 -61060 1789 1858 -61060 1796 1473 -61060 1858 1875 -61060 1871 1480 -61060 1877 1908 -61060 1886 1908 -61060 1908 1914 -61060 1439 1528 -61060 1448 1501 -61060 1492 1501 -61060 1544 1890 -61060 1551 1269 -61060 1652 1725 -61060 1655 1882 -61060 1675 1798 -61060 1688 1475 -61060 1708 1882 -61060 1825 1426 -61060 1828 1522 -61060 1835 1874 -61060 1888 1524 -61060 1889 1492 -61060 1439 1498 -61060 1585 1766 -61060 1613 1528 -61060 1613 1439 -61060 1661 1840 -61060 1669 1754 -61060 1679 1742 -61060 1684 1901 -61060 1689 1752 -61060 1728 1890 -61060 1775 1845 -61060 1880 1464 -61060 1547 1768 -61060 1599 1512 -61060 1601 1458 -61060 1734 1444 -61060 1898 1477 -61060 1438 1519 -61060 1689 1766 -61060 1740 1863 -61060 1752 1766 -61060 1796 1441 -61060 1804 1510 -61060 1437 1455 -61060 1601 1911 -61060 1655 1774 -61060 1825 1525 -61060 1613 1498 -61060 1426 1525 -61060 1829 1886 -61060 1660 1692 -61060 1591 1872 -61060 1652 1747 -61060 1470 1517 -61060 1650 1668 -61080 1538 1777 -61080 1544 1890 -61080 1551 1269 -61080 1554 1633 -61080 1563 1842 -61080 1572 1441 -61080 1592 1916 -61080 1592 1470 -61080 1592 1887 -61080 1606 1431 -61080 1616 1887 -61080 1652 1725 -61080 1655 1882 -61080 1660 1501 -61080 1675 1798 -61080 1676 1747 -61080 1678 1501 -61080 1688 1889 -61080 1688 1475 -61080 1688 1492 -61080 1688 1434 -61080 1694 1898 -61080 1706 1434 -61080 1708 1882 -61080 1725 1789 -61080 1725 1831 -61080 1731 1831 -61080 1767 1840 -61080 1779 1522 -61080 1805 1467 -61080 1825 1426 -61080 1828 1522 -61080 1828 1507 -61080 1829 1448 -61080 1835 1874 -61080 1840 1901 -61080 1862 1887 -61080 1888 1524 -61080 1889 1492 -61080 1889 1485 -61080 1431 1516 -61080 1439 1498 -61080 1480 1518 -61080 1550 1566 -61080 1585 1766 -61080 1613 1528 -61080 1613 1439 -61080 1645 1756 -61080 1661 1840 -61080 1669 1754 -61080 1679 1742 -61080 1684 1901 -61080 1689 1752 -61080 1728 1890 -61080 1775 1845 -61080 1831 1526 -61080 1880 1464 -61080 1911 1458 -61080 1507 1522 -61080 1547 1768 -61080 1599 1512 -61080 1688 1457 -61080 1688 1706 -61080 1808 1816 -61080 1601 1458 -61080 1734 1444 -61080 1898 1477 -61080 1438 1519 -61080 1689 1766 -61080 1740 1863 -61080 1752 1766 -61080 1796 1441 -61080 1804 1510 -61080 1437 1455 -61080 1546 1548 -61080 1601 1911 -61080 1655 1760 -61080 1655 1774 -61080 1665 1853 -61080 1825 1525 -61080 1613 1498 -61080 1426 1525 -61080 1829 1886 -61080 1802 1865 -61080 1660 1692 -61080 1591 1872 -61080 1598 1635 -61080 1652 1747 -61080 1470 1517 -61080 1871 1517 -61080 1650 1668 -61100 1541 1691 -61100 1546 1425 -61100 1550 1592 -61100 1550 1572 -61100 1550 1566 -61100 1560 1526 -61100 1585 1752 -61100 1585 1689 -61100 1585 1766 -61100 1592 1641 -61100 1593 1521 -61100 1613 1528 -61100 1613 1439 -61100 1629 1701 -61100 1645 1756 -61100 1661 1840 -61100 1664 1821 -61100 1664 1519 -61100 1667 1523 -61100 1669 1754 -61100 1670 1908 -61100 1679 1742 -61100 1681 1731 -61100 1683 1718 -61100 1684 1841 -61100 1684 1901 -61100 1689 1752 -61100 1691 1718 -61100 1692 1785 -61100 1706 1457 -61100 1715 1755 -61100 1728 1890 -61100 1764 1798 -61100 1773 1498 -61100 1775 1467 -61100 1775 1845 -61100 1831 1526 -61100 1835 1877 -61100 1853 1879 -61100 1880 1464 -61100 1886 1448 -61100 1911 1458 -61100 1914 1523 -61100 1439 1528 -61100 1485 1529 -61100 1507 1522 -61100 1547 1768 -61100 1599 1512 -61100 1617 1441 -61100 1688 1457 -61100 1688 1706 -61100 1798 1835 -61100 1808 1816 -61100 1877 1920 -61100 1877 1908 -61100 1924 1478 -61100 1601 1458 -61100 1721 1816 -61100 1734 1444 -61100 1898 1477 -61100 1908 1920 -61100 1912 1916 -61100 1438 1519 -61100 1646 1760 -61100 1689 1766 -61100 1740 1863 -61100 1752 1766 -61100 1796 1441 -61100 1804 1510 -61100 1871 1470 -61100 1437 1455 -61100 1546 1548 -61100 1601 1911 -61100 1646 1655 -61100 1655 1760 -61100 1655 1774 -61100 1665 1853 -61100 1825 1525 -61100 1613 1498 -61100 1816 1823 -61100 1426 1525 -61100 1600 1664 -61100 1829 1886 -61100 1802 1865 -61100 1660 1692 -61100 1591 1872 -61100 1598 1635 -61100 1652 1747 -61100 1470 1517 -61100 1871 1517 -61100 1650 1668 -61120 1546 1901 -61120 1547 1768 -61120 1547 1808 -61120 1547 1823 -61120 1547 1816 -61120 1547 1721 -61120 1551 1433 -61120 1554 1845 -61120 1566 1617 -61120 1569 1679 -61120 1592 1613 -61120 1599 1512 -61120 1617 1441 -61120 1623 1835 -61120 1623 1518 -61120 1655 1882 -61120 1688 1728 -61120 1688 1457 -61120 1688 1706 -61120 1688 1887 -61120 1708 1882 -61120 1711 1845 -61120 1721 1768 -61120 1725 1731 -61120 1760 1882 -61120 1767 1840 -61120 1768 1881 -61120 1789 1478 -61120 1798 1835 -61120 1808 1816 -61120 1835 1874 -61120 1877 1920 -61120 1877 1908 -61120 1887 1474 -61120 1889 1480 -61120 1902 1924 -61120 1920 1467 -61120 1924 1478 -61120 1463 1473 -61120 1601 1458 -61120 1673 1676 -61120 1688 1434 -61120 1721 1816 -61120 1734 1444 -61120 1747 1831 -61120 1760 1774 -61120 1768 1816 -61120 1789 1924 -61120 1898 1477 -61120 1908 1920 -61120 1912 1916 -61120 1438 1519 -61120 1543 1513 -61120 1646 1760 -61120 1689 1766 -61120 1740 1863 -61120 1752 1766 -61120 1796 1441 -61120 1804 1510 -61120 1871 1470 -61120 1437 1455 -61120 1546 1548 -61120 1601 1911 -61120 1646 1655 -61120 1655 1760 -61120 1655 1774 -61120 1665 1853 -61120 1825 1525 -61120 1613 1498 -61120 1816 1823 -61120 1889 1492 -61120 1426 1525 -61120 1600 1664 -61120 1829 1886 -61120 1802 1865 -61120 1660 1692 -61120 1591 1872 -61120 1598 1635 -61120 1652 1747 -61120 1470 1517 -61120 1871 1517 -61120 1650 1668 -61140 1544 1893 -61140 1552 1761 -61140 1560 1526 -61140 1569 1626 -61140 1569 1742 -61140 1590 1448 -61140 1591 1688 -61140 1592 1840 -61140 1595 1684 -61140 1595 1654 -61140 1601 1458 -61140 1623 1889 -61140 1623 1492 -61140 1646 1708 -61140 1647 1831 -61140 1673 1676 -61140 1679 1742 -61140 1683 1535 -61140 1688 1434 -61140 1688 1871 -61140 1692 1798 -61140 1721 1816 -61140 1728 1835 -61140 1734 1444 -61140 1747 1831 -61140 1760 1786 -61140 1760 1774 -61140 1768 1816 -61140 1786 1882 -61140 1789 1924 -61140 1858 1433 -61140 1858 1475 -61140 1886 1480 -61140 1897 1473 -61140 1898 1477 -61140 1908 1920 -61140 1912 1916 -61140 1431 1516 -61140 1438 1519 -61140 1485 1529 -61140 1522 1524 -61140 1543 1513 -61140 1585 1766 -61140 1646 1760 -61140 1655 1708 -61140 1689 1766 -61140 1740 1863 -61140 1752 1766 -61140 1796 1441 -61140 1804 1510 -61140 1825 1426 -61140 1871 1470 -61140 1890 1519 -61140 1437 1455 -61140 1546 1548 -61140 1601 1911 -61140 1646 1655 -61140 1655 1760 -61140 1655 1774 -61140 1665 1853 -61140 1825 1525 -61140 1613 1498 -61140 1706 1457 -61140 1816 1823 -61140 1889 1492 -61140 1426 1525 -61140 1541 1691 -61140 1600 1664 -61140 1829 1886 -61140 1841 1901 -61140 1802 1865 -61140 1544 1884 -61140 1660 1692 -61140 1550 1566 -61140 1591 1872 -61140 1598 1635 -61140 1652 1747 -61140 1470 1517 -61140 1871 1517 -61140 1664 1821 -61140 1650 1668 -61160 1537 1886 -61160 1541 1718 -61160 1543 1513 -61160 1566 1796 -61160 1585 1766 -61160 1592 1606 -61160 1592 1431 -61160 1609 1842 -61160 1617 1441 -61160 1646 1760 -61160 1649 1752 -61160 1655 1708 -61160 1664 1519 -61160 1688 1517 -61160 1689 1752 -61160 1689 1766 -61160 1701 1923 -61160 1708 1760 -61160 1713 1887 -61160 1731 1465 -61160 1734 1894 -61160 1740 1863 -61160 1752 1766 -61160 1796 1441 -61160 1804 1510 -61160 1805 1904 -61160 1816 1505 -61160 1823 1505 -61160 1825 1426 -61160 1835 1874 -61160 1835 1467 -61160 1840 1901 -61160 1847 1448 -61160 1871 1470 -61160 1877 1908 -61160 1884 1893 -61160 1890 1519 -61160 1437 1455 -61160 1448 1475 -61160 1507 1522 -61160 1544 1518 -61160 1546 1548 -61160 1599 1512 -61160 1601 1911 -61160 1602 1845 -61160 1616 1462 -61160 1646 1655 -61160 1655 1760 -61160 1655 1774 -61160 1665 1853 -61160 1825 1525 -61160 1572 1592 -61160 1613 1498 -61160 1706 1457 -61160 1816 1823 -61160 1889 1492 -61160 1426 1525 -61160 1541 1691 -61160 1547 1577 -61160 1600 1664 -61160 1829 1886 -61160 1884 1518 -61160 1841 1901 -61160 1802 1865 -61160 1544 1884 -61160 1660 1692 -61160 1550 1566 -61160 1591 1872 -61160 1598 1635 -61160 1652 1747 -61160 1715 1755 -61160 1470 1517 -61160 1871 1517 -61160 1664 1821 -61160 1650 1668 -61180 1544 1518 -61180 1546 1548 -61180 1569 1626 -61180 1581 1752 -61180 1590 1602 -61180 1599 1512 -61180 1601 1911 -61180 1602 1845 -61180 1613 1888 -61180 1616 1617 -61180 1616 1462 -61180 1617 1462 -61180 1625 1923 -61180 1628 1463 -61180 1646 1655 -61180 1647 1831 -61180 1655 1760 -61180 1655 1774 -61180 1665 1853 -61180 1667 1771 -61180 1679 1742 -61180 1721 1816 -61180 1728 1754 -61180 1735 1762 -61180 1786 1882 -61180 1789 1471 -61180 1798 1529 -61180 1798 1845 -61180 1825 1525 -61180 1914 1473 -61180 1914 1489 -61180 1439 1498 -61180 1546 1606 -61180 1554 1920 -61180 1572 1592 -61180 1595 1654 -61180 1613 1498 -61180 1706 1457 -61180 1816 1823 -61180 1889 1492 -61180 1426 1525 -61180 1541 1691 -61180 1547 1577 -61180 1600 1664 -61180 1649 1689 -61180 1829 1886 -61180 1884 1518 -61180 1601 1458 -61180 1606 1431 -61180 1630 1531 -61180 1841 1901 -61180 1850 1868 -61180 1924 1471 -61180 1802 1865 -61180 1544 1884 -61180 1660 1692 -61180 1734 1444 -61180 1550 1566 -61180 1613 1439 -61180 1789 1924 -61180 1840 1489 -61180 1591 1872 -61180 1598 1635 -61180 1652 1747 -61180 1438 1519 -61180 1715 1755 -61180 1470 1517 -61180 1871 1517 -61180 1664 1821 -61180 1650 1668 -61200 1539 1796 -61200 1546 1516 -61200 1546 1606 -61200 1546 1431 -61200 1554 1920 -61200 1568 1898 -61200 1572 1592 -61200 1590 1448 -61200 1595 1654 -61200 1600 1525 -61200 1602 1480 -61200 1602 1679 -61200 1613 1498 -61200 1625 1887 -61200 1641 1888 -61200 1641 1715 -61200 1641 1755 -61200 1664 1519 -61200 1684 1425 -61200 1706 1457 -61200 1731 1465 -61200 1731 1747 -61200 1735 1752 -61200 1735 1527 -61200 1764 1840 -61200 1798 1858 -61200 1805 1841 -61200 1816 1823 -61200 1840 1914 -61200 1853 1879 -61200 1857 1441 -61200 1858 1889 -61200 1858 1492 -61200 1889 1492 -61200 1894 1480 -61200 1920 1473 -61200 1426 1525 -61200 1437 1455 -61200 1541 1691 -61200 1547 1577 -61200 1583 1825 -61200 1587 1817 -61200 1600 1664 -61200 1649 1689 -61200 1661 1840 -61200 1688 1706 -61200 1754 1914 -61200 1755 1498 -61200 1829 1886 -61200 1884 1518 -61200 1548 1516 -61200 1601 1458 -61200 1606 1431 -61200 1630 1531 -61200 1841 1901 -61200 1850 1868 -61200 1541 1718 -61200 1688 1457 -61200 1912 1916 -61200 1924 1471 -61200 1802 1865 -61200 1544 1884 -61200 1660 1692 -61200 1664 1438 -61200 1734 1444 -61200 1550 1566 -61200 1613 1439 -61200 1789 1924 -61200 1840 1489 -61200 1591 1916 -61200 1591 1872 -61200 1598 1635 -61200 1835 1874 -61200 1652 1747 -61200 1438 1519 -61200 1715 1755 -61200 1470 1517 -61200 1871 1517 -61200 1664 1821 -61200 1650 1668 -61220 1541 1691 -61220 1547 1577 -61220 1550 1888 -61220 1566 1857 -61220 1583 1825 -61220 1583 1525 -61220 1585 1617 -61220 1587 1817 -61220 1595 1517 -61220 1600 1664 -61220 1600 1821 -61220 1601 1911 -61220 1609 1448 -61220 1617 1766 -61220 1649 1689 -61220 1649 1731 -61220 1655 1819 -61220 1655 1774 -61220 1661 1840 -61220 1674 1491 -61220 1676 1731 -61220 1688 1706 -61220 1701 1477 -61220 1754 1914 -61220 1755 1498 -61220 1805 1425 -61220 1829 1886 -61220 1842 1480 -61220 1877 1908 -61220 1884 1518 -61220 1908 1505 -61220 1448 1480 -61220 1485 1529 -61220 1548 1516 -61220 1569 1742 -61220 1583 1426 -61220 1601 1458 -61220 1606 1431 -61220 1625 1898 -61220 1626 1742 -61220 1630 1531 -61220 1731 1831 -61220 1841 1901 -61220 1850 1868 -61220 1541 1718 -61220 1576 1835 -61220 1628 1463 -61220 1688 1457 -61220 1825 1426 -61220 1845 1434 -61220 1912 1916 -61220 1924 1471 -61220 1437 1527 -61220 1600 1438 -61220 1645 1756 -61220 1802 1865 -61220 1544 1884 -61220 1660 1692 -61220 1664 1438 -61220 1734 1444 -61220 1550 1566 -61220 1613 1439 -61220 1764 1489 -61220 1789 1924 -61220 1840 1489 -61220 1591 1916 -61220 1591 1872 -61220 1598 1635 -61220 1835 1874 -61220 1652 1747 -61220 1438 1519 -61220 1715 1755 -61220 1871 1470 -61220 1470 1517 -61220 1871 1517 -61220 1664 1821 -61220 1650 1668 -61240 1538 1777 -61240 1541 1683 -61240 1546 1516 -61240 1546 1606 -61240 1548 1516 -61240 1554 1835 -61240 1566 1617 -61240 1569 1742 -61240 1583 1426 -61240 1601 1458 -61240 1602 1676 -61240 1602 1652 -61240 1606 1431 -61240 1625 1898 -61240 1626 1742 -61240 1630 1531 -61240 1634 1452 -61240 1652 1526 -61240 1688 1448 -61240 1688 1890 -61240 1706 1448 -61240 1731 1831 -61240 1764 1840 -61240 1766 1535 -61240 1841 1901 -61240 1850 1868 -61240 1889 1492 -61240 1890 1457 -61240 1901 1441 -61240 1437 1455 -61240 1438 1448 -61240 1467 1529 -61240 1541 1718 -61240 1546 1548 -61240 1546 1431 -61240 1576 1835 -61240 1613 1888 -61240 1625 1490 -61240 1628 1463 -61240 1655 1512 -61240 1688 1457 -61240 1691 1718 -61240 1825 1426 -61240 1831 1526 -61240 1845 1434 -61240 1912 1916 -61240 1924 1471 -61240 1437 1527 -61240 1448 1467 -61240 1600 1438 -61240 1645 1756 -61240 1802 1865 -61240 1544 1884 -61240 1585 1752 -61240 1660 1692 -61240 1664 1438 -61240 1673 1747 -61240 1734 1444 -61240 1544 1518 -61240 1550 1566 -61240 1572 1592 -61240 1613 1439 -61240 1764 1489 -61240 1676 1747 -61240 1789 1924 -61240 1840 1489 -61240 1872 1916 -61240 1591 1916 -61240 1591 1872 -61240 1598 1635 -61240 1835 1874 -61240 1652 1747 -61240 1438 1519 -61240 1715 1755 -61240 1871 1470 -61240 1470 1517 -61240 1871 1517 -61240 1664 1821 -61240 1650 1668 -61260 1541 1691 -61260 1541 1718 -61260 1546 1548 -61260 1546 1431 -61260 1547 1816 -61260 1554 1688 -61260 1554 1473 -61260 1575 1679 -61260 1576 1835 -61260 1599 1512 -61260 1602 1489 -61260 1602 1754 -61260 1609 1448 -61260 1613 1888 -61260 1625 1490 -61260 1628 1463 -61260 1635 1517 -61260 1655 1512 -61260 1688 1457 -61260 1688 1766 -61260 1688 1535 -61260 1691 1718 -61260 1706 1467 -61260 1755 1498 -61260 1766 1890 -61260 1766 1467 -61260 1798 1462 -61260 1825 1426 -61260 1831 1526 -61260 1845 1434 -61260 1857 1441 -61260 1886 1485 -61260 1912 1916 -61260 1924 1471 -61260 1428 1467 -61260 1431 1516 -61260 1433 1480 -61260 1437 1527 -61260 1448 1467 -61260 1448 1462 -61260 1462 1529 -61260 1581 1770 -61260 1600 1438 -61260 1645 1756 -61260 1652 1673 -61260 1688 1467 -61260 1802 1865 -61260 1877 1908 -61260 1544 1884 -61260 1569 1665 -61260 1573 1452 -61260 1585 1752 -61260 1648 1696 -61260 1660 1692 -61260 1664 1438 -61260 1673 1747 -61260 1734 1444 -61260 1544 1518 -61260 1550 1566 -61260 1600 1664 -61260 1600 1821 -61260 1649 1689 -61260 1829 1462 -61260 1884 1518 -61260 1886 1462 -61260 1890 1467 -61260 1572 1592 -61260 1613 1439 -61260 1754 1914 -61260 1764 1489 -61260 1617 1901 -61260 1857 1901 -61260 1652 1676 -61260 1676 1747 -61260 1789 1924 -61260 1840 1489 -61260 1872 1916 -61260 1665 1742 -61260 1591 1916 -61260 1591 1872 -61260 1598 1635 -61260 1835 1874 -61260 1652 1747 -61260 1438 1519 -61260 1715 1755 -61260 1871 1470 -61260 1470 1517 -61260 1871 1517 -61260 1541 1533 -61260 1664 1821 -61260 1650 1668 -61280 1546 1717 -61280 1546 1606 -61280 1548 1516 -61280 1554 1862 -61280 1581 1770 -61280 1591 1912 -61280 1600 1438 -61280 1606 1431 -61280 1609 1688 -61280 1609 1890 -61280 1609 1706 -61280 1619 1873 -61280 1635 1470 -61280 1645 1756 -61280 1649 1904 -61280 1652 1673 -61280 1688 1706 -61280 1688 1467 -61280 1688 1890 -61280 1717 1901 -61280 1764 1840 -61280 1798 1831 -61280 1802 1865 -61280 1805 1425 -61280 1821 1525 -61280 1877 1908 -61280 1889 1492 -61280 1898 1923 -61280 1434 1462 -61280 1438 1467 -61280 1467 1519 -61280 1544 1884 -61280 1547 1808 -61280 1569 1665 -61280 1573 1452 -61280 1585 1752 -61280 1617 1841 -61280 1648 1696 -61280 1660 1692 -61280 1664 1438 -61280 1673 1747 -61280 1673 1676 -61280 1734 1444 -61280 1893 1518 -61280 1897 1428 -61280 1434 1529 -61280 1544 1518 -61280 1550 1566 -61280 1600 1664 -61280 1600 1821 -61280 1617 1717 -61280 1635 1667 -61280 1649 1689 -61280 1829 1462 -61280 1841 1901 -61280 1850 1868 -61280 1884 1518 -61280 1886 1462 -61280 1890 1467 -61280 1572 1592 -61280 1613 1439 -61280 1688 1426 -61280 1754 1914 -61280 1764 1489 -61280 1617 1857 -61280 1617 1901 -61280 1734 1491 -61280 1829 1886 -61280 1841 1857 -61280 1857 1901 -61280 1652 1676 -61280 1676 1747 -61280 1789 1924 -61280 1840 1489 -61280 1872 1916 -61280 1665 1742 -61280 1683 1718 -61280 1591 1916 -61280 1691 1533 -61280 1591 1872 -61280 1598 1635 -61280 1835 1874 -61280 1652 1747 -61280 1438 1519 -61280 1715 1755 -61280 1871 1470 -61280 1470 1517 -61280 1871 1517 -61280 1541 1533 -61280 1664 1821 -61280 1650 1668 -61300 1544 1884 -61300 1546 1547 -61300 1547 1808 -61300 1547 1613 -61300 1569 1665 -61300 1573 1452 -61300 1583 1825 -61300 1585 1752 -61300 1587 1817 -61300 1599 1655 -61300 1600 1902 -61300 1617 1841 -61300 1625 1923 -61300 1630 1531 -61300 1648 1696 -61300 1649 1847 -61300 1660 1692 -61300 1664 1438 -61300 1673 1747 -61300 1673 1676 -61300 1677 1918 -61300 1689 1847 -61300 1701 1448 -61300 1734 1444 -61300 1735 1527 -61300 1755 1498 -61300 1767 1489 -61300 1831 1847 -61300 1845 1434 -61300 1893 1518 -61300 1897 1428 -61300 1902 1924 -61300 1924 1471 -61300 1427 1473 -61300 1434 1529 -61300 1434 1485 -61300 1485 1529 -61300 1544 1518 -61300 1550 1566 -61300 1566 1901 -61300 1579 1476 -61300 1600 1664 -61300 1600 1821 -61300 1617 1717 -61300 1635 1667 -61300 1649 1689 -61300 1829 1462 -61300 1841 1901 -61300 1850 1868 -61300 1884 1518 -61300 1886 1462 -61300 1890 1467 -61300 1911 1458 -61300 1572 1592 -61300 1613 1439 -61300 1688 1426 -61300 1754 1914 -61300 1764 1489 -61300 1617 1857 -61300 1617 1901 -61300 1734 1491 -61300 1829 1886 -61300 1841 1857 -61300 1857 1901 -61300 1652 1676 -61300 1676 1747 -61300 1789 1924 -61300 1840 1489 -61300 1872 1916 -61300 1437 1527 -61300 1665 1742 -61300 1683 1718 -61300 1541 1691 -61300 1591 1916 -61300 1691 1533 -61300 1591 1872 -61300 1598 1635 -61300 1835 1874 -61300 1628 1862 -61300 1652 1747 -61300 1438 1519 -61300 1715 1755 -61300 1871 1470 -61300 1470 1517 -61300 1871 1517 -61300 1541 1533 -61300 1664 1821 -61300 1650 1668 -61320 1544 1438 -61320 1544 1518 -61320 1544 1821 -61320 1550 1566 -61320 1566 1857 -61320 1566 1901 -61320 1579 1476 -61320 1585 1766 -61320 1590 1473 -61320 1600 1664 -61320 1600 1821 -61320 1601 1911 -61320 1604 1616 -61320 1617 1717 -61320 1628 1768 -61320 1635 1667 -61320 1649 1689 -61320 1652 1847 -61320 1676 1847 -61320 1681 1731 -61320 1688 1835 -61320 1692 1752 -61320 1692 1467 -61320 1697 1906 -61320 1701 1473 -61320 1727 1845 -61320 1829 1462 -61320 1841 1901 -61320 1850 1868 -61320 1866 1497 -61320 1884 1518 -61320 1886 1462 -61320 1889 1480 -61320 1889 1492 -61320 1890 1467 -61320 1897 1467 -61320 1911 1458 -61320 1549 1525 -61320 1572 1592 -61320 1595 1473 -61320 1601 1458 -61320 1613 1439 -61320 1626 1665 -61320 1688 1426 -61320 1754 1914 -61320 1764 1489 -61320 1617 1857 -61320 1617 1901 -61320 1734 1491 -61320 1829 1886 -61320 1841 1857 -61320 1857 1901 -61320 1600 1428 -61320 1652 1676 -61320 1676 1747 -61320 1789 1924 -61320 1840 1489 -61320 1872 1916 -61320 1437 1527 -61320 1665 1742 -61320 1683 1718 -61320 1541 1691 -61320 1591 1916 -61320 1691 1533 -61320 1591 1872 -61320 1598 1635 -61320 1835 1874 -61320 1628 1862 -61320 1652 1747 -61320 1805 1425 -61320 1438 1519 -61320 1715 1755 -61320 1871 1470 -61320 1470 1517 -61320 1871 1517 -61320 1541 1533 -61320 1664 1821 -61320 1650 1668 -61340 1549 1525 -61340 1549 1518 -61340 1550 1857 -61340 1550 1717 -61340 1551 1269 -61340 1566 1717 -61340 1569 1665 -61340 1572 1592 -61340 1581 1752 -61340 1595 1473 -61340 1599 1774 -61340 1601 1458 -61340 1606 1516 -61340 1609 1441 -61340 1613 1439 -61340 1626 1665 -61340 1630 1531 -61340 1660 1692 -61340 1664 1890 -61340 1688 1426 -61340 1701 1771 -61340 1731 1770 -61340 1731 1831 -61340 1754 1914 -61340 1764 1489 -61340 1802 1487 -61340 1821 1890 -61340 1847 1875 -61340 1877 1908 -61340 1617 1857 -61340 1617 1901 -61340 1625 1923 -61340 1640 1802 -61340 1734 1491 -61340 1829 1886 -61340 1841 1857 -61340 1857 1901 -61340 1573 1452 -61340 1600 1428 -61340 1652 1676 -61340 1676 1747 -61340 1789 1924 -61340 1840 1489 -61340 1872 1916 -61340 1437 1527 -61340 1583 1825 -61340 1665 1742 -61340 1683 1718 -61340 1752 1766 -61340 1541 1691 -61340 1591 1916 -61340 1673 1747 -61340 1691 1533 -61340 1740 1863 -61340 1890 1518 -61340 1591 1872 -61340 1598 1635 -61340 1835 1874 -61340 1628 1862 -61340 1652 1747 -61340 1805 1425 -61340 1438 1519 -61340 1715 1755 -61340 1871 1470 -61340 1470 1517 -61340 1871 1517 -61340 1541 1533 -61340 1664 1821 -61340 1650 1668 -61360 1537 1835 -61360 1543 1630 -61360 1548 1516 -61360 1549 1884 -61360 1592 1609 -61360 1609 1756 -61360 1617 1857 -61360 1617 1901 -61360 1625 1923 -61360 1640 1802 -61360 1664 1897 -61360 1677 1918 -61360 1688 1701 -61360 1734 1491 -61360 1735 1855 -61360 1825 1462 -61360 1829 1886 -61360 1841 1857 -61360 1841 1901 -61360 1850 1868 -61360 1853 1894 -61360 1857 1901 -61360 1912 1916 -61360 1924 1471 -61360 1473 1529 -61360 1473 1485 -61360 1480 1529 -61360 1480 1485 -61360 1573 1452 -61360 1600 1664 -61360 1600 1428 -61360 1652 1676 -61360 1676 1747 -61360 1789 1924 -61360 1840 1489 -61360 1872 1916 -61360 1437 1527 -61360 1583 1825 -61360 1599 1655 -61360 1665 1742 -61360 1683 1718 -61360 1752 1766 -61360 1767 1489 -61360 1485 1529 -61360 1541 1691 -61360 1591 1916 -61360 1635 1517 -61360 1673 1747 -61360 1691 1533 -61360 1740 1863 -61360 1890 1428 -61360 1890 1518 -61360 1591 1872 -61360 1598 1635 -61360 1600 1890 -61360 1835 1874 -61360 1628 1862 -61360 1652 1747 -61360 1805 1425 -61360 1438 1519 -61360 1550 1566 -61360 1715 1755 -61360 1871 1470 -61360 1470 1517 -61360 1871 1517 -61360 1544 1518 -61360 1541 1533 -61360 1664 1821 -61360 1599 1658 -61360 1650 1668 -61380 1537 1688 -61380 1544 1890 -61380 1573 1452 -61380 1585 1766 -61380 1595 1654 -61380 1600 1664 -61380 1600 1428 -61380 1600 1821 -61380 1626 1649 -61380 1649 1889 -61380 1649 1665 -61380 1652 1676 -61380 1664 1890 -61380 1676 1747 -61380 1694 1529 -61380 1701 1853 -61380 1701 1886 -61380 1756 1489 -61380 1764 1840 -61380 1789 1924 -61380 1821 1890 -61380 1821 1879 -61380 1825 1886 -61380 1840 1489 -61380 1865 1882 -61380 1872 1916 -61380 1879 1884 -61380 1889 1893 -61380 1437 1527 -61380 1583 1825 -61380 1599 1655 -61380 1600 1518 -61380 1665 1742 -61380 1669 1914 -61380 1683 1718 -61380 1731 1847 -61380 1752 1766 -61380 1767 1489 -61380 1789 1902 -61380 1847 1458 -61380 1853 1884 -61380 1886 1462 -61380 1485 1529 -61380 1541 1691 -61380 1591 1916 -61380 1635 1517 -61380 1648 1696 -61380 1673 1747 -61380 1691 1533 -61380 1740 1863 -61380 1754 1914 -61380 1755 1498 -61380 1764 1489 -61380 1890 1428 -61380 1890 1518 -61380 1591 1872 -61380 1598 1635 -61380 1600 1890 -61380 1652 1673 -61380 1713 1924 -61380 1835 1874 -61380 1628 1862 -61380 1660 1692 -61380 1652 1747 -61380 1805 1425 -61380 1438 1519 -61380 1550 1566 -61380 1715 1755 -61380 1871 1470 -61380 1470 1517 -61380 1871 1517 -61380 1544 1518 -61380 1541 1533 -61380 1664 1821 -61380 1599 1658 -61380 1650 1668 -61400 1549 1884 -61400 1551 1269 -61400 1583 1825 -61400 1599 1655 -61400 1600 1518 -61400 1601 1458 -61400 1602 1467 -61400 1664 1853 -61400 1665 1742 -61400 1669 1914 -61400 1669 1754 -61400 1681 1731 -61400 1683 1718 -61400 1701 1706 -61400 1701 1756 -61400 1715 1498 -61400 1731 1847 -61400 1735 1921 -61400 1752 1766 -61400 1767 1489 -61400 1789 1902 -61400 1791 1467 -61400 1825 1462 -61400 1829 1491 -61400 1847 1458 -61400 1850 1868 -61400 1853 1884 -61400 1886 1462 -61400 1444 1491 -61400 1485 1529 -61400 1541 1691 -61400 1547 1660 -61400 1591 1916 -61400 1604 1616 -61400 1635 1517 -61400 1648 1696 -61400 1673 1747 -61400 1691 1533 -61400 1740 1863 -61400 1754 1914 -61400 1755 1498 -61400 1764 1489 -61400 1821 1518 -61400 1890 1428 -61400 1890 1518 -61400 1924 1471 -61400 1591 1872 -61400 1598 1635 -61400 1600 1890 -61400 1652 1673 -61400 1713 1924 -61400 1835 1874 -61400 1628 1862 -61400 1660 1692 -61400 1841 1901 -61400 1652 1747 -61400 1805 1425 -61400 1438 1519 -61400 1550 1566 -61400 1715 1755 -61400 1871 1470 -61400 1470 1517 -61400 1871 1517 -61400 1544 1518 -61400 1541 1533 -61400 1664 1821 -61400 1599 1658 -61400 1650 1668 -61420 1541 1691 -61420 1547 1660 -61420 1548 1606 -61420 1550 1921 -61420 1591 1916 -61420 1600 1428 -61420 1600 1650 -61420 1604 1616 -61420 1617 1441 -61420 1617 1921 -61420 1619 1505 -61420 1628 1701 -61420 1635 1517 -61420 1648 1696 -61420 1664 1448 -61420 1664 1438 -61420 1673 1747 -61420 1691 1533 -61420 1734 1475 -61420 1740 1863 -61420 1754 1889 -61420 1754 1914 -61420 1755 1498 -61420 1756 1475 -61420 1764 1489 -61420 1821 1448 -61420 1821 1518 -61420 1821 1438 -61420 1879 1890 -61420 1890 1428 -61420 1890 1518 -61420 1921 1527 -61420 1924 1471 -61420 1427 1482 -61420 1544 1890 -61420 1564 1847 -61420 1591 1872 -61420 1592 1606 -61420 1598 1635 -61420 1600 1890 -61420 1652 1673 -61420 1655 1774 -61420 1713 1924 -61420 1835 1448 -61420 1835 1874 -61420 1496 1497 -61420 1628 1862 -61420 1660 1692 -61420 1841 1901 -61420 1904 1920 -61420 1652 1747 -61420 1805 1425 -61420 1438 1519 -61420 1550 1566 -61420 1715 1755 -61420 1871 1470 -61420 1470 1517 -61420 1871 1517 -61420 1840 1489 -61420 1544 1518 -61420 1541 1533 -61420 1645 1756 -61420 1664 1821 -61420 1599 1658 -61420 1650 1668 -61440 1544 1890 -61440 1552 1761 -61440 1564 1847 -61440 1566 1921 -61440 1568 1625 -61440 1576 1835 -61440 1590 1609 -61440 1591 1872 -61440 1592 1734 -61440 1592 1606 -61440 1598 1635 -61440 1600 1890 -61440 1601 1458 -61440 1652 1673 -61440 1655 1774 -61440 1664 1879 -61440 1679 1523 -61440 1701 1463 -61440 1713 1924 -61440 1725 1434 -61440 1734 1480 -61440 1764 1840 -61440 1821 1890 -61440 1821 1879 -61440 1835 1448 -61440 1835 1874 -61440 1857 1921 -61440 1857 1527 -61440 1894 1919 -61440 1911 1458 -61440 1496 1497 -61440 1551 1269 -61440 1599 1655 -61440 1628 1862 -61440 1660 1692 -61440 1664 1890 -61440 1841 1901 -61440 1857 1441 -61440 1914 1921 -61440 1462 1518 -61440 1687 1841 -61440 1904 1920 -61440 1652 1747 -61440 1805 1425 -61440 1438 1519 -61440 1550 1566 -61440 1544 1462 -61440 1715 1755 -61440 1767 1489 -61440 1601 1911 -61440 1655 1861 -61440 1669 1754 -61440 1850 1868 -61440 1549 1525 -61440 1871 1470 -61440 1470 1517 -61440 1871 1517 -61440 1840 1489 -61440 1544 1518 -61440 1541 1533 -61440 1645 1756 -61440 1664 1821 -61440 1599 1658 -61440 1650 1668 -61460 1551 1269 -61460 1565 1628 -61460 1591 1734 -61460 1599 1655 -61460 1613 1526 -61460 1628 1862 -61460 1648 1696 -61460 1652 1830 -61460 1660 1692 -61460 1664 1890 -61460 1676 1439 -61460 1688 1888 -61460 1764 1489 -61460 1767 1840 -61460 1831 1847 -61460 1841 1901 -61460 1857 1441 -61460 1890 1428 -61460 1914 1921 -61460 1914 1476 -61460 1462 1518 -61460 1566 1857 -61460 1687 1841 -61460 1879 1890 -61460 1904 1920 -61460 1572 1592 -61460 1652 1747 -61460 1755 1498 -61460 1805 1425 -61460 1438 1519 -61460 1550 1566 -61460 1735 1466 -61460 1544 1462 -61460 1715 1755 -61460 1767 1489 -61460 1601 1911 -61460 1655 1861 -61460 1669 1754 -61460 1731 1911 -61460 1850 1868 -61460 1549 1525 -61460 1871 1470 -61460 1470 1517 -61460 1871 1517 -61460 1840 1489 -61460 1544 1518 -61460 1541 1533 -61460 1645 1756 -61460 1601 1731 -61460 1664 1821 -61460 1829 1886 -61460 1599 1658 -61460 1650 1668 -61480 1548 1606 -61480 1549 1884 -61480 1550 1857 -61480 1566 1857 -61480 1566 1617 -61480 1628 1701 -61480 1673 1747 -61480 1678 1480 -61480 1687 1841 -61480 1721 1906 -61480 1764 1840 -61480 1821 1890 -61480 1862 1471 -61480 1871 1912 -61480 1879 1890 -61480 1889 1906 -61480 1904 1920 -61480 1496 1497 -61480 1572 1592 -61480 1652 1747 -61480 1683 1718 -61480 1696 1894 -61480 1755 1498 -61480 1431 1516 -61480 1805 1425 -61480 1438 1519 -61480 1550 1566 -61480 1598 1635 -61480 1735 1466 -61480 1485 1529 -61480 1544 1462 -61480 1715 1755 -61480 1767 1489 -61480 1601 1911 -61480 1655 1861 -61480 1669 1754 -61480 1731 1911 -61480 1850 1868 -61480 1549 1525 -61480 1595 1654 -61480 1871 1470 -61480 1470 1517 -61480 1871 1517 -61480 1840 1489 -61480 1544 1518 -61480 1541 1533 -61480 1645 1756 -61480 1601 1731 -61480 1664 1821 -61480 1829 1886 -61480 1599 1658 -61480 1650 1668 -61500 1547 1889 -61500 1560 1474 -61500 1565 1628 -61500 1572 1592 -61500 1592 1702 -61500 1599 1861 -61500 1600 1890 -61500 1630 1467 -61500 1652 1747 -61500 1664 1438 -61500 1679 1523 -61500 1681 1831 -61500 1683 1718 -61500 1691 1533 -61500 1696 1894 -61500 1713 1924 -61500 1734 1871 -61500 1752 1766 -61500 1754 1471 -61500 1755 1498 -61500 1831 1875 -61500 1854 1448 -61500 1431 1516 -61500 1664 1890 -61500 1805 1425 -61500 1857 1907 -61500 1890 1462 -61500 1438 1519 -61500 1462 1518 -61500 1550 1566 -61500 1598 1635 -61500 1735 1466 -61500 1835 1874 -61500 1485 1529 -61500 1544 1462 -61500 1549 1689 -61500 1715 1755 -61500 1767 1489 -61500 1601 1911 -61500 1655 1861 -61500 1669 1754 -61500 1731 1911 -61500 1850 1868 -61500 1549 1525 -61500 1840 1901 -61500 1595 1654 -61500 1871 1470 -61500 1470 1517 -61500 1871 1517 -61500 1840 1489 -61500 1544 1518 -61500 1541 1533 -61500 1645 1756 -61500 1601 1731 -61500 1664 1821 -61500 1829 1886 -61500 1599 1658 -61500 1650 1668 -61520 1539 1678 -61520 1547 1747 -61520 1583 1884 -61520 1591 1626 -61520 1600 1438 -61520 1604 1616 -61520 1651 1473 -61520 1652 1427 -61520 1664 1890 -61520 1676 1678 -61520 1684 1841 -61520 1749 1757 -61520 1805 1425 -61520 1821 1890 -61520 1821 1462 -61520 1857 1907 -61520 1890 1462 -61520 1438 1519 -61520 1462 1518 -61520 1538 1549 -61520 1550 1566 -61520 1598 1635 -61520 1735 1466 -61520 1764 1840 -61520 1835 1874 -61520 1847 1458 -61520 1485 1529 -61520 1544 1462 -61520 1549 1689 -61520 1609 1920 -61520 1701 1463 -61520 1715 1755 -61520 1767 1489 -61520 1601 1911 -61520 1655 1861 -61520 1669 1754 -61520 1731 1911 -61520 1841 1901 -61520 1850 1868 -61520 1549 1525 -61520 1840 1841 -61520 1840 1901 -61520 1879 1890 -61520 1595 1654 -61520 1871 1470 -61520 1470 1517 -61520 1871 1517 -61520 1840 1489 -61520 1544 1518 -61520 1541 1533 -61520 1645 1756 -61520 1601 1731 -61520 1664 1821 -61520 1829 1886 -61520 1599 1658 -61520 1650 1668 -61540 1538 1549 -61540 1550 1566 -61540 1592 1887 -61540 1592 1438 -61540 1592 1519 -61540 1598 1635 -61540 1599 1774 -61540 1651 1894 -61540 1652 1747 -61540 1688 1530 -61540 1689 1525 -61540 1692 1830 -61540 1735 1466 -61540 1764 1840 -61540 1764 1489 -61540 1767 1841 -61540 1835 1874 -61540 1835 1887 -61540 1847 1458 -61540 1847 1911 -61540 1854 1887 -61540 1871 1474 -61540 1888 1529 -61540 1904 1920 -61540 1476 1480 -61540 1485 1529 -61540 1544 1462 -61540 1549 1689 -61540 1583 1825 -61540 1609 1920 -61540 1655 1658 -61540 1701 1463 -61540 1715 1755 -61540 1767 1489 -61540 1601 1911 -61540 1655 1861 -61540 1669 1754 -61540 1569 1742 -61540 1600 1519 -61540 1731 1911 -61540 1841 1901 -61540 1850 1868 -61540 1918 1448 -61540 1549 1525 -61540 1598 1667 -61540 1840 1841 -61540 1840 1901 -61540 1879 1890 -61540 1595 1654 -61540 1679 1523 -61540 1871 1470 -61540 1470 1517 -61540 1871 1517 -61540 1840 1489 -61540 1544 1518 -61540 1541 1533 -61540 1645 1756 -61540 1601 1731 -61540 1664 1821 -61540 1829 1886 -61540 1599 1658 -61540 1538 1825 -61540 1650 1668 -61560 1539 1617 -61560 1539 1562 -61560 1539 1527 -61560 1539 1441 -61560 1543 1786 -61560 1544 1462 -61560 1549 1689 -61560 1549 1890 -61560 1550 1562 -61560 1562 1617 -61560 1583 1825 -61560 1583 1884 -61560 1599 1861 -61560 1609 1920 -61560 1630 1467 -61560 1655 1658 -61560 1664 1890 -61560 1688 1900 -61560 1688 1887 -61560 1701 1463 -61560 1713 1924 -61560 1715 1755 -61560 1767 1840 -61560 1767 1489 -61560 1841 1489 -61560 1875 1437 -61560 1438 1471 -61560 1444 1491 -61560 1467 1531 -61560 1544 1821 -61560 1601 1911 -61560 1617 1441 -61560 1655 1861 -61560 1669 1754 -61560 1691 1533 -61560 1731 1458 -61560 1740 1863 -61560 1857 1907 -61560 1888 1485 -61560 1911 1458 -61560 1569 1742 -61560 1600 1519 -61560 1683 1718 -61560 1731 1911 -61560 1841 1901 -61560 1850 1868 -61560 1918 1448 -61560 1547 1889 -61560 1549 1525 -61560 1598 1667 -61560 1840 1841 -61560 1840 1901 -61560 1879 1890 -61560 1595 1654 -61560 1679 1523 -61560 1767 1901 -61560 1871 1470 -61560 1470 1517 -61560 1755 1498 -61560 1871 1517 -61560 1840 1489 -61560 1544 1518 -61560 1541 1533 -61560 1645 1756 -61560 1601 1731 -61560 1664 1821 -61560 1829 1886 -61560 1599 1658 -61560 1538 1825 -61560 1650 1668 -61580 1541 1691 -61580 1544 1821 -61580 1550 1441 -61580 1591 1835 -61580 1599 1774 -61580 1601 1911 -61580 1617 1441 -61580 1640 1802 -61580 1641 1441 -61580 1642 1466 -61580 1655 1861 -61580 1655 1431 -61580 1658 1861 -61580 1669 1754 -61580 1688 1756 -61580 1688 1517 -61580 1689 1713 -61580 1691 1533 -61580 1731 1458 -61580 1740 1863 -61580 1761 1501 -61580 1767 1841 -61580 1798 1906 -61580 1804 1510 -61580 1831 1847 -61580 1857 1907 -61580 1866 1528 -61580 1888 1485 -61580 1911 1458 -61580 1438 1489 -61580 1550 1566 -61580 1569 1742 -61580 1600 1519 -61580 1652 1747 -61580 1683 1718 -61580 1731 1911 -61580 1829 1451 -61580 1841 1901 -61580 1850 1868 -61580 1918 1448 -61580 1543 1467 -61580 1547 1889 -61580 1549 1525 -61580 1598 1667 -61580 1644 1855 -61580 1840 1841 -61580 1840 1901 -61580 1879 1890 -61580 1595 1654 -61580 1679 1523 -61580 1767 1901 -61580 1871 1470 -61580 1470 1517 -61580 1755 1498 -61580 1871 1517 -61580 1840 1489 -61580 1544 1518 -61580 1541 1533 -61580 1645 1756 -61580 1601 1731 -61580 1664 1821 -61580 1829 1886 -61580 1599 1658 -61580 1538 1825 -61580 1650 1668 -61600 1546 1655 -61600 1549 1689 -61600 1550 1566 -61600 1562 1689 -61600 1562 1900 -61600 1563 1835 -61600 1566 1441 -61600 1569 1742 -61600 1600 1519 -61600 1626 1874 -61600 1648 1696 -61600 1648 1651 -61600 1652 1747 -61600 1683 1718 -61600 1688 1871 -61600 1689 1890 -61600 1731 1911 -61600 1767 1840 -61600 1829 1451 -61600 1841 1901 -61600 1850 1868 -61600 1918 1448 -61600 1543 1467 -61600 1546 1516 -61600 1547 1889 -61600 1549 1525 -61600 1598 1667 -61600 1644 1855 -61600 1796 1816 -61600 1798 1889 -61600 1840 1841 -61600 1840 1901 -61600 1879 1890 -61600 1920 1482 -61600 1546 1431 -61600 1547 1798 -61600 1595 1654 -61600 1601 1434 -61600 1679 1523 -61600 1731 1434 -61600 1767 1901 -61600 1871 1470 -61600 1470 1517 -61600 1544 1462 -61600 1715 1755 -61600 1755 1498 -61600 1871 1517 -61600 1840 1489 -61600 1544 1518 -61600 1541 1533 -61600 1645 1756 -61600 1601 1731 -61600 1664 1821 -61600 1660 1692 -61600 1829 1886 -61600 1599 1658 -61600 1538 1825 -61600 1650 1668 -61620 1543 1467 -61620 1546 1599 -61620 1546 1516 -61620 1547 1889 -61620 1549 1525 -61620 1549 1821 -61620 1550 1441 -61620 1587 1817 -61620 1591 1835 -61620 1598 1667 -61620 1608 1831 -61620 1617 1641 -61620 1644 1855 -61620 1679 1835 -61620 1796 1816 -61620 1798 1889 -61620 1840 1841 -61620 1840 1901 -61620 1879 1890 -61620 1920 1482 -61620 1546 1431 -61620 1547 1798 -61620 1595 1654 -61620 1601 1434 -61620 1651 1694 -61620 1679 1523 -61620 1731 1434 -61620 1767 1901 -61620 1871 1470 -61620 1924 1478 -61620 1470 1517 -61620 1544 1462 -61620 1715 1755 -61620 1740 1863 -61620 1755 1498 -61620 1871 1517 -61620 1617 1441 -61620 1675 1857 -61620 1840 1489 -61620 1544 1518 -61620 1541 1533 -61620 1645 1756 -61620 1601 1731 -61620 1664 1821 -61620 1660 1692 -61620 1829 1886 -61620 1599 1658 -61620 1538 1825 -61620 1598 1635 -61620 1650 1668 -61640 1546 1431 -61640 1547 1808 -61640 1547 1798 -61640 1548 1476 -61640 1562 1448 -61640 1563 1592 -61640 1595 1654 -61640 1601 1434 -61640 1648 1696 -61640 1651 1694 -61640 1664 1835 -61640 1679 1523 -61640 1683 1718 -61640 1731 1434 -61640 1767 1901 -61640 1770 1458 -61640 1836 1897 -61640 1871 1470 -61640 1880 1914 -61640 1888 1448 -61640 1897 1467 -61640 1924 1478 -61640 1470 1517 -61640 1475 1523 -61640 1507 1522 -61640 1541 1691 -61640 1544 1462 -61640 1569 1742 -61640 1600 1519 -61640 1626 1874 -61640 1669 1754 -61640 1701 1463 -61640 1841 1901 -61640 1850 1868 -61640 1875 1437 -61640 1689 1825 -61640 1715 1755 -61640 1740 1863 -61640 1755 1498 -61640 1871 1517 -61640 1617 1441 -61640 1675 1857 -61640 1840 1489 -61640 1544 1518 -61640 1541 1533 -61640 1645 1756 -61640 1721 1816 -61640 1601 1731 -61640 1664 1821 -61640 1660 1692 -61640 1829 1886 -61640 1599 1658 -61640 1538 1825 -61640 1598 1635 -61640 1650 1668 -61660 1538 1689 -61660 1539 1448 -61660 1539 1665 -61660 1539 1529 -61660 1541 1691 -61660 1544 1462 -61660 1549 1884 -61660 1569 1742 -61660 1583 1689 -61660 1600 1664 -61660 1600 1518 -61660 1600 1519 -61660 1626 1874 -61660 1669 1754 -61660 1678 1683 -61660 1688 1517 -61660 1691 1533 -61660 1701 1463 -61660 1735 1477 -61660 1811 1875 -61660 1821 1890 -61660 1831 1850 -61660 1831 1868 -61660 1835 1887 -61660 1841 1901 -61660 1850 1868 -61660 1875 1437 -61660 1448 1529 -61660 1471 1517 -61660 1501 1528 -61660 1539 1771 -61660 1689 1825 -61660 1715 1755 -61660 1735 1911 -61660 1740 1863 -61660 1755 1498 -61660 1771 1529 -61660 1796 1816 -61660 1840 1901 -61660 1871 1517 -61660 1617 1857 -61660 1617 1441 -61660 1675 1857 -61660 1840 1489 -61660 1841 1489 -61660 1901 1489 -61660 1544 1518 -61660 1538 1890 -61660 1541 1533 -61660 1645 1756 -61660 1721 1816 -61660 1825 1890 -61660 1601 1731 -61660 1664 1821 -61660 1660 1692 -61660 1829 1886 -61660 1599 1658 -61660 1538 1825 -61660 1598 1635 -61660 1650 1668 -61680 1539 1771 -61680 1546 1851 -61680 1555 1918 -61680 1563 1438 -61680 1689 1825 -61680 1692 1835 -61680 1715 1755 -61680 1735 1847 -61680 1735 1911 -61680 1740 1863 -61680 1755 1498 -61680 1771 1529 -61680 1796 1816 -61680 1840 1901 -61680 1871 1517 -61680 1522 1524 -61680 1617 1857 -61680 1617 1441 -61680 1675 1857 -61680 1731 1434 -61680 1840 1489 -61680 1841 1489 -61680 1901 1489 -61680 1462 1518 -61680 1544 1518 -61680 1675 1441 -61680 1924 1478 -61680 1538 1890 -61680 1541 1533 -61680 1645 1756 -61680 1721 1816 -61680 1825 1890 -61680 1601 1434 -61680 1601 1731 -61680 1857 1441 -61680 1664 1821 -61680 1660 1692 -61680 1829 1886 -61680 1599 1658 -61680 1538 1825 -61680 1547 1798 -61680 1598 1635 -61680 1650 1668 -61700 1549 1600 -61700 1562 1903 -61700 1563 1529 -61700 1578 1592 -61700 1608 1688 -61700 1608 1659 -61700 1617 1857 -61700 1617 1441 -61700 1626 1874 -61700 1675 1857 -61700 1689 1890 -61700 1701 1835 -61700 1731 1434 -61700 1754 1770 -61700 1767 1840 -61700 1835 1441 -61700 1835 1477 -61700 1840 1841 -61700 1840 1489 -61700 1841 1489 -61700 1875 1437 -61700 1890 1518 -61700 1901 1489 -61700 1462 1518 -61700 1544 1518 -61700 1549 1884 -61700 1562 1887 -61700 1609 1920 -61700 1675 1441 -61700 1771 1485 -61700 1924 1478 -61700 1538 1890 -61700 1541 1533 -61700 1645 1756 -61700 1669 1754 -61700 1721 1816 -61700 1825 1890 -61700 1601 1434 -61700 1601 1731 -61700 1857 1441 -61700 1501 1528 -61700 1664 1821 -61700 1660 1692 -61700 1715 1794 -61700 1755 1794 -61700 1841 1901 -61700 1829 1886 -61700 1599 1658 -61700 1595 1654 -61700 1767 1901 -61700 1538 1825 -61700 1547 1798 -61700 1598 1635 -61700 1650 1668 -61720 1544 1462 -61720 1544 1518 -61720 1549 1884 -61720 1562 1887 -61720 1563 1893 -61720 1575 1458 -61720 1595 1845 -61720 1600 1884 -61720 1600 1668 -61720 1609 1920 -61720 1628 1463 -61720 1641 1811 -61720 1642 1911 -61720 1664 1518 -61720 1675 1441 -61720 1688 1887 -61720 1701 1489 -61720 1771 1485 -61720 1802 1528 -61720 1825 1518 -61720 1871 1517 -61720 1924 1478 -61720 1538 1890 -61720 1541 1533 -61720 1569 1742 -61720 1579 1471 -61720 1600 1664 -61720 1645 1756 -61720 1669 1754 -61720 1721 1816 -61720 1740 1863 -61720 1796 1816 -61720 1825 1890 -61720 1601 1434 -61720 1601 1731 -61720 1648 1696 -61720 1715 1755 -61720 1857 1441 -61720 1501 1528 -61720 1664 1821 -61720 1660 1692 -61720 1715 1794 -61720 1755 1794 -61720 1767 1841 -61720 1841 1901 -61720 1829 1886 -61720 1599 1658 -61720 1595 1654 -61720 1767 1901 -61720 1538 1825 -61720 1547 1798 -61720 1598 1635 -61720 1650 1668 -61740 1538 1890 -61740 1541 1533 -61740 1563 1771 -61740 1565 1628 -61740 1569 1742 -61740 1579 1471 -61740 1583 1462 -61740 1600 1664 -61740 1644 1527 -61740 1645 1756 -61740 1645 1438 -61740 1664 1884 -61740 1669 1754 -61740 1673 1688 -61740 1684 1702 -61740 1684 1687 -61740 1688 1920 -61740 1689 1771 -61740 1718 1770 -61740 1721 1816 -61740 1740 1863 -61740 1796 1816 -61740 1804 1510 -61740 1821 1458 -61740 1825 1890 -61740 1840 1901 -61740 1840 1841 -61740 1431 1516 -61740 1601 1434 -61740 1601 1731 -61740 1648 1696 -61740 1664 1458 -61740 1715 1755 -61740 1840 1489 -61740 1857 1441 -61740 1875 1437 -61740 1501 1528 -61740 1664 1821 -61740 1787 1851 -61740 1660 1692 -61740 1715 1794 -61740 1755 1794 -61740 1767 1841 -61740 1841 1901 -61740 1829 1886 -61740 1599 1658 -61740 1595 1654 -61740 1767 1901 -61740 1617 1857 -61740 1617 1441 -61740 1538 1825 -61740 1547 1798 -61740 1626 1835 -61740 1598 1635 -61740 1650 1668 -61760 1547 1533 -61760 1549 1525 -61760 1600 1825 -61760 1600 1884 -61760 1600 1525 -61760 1601 1434 -61760 1601 1731 -61760 1626 1874 -61760 1628 1433 -61760 1641 1701 -61760 1644 1718 -61760 1648 1696 -61760 1664 1458 -61760 1664 1835 -61760 1679 1886 -61760 1687 1702 -61760 1688 1854 -61760 1706 1905 -61760 1706 1835 -61760 1715 1811 -61760 1715 1755 -61760 1724 1835 -61760 1840 1489 -61760 1857 1441 -61760 1875 1437 -61760 1924 1478 -61760 1501 1528 -61760 1549 1600 -61760 1601 1847 -61760 1664 1821 -61760 1688 1829 -61760 1731 1847 -61760 1734 1802 -61760 1787 1851 -61760 1660 1692 -61760 1715 1794 -61760 1755 1794 -61760 1767 1841 -61760 1841 1901 -61760 1829 1886 -61760 1841 1489 -61760 1433 1463 -61760 1599 1658 -61760 1595 1654 -61760 1767 1901 -61760 1617 1857 -61760 1617 1441 -61760 1767 1489 -61760 1538 1825 -61760 1547 1798 -61760 1835 1874 -61760 1576 1835 -61760 1626 1835 -61760 1598 1635 -61760 1650 1668 -61780 1549 1600 -61780 1587 1817 -61780 1592 1918 -61780 1601 1829 -61780 1601 1886 -61780 1601 1847 -61780 1664 1821 -61780 1669 1754 -61780 1674 1688 -61780 1684 1687 -61780 1688 1829 -61780 1688 1886 -61780 1718 1850 -61780 1718 1875 -61780 1731 1886 -61780 1731 1847 -61780 1734 1802 -61780 1755 1811 -61780 1756 1438 -61780 1787 1851 -61780 1794 1811 -61780 1821 1471 -61780 1898 1911 -61780 1911 1527 -61780 1425 1533 -61780 1544 1462 -61780 1628 1458 -61780 1660 1692 -61780 1715 1794 -61780 1755 1794 -61780 1767 1841 -61780 1804 1510 -61780 1829 1847 -61780 1841 1901 -61780 1855 1463 -61780 1431 1516 -61780 1721 1816 -61780 1829 1886 -61780 1841 1489 -61780 1433 1463 -61780 1599 1658 -61780 1600 1519 -61780 1595 1654 -61780 1767 1901 -61780 1617 1857 -61780 1617 1441 -61780 1901 1489 -61780 1767 1489 -61780 1549 1890 -61780 1538 1825 -61780 1547 1798 -61780 1835 1874 -61780 1576 1835 -61780 1626 1835 -61780 1644 1527 -61780 1598 1635 -61780 1650 1668 -61800 1544 1462 -61800 1562 1673 -61800 1579 1592 -61800 1609 1920 -61800 1625 1269 -61800 1626 1874 -61800 1628 1458 -61800 1640 1802 -61800 1651 1694 -61800 1660 1692 -61800 1715 1794 -61800 1718 1754 -61800 1755 1794 -61800 1767 1840 -61800 1767 1841 -61800 1804 1510 -61800 1829 1847 -61800 1831 1847 -61800 1841 1901 -61800 1847 1886 -61800 1847 1911 -61800 1855 1463 -61800 1431 1516 -61800 1721 1816 -61800 1829 1886 -61800 1841 1489 -61800 1857 1441 -61800 1858 1918 -61800 1924 1478 -61800 1433 1463 -61800 1599 1658 -61800 1600 1519 -61800 1715 1755 -61800 1835 1470 -61800 1595 1654 -61800 1767 1901 -61800 1617 1857 -61800 1617 1441 -61800 1645 1756 -61800 1901 1489 -61800 1767 1489 -61800 1549 1890 -61800 1538 1825 -61800 1547 1798 -61800 1835 1874 -61800 1576 1835 -61800 1626 1835 -61800 1644 1527 -61800 1598 1635 -61800 1650 1668 -61820 1568 1911 -61820 1592 1920 -61820 1628 1433 -61820 1629 1894 -61820 1648 1696 -61820 1688 1847 -61820 1702 1489 -61820 1715 1811 -61820 1721 1816 -61820 1755 1498 -61820 1829 1886 -61820 1841 1489 -61820 1857 1441 -61820 1858 1918 -61820 1924 1478 -61820 1433 1463 -61820 1599 1658 -61820 1600 1519 -61820 1669 1754 -61820 1684 1687 -61820 1715 1755 -61820 1835 1470 -61820 1840 1489 -61820 1840 1841 -61820 1595 1654 -61820 1767 1901 -61820 1590 1455 -61820 1617 1857 -61820 1617 1441 -61820 1645 1756 -61820 1664 1821 -61820 1740 1863 -61820 1629 1911 -61820 1901 1489 -61820 1675 1441 -61820 1767 1489 -61820 1549 1890 -61820 1538 1825 -61820 1547 1798 -61820 1835 1874 -61820 1576 1835 -61820 1626 1835 -61820 1644 1527 -61820 1598 1635 -61820 1650 1668 -61840 1544 1890 -61840 1544 1884 -61840 1568 1831 -61840 1599 1658 -61840 1600 1519 -61840 1623 1901 -61840 1623 1462 -61840 1641 1642 -61840 1669 1754 -61840 1684 1687 -61840 1715 1755 -61840 1835 1470 -61840 1840 1489 -61840 1840 1841 -61840 1850 1868 -61840 1872 1470 -61840 1595 1654 -61840 1601 1434 -61840 1734 1802 -61840 1767 1901 -61840 1771 1529 -61840 1590 1455 -61840 1617 1857 -61840 1617 1441 -61840 1645 1756 -61840 1664 1821 -61840 1740 1863 -61840 1431 1516 -61840 1629 1911 -61840 1901 1489 -61840 1675 1441 -61840 1767 1489 -61840 1549 1890 -61840 1855 1463 -61840 1538 1825 -61840 1547 1798 -61840 1835 1874 -61840 1576 1835 -61840 1626 1835 -61840 1644 1527 -61840 1598 1635 -61840 1650 1668 -61860 1544 1549 -61860 1595 1654 -61860 1601 1434 -61860 1665 1678 -61860 1674 1684 -61860 1687 1702 -61860 1717 1441 -61860 1717 1527 -61860 1724 1835 -61860 1734 1802 -61860 1767 1901 -61860 1771 1529 -61860 1840 1901 -61860 1875 1437 -61860 1884 1890 -61860 1590 1455 -61860 1617 1857 -61860 1617 1441 -61860 1645 1756 -61860 1664 1821 -61860 1687 1841 -61860 1735 1465 -61860 1740 1863 -61860 1431 1516 -61860 1601 1629 -61860 1601 1911 -61860 1629 1911 -61860 1901 1489 -61860 1675 1441 -61860 1767 1489 -61860 1549 1890 -61860 1829 1886 -61860 1855 1463 -61860 1660 1692 -61860 1538 1825 -61860 1634 1831 -61860 1547 1798 -61860 1835 1874 -61860 1576 1835 -61860 1626 1835 -61860 1644 1527 -61860 1598 1635 -61860 1650 1668 -61880 1544 1884 -61880 1590 1455 -61880 1598 1920 -61880 1609 1920 -61880 1617 1857 -61880 1617 1441 -61880 1645 1756 -61880 1664 1821 -61880 1674 1702 -61880 1677 1894 -61880 1687 1840 -61880 1687 1841 -61880 1687 1489 -61880 1688 1731 -61880 1721 1816 -61880 1731 1829 -61880 1731 1886 -61880 1735 1465 -61880 1740 1863 -61880 1431 1516 -61880 1496 1497 -61880 1599 1787 -61880 1601 1629 -61880 1601 1911 -61880 1628 1463 -61880 1629 1911 -61880 1644 1717 -61880 1715 1811 -61880 1755 1811 -61880 1840 1841 -61880 1841 1901 -61880 1857 1441 -61880 1901 1489 -61880 1628 1855 -61880 1675 1441 -61880 1767 1489 -61880 1544 1890 -61880 1549 1890 -61880 1829 1886 -61880 1855 1463 -61880 1660 1692 -61880 1538 1825 -61880 1634 1831 -61880 1547 1798 -61880 1835 1874 -61880 1576 1835 -61880 1626 1835 -61880 1644 1527 -61880 1598 1635 -61880 1650 1668 -61900 1563 1629 -61900 1599 1787 -61900 1601 1629 -61900 1601 1911 -61900 1623 1527 -61900 1628 1463 -61900 1629 1642 -61900 1629 1911 -61900 1644 1717 -61900 1702 1841 -61900 1702 1901 -61900 1715 1811 -61900 1724 1835 -61900 1755 1811 -61900 1811 1498 -61900 1840 1841 -61900 1841 1901 -61900 1857 1441 -61900 1875 1437 -61900 1901 1489 -61900 1619 1505 -61900 1628 1855 -61900 1674 1901 -61900 1675 1441 -61900 1767 1489 -61900 1544 1890 -61900 1549 1890 -61900 1595 1654 -61900 1829 1886 -61900 1840 1489 -61900 1855 1463 -61900 1660 1692 -61900 1663 1818 -61900 1538 1825 -61900 1634 1831 -61900 1547 1798 -61900 1835 1874 -61900 1576 1835 -61900 1626 1835 -61900 1644 1527 -61900 1598 1635 -61900 1650 1668 -61920 1568 1717 -61920 1576 1626 -61920 1600 1519 -61920 1619 1505 -61920 1628 1855 -61920 1629 1920 -61920 1642 1485 -61920 1674 1901 -61920 1675 1441 -61920 1767 1489 -61920 1858 1872 -61920 1875 1441 -61920 1889 1920 -61920 1458 1485 -61920 1485 1529 -61920 1544 1890 -61920 1549 1890 -61920 1595 1654 -61920 1684 1901 -61920 1687 1489 -61920 1715 1755 -61920 1924 1478 -61920 1664 1821 -61920 1829 1886 -61920 1840 1489 -61920 1855 1463 -61920 1660 1692 -61920 1663 1818 -61920 1755 1498 -61920 1538 1825 -61920 1634 1831 -61920 1547 1798 -61920 1835 1874 -61920 1576 1835 -61920 1617 1857 -61920 1626 1835 -61920 1644 1527 -61920 1598 1635 -61920 1650 1668 -61940 1544 1890 -61940 1549 1890 -61940 1585 1766 -61940 1595 1654 -61940 1617 1441 -61940 1628 1650 -61940 1669 1754 -61940 1679 1872 -61940 1684 1901 -61940 1687 1841 -61940 1687 1489 -61940 1702 1901 -61940 1715 1755 -61940 1850 1868 -61940 1924 1478 -61940 1544 1600 -61940 1664 1821 -61940 1829 1886 -61940 1840 1489 -61940 1855 1463 -61940 1544 1884 -61940 1660 1692 -61940 1663 1818 -61940 1755 1498 -61940 1884 1890 -61940 1898 1477 -61940 1538 1825 -61940 1634 1831 -61940 1547 1798 -61940 1804 1510 -61940 1835 1874 -61940 1576 1835 -61940 1617 1857 -61940 1626 1835 -61940 1740 1863 -61940 1644 1527 -61940 1598 1635 -61940 1650 1668 -61960 1537 1918 -61960 1544 1600 -61960 1593 1599 -61960 1664 1821 -61960 1701 1906 -61960 1717 1754 -61960 1731 1894 -61960 1829 1886 -61960 1835 1470 -61960 1840 1489 -61960 1855 1463 -61960 1875 1889 -61960 1544 1884 -61960 1660 1692 -61960 1663 1818 -61960 1755 1498 -61960 1884 1890 -61960 1898 1477 -61960 1538 1825 -61960 1628 1855 -61960 1634 1831 -61960 1547 1798 -61960 1661 1684 -61960 1841 1901 -61960 1804 1510 -61960 1835 1874 -61960 1576 1835 -61960 1617 1857 -61960 1626 1835 -61960 1740 1863 -61960 1644 1527 -61960 1598 1635 -61960 1650 1668 -61980 1537 1724 -61980 1541 1887 -61980 1544 1884 -61980 1642 1731 -61980 1651 1694 -61980 1660 1689 -61980 1660 1692 -61980 1663 1818 -61980 1689 1692 -61980 1752 1774 -61980 1755 1498 -61980 1755 1811 -61980 1835 1875 -61980 1875 1491 -61980 1875 1879 -61980 1884 1890 -61980 1898 1477 -61980 1538 1825 -61980 1599 1774 -61980 1628 1855 -61980 1634 1831 -61980 1675 1441 -61980 1701 1845 -61980 1798 1868 -61980 1496 1497 -61980 1547 1798 -61980 1585 1766 -61980 1599 1766 -61980 1617 1441 -61980 1661 1684 -61980 1841 1901 -61980 1585 1599 -61980 1599 1752 -61980 1669 1754 -61980 1804 1510 -61980 1835 1874 -61980 1576 1835 -61980 1617 1857 -61980 1626 1835 -61980 1740 1863 -61980 1644 1527 -61980 1547 1868 -61980 1598 1635 -61980 1650 1668 -62000 1538 1825 -62000 1538 1549 -62000 1568 1889 -62000 1599 1774 -62000 1626 1874 -62000 1628 1855 -62000 1634 1831 -62000 1675 1441 -62000 1687 1841 -62000 1701 1845 -62000 1701 1839 -62000 1715 1724 -62000 1798 1850 -62000 1798 1868 -62000 1821 1898 -62000 1821 1830 -62000 1496 1497 -62000 1547 1798 -62000 1549 1890 -62000 1585 1766 -62000 1599 1766 -62000 1617 1441 -62000 1661 1684 -62000 1752 1766 -62000 1825 1890 -62000 1840 1489 -62000 1841 1901 -62000 1585 1599 -62000 1599 1752 -62000 1669 1754 -62000 1804 1510 -62000 1835 1874 -62000 1576 1835 -62000 1679 1872 -62000 1617 1857 -62000 1767 1489 -62000 1626 1835 -62000 1740 1863 -62000 1547 1850 -62000 1644 1527 -62000 1547 1868 -62000 1829 1886 -62000 1598 1635 -62000 1650 1668 -62020 1538 1525 -62020 1547 1798 -62020 1549 1890 -62020 1585 1766 -62020 1599 1766 -62020 1617 1441 -62020 1661 1684 -62020 1674 1840 -62020 1674 1489 -62020 1679 1862 -62020 1721 1816 -62020 1752 1766 -62020 1825 1890 -62020 1839 1845 -62020 1840 1489 -62020 1841 1901 -62020 1854 1875 -62020 1549 1825 -62020 1585 1599 -62020 1599 1752 -62020 1669 1754 -62020 1804 1510 -62020 1835 1874 -62020 1576 1835 -62020 1471 1503 -62020 1850 1868 -62020 1679 1872 -62020 1544 1884 -62020 1617 1857 -62020 1767 1489 -62020 1626 1835 -62020 1740 1863 -62020 1547 1850 -62020 1644 1527 -62020 1547 1868 -62020 1829 1886 -62020 1598 1635 -62020 1650 1668 -62040 1538 1825 -62040 1549 1825 -62040 1585 1599 -62040 1591 1875 -62040 1599 1752 -62040 1613 1526 -62040 1648 1696 -62040 1669 1754 -62040 1675 1441 -62040 1684 1811 -62040 1688 1473 -62040 1740 1798 -62040 1798 1875 -62040 1804 1510 -62040 1835 1874 -62040 1845 1906 -62040 1854 1470 -62040 1884 1890 -62040 1496 1497 -62040 1576 1835 -62040 1599 1794 -62040 1687 1901 -62040 1924 1478 -62040 1471 1503 -62040 1755 1498 -62040 1850 1868 -62040 1679 1872 -62040 1544 1884 -62040 1617 1857 -62040 1634 1831 -62040 1767 1489 -62040 1626 1835 -62040 1740 1863 -62040 1547 1850 -62040 1644 1527 -62040 1547 1868 -62040 1829 1886 -62040 1598 1635 -62040 1650 1668 -62060 1563 1715 -62060 1576 1835 -62060 1587 1817 -62060 1593 1599 -62060 1599 1794 -62060 1599 1774 -62060 1663 1818 -62060 1687 1901 -62060 1875 1471 -62060 1924 1478 -62060 1471 1503 -62060 1600 1519 -62060 1755 1498 -62060 1804 1482 -62060 1840 1489 -62060 1850 1868 -62060 1857 1441 -62060 1679 1872 -62060 1825 1890 -62060 1544 1884 -62060 1617 1857 -62060 1634 1831 -62060 1767 1840 -62060 1767 1489 -62060 1626 1835 -62060 1740 1863 -62060 1547 1850 -62060 1644 1527 -62060 1547 1868 -62060 1829 1886 -62060 1598 1635 -62060 1650 1668 -62080 1538 1825 -62080 1551 1818 -62080 1600 1519 -62080 1609 1920 -62080 1624 1835 -62080 1721 1816 -62080 1755 1498 -62080 1804 1482 -62080 1840 1489 -62080 1841 1901 -62080 1850 1868 -62080 1857 1441 -62080 1538 1890 -62080 1550 1906 -62080 1679 1872 -62080 1804 1510 -62080 1825 1890 -62080 1835 1874 -62080 1544 1884 -62080 1617 1857 -62080 1634 1831 -62080 1767 1840 -62080 1767 1489 -62080 1617 1441 -62080 1626 1835 -62080 1740 1863 -62080 1547 1850 -62080 1644 1527 -62080 1547 1868 -62080 1829 1886 -62080 1598 1635 -62080 1650 1668 -62100 1538 1890 -62100 1550 1906 -62100 1580 1772 -62100 1599 1512 -62100 1626 1874 -62100 1641 1835 -62100 1641 1470 -62100 1678 1433 -62100 1679 1872 -62100 1684 1489 -62100 1687 1901 -62100 1688 1731 -62100 1804 1510 -62100 1825 1890 -62100 1835 1874 -62100 1854 1491 -62100 1875 1517 -62100 1920 1470 -62100 1924 1478 -62100 1544 1884 -62100 1617 1857 -62100 1634 1831 -62100 1767 1840 -62100 1767 1489 -62100 1617 1441 -62100 1626 1835 -62100 1740 1863 -62100 1547 1850 -62100 1547 1523 -62100 1644 1527 -62100 1547 1868 -62100 1829 1886 -62100 1598 1635 -62100 1650 1668 -62120 1544 1811 -62120 1544 1884 -62120 1549 1525 -62120 1617 1857 -62120 1634 1831 -62120 1731 1857 -62120 1767 1840 -62120 1767 1489 -62120 1796 1823 -62120 1890 1901 -62120 1576 1835 -62120 1609 1920 -62120 1617 1441 -62120 1626 1835 -62120 1701 1839 -62120 1752 1766 -62120 1857 1441 -62120 1600 1519 -62120 1755 1498 -62120 1740 1863 -62120 1547 1850 -62120 1547 1523 -62120 1644 1527 -62120 1871 1517 -62120 1547 1868 -62120 1811 1890 -62120 1538 1825 -62120 1829 1886 -62120 1598 1635 -62120 1650 1668 -62140 1549 1890 -62140 1576 1835 -62140 1578 1718 -62140 1598 1920 -62140 1609 1920 -62140 1617 1441 -62140 1626 1835 -62140 1701 1839 -62140 1752 1766 -62140 1840 1489 -62140 1857 1441 -62140 1884 1890 -62140 1600 1519 -62140 1755 1498 -62140 1804 1510 -62140 1740 1863 -62140 1547 1850 -62140 1547 1523 -62140 1644 1527 -62140 1871 1517 -62140 1547 1868 -62140 1811 1890 -62140 1538 1825 -62140 1829 1886 -62140 1678 1845 -62140 1598 1635 -62140 1650 1668 -62160 1600 1519 -62160 1688 1771 -62160 1721 1816 -62160 1755 1498 -62160 1804 1510 -62160 1835 1911 -62160 1841 1901 -62160 1868 1523 -62160 1924 1478 -62160 1544 1890 -62160 1740 1863 -62160 1547 1850 -62160 1547 1523 -62160 1644 1527 -62160 1871 1517 -62160 1547 1868 -62160 1811 1890 -62160 1538 1825 -62160 1549 1525 -62160 1829 1886 -62160 1678 1845 -62160 1598 1635 -62160 1650 1668 -62180 1544 1890 -62180 1609 1920 -62180 1648 1696 -62180 1684 1441 -62180 1740 1863 -62180 1547 1850 -62180 1547 1523 -62180 1576 1835 -62180 1617 1857 -62180 1626 1835 -62180 1644 1527 -62180 1871 1517 -62180 1835 1874 -62180 1547 1868 -62180 1811 1890 -62180 1538 1825 -62180 1549 1525 -62180 1829 1886 -62180 1678 1845 -62180 1598 1635 -62180 1650 1668 -62200 1547 1850 -62200 1547 1523 -62200 1576 1835 -62200 1617 1857 -62200 1626 1835 -62200 1644 1527 -62200 1688 1841 -62200 1688 1901 -62200 1701 1900 -62200 1850 1868 -62200 1871 1517 -62200 1920 1470 -62200 1924 1478 -62200 1583 1825 -62200 1835 1874 -62200 1841 1901 -62200 1449 1512 -62200 1755 1498 -62200 1547 1868 -62200 1811 1890 -62200 1538 1825 -62200 1549 1525 -62200 1829 1886 -62200 1678 1845 -62200 1598 1635 -62200 1650 1668 -62220 1538 1583 -62220 1544 1825 -62220 1580 1772 -62220 1583 1825 -62220 1587 1817 -62220 1648 1696 -62220 1754 1527 -62220 1771 1813 -62220 1831 1527 -62220 1835 1874 -62220 1841 1901 -62220 1449 1512 -62220 1609 1920 -62220 1755 1498 -62220 1767 1840 -62220 1547 1868 -62220 1547 1701 -62220 1701 1868 -62220 1811 1890 -62220 1538 1825 -62220 1549 1525 -62220 1829 1886 -62220 1678 1845 -62220 1598 1635 -62220 1740 1863 -62220 1650 1668 -62240 1575 1679 -62240 1591 1689 -62240 1599 1774 -62240 1609 1920 -62240 1617 1441 -62240 1688 1901 -62240 1701 1831 -62240 1755 1498 -62240 1767 1840 -62240 1872 1527 -62240 1888 1920 -62240 1547 1850 -62240 1547 1868 -62240 1547 1701 -62240 1701 1868 -62240 1811 1890 -62240 1538 1825 -62240 1549 1525 -62240 1547 1523 -62240 1829 1886 -62240 1678 1845 -62240 1598 1635 -62240 1740 1863 -62240 1650 1668 -62260 1544 1583 -62260 1547 1850 -62260 1547 1868 -62260 1547 1701 -62260 1600 1890 -62260 1701 1868 -62260 1811 1890 -62260 1825 1890 -62260 1835 1458 -62260 1924 1478 -62260 1538 1825 -62260 1549 1525 -62260 1871 1517 -62260 1600 1888 -62260 1648 1696 -62260 1857 1441 -62260 1644 1527 -62260 1547 1523 -62260 1829 1886 -62260 1678 1845 -62260 1598 1635 -62260 1740 1863 -62260 1650 1668 -62280 1538 1825 -62280 1539 1831 -62280 1549 1525 -62280 1563 1920 -62280 1617 1857 -62280 1649 1918 -62280 1669 1754 -62280 1767 1840 -62280 1825 1888 -62280 1850 1868 -62280 1855 1517 -62280 1855 1871 -62280 1871 1517 -62280 1600 1888 -62280 1648 1696 -62280 1701 1845 -62280 1857 1441 -62280 1547 1808 -62280 1599 1512 -62280 1644 1527 -62280 1841 1901 -62280 1755 1498 -62280 1547 1523 -62280 1829 1886 -62280 1678 1845 -62280 1598 1635 -62280 1740 1863 -62280 1650 1668 -62300 1566 1893 -62300 1600 1888 -62300 1602 1779 -62300 1648 1696 -62300 1684 1840 -62300 1688 1841 -62300 1701 1845 -62300 1808 1523 -62300 1857 1441 -62300 1924 1478 -62300 1547 1808 -62300 1599 1512 -62300 1644 1527 -62300 1841 1901 -62300 1755 1498 -62300 1547 1523 -62300 1829 1886 -62300 1678 1845 -62300 1598 1635 -62300 1740 1863 -62300 1650 1668 -62320 1767 1840 -62320 1835 1886 -62320 1840 1489 -62320 1871 1517 -62320 1538 1825 -62320 1547 1808 -62320 1599 1512 -62320 1644 1527 -62320 1841 1901 -62320 1755 1498 -62320 1547 1523 -62320 1825 1888 -62320 1829 1886 -62320 1678 1845 -62320 1598 1635 -62320 1740 1863 -62320 1650 1668 -62340 1538 1825 -62340 1547 1808 -62340 1587 1817 -62340 1599 1512 -62340 1617 1857 -62340 1644 1527 -62340 1684 1840 -62340 1701 1835 -62340 1701 1740 -62340 1701 1527 -62340 1841 1901 -62340 1850 1868 -62340 1425 1491 -62340 1840 1514 -62340 1592 1715 -62340 1592 1718 -62340 1648 1696 -62340 1755 1498 -62340 1547 1523 -62340 1825 1888 -62340 1829 1886 -62340 1678 1845 -62340 1600 1888 -62340 1598 1635 -62340 1740 1863 -62340 1650 1668 -62360 1576 1755 -62360 1811 1890 -62360 1840 1514 -62360 1857 1441 -62360 1868 1527 -62360 1592 1715 -62360 1592 1718 -62360 1600 1825 -62360 1648 1696 -62360 1755 1498 -62360 1835 1470 -62360 1547 1523 -62360 1825 1888 -62360 1829 1886 -62360 1678 1845 -62360 1600 1888 -62360 1598 1635 -62360 1740 1863 -62360 1650 1668 -62380 1538 1888 -62380 1566 1718 -62380 1592 1715 -62380 1592 1718 -62380 1600 1825 -62380 1648 1696 -62380 1678 1701 -62380 1840 1489 -62380 1894 1425 -62380 1547 1808 -62380 1578 1715 -62380 1755 1498 -62380 1835 1470 -62380 1547 1523 -62380 1717 1886 -62380 1825 1888 -62380 1850 1868 -62380 1829 1886 -62380 1678 1845 -62380 1600 1888 -62380 1598 1635 -62380 1599 1512 -62380 1740 1863 -62380 1650 1668 -62400 1547 1808 -62400 1569 1742 -62400 1578 1715 -62400 1669 1754 -62400 1688 1813 -62400 1717 1829 -62400 1755 1498 -62400 1835 1470 -62400 1857 1441 -62400 1538 1924 -62400 1547 1523 -62400 1717 1886 -62400 1777 1512 -62400 1811 1890 -62400 1825 1888 -62400 1850 1868 -62400 1841 1901 -62400 1829 1886 -62400 1678 1845 -62400 1600 1888 -62400 1598 1635 -62400 1599 1512 -62400 1740 1863 -62400 1650 1668 -62420 1538 1924 -62420 1547 1523 -62420 1592 1715 -62420 1599 1777 -62420 1717 1886 -62420 1777 1512 -62420 1811 1890 -62420 1845 1527 -62420 1489 1514 -62420 1825 1888 -62420 1835 1854 -62420 1840 1489 -62420 1850 1868 -62420 1599 1655 -62420 1841 1901 -62420 1829 1886 -62420 1678 1845 -62420 1871 1517 -62420 1648 1696 -62420 1600 1888 -62420 1598 1635 -62420 1599 1512 -62420 1655 1512 -62420 1740 1863 -62420 1650 1668 -62440 1569 1742 -62440 1598 1702 -62440 1645 1756 -62440 1808 1523 -62440 1825 1888 -62440 1835 1854 -62440 1840 1489 -62440 1755 1498 -62440 1850 1868 -62440 1599 1655 -62440 1841 1901 -62440 1829 1886 -62440 1678 1845 -62440 1871 1517 -62440 1648 1696 -62440 1600 1888 -62440 1598 1635 -62440 1599 1512 -62440 1655 1512 -62440 1740 1863 -62440 1650 1668 -62460 1550 1641 -62460 1609 1920 -62460 1617 1857 -62460 1755 1498 -62460 1850 1868 -62460 1599 1655 -62460 1841 1901 -62460 1787 1851 -62460 1547 1808 -62460 1829 1886 -62460 1678 1845 -62460 1871 1517 -62460 1648 1696 -62460 1600 1888 -62460 1598 1635 -62460 1599 1512 -62460 1655 1512 -62460 1740 1863 -62460 1650 1668 -62480 1547 1523 -62480 1592 1715 -62480 1599 1655 -62480 1669 1754 -62480 1721 1816 -62480 1767 1489 -62480 1841 1901 -62480 1873 1921 -62480 1549 1525 -62480 1787 1851 -62480 1485 1529 -62480 1547 1808 -62480 1592 1718 -62480 1829 1886 -62480 1678 1845 -62480 1871 1517 -62480 1648 1696 -62480 1600 1888 -62480 1598 1635 -62480 1489 1514 -62480 1599 1512 -62480 1825 1888 -62480 1655 1512 -62480 1740 1863 -62480 1650 1668 -62500 1544 1553 -62500 1549 1525 -62500 1674 1767 -62500 1787 1851 -62500 1804 1510 -62500 1816 1881 -62500 1485 1529 -62500 1547 1808 -62500 1592 1718 -62500 1617 1441 -62500 1755 1437 -62500 1829 1886 -62500 1678 1845 -62500 1850 1868 -62500 1871 1517 -62500 1648 1696 -62500 1600 1888 -62500 1598 1635 -62500 1489 1514 -62500 1617 1857 -62500 1599 1512 -62500 1825 1888 -62500 1655 1512 -62500 1740 1863 -62500 1650 1668 -62520 1544 1890 -62520 1544 1811 -62520 1547 1808 -62520 1575 1696 -62520 1592 1718 -62520 1617 1441 -62520 1625 1755 -62520 1641 1692 -62520 1710 1889 -62520 1755 1437 -62520 1829 1886 -62520 1841 1901 -62520 1625 1437 -62520 1669 1754 -62520 1678 1845 -62520 1850 1868 -62520 1592 1715 -62520 1871 1517 -62520 1575 1648 -62520 1648 1696 -62520 1808 1523 -62520 1600 1888 -62520 1598 1635 -62520 1599 1655 -62520 1489 1514 -62520 1617 1857 -62520 1599 1512 -62520 1825 1888 -62520 1655 1512 -62520 1740 1863 -62520 1650 1668 -62540 1625 1437 -62540 1641 1920 -62540 1669 1754 -62540 1678 1845 -62540 1816 1881 -62540 1816 1923 -62540 1850 1868 -62540 1857 1923 -62540 1592 1715 -62540 1692 1816 -62540 1871 1517 -62540 1575 1648 -62540 1648 1696 -62540 1808 1523 -62540 1549 1525 -62540 1600 1888 -62540 1598 1635 -62540 1599 1655 -62540 1674 1489 -62540 1489 1514 -62540 1617 1857 -62540 1599 1512 -62540 1825 1888 -62540 1655 1512 -62540 1740 1863 -62540 1650 1668 -62560 1563 1592 -62560 1575 1696 -62560 1592 1715 -62560 1625 1713 -62560 1692 1816 -62560 1710 1889 -62560 1871 1517 -62560 1890 1519 -62560 1575 1648 -62560 1648 1696 -62560 1648 1679 -62560 1808 1523 -62560 1485 1529 -62560 1549 1525 -62560 1600 1888 -62560 1841 1901 -62560 1569 1742 -62560 1598 1635 -62560 1599 1655 -62560 1674 1489 -62560 1489 1514 -62560 1617 1857 -62560 1547 1808 -62560 1599 1512 -62560 1829 1886 -62560 1825 1888 -62560 1886 1919 -62560 1655 1512 -62560 1740 1863 -62560 1650 1668 -62580 1538 1924 -62580 1544 1811 -62580 1563 1475 -62580 1575 1648 -62580 1617 1441 -62580 1648 1696 -62580 1648 1679 -62580 1679 1696 -62580 1721 1816 -62580 1721 1881 -62580 1787 1851 -62580 1808 1523 -62580 1485 1529 -62580 1544 1890 -62580 1549 1525 -62580 1600 1888 -62580 1841 1901 -62580 1569 1742 -62580 1598 1635 -62580 1599 1655 -62580 1674 1489 -62580 1713 1437 -62580 1489 1514 -62580 1617 1857 -62580 1547 1808 -62580 1599 1512 -62580 1829 1886 -62580 1829 1919 -62580 1825 1888 -62580 1886 1919 -62580 1655 1512 -62580 1740 1863 -62580 1650 1668 -62600 1544 1890 -62600 1549 1525 -62600 1592 1688 -62600 1600 1888 -62600 1728 1458 -62600 1742 1478 -62600 1841 1901 -62600 1569 1742 -62600 1598 1635 -62600 1599 1655 -62600 1674 1489 -62600 1713 1437 -62600 1767 1489 -62600 1489 1514 -62600 1617 1857 -62600 1547 1808 -62600 1599 1512 -62600 1829 1886 -62600 1829 1919 -62600 1871 1517 -62600 1825 1888 -62600 1886 1919 -62600 1655 1512 -62600 1740 1863 -62600 1650 1668 -62620 1569 1742 -62620 1598 1635 -62620 1599 1655 -62620 1674 1489 -62620 1694 1862 -62620 1713 1437 -62620 1767 1489 -62620 1808 1523 -62620 1489 1514 -62620 1617 1857 -62620 1547 1808 -62620 1609 1924 -62620 1669 1754 -62620 1599 1512 -62620 1829 1886 -62620 1829 1919 -62620 1871 1517 -62620 1825 1888 -62620 1886 1919 -62620 1655 1512 -62620 1740 1863 -62620 1650 1668 -62640 1600 1825 -62640 1617 1857 -62640 1678 1845 -62640 1721 1816 -62640 1767 1840 -62640 1547 1808 -62640 1609 1924 -62640 1669 1754 -62640 1569 1478 -62640 1599 1512 -62640 1829 1886 -62640 1829 1919 -62640 1841 1901 -62640 1871 1517 -62640 1825 1888 -62640 1544 1890 -62640 1886 1919 -62640 1655 1512 -62640 1740 1863 -62640 1635 1920 -62640 1650 1668 -62660 1547 1808 -62660 1609 1924 -62660 1625 1710 -62660 1669 1754 -62660 1713 1437 -62660 1816 1881 -62660 1485 1529 -62660 1549 1525 -62660 1569 1478 -62660 1599 1512 -62660 1808 1523 -62660 1829 1886 -62660 1829 1919 -62660 1841 1901 -62660 1871 1517 -62660 1825 1888 -62660 1544 1890 -62660 1886 1919 -62660 1655 1512 -62660 1740 1863 -62660 1635 1920 -62660 1650 1668 -62680 1549 1525 -62680 1550 1839 -62680 1551 1701 -62680 1569 1478 -62680 1599 1512 -62680 1617 1857 -62680 1808 1523 -62680 1816 1823 -62680 1829 1886 -62680 1829 1919 -62680 1841 1901 -62680 1617 1694 -62680 1678 1845 -62680 1871 1517 -62680 1694 1857 -62680 1825 1888 -62680 1544 1890 -62680 1886 1919 -62680 1694 1441 -62680 1655 1512 -62680 1740 1863 -62680 1635 1920 -62680 1650 1668 -62700 1617 1441 -62700 1617 1694 -62700 1651 1817 -62700 1674 1767 -62700 1678 1845 -62700 1823 1881 -62700 1489 1514 -62700 1688 1715 -62700 1721 1881 -62700 1871 1517 -62700 1721 1816 -62700 1694 1857 -62700 1816 1881 -62700 1825 1888 -62700 1544 1890 -62700 1886 1919 -62700 1694 1441 -62700 1857 1441 -62700 1655 1512 -62700 1740 1863 -62700 1635 1920 -62700 1650 1668 -62720 1669 1754 -62720 1674 1840 -62720 1688 1715 -62720 1721 1881 -62720 1787 1851 -62720 1816 1872 -62720 1816 1825 -62720 1857 1858 -62720 1871 1517 -62720 1602 1779 -62720 1648 1696 -62720 1721 1816 -62720 1694 1857 -62720 1816 1881 -62720 1825 1888 -62720 1841 1901 -62720 1609 1924 -62720 1544 1890 -62720 1886 1919 -62720 1694 1441 -62720 1857 1441 -62720 1655 1512 -62720 1740 1863 -62720 1489 1498 -62720 1635 1920 -62720 1650 1668 -62740 1569 1478 -62740 1602 1779 -62740 1648 1696 -62740 1721 1816 -62740 1694 1857 -62740 1816 1881 -62740 1825 1888 -62740 1841 1901 -62740 1609 1924 -62740 1544 1890 -62740 1886 1919 -62740 1694 1441 -62740 1857 1441 -62740 1816 1823 -62740 1655 1512 -62740 1740 1863 -62740 1489 1498 -62740 1635 1920 -62740 1650 1668 -62760 1538 1609 -62760 1674 1767 -62760 1678 1845 -62760 1694 1857 -62760 1721 1881 -62760 1804 1510 -62760 1816 1881 -62760 1825 1888 -62760 1841 1901 -62760 1609 1924 -62760 1544 1890 -62760 1886 1919 -62760 1694 1441 -62760 1857 1441 -62760 1816 1823 -62760 1655 1512 -62760 1740 1863 -62760 1489 1498 -62760 1635 1920 -62760 1650 1668 -62780 1569 1742 -62780 1579 1717 -62780 1609 1924 -62780 1648 1696 -62780 1544 1890 -62780 1599 1890 -62780 1688 1715 -62780 1721 1816 -62780 1886 1919 -62780 1694 1441 -62780 1857 1441 -62780 1816 1823 -62780 1655 1512 -62780 1740 1863 -62780 1829 1919 -62780 1829 1886 -62780 1489 1498 -62780 1544 1599 -62780 1635 1920 -62780 1650 1668 -62800 1544 1890 -62800 1544 1876 -62800 1599 1890 -62800 1625 1713 -62800 1688 1715 -62800 1721 1816 -62800 1825 1888 -62800 1871 1517 -62800 1886 1919 -62800 1890 1519 -62800 1599 1519 -62800 1694 1441 -62800 1857 1441 -62800 1876 1890 -62800 1470 1471 -62800 1816 1823 -62800 1655 1512 -62800 1740 1863 -62800 1829 1919 -62800 1694 1857 -62800 1829 1886 -62800 1489 1498 -62800 1678 1845 -62800 1544 1599 -62800 1635 1920 -62800 1650 1668 -62820 1544 1913 -62820 1544 1519 -62820 1583 1913 -62820 1599 1913 -62820 1599 1519 -62820 1694 1441 -62820 1721 1825 -62820 1721 1881 -62820 1811 1448 -62820 1811 1890 -62820 1811 1876 -62820 1816 1825 -62820 1857 1441 -62820 1876 1890 -62820 1470 1471 -62820 1816 1823 -62820 1913 1519 -62820 1655 1512 -62820 1740 1863 -62820 1829 1919 -62820 1694 1857 -62820 1829 1886 -62820 1489 1498 -62820 1678 1845 -62820 1544 1599 -62820 1635 1920 -62820 1650 1668 -62840 1599 1448 -62840 1669 1754 -62840 1816 1823 -62840 1913 1519 -62840 1655 1512 -62840 1871 1517 -62840 1740 1863 -62840 1602 1779 -62840 1829 1919 -62840 1886 1919 -62840 1694 1857 -62840 1829 1886 -62840 1489 1498 -62840 1678 1845 -62840 1544 1599 -62840 1635 1920 -62840 1599 1890 -62840 1650 1668 -62860 1550 1839 -62860 1553 1924 -62860 1625 1713 -62860 1655 1512 -62860 1804 1835 -62860 1816 1825 -62860 1825 1835 -62860 1835 1876 -62860 1835 1510 -62860 1871 1517 -62860 1470 1471 -62860 1599 1519 -62860 1688 1715 -62860 1721 1825 -62860 1740 1863 -62860 1816 1835 -62860 1470 1495 -62860 1602 1779 -62860 1811 1876 -62860 1829 1919 -62860 1886 1919 -62860 1890 1519 -62860 1694 1857 -62860 1829 1886 -62860 1489 1498 -62860 1678 1845 -62860 1544 1599 -62860 1635 1920 -62860 1599 1890 -62860 1650 1668 -62880 1544 1519 -62880 1550 1857 -62880 1599 1819 -62880 1599 1519 -62880 1600 1890 -62880 1688 1715 -62880 1721 1816 -62880 1721 1825 -62880 1740 1863 -62880 1816 1835 -62880 1819 1519 -62880 1913 1519 -62880 1470 1495 -62880 1602 1779 -62880 1811 1876 -62880 1829 1919 -62880 1886 1919 -62880 1890 1519 -62880 1694 1857 -62880 1694 1441 -62880 1819 1913 -62880 1857 1441 -62880 1829 1886 -62880 1489 1498 -62880 1544 1890 -62880 1825 1881 -62880 1678 1845 -62880 1804 1510 -62880 1816 1823 -62880 1544 1599 -62880 1635 1920 -62880 1599 1890 -62880 1617 1684 -62880 1650 1668 -62900 1599 1688 -62900 1602 1779 -62900 1668 1463 -62900 1669 1835 -62900 1703 1889 -62900 1811 1876 -62900 1829 1919 -62900 1886 1919 -62900 1890 1519 -62900 1600 1888 -62900 1669 1754 -62900 1694 1857 -62900 1694 1441 -62900 1819 1913 -62900 1857 1441 -62900 1829 1886 -62900 1489 1498 -62900 1544 1890 -62900 1816 1825 -62900 1825 1881 -62900 1678 1845 -62900 1804 1510 -62900 1816 1823 -62900 1544 1599 -62900 1635 1920 -62900 1599 1890 -62900 1617 1684 -62900 1650 1668 -62920 1600 1888 -62920 1669 1754 -62920 1688 1913 -62920 1688 1819 -62920 1694 1857 -62920 1694 1441 -62920 1721 1825 -62920 1740 1863 -62920 1819 1913 -62920 1857 1441 -62920 1625 1678 -62920 1829 1886 -62920 1489 1498 -62920 1544 1890 -62920 1816 1825 -62920 1825 1881 -62920 1678 1845 -62920 1804 1510 -62920 1816 1823 -62920 1544 1599 -62920 1635 1920 -62920 1599 1890 -62920 1617 1684 -62920 1650 1668 -62940 1555 1625 -62940 1625 1678 -62940 1648 1696 -62940 1651 1754 -62940 1811 1876 -62940 1829 1886 -62940 1441 1489 -62940 1489 1498 -62940 1544 1890 -62940 1816 1825 -62940 1825 1881 -62940 1678 1845 -62940 1804 1510 -62940 1816 1823 -62940 1544 1599 -62940 1549 1525 -62940 1635 1920 -62940 1599 1890 -62940 1617 1684 -62940 1835 1463 -62940 1650 1668 -62960 1544 1890 -62960 1767 1498 -62960 1816 1825 -62960 1825 1881 -62960 1890 1525 -62960 1600 1888 -62960 1678 1845 -62960 1804 1510 -62960 1816 1823 -62960 1767 1489 -62960 1544 1599 -62960 1549 1525 -62960 1635 1920 -62960 1599 1890 -62960 1617 1684 -62960 1694 1857 -62960 1835 1463 -62960 1650 1668 -62980 1599 1525 -62980 1600 1888 -62980 1678 1845 -62980 1721 1816 -62980 1721 1825 -62980 1804 1510 -62980 1816 1823 -62980 1829 1886 -62980 1767 1489 -62980 1544 1599 -62980 1549 1525 -62980 1635 1920 -62980 1599 1890 -62980 1617 1684 -62980 1694 1857 -62980 1489 1498 -62980 1835 1463 -62980 1811 1876 -62980 1740 1863 -62980 1650 1668 -63000 1563 1592 -63000 1583 1890 -63000 1648 1696 -63000 1688 1448 -63000 1721 1881 -63000 1721 1796 -63000 1767 1489 -63000 1796 1816 -63000 1544 1890 -63000 1544 1599 -63000 1549 1525 -63000 1635 1920 -63000 1819 1913 -63000 1599 1890 -63000 1617 1684 -63000 1694 1857 -63000 1694 1441 -63000 1857 1441 -63000 1489 1498 -63000 1835 1463 -63000 1811 1876 -63000 1740 1863 -63000 1650 1668 -63020 1544 1890 -63020 1544 1599 -63020 1549 1525 -63020 1569 1678 -63020 1635 1920 -63020 1669 1754 -63020 1819 1913 -63020 1829 1886 -63020 1840 1489 -63020 1841 1901 -63020 1876 1918 -63020 1890 1519 -63020 1599 1890 -63020 1617 1684 -63020 1678 1845 -63020 1694 1857 -63020 1694 1441 -63020 1857 1441 -63020 1489 1498 -63020 1825 1888 -63020 1835 1463 -63020 1600 1888 -63020 1811 1876 -63020 1740 1863 -63020 1650 1668 -63040 1563 1592 -63040 1599 1890 -63040 1602 1779 -63040 1617 1684 -63040 1648 1696 -63040 1678 1845 -63040 1871 1517 -63040 1600 1825 -63040 1694 1857 -63040 1694 1441 -63040 1857 1441 -63040 1489 1498 -63040 1825 1888 -63040 1835 1463 -63040 1600 1888 -63040 1811 1876 -63040 1740 1863 -63040 1650 1668 -63060 1569 1678 -63060 1600 1825 -63060 1679 1819 -63060 1694 1857 -63060 1694 1441 -63060 1721 1816 -63060 1816 1881 -63060 1816 1823 -63060 1857 1441 -63060 1489 1498 -63060 1825 1888 -63060 1829 1886 -63060 1835 1463 -63060 1600 1888 -63060 1655 1512 -63060 1811 1876 -63060 1924 1478 -63060 1635 1920 -63060 1678 1742 -63060 1740 1863 -63060 1650 1668 -63080 1602 1779 -63080 1663 1818 -63080 1669 1754 -63080 1796 1816 -63080 1796 1823 -63080 1825 1888 -63080 1829 1886 -63080 1835 1840 -63080 1835 1463 -63080 1884 1890 -63080 1600 1888 -63080 1655 1512 -63080 1544 1890 -63080 1811 1876 -63080 1549 1525 -63080 1841 1901 -63080 1924 1478 -63080 1635 1920 -63080 1678 1742 -63080 1740 1863 -63080 1650 1668 -63100 1600 1888 -63100 1617 1684 -63100 1655 1512 -63100 1721 1816 -63100 1728 1458 -63100 1816 1823 -63100 1816 1881 -63100 1544 1890 -63100 1599 1512 -63100 1599 1655 -63100 1811 1876 -63100 1549 1525 -63100 1841 1901 -63100 1924 1478 -63100 1569 1678 -63100 1635 1920 -63100 1678 1742 -63100 1600 1825 -63100 1740 1863 -63100 1650 1668 -63120 1544 1890 -63120 1599 1512 -63120 1599 1655 -63120 1811 1876 -63120 1840 1463 -63120 1549 1525 -63120 1669 1754 -63120 1841 1901 -63120 1924 1478 -63120 1569 1678 -63120 1635 1920 -63120 1489 1498 -63120 1678 1742 -63120 1857 1441 -63120 1694 1441 -63120 1694 1857 -63120 1600 1825 -63120 1740 1863 -63120 1650 1668 -63140 1549 1525 -63140 1669 1754 -63140 1767 1840 -63140 1816 1823 -63140 1841 1901 -63140 1871 1517 -63140 1924 1478 -63140 1602 1779 -63140 1888 1503 -63140 1569 1678 -63140 1635 1920 -63140 1489 1498 -63140 1678 1742 -63140 1857 1441 -63140 1694 1441 -63140 1694 1857 -63140 1600 1825 -63140 1740 1863 -63140 1650 1668 -63160 1599 1512 -63160 1602 1779 -63160 1679 1819 -63160 1688 1426 -63160 1721 1816 -63160 1767 1489 -63160 1816 1881 -63160 1829 1886 -63160 1888 1503 -63160 1563 1592 -63160 1617 1684 -63160 1485 1529 -63160 1569 1678 -63160 1635 1920 -63160 1489 1498 -63160 1678 1742 -63160 1857 1441 -63160 1694 1441 -63160 1694 1857 -63160 1600 1825 -63160 1740 1863 -63160 1650 1668 -63180 1563 1592 -63180 1617 1684 -63180 1659 1449 -63180 1688 1886 -63180 1841 1901 -63180 1767 1840 -63180 1924 1478 -63180 1485 1529 -63180 1549 1525 -63180 1569 1678 -63180 1635 1920 -63180 1787 1851 -63180 1819 1913 -63180 1489 1498 -63180 1678 1742 -63180 1689 1533 -63180 1857 1441 -63180 1694 1441 -63180 1694 1857 -63180 1600 1825 -63180 1740 1863 -63180 1650 1668 -63200 1655 1529 -63200 1767 1840 -63200 1796 1816 -63200 1924 1478 -63200 1485 1529 -63200 1549 1525 -63200 1569 1678 -63200 1635 1920 -63200 1787 1851 -63200 1819 1913 -63200 1602 1779 -63200 1489 1498 -63200 1678 1742 -63200 1721 1796 -63200 1689 1533 -63200 1857 1441 -63200 1694 1441 -63200 1694 1857 -63200 1669 1754 -63200 1600 1825 -63200 1740 1863 -63200 1650 1668 -63220 1549 1525 -63220 1563 1592 -63220 1569 1678 -63220 1599 1512 -63220 1635 1920 -63220 1787 1851 -63220 1811 1876 -63220 1819 1913 -63220 1829 1871 -63220 1440 1458 -63220 1829 1517 -63220 1602 1779 -63220 1489 1498 -63220 1678 1742 -63220 1721 1796 -63220 1829 1886 -63220 1689 1533 -63220 1857 1441 -63220 1694 1441 -63220 1694 1857 -63220 1669 1754 -63220 1600 1825 -63220 1740 1863 -63220 1650 1668 -63240 1630 1531 -63240 1829 1517 -63240 1602 1779 -63240 1677 1678 -63240 1489 1498 -63240 1678 1742 -63240 1721 1796 -63240 1829 1886 -63240 1767 1840 -63240 1689 1533 -63240 1796 1816 -63240 1857 1441 -63240 1694 1441 -63240 1694 1857 -63240 1669 1754 -63240 1600 1825 -63240 1547 1808 -63240 1740 1863 -63240 1650 1668 -63260 1602 1779 -63260 1617 1684 -63260 1677 1678 -63260 1688 1894 -63260 1811 1876 -63260 1448 1449 -63260 1489 1498 -63260 1678 1742 -63260 1721 1816 -63260 1721 1796 -63260 1829 1886 -63260 1871 1517 -63260 1440 1458 -63260 1767 1840 -63260 1689 1533 -63260 1796 1816 -63260 1857 1441 -63260 1694 1441 -63260 1694 1857 -63260 1669 1754 -63260 1600 1825 -63260 1547 1808 -63260 1740 1863 -63260 1650 1668 -63280 1635 1840 -63280 1635 1767 -63280 1678 1742 -63280 1721 1816 -63280 1721 1796 -63280 1829 1886 -63280 1871 1517 -63280 1440 1458 -63280 1767 1840 -63280 1689 1533 -63280 1796 1816 -63280 1857 1441 -63280 1485 1529 -63280 1694 1441 -63280 1694 1857 -63280 1669 1754 -63280 1600 1825 -63280 1547 1808 -63280 1740 1863 -63280 1650 1668 -63300 1569 1678 -63300 1600 1884 -63300 1689 1912 -63300 1767 1840 -63300 1840 1920 -63300 1689 1533 -63300 1796 1816 -63300 1857 1441 -63300 1485 1529 -63300 1617 1684 -63300 1694 1441 -63300 1694 1857 -63300 1669 1754 -63300 1489 1498 -63300 1600 1825 -63300 1547 1808 -63300 1740 1863 -63300 1650 1668 -63320 1549 1525 -63320 1635 1920 -63320 1678 1742 -63320 1689 1533 -63320 1796 1816 -63320 1857 1441 -63320 1440 1458 -63320 1485 1529 -63320 1485 1517 -63320 1871 1517 -63320 1617 1684 -63320 1635 1463 -63320 1694 1441 -63320 1694 1857 -63320 1669 1754 -63320 1489 1498 -63320 1600 1825 -63320 1547 1808 -63320 1740 1863 -63320 1650 1668 -63340 1679 1819 -63340 1679 1718 -63340 1689 1912 -63340 1718 1819 -63340 1721 1881 -63340 1871 1529 -63340 1871 1517 -63340 1517 1529 -63340 1617 1684 -63340 1635 1463 -63340 1694 1441 -63340 1694 1857 -63340 1669 1754 -63340 1489 1498 -63340 1600 1825 -63340 1547 1808 -63340 1740 1863 -63340 1650 1668 -63360 1599 1678 -63360 1617 1684 -63360 1635 1463 -63360 1694 1441 -63360 1694 1857 -63360 1829 1886 -63360 1888 1503 -63360 1669 1754 -63360 1489 1498 -63360 1600 1825 -63360 1678 1742 -63360 1547 1808 -63360 1740 1863 -63360 1650 1668 -63380 1569 1678 -63380 1579 1441 -63380 1599 1825 -63380 1599 1519 -63380 1617 1684 -63380 1635 1463 -63380 1664 1530 -63380 1694 1441 -63380 1694 1857 -63380 1787 1851 -63380 1829 1886 -63380 1857 1441 -63380 1888 1503 -63380 1549 1525 -63380 1669 1754 -63380 1489 1498 -63380 1600 1825 -63380 1678 1742 -63380 1547 1808 -63380 1579 1694 -63380 1740 1863 -63380 1650 1668 -63400 1721 1881 -63400 1857 1441 -63400 1871 1517 -63400 1888 1503 -63400 1549 1525 -63400 1669 1754 -63400 1816 1881 -63400 1796 1816 -63400 1489 1498 -63400 1600 1825 -63400 1678 1742 -63400 1689 1533 -63400 1547 1808 -63400 1598 1920 -63400 1579 1694 -63400 1740 1863 -63400 1650 1668 -63420 1549 1525 -63420 1669 1754 -63420 1816 1881 -63420 1796 1816 -63420 1489 1498 -63420 1600 1825 -63420 1678 1742 -63420 1689 1533 -63420 1547 1808 -63420 1598 1920 -63420 1579 1694 -63420 1740 1863 -63420 1650 1668 -63440 1684 1441 -63440 1796 1816 -63440 1816 1918 -63440 1829 1886 -63440 1721 1816 -63440 1857 1441 -63440 1489 1498 -63440 1599 1525 -63440 1600 1825 -63440 1617 1441 -63440 1678 1742 -63440 1689 1533 -63440 1871 1517 -63440 1547 1808 -63440 1598 1920 -63440 1579 1694 -63440 1888 1503 -63440 1740 1863 -63440 1650 1668 -63460 1669 1754 -63460 1721 1816 -63460 1816 1823 -63460 1857 1441 -63460 1489 1498 -63460 1569 1742 -63460 1569 1678 -63460 1599 1525 -63460 1600 1825 -63460 1617 1441 -63460 1678 1742 -63460 1689 1533 -63460 1871 1517 -63460 1881 1918 -63460 1547 1808 -63460 1598 1920 -63460 1617 1857 -63460 1579 1694 -63460 1888 1503 -63460 1721 1796 -63460 1740 1863 -63460 1650 1668 -63480 1569 1742 -63480 1569 1678 -63480 1579 1437 -63480 1599 1525 -63480 1600 1825 -63480 1617 1441 -63480 1678 1742 -63480 1689 1533 -63480 1728 1458 -63480 1871 1517 -63480 1881 1918 -63480 1547 1808 -63480 1598 1920 -63480 1617 1857 -63480 1579 1694 -63480 1694 1437 -63480 1888 1503 -63480 1721 1796 -63480 1740 1863 -63480 1650 1668 -63500 1547 1808 -63500 1598 1920 -63500 1602 1779 -63500 1796 1816 -63500 1857 1441 -63500 1617 1857 -63500 1579 1694 -63500 1694 1437 -63500 1888 1503 -63500 1721 1796 -63500 1740 1863 -63500 1650 1668 -63520 1617 1857 -63520 1579 1694 -63520 1694 1437 -63520 1888 1503 -63520 1871 1517 -63520 1489 1498 -63520 1721 1796 -63520 1579 1437 -63520 1549 1525 -63520 1829 1886 -63520 1740 1863 -63520 1650 1668 -63540 1579 1694 -63540 1669 1754 -63540 1694 1437 -63540 1819 1876 -63540 1575 1679 -63540 1888 1503 -63540 1547 1808 -63540 1600 1825 -63540 1871 1517 -63540 1489 1498 -63540 1721 1796 -63540 1721 1816 -63540 1796 1816 -63540 1579 1437 -63540 1549 1525 -63540 1829 1886 -63540 1740 1863 -63540 1650 1668 -63560 1575 1679 -63560 1721 1823 -63560 1841 1901 -63560 1857 1489 -63560 1888 1503 -63560 1547 1808 -63560 1600 1825 -63560 1617 1857 -63560 1721 1881 -63560 1871 1517 -63560 1489 1498 -63560 1721 1796 -63560 1721 1816 -63560 1796 1816 -63560 1579 1437 -63560 1549 1525 -63560 1829 1886 -63560 1740 1863 -63560 1678 1813 -63560 1650 1668 -63580 1547 1808 -63580 1600 1825 -63580 1617 1857 -63580 1721 1881 -63580 1871 1517 -63580 1489 1498 -63580 1721 1796 -63580 1721 1816 -63580 1796 1816 -63580 1593 1787 -63580 1579 1437 -63580 1549 1525 -63580 1829 1886 -63580 1740 1863 -63580 1678 1813 -63580 1650 1668 -63600 1669 1754 -63600 1721 1796 -63600 1721 1823 -63600 1547 1716 -63600 1575 1679 -63600 1721 1816 -63600 1796 1816 -63600 1857 1441 -63600 1593 1787 -63600 1579 1437 -63600 1549 1525 -63600 1829 1886 -63600 1740 1863 -63600 1678 1813 -63600 1650 1668 -63620 1547 1716 -63620 1575 1679 -63620 1721 1816 -63620 1796 1816 -63620 1816 1918 -63620 1857 1441 -63620 1593 1787 -63620 1579 1437 -63620 1549 1525 -63620 1829 1886 -63620 1600 1825 -63620 1740 1863 -63620 1678 1813 -63620 1650 1668 -63640 1568 1516 -63640 1593 1787 -63640 1684 1839 -63640 1721 1796 -63640 1825 1463 -63640 1579 1437 -63640 1699 1884 -63640 1549 1525 -63640 1669 1754 -63640 1489 1498 -63640 1829 1886 -63640 1600 1825 -63640 1740 1863 -63640 1678 1813 -63640 1650 1668 -63660 1579 1437 -63660 1651 1906 -63660 1699 1884 -63660 1857 1901 -63660 1871 1517 -63660 1549 1525 -63660 1669 1754 -63660 1489 1498 -63660 1841 1901 -63660 1829 1886 -63660 1600 1825 -63660 1740 1863 -63660 1678 1813 -63660 1650 1668 -63680 1547 1816 -63680 1549 1525 -63680 1617 1694 -63680 1669 1754 -63680 1816 1823 -63680 1489 1498 -63680 1841 1901 -63680 1829 1886 -63680 1600 1825 -63680 1740 1863 -63680 1678 1813 -63680 1650 1668 -63700 1796 1816 -63700 1841 1901 -63700 1599 1512 -63700 1600 1519 -63700 1651 1742 -63700 1699 1884 -63700 1829 1886 -63700 1600 1825 -63700 1740 1863 -63700 1871 1517 -63700 1678 1813 -63700 1650 1668 -63720 1599 1512 -63720 1600 1519 -63720 1650 1463 -63720 1651 1742 -63720 1699 1884 -63720 1816 1823 -63720 1829 1886 -63720 1600 1825 -63720 1617 1694 -63720 1740 1863 -63720 1549 1525 -63720 1871 1517 -63720 1678 1813 -63720 1650 1668 -63740 1651 1742 -63740 1699 1884 -63740 1718 1819 -63740 1796 1823 -63740 1816 1823 -63740 1721 1816 -63740 1796 1816 -63740 1829 1886 -63740 1600 1825 -63740 1602 1779 -63740 1617 1694 -63740 1740 1863 -63740 1549 1525 -63740 1871 1517 -63740 1678 1813 -63740 1650 1668 -63760 1715 1718 -63760 1717 1718 -63760 1721 1816 -63760 1767 1840 -63760 1796 1816 -63760 1811 1876 -63760 1829 1886 -63760 1600 1825 -63760 1602 1779 -63760 1617 1694 -63760 1740 1863 -63760 1549 1525 -63760 1841 1901 -63760 1593 1787 -63760 1600 1519 -63760 1871 1517 -63760 1678 1813 -63760 1650 1668 -63780 1600 1825 -63780 1602 1779 -63780 1617 1694 -63780 1740 1863 -63780 1533 1535 -63780 1549 1525 -63780 1841 1901 -63780 1599 1512 -63780 1816 1823 -63780 1593 1787 -63780 1699 1884 -63780 1600 1519 -63780 1587 1535 -63780 1871 1517 -63780 1678 1813 -63780 1650 1668 -63800 1549 1525 -63800 1811 1819 -63800 1811 1876 -63800 1819 1851 -63800 1841 1901 -63800 1599 1512 -63800 1816 1823 -63800 1593 1787 -63800 1699 1884 -63800 1721 1816 -63800 1767 1840 -63800 1600 1519 -63800 1587 1535 -63800 1871 1517 -63800 1678 1813 -63800 1650 1668 -63820 1547 1716 -63820 1599 1512 -63820 1617 1694 -63820 1816 1823 -63820 1593 1787 -63820 1699 1884 -63820 1721 1816 -63820 1767 1840 -63820 1489 1498 -63820 1600 1519 -63820 1587 1535 -63820 1871 1517 -63820 1678 1813 -63820 1650 1668 -63840 1593 1787 -63840 1651 1742 -63840 1721 1881 -63840 1740 1863 -63840 1857 1901 -63840 1563 1592 -63840 1699 1884 -63840 1721 1816 -63840 1767 1840 -63840 1811 1876 -63840 1819 1913 -63840 1489 1498 -63840 1600 1519 -63840 1587 1535 -63840 1871 1517 -63840 1678 1813 -63840 1650 1668 -63860 1563 1592 -63860 1699 1884 -63860 1721 1816 -63860 1767 1840 -63860 1811 1876 -63860 1819 1913 -63860 1841 1901 -63860 1489 1498 -63860 1600 1519 -63860 1587 1535 -63860 1871 1517 -63860 1678 1813 -63860 1650 1668 -63880 1547 1716 -63880 1600 1519 -63880 1665 1688 -63880 1718 1816 -63880 1718 1441 -63880 1857 1441 -63880 1587 1535 -63880 1871 1517 -63880 1678 1813 -63880 1650 1668 -63900 1563 1441 -63900 1651 1742 -63900 1721 1816 -63900 1740 1863 -63900 1811 1876 -63900 1825 1519 -63900 1857 1441 -63900 1549 1525 -63900 1587 1535 -63900 1816 1881 -63900 1489 1498 -63900 1871 1517 -63900 1678 1813 -63900 1650 1668 -63920 1549 1525 -63920 1587 1535 -63920 1598 1659 -63920 1598 1718 -63920 1715 1717 -63920 1767 1840 -63920 1816 1881 -63920 1825 1884 -63920 1563 1678 -63920 1563 1813 -63920 1819 1913 -63920 1489 1498 -63920 1871 1517 -63920 1547 1716 -63920 1678 1813 -63920 1650 1668 -63940 1563 1678 -63940 1563 1813 -63940 1593 1787 -63940 1819 1913 -63940 1857 1441 -63940 1489 1498 -63940 1871 1517 -63940 1547 1716 -63940 1678 1813 -63940 1598 1876 -63940 1650 1668 -63960 1563 1813 -63960 1587 1535 -63960 1593 1787 -63960 1699 1437 -63960 1819 1913 -63960 1857 1441 -63960 1489 1498 -63960 1841 1901 -63960 1651 1742 -63960 1598 1811 -63960 1811 1876 -63960 1871 1517 -63960 1547 1716 -63960 1678 1813 -63960 1598 1876 -63960 1650 1668 -63980 1767 1840 -63980 1796 1816 -63980 1489 1498 -63980 1841 1901 -63980 1549 1525 -63980 1651 1742 -63980 1598 1811 -63980 1811 1876 -63980 1871 1517 -63980 1547 1716 -63980 1678 1813 -63980 1598 1876 -63980 1650 1668 -64000 1825 1519 -64000 1841 1901 -64000 1549 1525 -64000 1651 1742 -64000 1598 1811 -64000 1811 1876 -64000 1871 1517 -64000 1547 1716 -64000 1678 1813 -64000 1598 1876 -64000 1650 1668 -64020 1549 1525 -64020 1597 1622 -64020 1651 1742 -64020 1819 1913 -64020 1877 1908 -64020 1593 1787 -64020 1598 1811 -64020 1811 1876 -64020 1871 1517 -64020 1721 1796 -64020 1740 1863 -64020 1816 1881 -64020 1547 1716 -64020 1796 1816 -64020 1678 1813 -64020 1598 1876 -64020 1650 1668 -64040 1593 1787 -64040 1598 1811 -64040 1767 1840 -64040 1811 1876 -64040 1871 1517 -64040 1721 1796 -64040 1740 1863 -64040 1816 1881 -64040 1547 1716 -64040 1796 1816 -64040 1678 1813 -64040 1598 1876 -64040 1650 1668 -64060 1689 1817 -64060 1721 1796 -64060 1740 1863 -64060 1816 1881 -64060 1501 1528 -64060 1651 1742 -64060 1547 1716 -64060 1796 1816 -64060 1549 1525 -64060 1678 1813 -64060 1598 1876 -64060 1650 1668 -64080 1651 1742 -64080 1669 1754 -64080 1617 1441 -64080 1547 1716 -64080 1811 1876 -64080 1598 1811 -64080 1767 1840 -64080 1796 1816 -64080 1549 1525 -64080 1678 1813 -64080 1598 1876 -64080 1650 1668 -64100 1598 1920 -64100 1617 1441 -64100 1877 1908 -64100 1547 1716 -64100 1740 1863 -64100 1811 1876 -64100 1819 1913 -64100 1598 1811 -64100 1489 1498 -64100 1767 1840 -64100 1796 1816 -64100 1549 1525 -64100 1678 1813 -64100 1598 1876 -64100 1650 1668 -64120 1547 1716 -64120 1740 1863 -64120 1811 1876 -64120 1817 1819 -64120 1819 1913 -64120 1598 1811 -64120 1489 1498 -64120 1767 1840 -64120 1796 1816 -64120 1549 1525 -64120 1678 1813 -64120 1598 1876 -64120 1650 1668 -64140 1598 1811 -64140 1617 1857 -64140 1617 1441 -64140 1721 1816 -64140 1821 1898 -64140 1489 1498 -64140 1767 1840 -64140 1857 1441 -64140 1796 1816 -64140 1549 1525 -64140 1678 1813 -64140 1598 1876 -64140 1650 1668 -64160 1598 1918 -64160 1721 1796 -64160 1489 1498 -64160 1547 1716 -64160 1811 1876 -64160 1767 1840 -64160 1857 1441 -64160 1796 1816 -64160 1549 1525 -64160 1678 1813 -64160 1598 1876 -64160 1650 1668 -64180 1613 1526 -64180 1716 1808 -64180 1721 1816 -64180 1740 1863 -64180 1819 1913 -64180 1823 1881 -64180 1489 1498 -64180 1547 1716 -64180 1796 1881 -64180 1811 1876 -64180 1877 1908 -64180 1767 1840 -64180 1857 1441 -64180 1796 1816 -64180 1549 1525 -64180 1678 1813 -64180 1598 1876 -64180 1547 1808 -64180 1650 1668 -64200 1819 1920 -64200 1840 1489 -64200 1924 1478 -64200 1547 1716 -64200 1796 1881 -64200 1811 1876 -64200 1877 1908 -64200 1767 1840 -64200 1857 1441 -64200 1669 1754 -64200 1721 1796 -64200 1796 1816 -64200 1549 1525 -64200 1678 1813 -64200 1598 1876 -64200 1547 1808 -64200 1650 1668 -64220 1547 1716 -64220 1598 1811 -64220 1598 1819 -64220 1613 1526 -64220 1796 1881 -64220 1811 1876 -64220 1877 1908 -64220 1767 1840 -64220 1857 1441 -64220 1669 1754 -64220 1721 1796 -64220 1796 1816 -64220 1549 1525 -64220 1678 1813 -64220 1716 1808 -64220 1598 1876 -64220 1547 1808 -64220 1650 1668 -64240 1592 1717 -64240 1598 1920 -64240 1651 1742 -64240 1924 1478 -64240 1767 1840 -64240 1857 1441 -64240 1669 1754 -64240 1721 1796 -64240 1796 1816 -64240 1549 1525 -64240 1678 1813 -64240 1489 1498 -64240 1716 1808 -64240 1598 1876 -64240 1547 1808 -64240 1650 1668 -64260 1598 1811 -64260 1721 1816 -64260 1767 1840 -64260 1857 1441 -64260 1913 1918 -64260 1669 1754 -64260 1721 1796 -64260 1796 1816 -64260 1796 1881 -64260 1549 1525 -64260 1678 1813 -64260 1489 1498 -64260 1716 1808 -64260 1598 1876 -64260 1547 1808 -64260 1650 1668 -64280 1548 1606 -64280 1655 1819 -64280 1811 1876 -64280 1924 1478 -64280 1669 1754 -64280 1721 1796 -64280 1796 1816 -64280 1796 1881 -64280 1549 1525 -64280 1547 1716 -64280 1678 1813 -64280 1489 1498 -64280 1716 1808 -64280 1598 1876 -64280 1547 1808 -64280 1617 1857 -64280 1650 1668 -64300 1617 1441 -64300 1669 1754 -64300 1767 1840 -64300 1857 1441 -64300 1920 1463 -64300 1721 1796 -64300 1796 1816 -64300 1796 1881 -64300 1816 1823 -64300 1549 1525 -64300 1547 1716 -64300 1592 1717 -64300 1678 1813 -64300 1489 1498 -64300 1716 1808 -64300 1598 1876 -64300 1547 1808 -64300 1617 1857 -64300 1650 1668 -64320 1599 1655 -64320 1721 1796 -64320 1767 1489 -64320 1796 1816 -64320 1796 1881 -64320 1816 1823 -64320 1840 1498 -64320 1913 1920 -64320 1549 1525 -64320 1598 1811 -64320 1466 1467 -64320 1547 1716 -64320 1592 1717 -64320 1678 1813 -64320 1840 1489 -64320 1489 1498 -64320 1716 1808 -64320 1598 1876 -64320 1547 1808 -64320 1617 1857 -64320 1650 1668 -64340 1548 1606 -64340 1549 1525 -64340 1598 1811 -64340 1718 1466 -64340 1740 1863 -64340 1811 1876 -64340 1466 1467 -64340 1547 1716 -64340 1592 1717 -64340 1678 1813 -64340 1840 1489 -64340 1489 1498 -64340 1587 1535 -64340 1716 1808 -64340 1884 1920 -64340 1598 1876 -64340 1547 1808 -64340 1617 1857 -64340 1650 1668 -64360 1547 1716 -64360 1592 1717 -64360 1599 1655 -64360 1602 1779 -64360 1678 1813 -64360 1816 1881 -64360 1840 1489 -64360 1467 1535 -64360 1489 1498 -64360 1587 1535 -64360 1716 1808 -64360 1884 1920 -64360 1598 1876 -64360 1547 1808 -64360 1617 1857 -64360 1650 1668 -64380 1549 1525 -64380 1587 1535 -64380 1669 1754 -64380 1721 1816 -64380 1767 1840 -64380 1841 1901 -64380 1716 1808 -64380 1740 1863 -64380 1884 1920 -64380 1628 1463 -64380 1816 1823 -64380 1598 1811 -64380 1598 1876 -64380 1547 1808 -64380 1617 1857 -64380 1811 1876 -64380 1884 1453 -64380 1650 1668 -64400 1689 1825 -64400 1689 1519 -64400 1703 1901 -64400 1716 1808 -64400 1740 1863 -64400 1796 1816 -64400 1884 1920 -64400 1920 1453 -64400 1628 1463 -64400 1816 1823 -64400 1598 1811 -64400 1598 1876 -64400 1599 1512 -64400 1547 1808 -64400 1617 1857 -64400 1811 1876 -64400 1547 1716 -64400 1602 1779 -64400 1884 1453 -64400 1650 1668 -64420 1598 1920 -64420 1628 1463 -64420 1721 1796 -64420 1816 1823 -64420 1841 1901 -64420 1876 1920 -64420 1924 1478 -64420 1598 1811 -64420 1598 1876 -64420 1599 1512 -64420 1669 1754 -64420 1547 1808 -64420 1617 1857 -64420 1811 1876 -64420 1547 1716 -64420 1602 1779 -64420 1655 1512 -64420 1884 1453 -64420 1592 1717 -64420 1650 1668 -64440 1598 1811 -64440 1598 1876 -64440 1599 1512 -64440 1669 1754 -64440 1718 1893 -64440 1547 1808 -64440 1617 1857 -64440 1716 1808 -64440 1796 1816 -64440 1811 1876 -64440 1547 1716 -64440 1602 1779 -64440 1655 1512 -64440 1884 1453 -64440 1592 1717 -64440 1650 1668 -64460 1547 1808 -64460 1587 1535 -64460 1617 1857 -64460 1716 1808 -64460 1721 1816 -64460 1796 1816 -64460 1796 1881 -64460 1811 1876 -64460 1816 1823 -64460 1547 1716 -64460 1602 1779 -64460 1655 1512 -64460 1816 1881 -64460 1884 1453 -64460 1924 1478 -64460 1650 1463 -64460 1841 1901 -64460 1489 1498 -64460 1592 1717 -64460 1650 1668 -64480 1547 1716 -64480 1599 1512 -64480 1602 1779 -64480 1655 1512 -64480 1668 1463 -64480 1816 1881 -64480 1825 1890 -64480 1884 1453 -64480 1924 1478 -64480 1600 1825 -64480 1650 1463 -64480 1841 1901 -64480 1489 1498 -64480 1890 1525 -64480 1592 1717 -64480 1650 1668 -64500 1600 1825 -64500 1613 1526 -64500 1650 1463 -64500 1841 1901 -64500 1489 1498 -64500 1877 1908 -64500 1890 1525 -64500 1592 1717 -64500 1650 1668 -64520 1549 1525 -64520 1617 1857 -64520 1841 1901 -64520 1489 1498 -64520 1602 1779 -64520 1718 1818 -64520 1811 1876 -64520 1877 1908 -64520 1599 1512 -64520 1549 1890 -64520 1890 1525 -64520 1716 1808 -64520 1592 1717 -64520 1650 1668 -64540 1602 1779 -64540 1718 1818 -64540 1811 1876 -64540 1877 1908 -64540 1599 1512 -64540 1599 1655 -64540 1549 1890 -64540 1767 1840 -64540 1890 1525 -64540 1716 1808 -64540 1587 1535 -64540 1592 1717 -64540 1650 1668 -64560 1549 1525 -64560 1599 1512 -64560 1599 1655 -64560 1617 1857 -64560 1655 1512 -64560 1549 1890 -64560 1767 1840 -64560 1890 1525 -64560 1754 1459 -64560 1716 1808 -64560 1587 1535 -64560 1592 1717 -64560 1650 1668 -64580 1841 1901 -64580 1898 1477 -64580 1549 1890 -64580 1767 1840 -64580 1876 1437 -64580 1884 1453 -64580 1890 1525 -64580 1754 1459 -64580 1811 1876 -64580 1716 1808 -64580 1587 1535 -64580 1592 1717 -64580 1598 1713 -64580 1650 1668 -64600 1549 1890 -64600 1600 1890 -64600 1655 1512 -64600 1767 1840 -64600 1876 1437 -64600 1884 1453 -64600 1890 1525 -64600 1890 1453 -64600 1599 1655 -64600 1617 1857 -64600 1754 1459 -64600 1811 1876 -64600 1544 1600 -64600 1716 1808 -64600 1587 1535 -64600 1592 1717 -64600 1598 1713 -64600 1650 1668 -64620 1549 1525 -64620 1599 1655 -64620 1617 1857 -64620 1703 1890 -64620 1754 1459 -64620 1740 1863 -64620 1811 1876 -64620 1544 1600 -64620 1716 1808 -64620 1587 1535 -64620 1592 1717 -64620 1598 1713 -64620 1650 1668 -64640 1549 1890 -64640 1563 1675 -64640 1617 1684 -64640 1684 1439 -64640 1740 1863 -64640 1811 1876 -64640 1857 1441 -64640 1890 1525 -64640 1544 1600 -64640 1876 1437 -64640 1767 1840 -64640 1635 1717 -64640 1669 1754 -64640 1684 1441 -64640 1716 1808 -64640 1587 1535 -64640 1684 1857 -64640 1592 1717 -64640 1598 1713 -64640 1650 1668 -64660 1544 1600 -64660 1599 1655 -64660 1821 1477 -64660 1876 1437 -64660 1767 1840 -64660 1635 1717 -64660 1669 1754 -64660 1684 1441 -64660 1716 1808 -64660 1587 1535 -64660 1684 1857 -64660 1592 1717 -64660 1598 1713 -64660 1650 1668 -64680 1593 1851 -64680 1767 1840 -64680 1841 1901 -64680 1547 1808 -64680 1635 1717 -64680 1669 1754 -64680 1684 1441 -64680 1716 1808 -64680 1787 1851 -64680 1553 1890 -64680 1547 1716 -64680 1587 1535 -64680 1684 1857 -64680 1740 1863 -64680 1592 1717 -64680 1598 1713 -64680 1650 1668 -64700 1547 1808 -64700 1617 1857 -64700 1617 1684 -64700 1617 1441 -64700 1635 1717 -64700 1650 1463 -64700 1668 1463 -64700 1669 1754 -64700 1684 1441 -64700 1716 1808 -64700 1787 1851 -64700 1857 1441 -64700 1884 1453 -64700 1553 1890 -64700 1547 1716 -64700 1587 1535 -64700 1598 1920 -64700 1684 1857 -64700 1740 1863 -64700 1563 1675 -64700 1684 1876 -64700 1876 1441 -64700 1592 1717 -64700 1617 1876 -64700 1598 1713 -64700 1857 1876 -64700 1650 1668 -64720 1553 1890 -64720 1628 1463 -64720 1767 1840 -64720 1547 1716 -64720 1549 1525 -64720 1587 1535 -64720 1598 1920 -64720 1684 1857 -64720 1740 1863 -64720 1563 1675 -64720 1684 1876 -64720 1876 1441 -64720 1592 1717 -64720 1617 1876 -64720 1598 1713 -64720 1857 1876 -64720 1650 1668 -64740 1547 1716 -64740 1549 1525 -64740 1587 1535 -64740 1598 1920 -64740 1600 1453 -64740 1650 1463 -64740 1668 1463 -64740 1684 1857 -64740 1740 1863 -64740 1884 1453 -64740 1563 1811 -64740 1563 1675 -64740 1684 1876 -64740 1857 1441 -64740 1876 1441 -64740 1592 1717 -64740 1617 1876 -64740 1669 1754 -64740 1598 1713 -64740 1857 1876 -64740 1650 1668 -64760 1563 1811 -64760 1563 1675 -64760 1597 1622 -64760 1617 1441 -64760 1617 1684 -64760 1628 1463 -64760 1877 1908 -64760 1890 1525 -64760 1684 1441 -64760 1684 1876 -64760 1857 1441 -64760 1876 1441 -64760 1592 1717 -64760 1617 1876 -64760 1669 1754 -64760 1598 1713 -64760 1857 1876 -64760 1840 1437 -64760 1650 1668 -64780 1563 1678 -64780 1583 1825 -64780 1628 1650 -64780 1628 1668 -64780 1684 1441 -64780 1684 1876 -64780 1825 1525 -64780 1857 1441 -64780 1876 1441 -64780 1592 1717 -64780 1599 1655 -64780 1617 1876 -64780 1669 1754 -64780 1598 1713 -64780 1857 1876 -64780 1555 1441 -64780 1840 1437 -64780 1549 1890 -64780 1650 1668 -64800 1592 1717 -64800 1593 1512 -64800 1599 1512 -64800 1599 1655 -64800 1617 1876 -64800 1628 1463 -64800 1669 1754 -64800 1727 1894 -64800 1501 1528 -64800 1598 1713 -64800 1811 1857 -64800 1857 1876 -64800 1555 1441 -64800 1587 1535 -64800 1840 1437 -64800 1549 1890 -64800 1884 1453 -64800 1811 1876 -64800 1650 1668 -64820 1598 1713 -64820 1628 1650 -64820 1718 1517 -64820 1811 1857 -64820 1857 1876 -64820 1890 1525 -64820 1924 1478 -64820 1555 1441 -64820 1587 1535 -64820 1617 1857 -64820 1840 1437 -64820 1547 1716 -64820 1549 1890 -64820 1884 1453 -64820 1811 1876 -64820 1857 1441 -64820 1650 1668 -64840 1544 1600 -64840 1563 1717 -64840 1555 1441 -64840 1555 1857 -64840 1587 1535 -64840 1617 1857 -64840 1840 1437 -64840 1547 1716 -64840 1549 1890 -64840 1884 1453 -64840 1811 1876 -64840 1857 1441 -64840 1650 1668 -64860 1538 1459 -64860 1555 1441 -64860 1555 1857 -64860 1569 1591 -64860 1587 1535 -64860 1628 1650 -64860 1877 1908 -64860 1563 1592 -64860 1617 1857 -64860 1840 1437 -64860 1547 1716 -64860 1549 1890 -64860 1884 1453 -64860 1811 1876 -64860 1857 1441 -64860 1650 1668 -64880 1563 1592 -64880 1617 1441 -64880 1617 1857 -64880 1840 1437 -64880 1501 1528 -64880 1547 1716 -64880 1549 1890 -64880 1598 1713 -64880 1884 1453 -64880 1811 1876 -64880 1857 1441 -64880 1650 1668 -64900 1544 1549 -64900 1547 1716 -64900 1549 1890 -64900 1598 1713 -64900 1884 1453 -64900 1811 1876 -64900 1547 1555 -64900 1857 1441 -64900 1650 1668 -64920 1549 1600 -64920 1617 1857 -64920 1630 1531 -64920 1811 1876 -64920 1547 1555 -64920 1544 1600 -64920 1587 1535 -64920 1857 1441 -64920 1924 1478 -64920 1650 1668 -64940 1547 1555 -64940 1551 1894 -64940 1669 1754 -64940 1501 1528 -64940 1544 1600 -64940 1551 1269 -64940 1587 1535 -64940 1598 1713 -64940 1787 1851 -64940 1857 1441 -64940 1890 1525 -64940 1599 1512 -64940 1924 1478 -64940 1841 1901 -64940 1884 1453 -64940 1617 1441 -64940 1650 1668 -64960 1544 1600 -64960 1551 1269 -64960 1555 1716 -64960 1587 1535 -64960 1598 1713 -64960 1599 1655 -64960 1605 1636 -64960 1617 1857 -64960 1787 1851 -64960 1840 1437 -64960 1857 1441 -64960 1890 1525 -64960 1549 1890 -64960 1599 1512 -64960 1924 1478 -64960 1841 1901 -64960 1884 1453 -64960 1547 1716 -64960 1617 1441 -64960 1650 1668 -64980 1544 1549 -64980 1549 1890 -64980 1590 1894 -64980 1599 1512 -64980 1602 1779 -64980 1924 1478 -64980 1600 1890 -64980 1538 1459 -64980 1549 1600 -64980 1544 1890 -64980 1841 1901 -64980 1884 1453 -64980 1547 1716 -64980 1617 1441 -64980 1650 1668 -65000 1544 1600 -65000 1587 1535 -65000 1600 1890 -65000 1605 1659 -65000 1787 1851 -65000 1538 1459 -65000 1547 1555 -65000 1549 1600 -65000 1555 1716 -65000 1605 1636 -65000 1669 1754 -65000 1544 1890 -65000 1841 1901 -65000 1884 1453 -65000 1547 1716 -65000 1617 1857 -65000 1617 1441 -65000 1650 1668 -65020 1538 1459 -65020 1547 1555 -65020 1549 1600 -65020 1555 1716 -65020 1598 1713 -65020 1599 1655 -65020 1605 1636 -65020 1669 1754 -65020 1857 1441 -65020 1544 1890 -65020 1841 1901 -65020 1884 1453 -65020 1547 1716 -65020 1669 1840 -65020 1617 1857 -65020 1617 1441 -65020 1650 1668 -65040 1549 1525 -65040 1544 1890 -65040 1821 1477 -65040 1841 1901 -65040 1884 1453 -65040 1547 1716 -65040 1669 1840 -65040 1617 1857 -65040 1617 1441 -65040 1650 1668 -65060 1544 1825 -65060 1544 1890 -65060 1549 1890 -65060 1555 1716 -65060 1600 1890 -65060 1605 1636 -65060 1767 1913 -65060 1821 1477 -65060 1841 1901 -65060 1884 1453 -65060 1547 1716 -65060 1669 1840 -65060 1825 1890 -65060 1617 1857 -65060 1617 1441 -65060 1650 1668 -65080 1825 1459 -65080 1890 1459 -65080 1538 1825 -65080 1538 1890 -65080 1547 1716 -65080 1669 1840 -65080 1825 1890 -65080 1549 1525 -65080 1617 1857 -65080 1617 1441 -65080 1650 1668 -65100 1538 1825 -65100 1538 1890 -65100 1547 1716 -65100 1593 1449 -65100 1669 1840 -65100 1825 1890 -65100 1549 1525 -65100 1555 1716 -65100 1617 1857 -65100 1617 1441 -65100 1884 1453 -65100 1650 1668 -65120 1549 1525 -65120 1555 1716 -65120 1605 1659 -65120 1821 1477 -65120 1829 1886 -65120 1825 1459 -65120 1924 1478 -65120 1617 1857 -65120 1617 1441 -65120 1549 1890 -65120 1884 1453 -65120 1650 1668 -65140 1538 1825 -65140 1628 1650 -65140 1628 1924 -65140 1825 1459 -65140 1924 1478 -65140 1617 1857 -65140 1669 1754 -65140 1890 1525 -65140 1617 1441 -65140 1669 1840 -65140 1549 1890 -65140 1754 1840 -65140 1884 1453 -65140 1650 1668 -65160 1605 1636 -65160 1617 1857 -65160 1669 1754 -65160 1890 1525 -65160 1549 1525 -65160 1617 1441 -65160 1669 1840 -65160 1544 1600 -65160 1549 1890 -65160 1754 1840 -65160 1884 1453 -65160 1650 1668 -65160 1592 1717 -65160 1547 1716 -65180 1549 1525 -65180 1617 1441 -65180 1649 1887 -65180 1669 1840 -65180 1857 1441 -65180 1544 1600 -65180 1549 1890 -65180 1754 1840 -65180 1884 1453 -65180 1650 1668 -65180 1592 1717 -65180 1547 1716 -65200 1544 1600 -65200 1549 1890 -65200 1628 1650 -65200 1628 1668 -65200 1821 1477 -65200 1754 1840 -65200 1884 1453 -65200 1617 1857 -65200 1650 1668 -65200 1592 1717 -65200 1547 1716 -65220 1544 1600 -65220 1544 1825 -65220 1549 1890 -65220 1600 1825 -65220 1628 1650 -65220 1628 1668 -65220 1669 1840 -65220 1740 1918 -65220 1811 1876 -65220 1890 1525 -65220 1821 1477 -65220 1754 1840 -65220 1884 1453 -65220 1549 1525 -65220 1617 1857 -65220 1650 1668 -65220 1592 1717 -65220 1547 1716 -65240 1587 1535 -65240 1628 1767 -65240 1767 1840 -65240 1821 1477 -65240 1825 1890 -65240 1754 1840 -65240 1884 1453 -65240 1549 1525 -65240 1600 1890 -65240 1617 1857 -65240 1650 1668 -65240 1592 1717 -65240 1547 1716 -65260 1754 1840 -65260 1884 1453 -65260 1549 1525 -65260 1605 1636 -65260 1600 1825 -65260 1600 1890 -65260 1617 1441 -65260 1617 1857 -65260 1650 1668 -65260 1857 1441 -65260 1592 1717 -65260 1547 1716 -65280 1549 1525 -65280 1605 1636 -65280 1669 1754 -65280 1600 1825 -65280 1600 1890 -65280 1617 1441 -65280 1890 1453 -65280 1617 1857 -65280 1767 1840 -65280 1825 1890 -65280 1650 1668 -65280 1857 1441 -65280 1592 1717 -65280 1547 1716 -65300 1600 1825 -65300 1600 1890 -65300 1600 1453 -65300 1617 1441 -65300 1884 1890 -65300 1890 1453 -65300 1617 1857 -65300 1767 1840 -65300 1600 1884 -65300 1825 1890 -65300 1650 1668 -65300 1857 1441 -65300 1592 1717 -65300 1547 1716 -65320 1549 1525 -65320 1626 1920 -65320 1605 1636 -65320 1617 1857 -65320 1767 1840 -65320 1600 1884 -65320 1825 1890 -65320 1650 1668 -65320 1857 1441 -65320 1592 1717 -65320 1547 1716 -65340 1600 1890 -65340 1605 1636 -65340 1617 1857 -65340 1825 1884 -65340 1538 1512 -65340 1767 1840 -65340 1600 1884 -65340 1841 1901 -65340 1825 1890 -65340 1650 1668 -65340 1857 1441 -65340 1439 1453 -65340 1592 1717 -65340 1547 1716 -65360 1538 1512 -65360 1549 1525 -65360 1617 1441 -65360 1660 1924 -65360 1767 1840 -65360 1825 1519 -65360 1890 1519 -65360 1924 1478 -65360 1600 1884 -65360 1628 1650 -65360 1628 1668 -65360 1841 1901 -65360 1825 1890 -65360 1650 1668 -65360 1857 1441 -65360 1439 1453 -65360 1592 1717 -65360 1547 1716 -65380 1600 1884 -65380 1617 1857 -65380 1628 1650 -65380 1628 1668 -65380 1628 1655 -65380 1819 1845 -65380 1841 1901 -65380 1554 1887 -65380 1650 1655 -65380 1825 1890 -65380 1605 1636 -65380 1626 1920 -65380 1650 1668 -65380 1655 1668 -65380 1669 1840 -65380 1857 1441 -65380 1439 1453 -65380 1592 1717 -65380 1547 1716 -65400 1554 1887 -65400 1650 1655 -65400 1825 1890 -65400 1605 1636 -65400 1626 1920 -65400 1650 1668 -65400 1655 1668 -65400 1669 1840 -65400 1857 1441 -65400 1617 1767 -65400 1439 1453 -65400 1592 1717 -65400 1547 1716 -65400 1549 1525 -65420 1553 1924 -65420 1605 1636 -65420 1626 1920 -65420 1650 1668 -65420 1655 1668 -65420 1669 1840 -65420 1754 1840 -65420 1857 1441 -65420 1617 1767 -65420 1439 1453 -65420 1592 1717 -65420 1547 1716 -65420 1549 1525 -65440 1600 1890 -65440 1600 1884 -65440 1857 1441 -65440 1617 1767 -65440 1439 1453 -65440 1592 1717 -65440 1547 1716 -65440 1549 1525 -65460 1553 1924 -65460 1563 1857 -65460 1617 1767 -65460 1439 1453 -65460 1669 1840 -65460 1825 1890 -65460 1592 1717 -65460 1547 1716 -65460 1549 1525 -65480 1605 1636 -65480 1857 1441 -65480 1884 1890 -65480 1669 1840 -65480 1825 1890 -65480 1825 1884 -65480 1924 1478 -65480 1592 1717 -65480 1547 1716 -65480 1549 1525 -65500 1655 1774 -65500 1857 1441 -65500 1884 1890 -65500 1485 1532 -65500 1669 1840 -65500 1825 1890 -65500 1754 1840 -65500 1825 1884 -65500 1924 1478 -65500 1592 1717 -65500 1547 1716 -65500 1549 1525 -65500 1617 1767 -65520 1669 1840 -65520 1825 1890 -65520 1754 1840 -65520 1617 1441 -65520 1767 1441 -65520 1825 1884 -65520 1924 1478 -65520 1592 1717 -65520 1547 1716 -65520 1549 1525 -65520 1617 1767 -65540 1655 1774 -65540 1754 1840 -65540 1884 1890 -65540 1617 1441 -65540 1767 1441 -65540 1825 1884 -65540 1924 1478 -65540 1592 1717 -65540 1547 1716 -65540 1549 1525 -65540 1617 1767 -65560 1605 1636 -65560 1617 1441 -65560 1767 1441 -65560 1520 1531 -65560 1857 1441 -65560 1825 1884 -65560 1924 1478 -65560 1592 1717 -65560 1547 1716 -65560 1549 1525 -65560 1617 1767 -65580 1825 1890 -65580 1857 1441 -65580 1669 1840 -65580 1825 1884 -65580 1924 1478 -65580 1592 1717 -65580 1547 1716 -65580 1549 1525 -65580 1617 1767 -65600 1669 1840 -65600 1749 1531 -65600 1749 1757 -65600 1825 1884 -65600 1924 1478 -65600 1592 1717 -65600 1547 1716 -65600 1549 1525 -65600 1617 1767 -65620 1563 1839 -65620 1825 1890 -65620 1592 1717 -65620 1547 1716 -65620 1549 1525 -65620 1617 1767 -65640 1569 1591 -65640 1669 1840 -65640 1825 1890 -65640 1592 1717 -65640 1547 1716 -65640 1924 1478 -65640 1549 1525 -65640 1617 1767 -65660 1592 1684 -65660 1669 1840 -65660 1684 1463 -65660 1825 1890 -65660 1592 1717 -65660 1547 1716 -65660 1924 1478 -65660 1549 1525 -65660 1617 1767 -65680 1553 1924 -65680 1845 1894 -65680 1427 1467 -65680 1575 1679 -65680 1684 1463 -65680 1787 1851 -65680 1857 1441 -65680 1825 1890 -65680 1592 1717 -65680 1547 1634 -65680 1547 1716 -65680 1924 1478 -65680 1549 1525 -65680 1617 1767 -65700 1575 1679 -65700 1684 1463 -65700 1787 1851 -65700 1857 1441 -65700 1825 1890 -65700 1592 1717 -65700 1547 1634 -65700 1547 1716 -65700 1924 1478 -65700 1549 1525 -65700 1617 1767 -65720 1544 1890 -65720 1550 1866 -65720 1825 1890 -65720 1592 1717 -65720 1547 1634 -65720 1547 1716 -65720 1924 1478 -65720 1549 1525 -65720 1617 1767 -65740 1592 1717 -65740 1669 1754 -65740 1547 1634 -65740 1547 1716 -65740 1575 1679 -65740 1684 1463 -65740 1924 1478 -65740 1549 1525 -65740 1617 1767 -65740 1634 1716 -65740 1716 1808 -65760 1544 1890 -65760 1547 1808 -65760 1547 1634 -65760 1547 1716 -65760 1553 1924 -65760 1575 1679 -65760 1669 1840 -65760 1684 1463 -65760 1754 1840 -65760 1811 1876 -65760 1857 1441 -65760 1924 1478 -65760 1549 1525 -65760 1617 1767 -65760 1634 1716 -65760 1716 1808 -65780 1634 1808 -65780 1857 1441 -65780 1924 1478 -65780 1549 1525 -65780 1684 1717 -65780 1787 1851 -65780 1825 1890 -65780 1617 1767 -65780 1634 1716 -65780 1716 1808 -65800 1549 1525 -65800 1684 1717 -65800 1718 1908 -65800 1787 1851 -65800 1547 1717 -65800 1670 1908 -65800 1825 1890 -65800 1879 1512 -65800 1547 1684 -65800 1575 1679 -65800 1617 1767 -65800 1634 1716 -65800 1716 1808 -65820 1547 1717 -65820 1634 1808 -65820 1670 1908 -65820 1811 1913 -65820 1825 1890 -65820 1879 1512 -65820 1924 1478 -65820 1547 1684 -65820 1575 1679 -65820 1617 1767 -65820 1634 1716 -65820 1716 1808 -65840 1628 1463 -65840 1754 1840 -65840 1764 1463 -65840 1924 1478 -65840 1544 1890 -65840 1547 1684 -65840 1575 1679 -65840 1617 1767 -65840 1811 1876 -65840 1634 1716 -65840 1716 1808 -65860 1655 1512 -65860 1898 1477 -65860 1544 1825 -65860 1544 1890 -65860 1547 1684 -65860 1549 1525 -65860 1575 1679 -65860 1669 1840 -65860 1825 1890 -65860 1617 1767 -65860 1811 1876 -65860 1634 1716 -65860 1716 1808 -65880 1544 1825 -65880 1544 1890 -65880 1547 1684 -65880 1549 1525 -65880 1575 1679 -65880 1612 1835 -65880 1669 1840 -65880 1754 1840 -65880 1764 1519 -65880 1825 1890 -65880 1617 1767 -65880 1811 1876 -65880 1634 1716 -65880 1716 1808 -65900 1617 1767 -65900 1670 1908 -65900 1821 1477 -65900 1811 1876 -65900 1547 1463 -65900 1634 1716 -65900 1716 1808 -65900 1634 1808 -65920 1605 1636 -65920 1684 1463 -65920 1718 1813 -65920 1811 1876 -65920 1547 1463 -65920 1547 1684 -65920 1634 1716 -65920 1716 1808 -65920 1634 1808 -65920 1544 1890 -65940 1547 1463 -65940 1575 1679 -65940 1655 1512 -65940 1547 1684 -65940 1634 1716 -65940 1716 1808 -65940 1634 1808 -65940 1669 1840 -65940 1617 1767 -65940 1544 1890 -65960 1547 1684 -65960 1563 1839 -65960 1599 1655 -65960 1634 1716 -65960 1716 1808 -65960 1634 1808 -65960 1669 1840 -65960 1684 1463 -65960 1617 1767 -65960 1544 1890 -65980 1605 1636 -65980 1634 1808 -65980 1669 1840 -65980 1684 1463 -65980 1821 1898 -65980 1617 1767 -65980 1544 1890 -66000 1634 1716 -66000 1716 1808 -66000 1825 1890 -66000 1924 1478 -66000 1440 1458 -66000 1617 1767 -66000 1544 1890 -66000 1593 1659 -66000 1628 1787 -66020 1575 1679 -66020 1605 1636 -66020 1617 1767 -66020 1787 1520 -66020 1811 1876 -66020 1544 1890 -66020 1593 1659 -66020 1628 1787 -66020 1549 1525 -66040 1544 1890 -66040 1593 1659 -66040 1727 1819 -66040 1501 1528 -66040 1628 1787 -66040 1549 1525 -66060 1575 1679 -66060 1591 1918 -66060 1617 1694 -66060 1841 1901 -66060 1628 1787 -66060 1549 1525 -66080 1617 1694 -66080 1841 1901 -66080 1485 1529 -66080 1924 1478 -66080 1593 1659 -66080 1628 1787 -66080 1549 1525 -66100 1553 1924 -66100 1599 1655 -66100 1605 1636 -66100 1655 1512 -66100 1924 1478 -66100 1593 1659 -66100 1754 1840 -66100 1617 1857 -66100 1628 1787 -66100 1694 1857 -66100 1549 1525 -66120 1605 1636 -66120 1655 1512 -66120 1677 1850 -66120 1701 1894 -66120 1924 1478 -66120 1593 1659 -66120 1754 1840 -66120 1544 1890 -66120 1617 1857 -66120 1628 1787 -66120 1694 1857 -66120 1549 1525 -66140 1593 1659 -66140 1754 1840 -66140 1544 1890 -66140 1617 1857 -66140 1628 1787 -66140 1677 1701 -66140 1694 1857 -66140 1811 1876 -66140 1553 1924 -66140 1549 1525 -66160 1544 1890 -66160 1617 1857 -66160 1628 1787 -66160 1677 1701 -66160 1694 1857 -66160 1787 1851 -66160 1811 1876 -66160 1924 1478 -66160 1553 1924 -66160 1549 1525 -66180 1553 1924 -66180 1634 1851 -66180 1754 1840 -66180 1605 1636 -66180 1884 1519 -66180 1549 1525 -66200 1605 1636 -66200 1884 1519 -66200 1811 1876 -66200 1857 1441 -66200 1544 1890 -66200 1549 1525 -66200 1593 1628 -66200 1617 1857 -66200 1694 1857 -66220 1553 1924 -66220 1554 1625 -66220 1669 1754 -66220 1734 1802 -66220 1811 1876 -66220 1841 1901 -66220 1575 1679 -66220 1857 1441 -66220 1898 1477 -66220 1544 1890 -66220 1549 1525 -66220 1593 1628 -66220 1754 1840 -66220 1924 1478 -66220 1617 1857 -66220 1694 1857 -66240 1563 1592 -66240 1575 1679 -66240 1605 1636 -66240 1787 1851 -66240 1857 1441 -66240 1898 1477 -66240 1544 1890 -66240 1544 1599 -66240 1599 1655 -66240 1549 1525 -66240 1593 1628 -66240 1716 1808 -66240 1754 1840 -66240 1924 1478 -66240 1599 1890 -66240 1617 1857 -66240 1694 1857 -66240 1655 1890 -66260 1544 1890 -66260 1544 1599 -66260 1553 1924 -66260 1599 1655 -66260 1694 1441 -66260 1549 1525 -66260 1593 1628 -66260 1669 1840 -66260 1716 1808 -66260 1754 1840 -66260 1924 1478 -66260 1599 1890 -66260 1617 1857 -66260 1694 1857 -66260 1655 1890 -66280 1549 1525 -66280 1575 1679 -66280 1593 1628 -66280 1669 1840 -66280 1857 1441 -66280 1716 1808 -66280 1754 1840 -66280 1811 1876 -66280 1924 1478 -66280 1563 1592 -66280 1599 1890 -66280 1617 1857 -66280 1694 1857 -66280 1655 1890 -66300 1603 1716 -66300 1716 1808 -66300 1716 1876 -66300 1754 1840 -66300 1811 1876 -66300 1617 1694 -66300 1924 1478 -66300 1544 1599 -66300 1563 1592 -66300 1599 1890 -66300 1617 1857 -66300 1694 1857 -66300 1655 1890 -66320 1544 1890 -66320 1593 1628 -66320 1617 1694 -66320 1635 1475 -66320 1924 1478 -66320 1544 1599 -66320 1599 1655 -66320 1857 1441 -66320 1563 1592 -66320 1599 1890 -66320 1617 1857 -66320 1694 1857 -66320 1655 1890 -66340 1541 1563 -66340 1544 1599 -66340 1599 1655 -66340 1716 1808 -66340 1829 1886 -66340 1857 1441 -66340 1544 1655 -66340 1563 1592 -66340 1599 1890 -66340 1617 1857 -66340 1694 1857 -66340 1655 1890 -66360 1886 1529 -66360 1501 1528 -66360 1754 1840 -66360 1857 1441 -66360 1924 1478 -66360 1544 1655 -66360 1563 1592 -66360 1599 1890 -66360 1617 1857 -66360 1694 1857 -66360 1655 1890 -66380 1549 1525 -66380 1553 1924 -66380 1603 1680 -66380 1605 1636 -66380 1747 1841 -66380 1617 1694 -66380 1754 1840 -66380 1857 1441 -66380 1924 1478 -66380 1544 1655 -66380 1563 1592 -66380 1599 1890 -66380 1617 1857 -66380 1694 1857 -66380 1655 1890 -66400 1617 1694 -66400 1754 1840 -66400 1857 1441 -66400 1901 1501 -66400 1924 1478 -66400 1544 1655 -66400 1563 1592 -66400 1599 1890 -66400 1617 1857 -66400 1694 1857 -66400 1655 1890 -66400 1541 1699 -66420 1544 1655 -66420 1563 1592 -66420 1599 1890 -66420 1605 1636 -66420 1669 1840 -66420 1617 1857 -66420 1694 1857 -66420 1655 1890 -66420 1541 1699 -66440 1684 1441 -66440 1563 1592 -66440 1599 1890 -66440 1598 1628 -66440 1605 1636 -66440 1669 1840 -66440 1617 1857 -66440 1694 1857 -66440 1655 1890 -66440 1541 1699 -66460 1553 1478 -66460 1563 1592 -66460 1598 1635 -66460 1603 1851 -66460 1617 1694 -66460 1630 1531 -66460 1857 1441 -66460 1439 1443 -66460 1754 1840 -66460 1924 1478 -66460 1603 1787 -66460 1669 1754 -66460 1680 1443 -66460 1599 1890 -66460 1598 1628 -66460 1605 1636 -66460 1669 1840 -66460 1617 1857 -66460 1694 1857 -66460 1655 1890 -66460 1541 1699 -66480 1575 1679 -66480 1754 1840 -66480 1829 1886 -66480 1884 1519 -66480 1924 1478 -66480 1603 1787 -66480 1669 1754 -66480 1680 1443 -66480 1716 1808 -66480 1593 1603 -66480 1599 1890 -66480 1544 1599 -66480 1598 1628 -66480 1605 1636 -66480 1669 1840 -66480 1617 1857 -66480 1694 1857 -66480 1655 1890 -66480 1541 1699 -66500 1548 1606 -66500 1599 1655 -66500 1603 1787 -66500 1669 1754 -66500 1680 1443 -66500 1684 1441 -66500 1703 1517 -66500 1716 1808 -66500 1716 1858 -66500 1593 1603 -66500 1599 1890 -66500 1544 1599 -66500 1598 1628 -66500 1605 1636 -66500 1617 1441 -66500 1669 1840 -66500 1617 1857 -66500 1694 1857 -66500 1655 1890 -66500 1541 1699 -66520 1544 1655 -66520 1593 1603 -66520 1617 1694 -66520 1829 1886 -66520 1877 1908 -66520 1924 1478 -66520 1857 1441 -66520 1599 1890 -66520 1886 1529 -66520 1544 1599 -66520 1549 1592 -66520 1598 1628 -66520 1694 1441 -66520 1605 1636 -66520 1617 1441 -66520 1669 1840 -66520 1617 1857 -66520 1694 1857 -66520 1655 1890 -66520 1541 1699 -66540 1857 1441 -66540 1599 1890 -66540 1886 1529 -66540 1886 1532 -66540 1544 1599 -66540 1599 1655 -66540 1549 1592 -66540 1576 1603 -66540 1680 1443 -66540 1598 1628 -66540 1694 1441 -66540 1605 1636 -66540 1617 1441 -66540 1669 1840 -66540 1617 1857 -66540 1694 1857 -66540 1655 1890 -66540 1541 1699 -66560 1599 1890 -66560 1716 1808 -66560 1886 1529 -66560 1886 1532 -66560 1544 1599 -66560 1599 1655 -66560 1924 1478 -66560 1549 1592 -66560 1754 1840 -66560 1576 1603 -66560 1680 1443 -66560 1598 1628 -66560 1694 1441 -66560 1605 1636 -66560 1617 1441 -66560 1669 1840 -66560 1617 1857 -66560 1694 1857 -66560 1655 1890 -66560 1541 1699 -66580 1539 1658 -66580 1544 1890 -66580 1544 1599 -66580 1548 1606 -66580 1553 1924 -66580 1575 1679 -66580 1599 1655 -66580 1630 1467 -66580 1669 1754 -66580 1857 1441 -66580 1924 1478 -66580 1548 1425 -66580 1485 1532 -66580 1549 1592 -66580 1754 1840 -66580 1576 1603 -66580 1680 1443 -66580 1598 1628 -66580 1694 1441 -66580 1605 1636 -66580 1617 1441 -66580 1669 1840 -66580 1617 1857 -66580 1694 1857 -66580 1655 1890 -66580 1541 1699 -66600 1548 1425 -66600 1877 1908 -66600 1485 1532 -66600 1543 1630 -66600 1549 1592 -66600 1617 1694 -66600 1770 1787 -66600 1786 1882 -66600 1754 1840 -66600 1576 1603 -66600 1680 1443 -66600 1598 1628 -66600 1694 1441 -66600 1605 1636 -66600 1617 1441 -66600 1669 1840 -66600 1617 1857 -66600 1694 1857 -66600 1655 1890 -66600 1541 1699 -66600 1599 1890 -66620 1543 1467 -66620 1543 1630 -66620 1549 1592 -66620 1617 1694 -66620 1684 1463 -66620 1770 1787 -66620 1786 1882 -66620 1754 1840 -66620 1576 1603 -66620 1680 1443 -66620 1924 1478 -66620 1598 1628 -66620 1694 1441 -66620 1605 1636 -66620 1617 1441 -66620 1669 1840 -66620 1544 1890 -66620 1617 1857 -66620 1694 1857 -66620 1857 1441 -66620 1655 1890 -66620 1541 1699 -66620 1599 1890 -66640 1603 1851 -66640 1603 1787 -66640 1684 1840 -66640 1754 1840 -66640 1884 1519 -66640 1576 1603 -66640 1599 1655 -66640 1886 1529 -66640 1680 1443 -66640 1924 1478 -66640 1598 1628 -66640 1694 1441 -66640 1605 1636 -66640 1617 1441 -66640 1669 1840 -66640 1544 1890 -66640 1544 1599 -66640 1617 1857 -66640 1694 1857 -66640 1857 1441 -66640 1655 1890 -66640 1541 1699 -66640 1599 1890 -66660 1544 1655 -66660 1549 1519 -66660 1566 1906 -66660 1576 1603 -66660 1599 1655 -66660 1877 1908 -66660 1886 1529 -66660 1680 1443 -66660 1924 1478 -66660 1598 1628 -66660 1694 1441 -66660 1605 1636 -66660 1617 1441 -66660 1669 1840 -66660 1544 1890 -66660 1544 1599 -66660 1617 1857 -66660 1694 1857 -66660 1857 1441 -66660 1655 1890 -66660 1541 1699 -66660 1599 1890 -66680 1630 1531 -66680 1680 1443 -66680 1754 1840 -66680 1829 1886 -66680 1924 1478 -66680 1469 1476 -66680 1598 1628 -66680 1603 1787 -66680 1617 1694 -66680 1694 1441 -66680 1605 1636 -66680 1617 1441 -66680 1669 1840 -66680 1544 1890 -66680 1544 1599 -66680 1617 1857 -66680 1694 1857 -66680 1857 1441 -66680 1655 1890 -66680 1541 1699 -66680 1599 1890 -66700 1539 1791 -66700 1598 1628 -66700 1599 1655 -66700 1603 1787 -66700 1617 1694 -66700 1694 1441 -66700 1792 1885 -66700 1884 1519 -66700 1791 1882 -66700 1598 1463 -66700 1605 1636 -66700 1617 1441 -66700 1649 1434 -66700 1669 1840 -66700 1544 1890 -66700 1544 1599 -66700 1593 1603 -66700 1617 1857 -66700 1694 1857 -66700 1857 1441 -66700 1655 1890 -66700 1541 1699 -66700 1599 1890 -66700 1598 1684 -66720 1658 1467 -66720 1680 1443 -66720 1786 1791 -66720 1791 1882 -66720 1877 1908 -66720 1598 1463 -66720 1605 1636 -66720 1617 1441 -66720 1630 1427 -66720 1649 1434 -66720 1669 1840 -66720 1544 1890 -66720 1544 1599 -66720 1593 1603 -66720 1619 1505 -66720 1617 1857 -66720 1694 1857 -66720 1857 1441 -66720 1628 1684 -66720 1655 1890 -66720 1541 1699 -66720 1599 1890 -66720 1924 1478 -66720 1598 1684 -66740 1598 1628 -66740 1598 1463 -66740 1605 1636 -66740 1617 1441 -66740 1630 1427 -66740 1649 1434 -66740 1669 1840 -66740 1673 1469 -66740 1754 1840 -66740 1544 1890 -66740 1544 1599 -66740 1593 1603 -66740 1619 1505 -66740 1829 1865 -66740 1617 1857 -66740 1617 1694 -66740 1694 1857 -66740 1694 1441 -66740 1857 1441 -66740 1599 1655 -66740 1628 1684 -66740 1655 1890 -66740 1541 1699 -66740 1599 1890 -66740 1924 1478 -66740 1865 1886 -66740 1598 1684 -66740 1829 1886 -66760 1543 1630 -66760 1544 1890 -66760 1544 1599 -66760 1593 1603 -66760 1604 1882 -66760 1619 1505 -66760 1716 1808 -66760 1829 1865 -66760 1603 1449 -66760 1617 1857 -66760 1617 1694 -66760 1694 1857 -66760 1694 1441 -66760 1787 1851 -66760 1857 1441 -66760 1599 1655 -66760 1628 1684 -66760 1798 1466 -66760 1655 1890 -66760 1541 1699 -66760 1599 1890 -66760 1924 1478 -66760 1865 1886 -66760 1598 1684 -66760 1829 1886 -66780 1593 1449 -66780 1603 1449 -66780 1617 1857 -66780 1617 1694 -66780 1658 1467 -66780 1694 1857 -66780 1694 1441 -66780 1787 1851 -66780 1857 1441 -66780 1871 1517 -66780 1599 1655 -66780 1628 1684 -66780 1658 1427 -66780 1754 1840 -66780 1798 1466 -66780 1655 1890 -66780 1541 1699 -66780 1599 1890 -66780 1924 1478 -66780 1865 1886 -66780 1598 1684 -66780 1829 1886 -66800 1543 1630 -66800 1599 1655 -66800 1628 1684 -66800 1658 1427 -66800 1669 1840 -66800 1688 1458 -66800 1688 1892 -66800 1731 1917 -66800 1731 1918 -66800 1754 1840 -66800 1792 1922 -66800 1792 1798 -66800 1798 1466 -66800 1798 1471 -66800 1553 1924 -66800 1598 1628 -66800 1655 1890 -66800 1669 1754 -66800 1541 1699 -66800 1599 1890 -66800 1924 1478 -66800 1512 1531 -66800 1865 1886 -66800 1598 1684 -66800 1829 1886 -66820 1539 1617 -66820 1544 1599 -66820 1553 1924 -66820 1598 1628 -66820 1603 1512 -66820 1619 1505 -66820 1655 1890 -66820 1665 1688 -66820 1669 1754 -66820 1694 1441 -66820 1728 1794 -66820 1728 1902 -66820 1794 1880 -66820 1828 1490 -66820 1871 1517 -66820 1541 1699 -66820 1599 1890 -66820 1688 1457 -66820 1716 1808 -66820 1921 1462 -66820 1924 1478 -66820 1512 1531 -66820 1865 1886 -66820 1617 1857 -66820 1598 1684 -66820 1603 1531 -66820 1829 1886 -66840 1541 1699 -66840 1543 1630 -66840 1544 1890 -66840 1581 1731 -66840 1599 1890 -66840 1613 1458 -66840 1630 1427 -66840 1651 1847 -66840 1669 1840 -66840 1688 1457 -66840 1716 1808 -66840 1798 1862 -66840 1921 1462 -66840 1924 1478 -66840 1715 1495 -66840 1512 1531 -66840 1865 1886 -66840 1617 1857 -66840 1598 1684 -66840 1603 1449 -66840 1603 1531 -66840 1680 1443 -66840 1829 1886 -66860 1630 1467 -66860 1665 1676 -66860 1676 1902 -66860 1676 1711 -66860 1715 1495 -66860 1512 1531 -66860 1658 1427 -66860 1865 1886 -66860 1617 1857 -66860 1598 1684 -66860 1603 1449 -66860 1603 1531 -66860 1680 1443 -66860 1829 1886 -66880 1544 1890 -66880 1562 1798 -66880 1598 1453 -66880 1645 1756 -66880 1658 1427 -66880 1716 1453 -66880 1754 1840 -66880 1786 1882 -66880 1792 1885 -66880 1798 1862 -66880 1865 1886 -66880 1617 1857 -66880 1449 1531 -66880 1622 1835 -66880 1655 1890 -66880 1669 1840 -66880 1873 1921 -66880 1598 1684 -66880 1603 1449 -66880 1603 1531 -66880 1680 1443 -66880 1599 1890 -66880 1829 1886 -66900 1549 1599 -66900 1560 1772 -66900 1617 1857 -66900 1619 1505 -66900 1622 1715 -66900 1622 1495 -66900 1665 1470 -66900 1873 1462 -66900 1449 1531 -66900 1622 1835 -66900 1655 1890 -66900 1669 1840 -66900 1873 1921 -66900 1890 1519 -66900 1579 1633 -66900 1598 1684 -66900 1603 1449 -66900 1603 1531 -66900 1680 1443 -66900 1715 1495 -66900 1924 1478 -66900 1599 1890 -66900 1829 1886 -66920 1553 1924 -66920 1569 1623 -66920 1581 1591 -66920 1599 1655 -66920 1622 1835 -66920 1640 1802 -66920 1655 1890 -66920 1669 1840 -66920 1670 1711 -66920 1716 1808 -66920 1857 1441 -66920 1865 1886 -66920 1873 1921 -66920 1890 1519 -66920 1908 1479 -66920 1921 1462 -66920 1579 1633 -66920 1591 1665 -66920 1598 1684 -66920 1603 1449 -66920 1603 1531 -66920 1629 1911 -66920 1680 1443 -66920 1715 1495 -66920 1821 1898 -66920 1924 1478 -66920 1599 1890 -66920 1829 1886 -66940 1544 1655 -66940 1579 1633 -66940 1581 1731 -66940 1591 1665 -66940 1598 1684 -66940 1603 1449 -66940 1603 1531 -66940 1629 1911 -66940 1680 1443 -66940 1718 1531 -66940 1731 1908 -66940 1754 1840 -66940 1756 1804 -66940 1784 1911 -66940 1541 1636 -66940 1715 1495 -66940 1821 1898 -66940 1924 1478 -66940 1619 1505 -66940 1669 1754 -66940 1581 1479 -66940 1599 1890 -66940 1829 1886 -66960 1541 1636 -66960 1572 1742 -66960 1591 1688 -66960 1591 1471 -66960 1658 1467 -66960 1703 1764 -66960 1715 1495 -66960 1821 1898 -66960 1543 1630 -66960 1617 1857 -66960 1716 1808 -66960 1865 1886 -66960 1924 1478 -66960 1658 1427 -66960 1619 1505 -66960 1669 1754 -66960 1731 1479 -66960 1581 1479 -66960 1599 1890 -66960 1622 1835 -66960 1829 1886 -66960 1877 1897 -66980 1537 1582 -66980 1543 1467 -66980 1543 1630 -66980 1598 1684 -66980 1617 1857 -66980 1673 1470 -66980 1716 1808 -66980 1731 1908 -66980 1865 1886 -66980 1924 1478 -66980 1579 1633 -66980 1658 1427 -66980 1787 1851 -66980 1603 1742 -66980 1619 1505 -66980 1669 1754 -66980 1731 1479 -66980 1581 1479 -66980 1599 1890 -66980 1622 1835 -66980 1688 1457 -66980 1680 1443 -66980 1655 1463 -66980 1829 1886 -66980 1877 1897 -67000 1554 1764 -67000 1579 1633 -67000 1581 1670 -67000 1582 1728 -67000 1591 1665 -67000 1599 1519 -67000 1629 1911 -67000 1658 1427 -67000 1711 1731 -67000 1784 1911 -67000 1787 1851 -67000 1792 1885 -67000 1890 1525 -67000 1581 1711 -67000 1603 1742 -67000 1619 1505 -67000 1669 1754 -67000 1731 1479 -67000 1754 1840 -67000 1581 1479 -67000 1599 1890 -67000 1890 1519 -67000 1572 1603 -67000 1622 1835 -67000 1688 1457 -67000 1680 1443 -67000 1655 1463 -67000 1829 1886 -67000 1877 1897 -67020 1581 1711 -67020 1590 1819 -67020 1603 1742 -67020 1619 1505 -67020 1669 1840 -67020 1669 1754 -67020 1711 1479 -67020 1717 1902 -67020 1731 1479 -67020 1754 1840 -67020 1821 1898 -67020 1857 1441 -67020 1581 1479 -67020 1582 1742 -67020 1599 1890 -67020 1890 1519 -67020 1572 1603 -67020 1622 1835 -67020 1688 1457 -67020 1680 1443 -67020 1655 1463 -67020 1865 1886 -67020 1715 1495 -67020 1829 1886 -67020 1877 1897 -67040 1543 1658 -67040 1550 1866 -67040 1566 1477 -67040 1572 1681 -67040 1581 1479 -67040 1582 1742 -67040 1599 1890 -67040 1603 1681 -67040 1630 1658 -67040 1630 1467 -67040 1633 1683 -67040 1716 1772 -67040 1718 1902 -67040 1872 1875 -67040 1890 1519 -67040 1924 1478 -67040 1427 1467 -67040 1582 1603 -67040 1602 1491 -67040 1602 1779 -67040 1640 1802 -67040 1841 1901 -67040 1572 1603 -67040 1622 1835 -67040 1688 1457 -67040 1731 1908 -67040 1680 1443 -67040 1655 1463 -67040 1605 1636 -67040 1699 1703 -67040 1865 1886 -67040 1715 1495 -67040 1829 1886 -67040 1877 1897 -67060 1543 1467 -67060 1582 1603 -67060 1590 1872 -67060 1602 1819 -67060 1602 1491 -67060 1602 1779 -67060 1603 1798 -67060 1640 1802 -67060 1658 1467 -67060 1669 1754 -67060 1711 1479 -67060 1734 1866 -67060 1743 1845 -67060 1789 1889 -67060 1802 1889 -67060 1802 1855 -67060 1807 1889 -67060 1807 1841 -67060 1819 1845 -67060 1821 1875 -67060 1835 1495 -67060 1841 1889 -67060 1841 1901 -67060 1857 1441 -67060 1872 1477 -67060 1875 1477 -67060 1912 1916 -67060 1487 1502 -67060 1543 1630 -67060 1550 1683 -67060 1572 1603 -67060 1602 1845 -67060 1622 1835 -67060 1651 1905 -67060 1663 1818 -67060 1688 1457 -67060 1731 1908 -67060 1734 1802 -67060 1602 1889 -67060 1680 1443 -67060 1502 1533 -67060 1655 1463 -67060 1871 1517 -67060 1605 1636 -67060 1727 1845 -67060 1699 1703 -67060 1865 1886 -67060 1715 1495 -67060 1829 1886 -67060 1877 1897 -67080 1543 1477 -67080 1543 1630 -67080 1550 1683 -67080 1555 1889 -67080 1572 1603 -67080 1602 1841 -67080 1602 1459 -67080 1602 1845 -67080 1602 1663 -67080 1602 1727 -67080 1617 1857 -67080 1622 1835 -67080 1629 1911 -67080 1651 1905 -67080 1663 1841 -67080 1663 1818 -67080 1663 1889 -67080 1688 1457 -67080 1717 1728 -67080 1731 1908 -67080 1734 1802 -67080 1734 1502 -67080 1789 1845 -67080 1841 1459 -67080 1841 1845 -67080 1845 1889 -67080 1845 1901 -67080 1845 1502 -67080 1851 1512 -67080 1924 1478 -67080 1442 1455 -67080 1550 1566 -67080 1602 1889 -67080 1680 1443 -67080 1734 1491 -67080 1501 1528 -67080 1502 1533 -67080 1655 1463 -67080 1716 1808 -67080 1871 1517 -67080 1605 1636 -67080 1727 1845 -67080 1699 1703 -67080 1865 1886 -67080 1715 1495 -67080 1829 1886 -67080 1877 1897 -67100 1550 1566 -67100 1554 1772 -67100 1590 1442 -67100 1602 1889 -67100 1602 1807 -67100 1603 1681 -67100 1619 1505 -67100 1630 1731 -67100 1663 1901 -67100 1680 1443 -67100 1688 1477 -67100 1688 1894 -67100 1731 1467 -67100 1731 1894 -67100 1734 1491 -67100 1734 1789 -67100 1775 1845 -67100 1818 1872 -67100 1818 1889 -67100 1835 1466 -67100 1836 1517 -67100 1866 1497 -67100 1877 1467 -67100 1886 1532 -67100 1912 1916 -67100 1501 1528 -67100 1502 1533 -67100 1550 1761 -67100 1655 1463 -67100 1716 1808 -67100 1871 1517 -67100 1599 1890 -67100 1605 1636 -67100 1727 1845 -67100 1640 1802 -67100 1699 1703 -67100 1865 1886 -67100 1669 1754 -67100 1715 1495 -67100 1829 1886 -67100 1877 1897 -67120 1550 1761 -67120 1629 1911 -67120 1640 1491 -67120 1655 1463 -67120 1688 1457 -67120 1716 1808 -67120 1761 1866 -67120 1802 1916 -67120 1871 1517 -67120 1485 1529 -67120 1544 1890 -67120 1550 1866 -67120 1590 1455 -67120 1599 1890 -67120 1605 1636 -67120 1663 1818 -67120 1727 1845 -67120 1761 1845 -67120 1779 1491 -67120 1640 1802 -67120 1699 1703 -67120 1767 1840 -67120 1865 1886 -67120 1669 1754 -67120 1715 1495 -67120 1787 1851 -67120 1829 1886 -67120 1605 1772 -67120 1544 1599 -67120 1779 1802 -67120 1802 1491 -67120 1877 1897 -67120 1841 1901 -67140 1544 1890 -67140 1550 1866 -67140 1581 1479 -67140 1590 1455 -67140 1599 1890 -67140 1605 1636 -67140 1616 1518 -67140 1630 1467 -67140 1663 1818 -67140 1687 1901 -67140 1712 1755 -67140 1727 1845 -67140 1727 1775 -67140 1761 1845 -67140 1779 1491 -67140 1818 1886 -67140 1590 1442 -67140 1640 1802 -67140 1699 1703 -67140 1767 1840 -67140 1865 1886 -67140 1669 1754 -67140 1715 1495 -67140 1787 1851 -67140 1829 1886 -67140 1605 1772 -67140 1680 1443 -67140 1544 1599 -67140 1636 1772 -67140 1727 1761 -67140 1779 1802 -67140 1802 1491 -67140 1877 1897 -67140 1841 1901 -67160 1550 1775 -67160 1582 1603 -67160 1590 1442 -67160 1628 1655 -67160 1640 1802 -67160 1663 1731 -67160 1673 1887 -67160 1699 1703 -67160 1755 1527 -67160 1767 1840 -67160 1818 1872 -67160 1865 1886 -67160 1617 1857 -67160 1669 1754 -67160 1715 1495 -67160 1787 1851 -67160 1829 1886 -67160 1892 1477 -67160 1605 1772 -67160 1680 1443 -67160 1544 1599 -67160 1550 1761 -67160 1636 1772 -67160 1688 1457 -67160 1727 1761 -67160 1761 1775 -67160 1779 1802 -67160 1802 1491 -67160 1877 1897 -67160 1841 1901 -67180 1605 1636 -67180 1613 1755 -67180 1613 1622 -67180 1616 1518 -67180 1617 1857 -67180 1645 1756 -67180 1663 1688 -67180 1669 1754 -67180 1715 1495 -67180 1787 1851 -67180 1829 1886 -67180 1880 1464 -67180 1892 1477 -67180 1550 1727 -67180 1566 1501 -67180 1605 1772 -67180 1673 1747 -67180 1680 1443 -67180 1761 1845 -67180 1544 1599 -67180 1550 1761 -67180 1636 1772 -67180 1688 1457 -67180 1727 1761 -67180 1761 1775 -67180 1779 1802 -67180 1802 1491 -67180 1550 1845 -67180 1877 1897 -67180 1779 1491 -67180 1841 1901 -67200 1544 1655 -67200 1550 1727 -67200 1566 1501 -67200 1590 1866 -67200 1604 1518 -67200 1604 1462 -67200 1605 1772 -67200 1652 1688 -67200 1673 1747 -67200 1680 1443 -67200 1761 1528 -67200 1761 1845 -67200 1871 1517 -67200 1544 1599 -67200 1550 1761 -67200 1550 1775 -67200 1636 1772 -67200 1688 1457 -67200 1727 1761 -67200 1731 1901 -67200 1761 1775 -67200 1779 1802 -67200 1802 1491 -67200 1898 1477 -67200 1550 1845 -67200 1599 1655 -67200 1877 1897 -67200 1779 1491 -67200 1699 1703 -67200 1841 1901 -67200 1598 1659 -67220 1544 1599 -67220 1550 1761 -67220 1550 1775 -67220 1562 1529 -67220 1622 1835 -67220 1628 1463 -67220 1630 1467 -67220 1636 1772 -67220 1640 1802 -67220 1676 1518 -67220 1688 1457 -67220 1717 1835 -67220 1727 1761 -67220 1731 1901 -67220 1761 1775 -67220 1779 1802 -67220 1802 1491 -67220 1829 1886 -67220 1898 1477 -67220 1550 1501 -67220 1550 1845 -67220 1563 1618 -67220 1599 1655 -67220 1617 1857 -67220 1716 1808 -67220 1877 1897 -67220 1779 1491 -67220 1715 1495 -67220 1835 1458 -67220 1699 1703 -67220 1841 1901 -67220 1598 1659 -67240 1544 1890 -67240 1550 1501 -67240 1550 1845 -67240 1563 1618 -67240 1579 1706 -67240 1582 1921 -67240 1599 1655 -67240 1617 1857 -67240 1676 1921 -67240 1676 1873 -67240 1680 1443 -67240 1716 1808 -67240 1727 1845 -67240 1877 1897 -67240 1880 1464 -67240 1889 1898 -67240 1889 1477 -67240 1485 1529 -67240 1727 1501 -67240 1779 1491 -67240 1845 1501 -67240 1892 1477 -67240 1715 1495 -67240 1787 1851 -67240 1835 1458 -67240 1699 1703 -67240 1841 1901 -67240 1598 1659 -67260 1543 1835 -67260 1582 1630 -67260 1640 1802 -67260 1652 1819 -67260 1655 1437 -67260 1670 1711 -67260 1688 1877 -67260 1727 1501 -67260 1775 1501 -67260 1779 1491 -67260 1845 1501 -67260 1892 1477 -67260 1715 1495 -67260 1787 1851 -67260 1835 1458 -67260 1439 1479 -67260 1599 1437 -67260 1699 1703 -67260 1581 1479 -67260 1841 1901 -67260 1598 1659 -67280 1544 1890 -67280 1581 1439 -67280 1582 1658 -67280 1582 1438 -67280 1628 1485 -67280 1630 1658 -67280 1715 1495 -67280 1787 1851 -67280 1818 1872 -67280 1835 1458 -67280 1884 1519 -67280 1439 1479 -67280 1599 1437 -67280 1622 1458 -67280 1663 1818 -67280 1699 1703 -67280 1716 1808 -67280 1877 1897 -67280 1581 1479 -67280 1617 1857 -67280 1688 1457 -67280 1841 1901 -67280 1598 1659 -67300 1580 1831 -67300 1599 1437 -67300 1622 1458 -67300 1663 1818 -67300 1699 1703 -67300 1716 1808 -67300 1877 1897 -67300 1889 1492 -67300 1581 1479 -67300 1617 1857 -67300 1640 1802 -67300 1688 1457 -67300 1541 1862 -67300 1599 1655 -67300 1841 1901 -67300 1598 1659 -67300 1636 1772 -67300 1775 1501 -67300 1562 1593 -67320 1547 1716 -67320 1575 1764 -67320 1581 1479 -67320 1602 1851 -67320 1604 1527 -67320 1605 1772 -67320 1617 1857 -67320 1640 1802 -67320 1658 1438 -67320 1688 1457 -67320 1835 1458 -67320 1884 1519 -67320 1541 1862 -67320 1544 1890 -67320 1582 1630 -67320 1599 1655 -67320 1841 1901 -67320 1850 1868 -67320 1518 1527 -67320 1598 1659 -67320 1636 1772 -67320 1685 1513 -67320 1715 1495 -67320 1775 1501 -67320 1562 1593 -67320 1680 1443 -67320 1829 1886 -67340 1541 1862 -67340 1544 1890 -67340 1581 1681 -67340 1582 1630 -67340 1599 1655 -67340 1604 1518 -67340 1616 1527 -67340 1622 1717 -67340 1628 1485 -67340 1841 1901 -67340 1850 1868 -67340 1886 1491 -67340 1518 1527 -67340 1598 1659 -67340 1636 1772 -67340 1685 1513 -67340 1715 1495 -67340 1775 1501 -67340 1562 1593 -67340 1680 1443 -67340 1829 1886 -67360 1554 1756 -67360 1598 1659 -67360 1604 1658 -67360 1616 1658 -67360 1636 1772 -67360 1685 1513 -67360 1718 1889 -67360 1920 1453 -67360 1924 1478 -67360 1617 1857 -67360 1715 1495 -67360 1775 1501 -67360 1562 1593 -67360 1835 1458 -67360 1680 1443 -67360 1829 1886 -67360 1865 1886 -67380 1617 1857 -67380 1640 1802 -67380 1658 1835 -67380 1715 1495 -67380 1742 1866 -67380 1742 1787 -67380 1775 1501 -67380 1787 1866 -67380 1875 1908 -67380 1877 1897 -67380 1562 1593 -67380 1592 1684 -67380 1835 1458 -67380 1680 1443 -67380 1829 1886 -67380 1865 1886 -67400 1555 1502 -67400 1562 1593 -67400 1592 1684 -67400 1599 1655 -67400 1687 1702 -67400 1688 1457 -67400 1702 1842 -67400 1702 1901 -67400 1835 1458 -67400 1842 1901 -67400 1908 1479 -67400 1619 1893 -67400 1680 1443 -67400 1829 1886 -67400 1579 1599 -67400 1865 1886 -67420 1579 1655 -67420 1619 1893 -67420 1640 1802 -67420 1652 1747 -67420 1734 1887 -67420 1893 1906 -67420 1669 1754 -67420 1679 1764 -67420 1680 1443 -67420 1711 1479 -67420 1541 1862 -67420 1829 1886 -67420 1579 1599 -67420 1865 1886 -67420 1924 1478 -67420 1715 1495 -67420 1684 1880 -67440 1545 1894 -67440 1580 1887 -67440 1669 1754 -67440 1670 1908 -67440 1670 1479 -67440 1679 1764 -67440 1680 1443 -67440 1688 1457 -67440 1711 1908 -67440 1711 1479 -67440 1767 1840 -67440 1541 1862 -67440 1829 1886 -67440 1908 1479 -67440 1579 1599 -67440 1865 1886 -67440 1889 1492 -67440 1924 1478 -67440 1715 1495 -67440 1684 1880 -67460 1541 1862 -67460 1789 1908 -67460 1829 1886 -67460 1908 1479 -67460 1579 1599 -67460 1640 1802 -67460 1865 1886 -67460 1889 1492 -67460 1924 1478 -67460 1562 1593 -67460 1663 1818 -67460 1715 1495 -67460 1684 1880 -67480 1553 1924 -67480 1579 1599 -67480 1593 1734 -67480 1599 1655 -67480 1617 1857 -67480 1640 1802 -67480 1663 1887 -67480 1669 1754 -67480 1865 1886 -67480 1887 1458 -67480 1887 1471 -67480 1889 1492 -67480 1924 1478 -67480 1562 1593 -67480 1663 1818 -67480 1715 1495 -67480 1544 1890 -67480 1636 1772 -67480 1680 1443 -67480 1684 1880 -67500 1562 1593 -67500 1663 1818 -67500 1688 1457 -67500 1715 1495 -67500 1544 1890 -67500 1798 1862 -67500 1877 1897 -67500 1636 1772 -67500 1680 1443 -67500 1684 1880 -67520 1541 1798 -67520 1544 1890 -67520 1591 1527 -67520 1598 1659 -67520 1640 1802 -67520 1798 1862 -67520 1877 1897 -67520 1575 1679 -67520 1636 1772 -67520 1857 1528 -67520 1680 1443 -67520 1684 1880 -67520 1825 1519 -67540 1555 1502 -67540 1575 1679 -67540 1754 1840 -67540 1841 1901 -67540 1460 1499 -67540 1497 1528 -67540 1599 1512 -67540 1636 1772 -67540 1857 1528 -67540 1680 1443 -67540 1684 1880 -67540 1825 1519 -67560 1599 1655 -67560 1655 1512 -67560 1688 1457 -67560 1688 1706 -67560 1485 1529 -67560 1599 1512 -67560 1636 1772 -67560 1715 1495 -67560 1591 1858 -67560 1857 1528 -67560 1680 1443 -67560 1877 1897 -67560 1684 1880 -67560 1825 1519 -67580 1599 1512 -67580 1617 1679 -67580 1636 1772 -67580 1872 1504 -67580 1527 1529 -67580 1715 1495 -67580 1573 1452 -67580 1591 1858 -67580 1857 1528 -67580 1640 1802 -67580 1680 1443 -67580 1877 1897 -67580 1684 1880 -67580 1825 1519 -67600 1539 1554 -67600 1591 1679 -67600 1599 1655 -67600 1617 1441 -67600 1708 1760 -67600 1715 1495 -67600 1775 1845 -67600 1890 1525 -67600 1924 1478 -67600 1573 1452 -67600 1591 1858 -67600 1703 1920 -67600 1857 1528 -67600 1640 1802 -67600 1680 1443 -67600 1683 1527 -67600 1877 1897 -67600 1684 1880 -67600 1825 1519 -67620 1573 1452 -67620 1591 1858 -67620 1703 1920 -67620 1857 1528 -67620 1872 1504 -67620 1897 1485 -67620 1617 1857 -67620 1640 1802 -67620 1680 1443 -67620 1683 1527 -67620 1877 1897 -67620 1485 1529 -67620 1734 1441 -67620 1460 1499 -67620 1684 1880 -67620 1825 1519 -67620 1636 1772 -67640 1603 1630 -67640 1617 1857 -67640 1640 1802 -67640 1680 1443 -67640 1683 1527 -67640 1734 1857 -67640 1877 1897 -67640 1924 1478 -67640 1485 1529 -67640 1734 1441 -67640 1767 1840 -67640 1715 1495 -67640 1802 1865 -67640 1460 1499 -67640 1688 1457 -67640 1684 1880 -67640 1825 1519 -67640 1636 1772 -67660 1554 1645 -67660 1630 1493 -67660 1655 1512 -67660 1727 1775 -67660 1734 1441 -67660 1767 1840 -67660 1775 1434 -67660 1605 1636 -67660 1715 1495 -67660 1802 1865 -67660 1857 1441 -67660 1460 1499 -67660 1688 1457 -67660 1619 1893 -67660 1684 1880 -67660 1825 1519 -67660 1636 1772 -67680 1554 1772 -67680 1605 1636 -67680 1628 1754 -67680 1683 1527 -67680 1715 1495 -67680 1802 1865 -67680 1857 1441 -67680 1877 1897 -67680 1924 1478 -67680 1460 1499 -67680 1688 1457 -67680 1708 1760 -67680 1573 1452 -67680 1619 1893 -67680 1684 1880 -67680 1825 1519 -67680 1636 1772 -67700 1688 1457 -67700 1688 1897 -67700 1727 1434 -67700 1605 1772 -67700 1708 1760 -67700 1884 1499 -67700 1573 1452 -67700 1619 1893 -67700 1684 1880 -67700 1825 1519 -67700 1636 1772 -67700 1547 1734 -67720 1583 1460 -67720 1601 1495 -67720 1605 1772 -67720 1708 1760 -67720 1767 1840 -67720 1802 1865 -67720 1884 1499 -67720 1884 1460 -67720 1924 1478 -67720 1573 1452 -67720 1619 1893 -67720 1716 1734 -67720 1877 1897 -67720 1683 1527 -67720 1684 1880 -67720 1825 1519 -67720 1636 1772 -67720 1655 1883 -67720 1547 1734 -67740 1563 1443 -67740 1573 1452 -67740 1619 1893 -67740 1672 1897 -67740 1715 1495 -67740 1716 1734 -67740 1877 1897 -67740 1499 1525 -67740 1683 1527 -67740 1684 1880 -67740 1825 1519 -67740 1636 1772 -67740 1655 1883 -67740 1460 1499 -67740 1547 1734 -67760 1599 1512 -67760 1640 1802 -67760 1683 1527 -67760 1802 1865 -67760 1684 1880 -67760 1680 1443 -67760 1688 1457 -67760 1688 1706 -67760 1825 1519 -67760 1636 1772 -67760 1655 1883 -67760 1460 1499 -67760 1547 1734 -67780 1619 1497 -67780 1684 1880 -67780 1708 1857 -67780 1883 1430 -67780 1680 1443 -67780 1688 1457 -67780 1688 1706 -67780 1825 1519 -67780 1767 1840 -67780 1636 1772 -67780 1655 1883 -67780 1460 1499 -67780 1547 1734 -67800 1619 1893 -67800 1640 1802 -67800 1669 1754 -67800 1680 1443 -67800 1688 1457 -67800 1688 1706 -67800 1845 1434 -67800 1825 1519 -67800 1767 1840 -67800 1636 1772 -67800 1655 1883 -67800 1460 1499 -67800 1716 1734 -67800 1547 1734 -67820 1554 1645 -67820 1605 1772 -67820 1825 1519 -67820 1554 1772 -67820 1605 1636 -67820 1767 1840 -67820 1787 1851 -67820 1636 1772 -67820 1655 1883 -67820 1460 1499 -67820 1716 1734 -67820 1547 1734 -67840 1554 1772 -67840 1593 1703 -67840 1605 1636 -67840 1727 1775 -67840 1767 1840 -67840 1787 1851 -67840 1636 1772 -67840 1655 1883 -67840 1688 1706 -67840 1688 1457 -67840 1460 1499 -67840 1716 1734 -67840 1547 1734 -67860 1541 1862 -67860 1592 1443 -67860 1624 1897 -67860 1636 1772 -67860 1655 1883 -67860 1688 1706 -67860 1829 1886 -67860 1683 1527 -67860 1688 1457 -67860 1460 1499 -67860 1716 1734 -67860 1547 1734 -67860 1563 1592 -67880 1593 1678 -67880 1598 1897 -67880 1683 1527 -67880 1688 1457 -67880 1787 1851 -67880 1460 1499 -67880 1727 1775 -67880 1655 1870 -67880 1716 1734 -67880 1547 1734 -67880 1563 1592 -67900 1554 1798 -67900 1645 1772 -67900 1767 1840 -67900 1460 1499 -67900 1541 1862 -67900 1727 1775 -67900 1825 1890 -67900 1655 1870 -67900 1716 1734 -67900 1547 1734 -67900 1563 1592 -67920 1541 1862 -67920 1553 1478 -67920 1563 1443 -67920 1683 1527 -67920 1688 1706 -67920 1727 1775 -67920 1734 1798 -67920 1825 1890 -67920 1829 1886 -67920 1592 1443 -67920 1775 1434 -67920 1655 1870 -67920 1464 1482 -67920 1716 1734 -67920 1547 1734 -67920 1563 1592 -67940 1569 1742 -67940 1592 1443 -67940 1619 1505 -67940 1678 1798 -67940 1775 1434 -67940 1787 1851 -67940 1619 1497 -67940 1645 1772 -67940 1688 1457 -67940 1655 1870 -67940 1893 1497 -67940 1605 1636 -67940 1464 1482 -67940 1716 1734 -67940 1547 1734 -67940 1563 1592 -67960 1619 1497 -67960 1645 1772 -67960 1688 1457 -67960 1727 1434 -67960 1775 1845 -67960 1655 1870 -67960 1893 1497 -67960 1605 1636 -67960 1767 1840 -67960 1464 1482 -67960 1716 1734 -67960 1547 1734 -67960 1563 1592 -67960 1886 1829 -67980 1591 1665 -67980 1599 1774 -67980 1619 1893 -67980 1655 1870 -67980 1688 1886 -67980 1893 1497 -67980 1573 1452 -67980 1605 1636 -67980 1767 1840 -67980 1787 1851 -67980 1464 1482 -67980 1716 1734 -67980 1547 1734 -67980 1563 1592 -67980 1886 1829 -68000 1541 1862 -68000 1573 1452 -68000 1598 1897 -68000 1599 1655 -68000 1605 1636 -68000 1767 1840 -68000 1787 1851 -68000 1502 1533 -68000 1893 1505 -68000 1464 1482 -68000 1694 1829 -68000 1716 1734 -68000 1547 1734 -68000 1563 1592 -68000 1886 1829 -68020 1539 1541 -68020 1562 1569 -68020 1562 1742 -68020 1734 1756 -68020 1893 1505 -68020 1464 1482 -68020 1694 1829 -68020 1840 1439 -68020 1527 1683 -68020 1825 1884 -68020 1669 1754 -68020 1716 1734 -68020 1547 1734 -68020 1563 1592 -68020 1886 1829 -68040 1678 1870 -68040 1694 1829 -68040 1541 1897 -68040 1443 1680 -68040 1840 1439 -68040 1527 1683 -68040 1499 1460 -68040 1825 1884 -68040 1669 1754 -68040 1716 1734 -68040 1547 1734 -68040 1563 1592 -68040 1886 1829 -68060 1599 1678 -68060 1694 1886 -68060 1734 1870 -68060 1787 1851 -68060 1825 1890 -68060 1825 1884 -68060 1669 1754 -68060 1840 1767 -68060 1716 1734 -68060 1547 1734 -68060 1549 1525 -68060 1482 1464 -68060 1547 1870 -68060 1563 1592 -68060 1886 1829 -68060 1716 1870 -68080 1798 1818 -68080 1798 1663 -68080 1669 1754 -68080 1840 1767 -68080 1716 1734 -68080 1547 1734 -68080 1549 1525 -68080 1663 1818 -68080 1840 1439 -68080 1680 1443 -68080 1482 1464 -68080 1547 1870 -68080 1563 1592 -68080 1886 1829 -68080 1716 1870 -68100 1547 1734 -68100 1549 1525 -68100 1573 1452 -68100 1605 1636 -68100 1663 1818 -68100 1840 1439 -68100 1920 1541 -68100 1680 1443 -68100 1482 1464 -68100 1665 1591 -68100 1547 1870 -68100 1513 1779 -68100 1563 1592 -68100 1886 1829 -68100 1716 1870 -68120 1920 1541 -68120 1680 1443 -68120 1527 1683 -68120 1840 1767 -68120 1482 1464 -68120 1665 1591 -68120 1547 1870 -68120 1513 1779 -68120 1563 1592 -68120 1886 1829 -68120 1716 1870 -68140 1680 1636 -68140 1825 1890 -68140 1840 1767 -68140 1591 1858 -68140 1605 1772 -68140 1482 1464 -68140 1665 1591 -68140 1539 1884 -68140 1547 1870 -68140 1549 1525 -68140 1513 1779 -68140 1680 1772 -68140 1563 1592 -68140 1452 1573 -68140 1886 1829 -68140 1443 1772 -68140 1716 1870 -68140 1605 1636 -68160 1665 1591 -68160 1539 1884 -68160 1547 1684 -68160 1547 1870 -68160 1549 1525 -68160 1513 1779 -68160 1825 1525 -68160 1680 1772 -68160 1851 1787 -68160 1563 1592 -68160 1452 1573 -68160 1886 1829 -68160 1443 1772 -68160 1716 1870 -68160 1605 1636 -68180 1563 1592 -68180 1884 1890 -68180 1880 1883 -68180 1825 1890 -68180 1628 1463 -68180 1452 1573 -68180 1886 1829 -68180 1443 1772 -68180 1716 1870 -68180 1605 1636 -68180 1482 1880 -68200 1680 1443 -68200 1825 1890 -68200 1628 1463 -68200 1452 1573 -68200 1886 1829 -68200 1549 1525 -68200 1513 1779 -68200 1443 1772 -68200 1716 1870 -68200 1605 1636 -68200 1598 1541 -68200 1482 1880 -68220 1665 1591 -68220 1539 1839 -68220 1549 1553 -68220 1549 1525 -68220 1592 1563 -68220 1513 1779 -68220 1439 1840 -68220 1443 1772 -68220 1716 1870 -68220 1605 1636 -68220 1598 1541 -68220 1482 1880 -68240 1665 1539 -68240 1513 1779 -68240 1439 1840 -68240 1680 1772 -68240 1443 1772 -68240 1716 1870 -68240 1605 1636 -68240 1598 1541 -68240 1482 1880 -68260 1549 1825 -68260 1680 1443 -68260 1592 1563 -68260 1680 1772 -68260 1443 1772 -68260 1716 1870 -68260 1605 1636 -68260 1598 1541 -68260 1482 1880 -68260 1591 1665 -68280 1547 1684 -68280 1897 1579 -68280 1592 1563 -68280 1851 1787 -68280 1680 1772 -68280 1443 1772 -68280 1605 1772 -68280 1482 1464 -68280 1716 1870 -68280 1605 1636 -68280 1598 1541 -68280 1482 1880 -68280 1591 1665 -68300 1680 1443 -68300 1680 1772 -68300 1692 1897 -68300 1692 1660 -68300 1443 1772 -68300 1829 1886 -68300 1605 1772 -68300 1464 1880 -68300 1636 1772 -68300 1547 1870 -68300 1482 1464 -68300 1716 1870 -68300 1605 1636 -68300 1598 1541 -68300 1482 1880 -68300 1591 1665 -68320 1672 1877 -68320 1591 1858 -68320 1464 1880 -68320 1636 1772 -68320 1547 1870 -68320 1482 1464 -68320 1716 1870 -68320 1605 1636 -68320 1598 1541 -68320 1482 1880 -68320 1591 1665 -68340 1539 1684 -68340 1547 1870 -68340 1482 1464 -68340 1573 1452 -68340 1716 1870 -68340 1605 1636 -68340 1598 1541 -68340 1482 1880 -68340 1591 1665 -68360 1580 1683 -68360 1547 1870 -68360 1692 1660 -68360 1569 1742 -68360 1851 1787 -68360 1482 1464 -68360 1734 1655 -68360 1573 1452 -68360 1716 1870 -68360 1605 1636 -68360 1825 1519 -68360 1598 1541 -68360 1482 1880 -68360 1591 1665 -68380 1792 1885 -68380 1443 1563 -68380 1573 1452 -68380 1716 1870 -68380 1605 1636 -68380 1559 1734 -68380 1825 1519 -68380 1598 1541 -68380 1482 1880 -68380 1591 1665 -68400 1580 1683 -68400 1559 1734 -68400 1692 1660 -68400 1692 1839 -68400 1566 1601 -68400 1884 1519 -68400 1464 1880 -68400 1825 1519 -68400 1684 1580 -68400 1598 1541 -68400 1482 1880 -68400 1547 1870 -68400 1591 1665 -68400 1464 1482 -68420 1692 1885 -68420 1684 1580 -68420 1598 1541 -68420 1482 1880 -68420 1605 1636 -68420 1547 1870 -68420 1591 1665 -68420 1890 1519 -68420 1464 1482 -68420 1716 1870 -68440 1884 1519 -68440 1645 1734 -68440 1684 1580 -68440 1825 1890 -68440 1825 1519 -68440 1840 1767 -68440 1598 1541 -68440 1482 1880 -68440 1884 1890 -68440 1605 1636 -68440 1549 1525 -68440 1547 1870 -68440 1591 1665 -68440 1890 1519 -68440 1464 1482 -68440 1716 1870 -68460 1756 1645 -68460 1684 1580 -68460 1563 1580 -68460 1825 1890 -68460 1825 1519 -68460 1840 1767 -68460 1464 1880 -68460 1598 1541 -68460 1482 1880 -68460 1884 1890 -68460 1512 1655 -68460 1605 1636 -68460 1549 1525 -68460 1547 1870 -68460 1591 1665 -68460 1890 1519 -68460 1464 1482 -68460 1716 1870 -68480 1566 1715 -68480 1591 1858 -68480 1734 1487 -68480 1458 1487 -68480 1605 1636 -68480 1884 1519 -68480 1549 1525 -68480 1547 1870 -68480 1591 1665 -68480 1890 1519 -68480 1464 1482 -68480 1716 1870 -68500 1569 1742 -68500 1605 1636 -68500 1655 1851 -68500 1655 1787 -68500 1884 1519 -68500 1549 1525 -68500 1684 1503 -68500 1825 1519 -68500 1547 1870 -68500 1591 1665 -68500 1890 1519 -68500 1657 1487 -68500 1464 1482 -68500 1541 1598 -68500 1880 1482 -68500 1716 1870 -68520 1549 1525 -68520 1605 1920 -68520 1684 1503 -68520 1787 1851 -68520 1825 1519 -68520 1547 1870 -68520 1591 1665 -68520 1890 1519 -68520 1657 1487 -68520 1464 1482 -68520 1657 1443 -68520 1541 1598 -68520 1880 1482 -68520 1443 1487 -68520 1716 1870 -68540 1547 1870 -68540 1591 1665 -68540 1663 1467 -68540 1890 1519 -68540 1657 1487 -68540 1464 1482 -68540 1657 1443 -68540 1541 1598 -68540 1769 1443 -68540 1880 1482 -68540 1443 1487 -68540 1716 1870 -68540 1769 1487 -68560 1657 1487 -68560 1663 1818 -68560 1787 1458 -68560 1464 1482 -68560 1569 1742 -68560 1657 1443 -68560 1884 1890 -68560 1541 1598 -68560 1769 1443 -68560 1880 1482 -68560 1443 1487 -68560 1716 1870 -68560 1769 1487 -68560 1657 1769 -68580 1569 1742 -68580 1645 1756 -68580 1660 1495 -68580 1547 1870 -68580 1880 1464 -68580 1657 1443 -68580 1884 1890 -68580 1541 1598 -68580 1769 1443 -68580 1880 1482 -68580 1890 1519 -68580 1443 1487 -68580 1716 1870 -68580 1769 1487 -68580 1657 1769 -68580 1655 1786 -68600 1547 1870 -68600 1553 1924 -68600 1591 1665 -68600 1880 1464 -68600 1464 1482 -68600 1657 1443 -68600 1884 1890 -68600 1541 1598 -68600 1769 1443 -68600 1880 1482 -68600 1890 1519 -68600 1443 1487 -68600 1657 1487 -68600 1716 1870 -68600 1769 1487 -68600 1657 1769 -68600 1655 1786 -68620 1604 1861 -68620 1663 1851 -68620 1840 1439 -68620 1657 1443 -68620 1692 1839 -68620 1792 1885 -68620 1884 1890 -68620 1541 1598 -68620 1663 1818 -68620 1769 1443 -68620 1880 1482 -68620 1890 1519 -68620 1443 1487 -68620 1629 1911 -68620 1657 1487 -68620 1716 1870 -68620 1769 1487 -68620 1657 1769 -68620 1655 1786 -68620 1920 1636 -68640 1598 1885 -68640 1657 1443 -68640 1692 1839 -68640 1792 1885 -68640 1880 1464 -68640 1884 1890 -68640 1464 1482 -68640 1541 1598 -68640 1569 1742 -68640 1663 1818 -68640 1769 1443 -68640 1880 1482 -68640 1890 1519 -68640 1443 1487 -68640 1547 1870 -68640 1629 1911 -68640 1657 1487 -68640 1716 1870 -68640 1769 1487 -68640 1601 1629 -68640 1657 1769 -68640 1655 1786 -68640 1920 1636 -68640 1665 1591 -68660 1541 1598 -68660 1562 1792 -68660 1569 1742 -68660 1663 1818 -68660 1769 1443 -68660 1880 1482 -68660 1890 1519 -68660 1443 1487 -68660 1655 1882 -68660 1547 1870 -68660 1601 1911 -68660 1629 1911 -68660 1657 1487 -68660 1716 1870 -68660 1769 1487 -68660 1601 1629 -68660 1657 1769 -68660 1580 1628 -68660 1655 1786 -68660 1920 1636 -68660 1665 1591 -68680 1655 1882 -68680 1825 1884 -68680 1547 1870 -68680 1601 1911 -68680 1629 1911 -68680 1657 1487 -68680 1684 1880 -68680 1692 1839 -68680 1716 1870 -68680 1769 1487 -68680 1884 1890 -68680 1601 1629 -68680 1657 1769 -68680 1580 1628 -68680 1655 1786 -68680 1920 1636 -68680 1464 1482 -68680 1665 1591 -68700 1547 1870 -68700 1601 1911 -68700 1629 1911 -68700 1657 1487 -68700 1663 1818 -68700 1684 1880 -68700 1692 1839 -68700 1716 1870 -68700 1769 1487 -68700 1825 1890 -68700 1884 1890 -68700 1601 1629 -68700 1657 1769 -68700 1580 1628 -68700 1655 1786 -68700 1920 1636 -68700 1593 1890 -68700 1569 1742 -68700 1598 1541 -68700 1464 1482 -68700 1665 1591 -68720 1601 1629 -68720 1633 1684 -68720 1657 1769 -68720 1672 1877 -68720 1580 1628 -68720 1655 1786 -68720 1920 1636 -68720 1593 1890 -68720 1569 1742 -68720 1920 1605 -68720 1598 1541 -68720 1464 1482 -68720 1665 1591 -68740 1911 1563 -68740 1580 1628 -68740 1679 1575 -68740 1593 1825 -68740 1655 1786 -68740 1920 1636 -68740 1593 1890 -68740 1569 1742 -68740 1920 1605 -68740 1598 1541 -68740 1605 1636 -68740 1464 1482 -68740 1665 1591 -68760 1593 1825 -68760 1655 1786 -68760 1920 1636 -68760 1593 1890 -68760 1569 1742 -68760 1920 1605 -68760 1598 1541 -68760 1605 1636 -68760 1464 1482 -68760 1665 1591 -68780 1920 1636 -68780 1679 1575 -68780 1580 1628 -68780 1880 1787 -68780 1593 1890 -68780 1569 1742 -68780 1920 1605 -68780 1598 1541 -68780 1605 1636 -68780 1464 1482 -68780 1665 1591 -68800 1439 1660 -68800 1593 1890 -68800 1569 1742 -68800 1920 1605 -68800 1598 1541 -68800 1605 1636 -68800 1464 1482 -68800 1665 1591 -68820 1573 1786 -68820 1678 1458 -68820 1684 1513 -68820 1569 1742 -68820 1580 1628 -68820 1513 1786 -68820 1840 1767 -68820 1825 1890 -68820 1920 1605 -68820 1598 1541 -68820 1605 1636 -68820 1464 1482 -68820 1665 1591 -68840 1580 1839 -68840 1678 1684 -68840 1679 1699 -68840 1839 1870 -68840 1840 1767 -68840 1458 1742 -68840 1924 1593 -68840 1825 1890 -68840 1920 1605 -68840 1598 1541 -68840 1605 1636 -68840 1464 1482 -68840 1665 1591 -68860 1920 1636 -68860 1924 1593 -68860 1547 1684 -68860 1825 1890 -68860 1920 1605 -68860 1884 1890 -68860 1458 1772 -68860 1598 1541 -68860 1605 1636 -68860 1464 1482 -68860 1678 1786 -68860 1583 1825 -68860 1665 1591 -68880 1920 1605 -68880 1924 1478 -68880 1679 1575 -68880 1605 1870 -68880 1870 1636 -68880 1592 1877 -68880 1884 1890 -68880 1458 1772 -68880 1598 1541 -68880 1605 1636 -68880 1464 1482 -68880 1678 1786 -68880 1583 1825 -68880 1665 1591 -68900 1920 1699 -68900 1458 1772 -68900 1598 1541 -68900 1605 1636 -68900 1920 1870 -68900 1679 1628 -68900 1464 1482 -68900 1678 1786 -68900 1583 1825 -68900 1665 1591 -68920 1920 1870 -68920 1924 1593 -68920 1547 1692 -68920 1679 1628 -68920 1679 1575 -68920 1884 1890 -68920 1684 1767 -68920 1464 1482 -68920 1678 1786 -68920 1583 1825 -68920 1665 1591 -68940 1808 1772 -68940 1684 1767 -68940 1464 1482 -68940 1678 1786 -68940 1583 1825 -68940 1665 1591 -68960 1924 1593 -68960 1678 1786 -68960 1583 1825 -68960 1665 1591 -68960 1599 1655 -68980 1825 1519 -68980 1575 1628 -68980 1599 1772 -68980 1678 1786 -68980 1679 1575 -68980 1684 1767 -68980 1583 1825 -68980 1458 1772 -68980 1825 1890 -68980 1605 1636 -68980 1772 1655 -68980 1458 1655 -68980 1665 1591 -68980 1599 1655 -69000 1924 1593 -69000 1678 1786 -69000 1679 1575 -69000 1684 1767 -69000 1583 1825 -69000 1458 1772 -69000 1825 1890 -69000 1605 1636 -69000 1772 1655 -69000 1458 1655 -69000 1665 1591 -69000 1599 1655 -69000 1458 1599 -69020 1825 1890 -69020 1605 1636 -69020 1772 1655 -69020 1458 1655 -69020 1665 1591 -69020 1599 1655 -69020 1599 1772 -69020 1458 1599 -69040 1835 1605 -69040 1679 1575 -69040 1591 1786 -69040 1772 1655 -69040 1458 1655 -69040 1665 1591 -69040 1599 1655 -69040 1599 1772 -69040 1458 1599 -69060 1772 1655 -69060 1458 1655 -69060 1665 1591 -69060 1458 1772 -69060 1599 1655 -69060 1599 1772 -69060 1458 1599 -69080 1924 1593 -69080 1458 1655 -69080 1464 1482 -69080 1665 1591 -69080 1458 1772 -69080 1599 1655 -69080 1599 1772 -69080 1458 1599 -69100 1665 1591 -69100 1692 1591 -69100 1458 1772 -69100 1599 1655 -69100 1772 1655 -69100 1599 1772 -69100 1679 1575 -69100 1458 1599 -69120 1684 1767 -69120 1692 1716 -69120 1458 1655 -69120 1599 1655 -69120 1772 1655 -69120 1924 1593 -69120 1599 1772 -69120 1679 1575 -69120 1464 1482 -69120 1605 1636 -69120 1458 1599 -69140 1924 1593 -69140 1599 1772 -69140 1665 1591 -69140 1679 1575 -69140 1464 1482 -69140 1605 1636 -69140 1458 1599 -69160 1665 1591 -69160 1882 1772 -69160 1458 1772 -69160 1851 1787 -69160 1679 1575 -69160 1464 1482 -69160 1605 1636 -69160 1458 1599 -69160 1599 1655 -69180 1924 1593 -69180 1679 1575 -69180 1684 1767 -69180 1464 1482 -69180 1605 1636 -69180 1458 1599 -69180 1599 1655 -69200 1464 1482 -69200 1605 1636 -69200 1458 1599 -69200 1599 1655 -69220 1593 1786 -69220 1605 1636 -69220 1458 1599 -69220 1599 1655 -69240 1840 1767 -69240 1605 1636 -69240 1458 1655 -69240 1464 1482 -69240 1458 1599 -69240 1599 1655 -69260 1882 1655 -69260 1458 1655 -69260 1464 1482 -69260 1458 1599 -69260 1599 1655 -69280 1547 1692 -69280 1458 1655 -69280 1840 1767 -69280 1825 1519 -69280 1464 1482 -69280 1458 1599 -69280 1599 1655 -69300 1679 1575 -69300 1840 1767 -69300 1851 1787 -69300 1825 1519 -69300 1464 1482 -69300 1458 1599 -69300 1599 1655 -69320 1684 1767 -69320 1825 1519 -69320 1464 1482 -69320 1458 1599 -69320 1458 1655 -69320 1599 1655 -69340 1464 1482 -69340 1458 1599 -69340 1458 1655 -69340 1599 1655 -69360 1825 1519 -69360 1458 1599 -69360 1458 1655 -69360 1599 1655 -69380 1679 1575 -69380 1684 1840 -69380 1458 1599 -69380 1458 1655 -69380 1599 1655 -69400 1458 1599 -69400 1458 1655 -69400 1840 1767 -69400 1599 1655 -69400 1605 1636 -69400 1458 1772 -69420 1882 1599 -69420 1840 1767 -69420 1599 1655 -69420 1605 1636 -69420 1458 1772 -69440 1840 1489 -69440 1679 1575 -69440 1489 1767 -69440 1599 1655 -69440 1605 1636 -69440 1458 1772 -69460 1679 1575 -69460 1882 1599 -69460 1489 1767 -69460 1599 1655 -69460 1605 1636 -69460 1458 1772 -69480 1599 1655 -69480 1605 1636 -69480 1808 1716 -69480 1458 1772 -69500 1464 1482 -69500 1808 1716 -69500 1458 1772 -69520 1882 1599 -69520 1605 1636 -69520 1808 1716 -69520 1458 1772 -69540 1882 1599 -69540 1605 1636 -69540 1808 1716 -69540 1458 1772 -69560 1839 1660 -69560 1458 1599 -69560 1605 1636 -69560 1808 1716 -69560 1458 1772 -69580 1547 1692 -69580 1678 1761 -69580 1692 1660 -69580 1808 1716 -69580 1458 1772 -69600 1692 1660 -69600 1605 1636 -69600 1808 1716 -69600 1458 1772 -69620 1692 1605 -69620 1808 1716 -69620 1458 1772 -69640 1605 1636 -69640 1482 1655 -69640 1808 1716 -69640 1458 1772 -69660 1808 1716 -69660 1458 1772 -69680 1839 1660 -69680 1547 1808 -69680 1808 1716 -69680 1692 1660 -69680 1458 1772 -69680 1605 1636 -69700 1547 1808 -69700 1825 1884 -69700 1808 1716 -69700 1692 1660 -69700 1458 1772 -69700 1605 1636 -69720 1808 1716 -69720 1683 1692 -69720 1692 1660 -69720 1458 1772 -69720 1583 1655 -69720 1605 1636 -69740 1692 1660 -69740 1547 1808 -69740 1825 1519 -69740 1458 1772 -69740 1583 1655 -69740 1605 1636 -69760 1547 1808 -69760 1547 1599 -69760 1825 1519 -69760 1882 1599 -69760 1458 1772 -69760 1464 1482 -69760 1583 1655 -69760 1605 1636 -69780 1882 1599 -69780 1458 1772 -69780 1464 1482 -69780 1599 1786 -69780 1884 1519 -69780 1583 1655 -69780 1605 1636 -69800 1692 1660 -69800 1464 1482 -69800 1599 1786 -69800 1884 1519 -69800 1599 1655 -69800 1583 1655 -69800 1605 1636 -69820 1884 1519 -69820 1583 1599 -69820 1599 1655 -69820 1583 1655 -69820 1605 1636 -69840 1464 1482 -69840 1458 1772 -69840 1884 1519 -69840 1583 1599 -69840 1599 1655 -69840 1583 1655 -69840 1599 1786 -69840 1825 1519 -69840 1605 1636 -69860 1692 1660 -69860 1458 1772 -69860 1884 1519 -69860 1583 1599 -69860 1599 1655 -69860 1684 1451 -69860 1583 1655 -69860 1599 1786 -69860 1825 1519 -69860 1605 1636 -69880 1458 1772 -69880 1464 1482 -69880 1655 1786 -69880 1884 1519 -69880 1583 1599 -69880 1599 1655 -69880 1684 1451 -69880 1583 1786 -69880 1583 1655 -69880 1599 1786 -69880 1825 1519 -69880 1605 1636 -69900 1884 1519 -69900 1583 1599 -69900 1599 1655 -69900 1684 1451 -69900 1583 1786 -69900 1583 1655 -69900 1599 1786 -69900 1825 1519 -69900 1605 1636 -69920 1882 1786 -69920 1599 1655 -69920 1655 1786 -69920 1684 1451 -69920 1583 1786 -69920 1583 1655 -69920 1599 1882 -69920 1599 1786 -69920 1825 1519 -69920 1605 1636 -69940 1684 1451 -69940 1825 1884 -69940 1583 1786 -69940 1583 1599 -69940 1884 1519 -69940 1583 1655 -69940 1599 1882 -69940 1599 1786 -69940 1825 1519 -69940 1605 1636 -69960 1884 1519 -69960 1583 1519 -69960 1583 1655 -69960 1599 1882 -69960 1458 1772 -69960 1825 1583 -69960 1599 1786 -69960 1825 1519 -69960 1605 1636 -69980 1882 1786 -69980 1825 1884 -69980 1599 1655 -69980 1458 1772 -69980 1825 1583 -69980 1655 1786 -69980 1599 1786 -69980 1825 1519 -69980 1605 1636 -70000 1599 1655 -70000 1583 1519 -70000 1458 1772 -70000 1599 1882 -70000 1825 1583 -70000 1655 1786 -70000 1599 1786 -70000 1825 1519 -70000 1884 1519 -70000 1605 1636 -70020 1583 1519 -70020 1458 1772 -70020 1599 1882 -70020 1920 1598 -70020 1825 1583 -70020 1655 1786 -70020 1599 1786 -70020 1825 1519 -70020 1884 1519 -70020 1605 1636 -70040 1920 1598 -70040 1825 1583 -70040 1884 1583 -70040 1655 1786 -70040 1599 1786 -70040 1825 1519 -70040 1884 1519 -70040 1599 1655 -70040 1605 1636 -70060 1882 1786 -70060 1825 1884 -70060 1599 1786 -70060 1825 1519 -70060 1884 1519 -70060 1599 1655 -70060 1605 1636 -70060 1882 1599 -70080 1825 1884 -70080 1599 1786 -70080 1655 1786 -70080 1808 1716 -70080 1920 1598 -70080 1825 1519 -70080 1884 1519 -70080 1599 1655 -70080 1605 1636 -70080 1882 1599 -70100 1808 1716 -70100 1884 1583 -70100 1825 1583 -70100 1920 1598 -70100 1684 1451 -70100 1825 1519 -70100 1884 1519 -70100 1599 1655 -70100 1605 1636 -70100 1882 1599 -70100 1583 1519 -70120 1825 1583 -70120 1599 1786 -70120 1920 1598 -70120 1684 1451 -70120 1825 1519 -70120 1884 1519 -70120 1655 1786 -70120 1599 1655 -70120 1605 1636 -70120 1882 1599 -70120 1583 1519 -70140 1920 1598 -70140 1684 1451 -70140 1825 1519 -70140 1884 1519 -70140 1655 1786 -70140 1599 1655 -70140 1884 1583 -70140 1605 1636 -70140 1882 1599 -70140 1583 1519 -70160 1464 1482 -70160 1599 1655 -70160 1884 1583 -70160 1605 1636 -70160 1882 1599 -70160 1583 1825 -70160 1583 1519 -70180 1884 1583 -70180 1655 1786 -70180 1605 1636 -70180 1882 1599 -70180 1583 1825 -70180 1583 1519 -70200 1605 1636 -70200 1882 1599 -70200 1583 1825 -70200 1583 1519 -70200 1825 1519 -70200 1825 1884 -70220 1884 1519 -70220 1605 1636 -70220 1882 1599 -70220 1583 1825 -70220 1583 1519 -70220 1825 1519 -70220 1825 1884 -70220 1547 1808 -70240 1884 1519 -70240 1605 1636 -70240 1882 1599 -70240 1583 1825 -70240 1583 1519 -70240 1825 1519 -70240 1825 1884 -70240 1547 1808 -70260 1884 1583 -70260 1884 1519 -70260 1599 1655 -70260 1605 1636 -70260 1882 1599 -70260 1655 1786 -70260 1583 1825 -70260 1583 1519 -70260 1825 1519 -70260 1825 1884 -70260 1547 1808 -70260 1599 1786 -70280 1882 1599 -70280 1655 1786 -70280 1583 1825 -70280 1583 1519 -70280 1825 1519 -70280 1825 1884 -70280 1547 1808 -70280 1599 1786 -70300 1464 1482 -70300 1583 1825 -70300 1583 1519 -70300 1825 1519 -70300 1825 1884 -70300 1547 1808 -70300 1599 1786 -70300 1605 1636 -70320 1583 1825 -70320 1583 1519 -70320 1825 1519 -70320 1684 1767 -70320 1825 1884 -70320 1547 1808 -70320 1599 1786 -70320 1605 1636 -70340 1684 1767 -70340 1825 1884 -70340 1884 1519 -70340 1547 1808 -70340 1599 1786 -70340 1605 1636 -70360 1825 1519 -70360 1547 1808 -70360 1851 1787 -70360 1599 1786 -70360 1605 1636 -70380 1547 1808 -70380 1464 1482 -70380 1851 1787 -70380 1599 1786 -70380 1605 1636 -70400 1825 1519 -70400 1655 1786 -70400 1825 1884 -70400 1605 1636 -70420 1882 1786 -70420 1628 1463 -70420 1851 1787 -70420 1655 1786 -70420 1825 1884 -70420 1605 1636 -70440 1595 1654 -70440 1851 1787 -70440 1655 1786 -70440 1920 1598 -70440 1825 1884 -70440 1605 1636 -70460 1884 1519 -70460 1920 1598 -70460 1825 1519 -70460 1825 1884 -70460 1605 1636 -70480 1920 1598 -70480 1825 1519 -70480 1851 1787 -70480 1655 1786 -70480 1825 1884 -70480 1605 1636 -70480 1599 1655 -70500 1825 1655 -70500 1825 1599 -70500 1884 1599 -70500 1599 1882 -70500 1599 1519 -70500 1825 1884 -70500 1605 1636 -70500 1599 1655 -70520 1599 1519 -70520 1882 1519 -70520 1825 1884 -70520 1825 1519 -70520 1605 1636 -70520 1599 1655 -70540 1825 1884 -70540 1825 1519 -70540 1605 1636 -70540 1599 1655 -70560 1599 1786 -70560 1825 1519 -70560 1605 1636 -70560 1599 1655 -70580 1882 1599 -70580 1825 1786 -70580 1862 1519 -70580 1825 1519 -70580 1605 1636 -70580 1599 1655 -70600 1825 1655 -70600 1825 1884 -70600 1825 1519 -70600 1605 1636 -70600 1599 1655 -70620 1825 1884 -70620 1825 1519 -70620 1605 1636 -70620 1884 1519 -70620 1599 1655 -70640 1924 1478 -70640 1716 1605 -70640 1884 1519 -70640 1599 1655 -70660 1605 1636 -70660 1825 1884 -70660 1825 1519 -70660 1599 1655 -70680 1882 1655 -70680 1605 1636 -70680 1605 1503 -70680 1825 1884 -70680 1825 1519 -70680 1599 1655 -70700 1825 1884 -70700 1884 1519 -70700 1808 1716 -70700 1825 1519 -70700 1599 1655 -70700 1547 1808 -70720 1655 1786 -70720 1808 1716 -70720 1825 1519 -70720 1882 1655 -70720 1599 1655 -70720 1924 1478 -70720 1547 1808 -70740 1808 1716 -70740 1825 1884 -70740 1825 1519 -70740 1882 1655 -70740 1599 1655 -70740 1924 1478 -70740 1547 1808 -70760 1599 1655 -70760 1884 1519 -70760 1519 1655 -70760 1924 1478 -70760 1599 1786 -70760 1547 1808 -70780 1599 1519 -70780 1519 1655 -70780 1924 1478 -70780 1599 1786 -70780 1547 1808 -70780 1808 1716 -70800 1924 1478 -70800 1884 1519 -70800 1599 1786 -70800 1547 1808 -70800 1599 1655 -70800 1808 1716 -70820 1547 1808 -70820 1882 1786 -70820 1882 1599 -70820 1882 1655 -70820 1655 1786 -70820 1599 1655 -70820 1808 1716 -70840 1924 1478 -70840 1599 1655 -70840 1808 1716 -70860 1924 1553 -70860 1825 1519 -70860 1808 1716 -70880 1547 1808 -70880 1655 1786 -70880 1808 1716 -70900 1884 1519 -70900 1655 1786 -70900 1808 1716 -70900 1684 1463 -70920 1808 1716 -70920 1684 1463 -70920 1599 1786 -70940 1924 1553 -70940 1882 1599 -70940 1599 1786 -70940 1599 1655 -70940 1924 1478 -70960 1808 1716 -70960 1825 1628 -70960 1924 1478 -70980 1655 1786 -70980 1599 1655 -70980 1924 1478 -71000 1599 1655 -71000 1924 1478 -71000 1808 1716 -71020 1599 1786 -71020 1924 1478 -71020 1808 1716 -71040 1924 1478 -71040 1655 1786 -71040 1808 1716 -71060 1808 1716 -71080 1808 1716 -71080 1851 1787 -71080 1655 1786 -71100 1512 1786 -71100 1924 1478 -71100 1655 1786 -71120 1924 1478 -71120 1599 1512 -71120 1599 1655 -71120 1655 1786 -71140 1547 1808 -71140 1808 1716 -71180 1547 1808 -71180 1599 1512 -71180 1512 1655 -71180 1924 1478 -71200 1553 1825 -71200 1924 1478 -71220 1924 1478 -71220 1870 1851 -71240 1553 1825 -71240 1808 1716 -71240 1512 1655 -71240 1547 1808 -71260 1924 1478 -71260 1808 1716 -71260 1512 1655 -71260 1547 1808 -71280 1808 1716 -71280 1512 1655 -71280 1547 1808 -71300 1463 1628 -71300 1594 1475 -71300 1599 1655 -71300 1547 1808 -71320 1547 1808 -71340 1547 1808 -71340 1808 1716 -71340 1924 1478 -71360 1924 1478 -71380 1594 1475 -71400 1924 1478 -71400 1547 1808 -71420 1678 1870 -71420 1599 1512 -71440 1463 1628 -71440 1599 1512 -71440 1882 1655 -71460 1882 1655 -71480 1882 1655 -71500 1882 1655 -71520 1599 1512 -71520 1882 1655 -71580 1684 1628 -71600 1684 1463 -71600 1684 1628 -71620 1684 1628 -71640 1684 1628 -71660 1684 1628 -71720 1547 1808 -71720 1463 1628 -71720 1774 1716 -71760 1655 1599 -71780 1512 1655 -71780 1463 1628 -71800 1512 1599 -71800 1512 1655 -71800 1463 1628 -71820 1463 1628 -71920 1655 1882 -71980 1451 1684 -71980 1655 1599 -72020 1512 1599 -72060 1599 1512 -72080 1684 1451 -72100 1599 1512 -72180 1512 1599 -72220 1512 1599 -72220 1655 1599 -72240 1655 1599 -72260 1655 1599 -72300 1512 1599 -72320 1882 1655 -72460 1787 1851 -72620 1655 1882 -72640 1512 1599 -72660 1512 1599 -72660 1655 1599 -72700 1655 1599 -72720 1655 1599 -72780 1512 1599 -72800 1512 1599 -72820 1512 1599 -72840 1512 1599 -72900 1512 1599 -72940 1851 1787 -72960 1851 1787 -72980 1512 1599 -73040 1512 1599 -73040 1655 1599 -73060 1655 1599 -73080 1655 1882 -73080 1655 1599 -73120 1521 1655 -73120 1655 1599 -73160 1787 1851 -73160 1655 1599 -73180 1851 1521 -73240 1851 1593 -73260 1787 1593 -73260 1851 1593 -73280 1882 1599 -73280 1851 1593 -73300 1512 1599 -73300 1851 1593 -73300 1787 1851 -73320 1787 1851 -73340 1787 1851 -73340 1851 1521 -73360 1521 1593 -73380 1787 1851 -73380 1521 1593 -73380 1521 1851 -73380 1851 1593 -73400 1521 1593 -73400 1655 1599 -73400 1521 1851 -73400 1851 1593 -73420 1521 1851 -73420 1851 1593 -73440 1512 1599 -73440 1851 1593 -73460 1655 1882 -73460 1851 1593 -73460 1655 1599 -73480 1512 1655 -73480 1851 1593 -73480 1655 1599 -73500 1787 1851 -73500 1851 1593 -73500 1655 1599 -73520 1512 1599 -73520 1851 1593 -73520 1655 1599 -73540 1787 1593 -73600 1787 1851 -73600 1655 1599 -73620 1787 1851 -73620 1655 1599 -73680 1818 1663 -73700 1655 1599 -73700 1818 1663 -73720 1818 1663 -73720 1851 1787 -73800 1559 1599 -73820 1787 1851 -73820 1559 1599 -73840 1559 1599 -73860 1851 1787 -73880 1559 1599 -73900 1851 1452 -73900 1573 1452 -73900 1559 1599 -73900 1559 1791 -73900 1599 1791 -73920 1559 1791 -73920 1851 1787 -73920 1599 1791 -73940 1599 1791 -73960 1599 1791 -73980 1599 1791 -74020 1791 1599 -74020 1655 1599 -74040 1655 1599 -74080 1791 1559 -74080 1559 1655 -74100 1559 1655 -74120 1559 1599 -74120 1559 1655 -74120 1655 1599 -74140 1559 1882 -74140 1559 1655 -74140 1655 1599 -74180 1559 1599 -74200 1559 1655 -74880 1787 1851 -74940 1851 1787 -74960 1851 1787 -75300 1851 1787 -75340 1851 1787 -75360 1851 1787 -75380 1851 1787 -75400 1851 1787 -75420 1851 1787 -75460 1851 1716 -75540 1851 1787 -75620 1851 1787 -75880 1582 1622 -75900 1427 1622 -75900 1582 1593 -75900 1603 1527 -75920 1543 1597 -75920 1676 1562 -75920 1562 1630 -75920 1603 1493 -75940 1543 1676 -75940 1543 1613 -75940 1676 1504 -75940 1676 1613 -75940 1550 1580 -75940 1550 1439 -75940 1562 1443 -75940 1580 1613 -75940 1676 1580 -75940 1597 1613 -75960 1676 1580 -75960 1597 1613 -75960 1543 1550 -75980 1543 1550 -76000 1851 1787 -76000 1543 1550 -76020 1543 1562 -76020 1543 1550 -76020 1550 1562 -76020 1550 1526 -76040 1504 1613 -76140 1851 1787 -76160 1851 1787 -76180 1851 1787 -76240 1593 1787 -76320 1851 1787 -76360 1787 1851 -76380 1787 1851 -77460 1622 1562 -77480 1453 1467 -77500 1453 1467 -77540 1543 1467 -77540 1453 1467 -77540 1543 1453 -77560 1603 1467 -77560 1543 1453 -77560 1443 1545 -77580 1443 1545 -115900 1521 1593 -116980 1761 1550 -117000 1761 1550 -117020 1761 1550 -117080 1512 1547 -117100 1761 1550 -117100 1512 1547 -117120 1512 1547 -117180 1761 1531 -117200 1761 1531 -117220 1761 1550 -117220 1761 1531 -117240 1761 1550 -117240 1761 1531 -117240 1531 1550 -117260 1531 1658 -117260 1761 1531 -117260 1531 1550 -117280 1761 1658 -117280 1531 1658 -117280 1761 1531 -117280 1531 1550 -117300 1761 1531 -117300 1761 1550 -117300 1531 1550 -117320 1531 1550 -117340 1761 1531 -117360 1761 1531 -117360 1550 1531 -117380 1761 1531 -117380 1550 1531 -117540 1512 1531 -117560 1512 1531 -117620 1512 1531 -117640 1512 1531 -117660 1512 1531 -117680 1512 1531 -117720 1512 1531 -117740 1512 1531 -117760 1512 1547 -117760 1512 1531 -117800 1512 1531 -117820 1512 1531 -117840 1512 1531 -117860 1512 1531 -117880 1512 1531 -117900 1512 1531 -117960 1512 1531 -118000 1531 1512 -118000 1521 1593 -118020 1521 1593 -118040 1521 1593 -118040 1531 1512 -118060 1521 1593 -118060 1531 1512 -118080 1543 1582 -118080 1545 1512 -118080 1557 1468 -118080 1531 1512 -118080 1545 1531 -118100 1545 1512 -118100 1557 1468 -118100 1531 1512 -118100 1545 1531 -118100 1582 1512 -118100 1582 1531 -118100 1545 1582 -118120 1531 1512 -118120 1545 1531 -118120 1582 1512 -118120 1582 1531 -118120 1545 1582 -118140 1545 1531 -118140 1582 1512 -118140 1582 1531 -118140 1593 1521 -118140 1545 1582 -118160 1545 1582 -118180 1543 1550 -118180 1545 1582 -118200 1547 1512 -118240 1593 1521 -118260 1593 1521 -118280 1543 1550 -118280 1593 1521 -118300 1543 1550 -118300 1593 1521 -118320 1557 1558 -118320 1593 1521 -118340 1557 1468 -118340 1593 1521 -118360 1716 1512 -118380 1593 1521 -118400 1676 1761 -118400 1593 1521 -118400 1550 1513 -118420 1550 1513 -118460 1547 1512 -118460 1550 1526 -118460 1493 1531 -118480 1557 1468 -118480 1582 1513 -118480 1593 1521 -118500 1543 1550 -118500 1593 1521 -118520 1543 1526 -118520 1543 1550 -118520 1562 1787 -118520 1593 1521 -118540 1543 1550 -118540 1562 1787 -118540 1593 1521 -118540 1505 1893 -118560 1557 1468 -118560 1505 1893 -118580 1550 1740 -118580 1505 1893 -118600 1543 1526 -118600 1550 1740 -118600 1505 1893 -118600 1562 1593 -118620 1550 1740 -118620 1505 1893 -118620 1562 1593 -118640 1550 1775 -118640 1427 1715 -118640 1593 1787 -118640 1550 1434 -118640 1562 1593 -118660 1427 1715 -118660 1439 1761 -118660 1593 1787 -118660 1434 1775 -118660 1550 1434 -118660 1505 1893 -118660 1562 1593 -118680 1439 1453 -118680 1593 1787 -118680 1434 1775 -118680 1550 1434 -118680 1505 1893 -118680 1562 1593 -118700 1556 1894 -118700 1434 1775 -118700 1593 1521 -118700 1550 1434 -118700 1505 1893 -118700 1562 1593 -118700 1562 1521 -118720 1550 1434 -118720 1505 1893 -118720 1562 1593 -118720 1562 1521 -118740 1550 1775 -118740 1453 1590 -118740 1593 1521 -118740 1550 1434 -118740 1505 1893 -118740 1562 1593 -118740 1562 1521 -118760 1562 1787 -118760 1593 1521 -118760 1434 1775 -118760 1497 1893 -118760 1550 1434 -118760 1505 1893 -118760 1562 1593 -118760 1562 1521 -118780 1434 1775 -118780 1497 1893 -118780 1550 1434 -118780 1550 1775 -118780 1505 1893 -118780 1562 1593 -118780 1562 1521 -118800 1550 1434 -118800 1550 1775 -118800 1505 1893 -118800 1562 1593 -118800 1562 1521 -118820 1505 1893 -118820 1562 1593 -118820 1497 1893 -118820 1562 1521 -118840 1562 1593 -118840 1497 1505 -118840 1497 1893 -118840 1774 1521 -118840 1676 1761 -118840 1562 1521 -118840 1593 1521 -118840 1593 1774 -118860 1676 1761 -118860 1562 1521 -118860 1593 1521 -118860 1593 1787 -118860 1593 1774 -118880 1543 1434 -118880 1543 1775 -118880 1562 1593 -118900 1761 1740 -118900 1562 1593 -118920 1716 1599 -118920 1866 1505 -118920 1505 1893 -118920 1562 1593 -118920 1866 1893 -118940 1735 1465 -118940 1716 1599 -118940 1866 1505 -118940 1497 1893 -118940 1505 1893 -118940 1562 1593 -118940 1866 1893 -118960 1715 1740 -118960 1716 1655 -118960 1716 1599 -118960 1866 1505 -118960 1497 1893 -118960 1505 1893 -118960 1562 1593 -118960 1866 1893 -118980 1716 1599 -118980 1866 1505 -118980 1497 1893 -118980 1505 1893 -118980 1562 1593 -118980 1866 1893 -119000 1599 1512 -119000 1512 1655 -119000 1562 1593 -119000 1716 1655 -119000 1866 1893 -119020 1562 1593 -119020 1599 1655 -119020 1497 1893 -119020 1716 1655 -119020 1866 1893 -119040 1761 1676 -119040 1761 1740 -119040 1676 1740 -119040 1562 1593 -119040 1711 1877 -119040 1599 1655 -119040 1512 1655 -119040 1547 1655 -119040 1497 1893 -119040 1716 1655 -119040 1866 1893 -119060 1547 1655 -119060 1497 1893 -119060 1716 1655 -119060 1866 1893 -119080 1547 1655 -119080 1711 1479 -119080 1512 1655 -119080 1599 1655 -119080 1497 1893 -119080 1538 1655 -119080 1716 1655 -119080 1562 1593 -119080 1866 1893 -119100 1547 1716 -119100 1599 1655 -119100 1740 1761 -119100 1497 1893 -119100 1538 1655 -119100 1676 1761 -119100 1716 1655 -119100 1676 1740 -119100 1562 1593 -119100 1866 1893 -119120 1538 1655 -119120 1676 1761 -119120 1439 1453 -119120 1716 1655 -119120 1512 1655 -119120 1676 1740 -119120 1562 1593 -119120 1599 1512 -119120 1866 1893 -119140 1676 1740 -119140 1599 1655 -119140 1562 1593 -119140 1599 1512 -119140 1740 1761 -119140 1593 1768 -119140 1703 1900 -119140 1562 1768 -119140 1497 1893 -119140 1866 1893 -119160 1807 1742 -119160 1562 1593 -119160 1599 1512 -119160 1740 1761 -119160 1593 1768 -119160 1703 1900 -119160 1562 1768 -119160 1497 1893 -119160 1512 1655 -119160 1866 1893 -119180 1505 1866 -119180 1562 1768 -119180 1497 1893 -119180 1512 1655 -119180 1866 1893 -119200 1439 1894 -119200 1465 1735 -119200 1599 1512 -119200 1599 1655 -119200 1512 1655 -119200 1866 1893 -119220 1670 1908 -119220 1562 1768 -119220 1439 1894 -119220 1465 1735 -119220 1599 1512 -119220 1599 1655 -119220 1512 1655 -119220 1497 1893 -119220 1866 1893 -119240 1512 1655 -119240 1866 1505 -119240 1497 1893 -119240 1866 1893 -119260 1518 1604 -119260 1866 1505 -119260 1497 1893 -119260 1866 1893 -119280 1590 1771 -119280 1599 1655 -119280 1497 1893 -119280 1866 1893 -119300 1703 1900 -119300 1599 1655 -119300 1470 1530 -119300 1497 1893 -119300 1866 1893 -119320 1673 1652 -119320 1497 1893 -119320 1866 1893 -119340 1500 1511 -119340 1505 1893 -119340 1512 1655 -119340 1470 1530 -119340 1866 1893 -119360 1866 1893 -119360 1497 1893 -119400 1866 1497 -119420 1590 1771 -119480 1599 1655 -119500 1573 1530 -119500 1599 1655 -119520 1599 1655 -119540 1449 1599 -119540 1599 1655 -119540 1512 1655 -119540 1449 1655 -119540 1882 1655 -119560 1449 1655 -119560 1882 1655 -119580 1707 1764 -119580 1599 1655 -119580 1882 1655 -119600 1698 1764 -119600 1599 1655 -119600 1882 1655 -119600 1512 1655 -119600 1698 1707 -119600 1449 1599 -119620 1698 1707 -119620 1449 1599 -119640 1882 1655 -119660 1882 1655 -119660 1698 1707 -119680 1439 1640 -119680 1439 1590 -119680 1698 1707 -119700 1521 1919 -119720 1882 1655 -119720 1771 1914 -119720 1698 1707 -119740 1771 1914 -119740 1882 1599 -119740 1698 1707 -119760 1882 1599 -119760 1696 1499 -119760 1698 1707 -119780 1698 1521 -119780 1707 1521 -119780 1696 1791 -119780 1698 1707 -119800 1696 1791 -119800 1538 1524 -119800 1460 1499 -119800 1599 1882 -119800 1698 1707 -119820 1538 1524 -119820 1698 1473 -119820 1698 1465 -119820 1707 1453 -119820 1707 1473 -119820 1460 1499 -119820 1599 1882 -119820 1698 1707 -119840 1707 1473 -119840 1460 1499 -119840 1599 1882 -119840 1698 1707 -119860 1707 1453 -119860 1599 1882 -119860 1698 1707 -119880 1707 1473 -119880 1599 1882 -119880 1698 1707 -119900 1698 1453 -119900 1593 1787 -119900 1676 1761 -119900 1707 1473 -119900 1599 1882 -119900 1698 1707 -119920 1439 1492 -119920 1676 1761 -119920 1707 1473 -119920 1599 1882 -119920 1698 1707 -119940 1439 1698 -119940 1439 1707 -119940 1453 1502 -119940 1676 1761 -119940 1707 1473 -119940 1599 1882 -119940 1698 1707 -119960 1676 1761 -119960 1707 1473 -119960 1599 1882 -119960 1698 1707 -119980 1829 1886 -119980 1707 1473 -119980 1599 1882 -119980 1698 1707 -120000 1829 1886 -120000 1707 1473 -120000 1599 1882 -120000 1698 1707 -120020 1829 1886 -120020 1453 1492 -120020 1875 1498 -120020 1707 1473 -120020 1599 1882 -120020 1698 1707 -120040 1453 1492 -120040 1875 1498 -120040 1707 1473 -120040 1599 1882 -120040 1698 1707 -120060 1465 1789 -120060 1707 1473 -120060 1599 1882 -120060 1676 1761 -120060 1698 1707 -120080 1803 1623 -120080 1498 1593 -120080 1707 1473 -120080 1599 1882 -120080 1676 1761 -120080 1698 1707 -120100 1707 1473 -120100 1537 1521 -120100 1599 1882 -120100 1875 1593 -120100 1676 1761 -120100 1698 1707 -120120 1537 1521 -120120 1599 1882 -120120 1875 1593 -120120 1875 1498 -120120 1593 1498 -120120 1676 1761 -120120 1698 1707 -120140 1676 1761 -120140 1694 1599 -120140 1707 1473 -120140 1698 1707 -120160 1707 1473 -120160 1599 1882 -120160 1698 1707 -120180 1882 1593 -120180 1698 1707 -120200 1707 1473 -120200 1593 1599 -120200 1698 1707 -120220 1882 1599 -120220 1593 1599 -120220 1698 1707 -120240 1707 1473 -120240 1698 1707 -120260 1707 1473 -120260 1698 1707 -120280 1439 1707 -120280 1707 1453 -120280 1599 1882 -120280 1707 1473 -120280 1698 1707 -120300 1698 1473 -120300 1599 1882 -120300 1707 1473 -120300 1698 1707 -120320 1599 1882 -120320 1707 1473 -120320 1698 1707 -120340 1599 1593 -120340 1599 1882 -120340 1707 1473 -120340 1698 1707 -120360 1593 1882 -120360 1599 1882 -120360 1707 1473 -120360 1698 1707 -120380 1829 1886 -120380 1593 1882 -120380 1599 1882 -120380 1707 1473 -120380 1698 1707 -120400 1599 1882 -120400 1707 1473 -120400 1698 1707 -120420 1707 1473 -120420 1453 1473 -120420 1498 1521 -120420 1698 1707 -120440 1519 1825 -120440 1829 1886 -120440 1498 1521 -120440 1698 1707 -120460 1498 1521 -120460 1707 1473 -120460 1698 1707 -120480 1537 1829 -120480 1825 1519 -120480 1707 1473 -120480 1698 1707 -120500 1707 1473 -120500 1829 1886 -120500 1698 1707 -120520 1551 1269 -120520 1825 1519 -120520 1707 1473 -120520 1829 1886 -120520 1698 1707 -120540 1593 1512 -120540 1599 1512 -120540 1829 1886 -120540 1698 1707 -120560 1707 1473 -120560 1707 1453 -120560 1441 1269 -120560 1498 1521 -120560 1441 1857 -120560 1829 1886 -120560 1698 1707 -120580 1498 1521 -120580 1441 1857 -120580 1441 1918 -120580 1829 1886 -120580 1857 1269 -120580 1617 1269 -120580 1874 1906 -120580 1698 1707 -120600 1551 1269 -120600 1698 1707 -120600 1696 1598 -120600 1875 1598 -120620 1829 1886 -120620 1498 1521 -120620 1698 1707 -120620 1648 1598 -120620 1696 1598 -120620 1875 1598 -120640 1498 1521 -120640 1875 1696 -120640 1698 1707 -120640 1551 1269 -120640 1648 1598 -120640 1696 1598 -120640 1875 1598 -120660 1808 1441 -120660 1441 1617 -120660 1829 1886 -120660 1875 1696 -120660 1698 1707 -120660 1551 1269 -120660 1648 1598 -120660 1696 1598 -120660 1875 1598 -120680 1829 1886 -120680 1875 1696 -120680 1698 1707 -120680 1551 1269 -120680 1648 1598 -120680 1696 1598 -120680 1875 1598 -120700 1698 1707 -120700 1599 1512 -120700 1551 1269 -120700 1648 1598 -120700 1696 1598 -120700 1875 1598 -120720 1551 1269 -120720 1648 1598 -120720 1696 1598 -120720 1875 1598 -120740 1924 1478 -120740 1441 1857 -120740 1593 1512 -120740 1648 1598 -120740 1696 1598 -120740 1875 1598 -120760 1696 1598 -120760 1875 1598 -120780 1924 1478 -120780 1829 1886 -120780 1648 1598 -120780 1696 1598 -120780 1875 1598 -120780 1593 1512 -120800 1696 1875 -120800 1696 1598 -120800 1463 1628 -120800 1875 1598 -120800 1593 1512 -120820 1924 1478 -120820 1676 1761 -120820 1696 1598 -120820 1463 1628 -120820 1875 1598 -120820 1593 1512 -120840 1599 1882 -120840 1698 1707 -120840 1696 1875 -120860 1599 1882 -120860 1698 1707 -120860 1696 1875 -120880 1698 1707 -120880 1880 1905 -120880 1727 1845 -120880 1803 1623 -120880 1696 1875 -120880 1707 1453 -120880 1808 1595 -120900 1803 1623 -120900 1696 1875 -120900 1698 1453 -120900 1707 1453 -120900 1808 1595 -120920 1808 1595 -120920 1698 1707 -120940 1825 1519 -120940 1590 1771 -120940 1593 1787 -120960 1803 1623 -120960 1717 1598 -120960 1698 1707 -120960 1924 1478 -120960 1590 1771 -120960 1463 1628 -120960 1593 1787 -120980 1924 1478 -120980 1590 1771 -120980 1463 1628 -120980 1593 1787 -120980 1441 1617 -121000 1441 1617 -121000 1829 1886 -121000 1717 1857 -121000 1560 1580 -121020 1924 1478 -121020 1803 1623 -121020 1463 1628 -121020 1875 1519 -121020 1560 1580 -121040 1560 1580 -121040 1560 1461 -121040 1829 1886 -121060 1560 1580 -121060 1560 1461 -121060 1441 1617 -121060 1829 1886 -121060 1463 1628 -121060 1698 1707 -121080 1599 1512 -121080 1829 1886 -121080 1463 1628 -121080 1590 1771 -121080 1698 1707 -121100 1580 1560 -121100 1617 1628 -121100 1845 1727 -121100 1590 1771 -121100 1698 1707 -121120 1617 1628 -121120 1882 1512 -121120 1845 1727 -121120 1590 1771 -121120 1924 1478 -121120 1829 1886 -121120 1698 1707 -121140 1845 1727 -121140 1590 1771 -121140 1463 1628 -121140 1441 1617 -121140 1553 1519 -121140 1924 1478 -121140 1829 1886 -121140 1698 1707 -121160 1553 1519 -121160 1502 1906 -121160 1874 1906 -121160 1924 1478 -121160 1829 1886 -121160 1698 1707 -121180 1727 1659 -121180 1924 1478 -121180 1694 1617 -121180 1808 1829 -121180 1829 1886 -121180 1698 1707 -121200 1808 1886 -121200 1924 1478 -121200 1694 1617 -121200 1440 1854 -121200 1803 1623 -121200 1808 1829 -121200 1829 1886 -121200 1698 1707 -121220 1924 1478 -121220 1694 1617 -121220 1694 1441 -121220 1440 1854 -121220 1845 1659 -121220 1803 1623 -121220 1808 1829 -121220 1599 1512 -121220 1829 1886 -121220 1698 1707 -121240 1920 1598 -121240 1452 1453 -121240 1803 1623 -121240 1808 1829 -121240 1502 1906 -121240 1599 1512 -121240 1740 1761 -121240 1808 1886 -121240 1829 1886 -121240 1441 1617 -121240 1698 1707 -121260 1924 1478 -121260 1808 1886 -121260 1485 1529 -121260 1829 1886 -121260 1441 1617 -121260 1698 1707 -121280 1829 1886 -121280 1598 1920 -121280 1441 1617 -121280 1698 1707 -121300 1441 1617 -121300 1659 1845 -121300 1502 1906 -121300 1512 1599 -121300 1698 1707 -121320 1551 1697 -121320 1551 1269 -121320 1684 1595 -121320 1485 1529 -121320 1502 1906 -121320 1512 1599 -121320 1698 1707 -121340 1433 1845 -121340 1857 1617 -121340 1920 1598 -121340 1829 1886 -121340 1502 1906 -121340 1512 1599 -121340 1698 1707 -121360 1857 1617 -121360 1857 1441 -121360 1628 1886 -121360 1920 1598 -121360 1829 1886 -121360 1502 1906 -121360 1512 1599 -121360 1698 1707 -121380 1920 1598 -121380 1684 1595 -121380 1825 1519 -121380 1441 1617 -121380 1829 1886 -121380 1882 1512 -121380 1502 1906 -121380 1512 1599 -121380 1698 1707 -121400 1502 1906 -121400 1698 1453 -121400 1512 1599 -121400 1551 1269 -121400 1441 1857 -121400 1698 1707 -121420 1697 1551 -121420 1882 1512 -121420 1551 1269 -121420 1684 1595 -121420 1441 1857 -121420 1698 1707 -121440 1551 1269 -121440 1684 1595 -121440 1599 1512 -121440 1727 1845 -121440 1485 1529 -121440 1829 1886 -121440 1441 1857 -121440 1502 1906 -121440 1698 1707 -121460 1829 1886 -121460 1441 1857 -121460 1552 1761 -121460 1502 1906 -121460 1698 1453 -121460 1698 1707 -121480 1441 1857 -121480 1552 1761 -121480 1502 1906 -121480 1698 1453 -121480 1590 1771 -121480 1599 1512 -121480 1698 1707 -121500 1727 1845 -121500 1829 1886 -121500 1698 1707 -121520 1599 1512 -121520 1502 1906 -121520 1698 1707 -121540 1698 1453 -121540 1453 1492 -121540 1441 1617 -121540 1829 1886 -121540 1698 1707 -121560 1551 1269 -121560 1502 1906 -121560 1599 1512 -121560 1718 1889 -121560 1829 1886 -121560 1845 1727 -121560 1698 1707 -121580 1920 1598 -121580 1829 1886 -121580 1845 1727 -121580 1698 1707 -121600 1502 1906 -121600 1920 1598 -121600 1829 1886 -121600 1845 1727 -121600 1698 1707 -121620 1920 1598 -121620 1551 1269 -121620 1684 1617 -121620 1560 1880 -121620 1825 1628 -121620 1829 1886 -121620 1845 1727 -121620 1698 1707 -121640 1825 1628 -121640 1829 1886 -121640 1599 1882 -121640 1850 1868 -121640 1857 1617 -121640 1441 1684 -121640 1845 1727 -121640 1698 1707 -121660 1698 1453 -121660 1850 1868 -121660 1857 1617 -121660 1593 1592 -121660 1441 1684 -121660 1560 1880 -121660 1502 1906 -121660 1845 1727 -121660 1485 1529 -121660 1698 1707 -121680 1441 1684 -121680 1560 1880 -121680 1502 1906 -121680 1845 1727 -121680 1485 1529 -121680 1698 1707 -121700 1502 1906 -121700 1845 1727 -121700 1850 1868 -121700 1485 1529 -121700 1698 1707 -121720 1767 1684 -121720 1697 1269 -121720 1850 1868 -121720 1551 1269 -121720 1512 1599 -121720 1771 1914 -121720 1485 1529 -121720 1560 1880 -121720 1698 1707 -121740 1803 1623 -121740 1698 1453 -121740 1485 1529 -121740 1560 1880 -121740 1441 1767 -121740 1502 1906 -121740 1698 1707 -121760 1580 1448 -121760 1560 1880 -121760 1441 1767 -121760 1727 1845 -121760 1868 1850 -121760 1502 1906 -121760 1698 1707 -121760 1551 1269 -121760 1857 1617 -121780 1694 1696 -121780 1698 1707 -121780 1829 1886 -121780 1551 1269 -121780 1857 1617 -121800 1599 1512 -121800 1857 1617 -121820 1599 1531 -121820 1502 1906 -121820 1694 1696 -121820 1829 1886 -121820 1857 1617 -121840 1857 1617 -121840 1551 1269 -121860 1684 1770 -121860 1694 1696 -121860 1825 1875 -121860 1699 1551 -121860 1593 1880 -121860 1551 1269 -121860 1502 1906 -121860 1512 1599 -121860 1698 1707 -121880 1924 1478 -121880 1684 1628 -121880 1684 1463 -121880 1829 1886 -121880 1502 1906 -121880 1512 1599 -121880 1617 1857 -121880 1698 1707 -121880 1727 1845 -121900 1694 1696 -121900 1583 1519 -121900 1551 1269 -121900 1617 1857 -121900 1698 1707 -121900 1727 1845 -121920 1583 1519 -121920 1441 1617 -121920 1551 1269 -121920 1617 1857 -121920 1698 1707 -121920 1727 1845 -121940 1551 1269 -121940 1617 1857 -121940 1698 1707 -121940 1727 1845 -121960 1920 1915 -121960 1684 1628 -121960 1696 1648 -121960 1829 1886 -121960 1583 1519 -121960 1512 1599 -121960 1617 1857 -121960 1441 1617 -121960 1698 1707 -121960 1727 1845 -121980 1574 1527 -121980 1875 1770 -121980 1617 1857 -121980 1441 1617 -121980 1698 1707 -121980 1727 1845 -122000 1599 1512 -122000 1599 1882 -122000 1617 1857 -122000 1920 1915 -122000 1441 1617 -122000 1698 1707 -122000 1727 1845 -122000 1551 1269 -122020 1920 1915 -122020 1441 1617 -122020 1792 1885 -122020 1698 1707 -122020 1829 1886 -122020 1727 1845 -122020 1769 1657 -122020 1551 1269 -122040 1792 1885 -122040 1698 1707 -122040 1829 1886 -122040 1727 1845 -122040 1769 1657 -122040 1551 1269 -122060 1441 1880 -122060 1882 1599 -122060 1769 1657 -122060 1551 1269 -122080 1803 1623 -122080 1684 1770 -122080 1885 1638 -122080 1684 1855 -122080 1551 1269 -122100 1684 1855 -122100 1845 1727 -122100 1920 1915 -122100 1551 1269 -122100 1707 1453 -122100 1698 1707 -122100 1792 1885 -122120 1920 1915 -122120 1551 1269 -122120 1529 1485 -122120 1707 1453 -122120 1599 1882 -122120 1498 1755 -122120 1885 1638 -122120 1698 1707 -122120 1792 1885 -122120 1574 1887 -122140 1698 1707 -122140 1792 1885 -122140 1574 1887 -122160 1920 1727 -122160 1698 1707 -122160 1885 1529 -122160 1502 1906 -122160 1792 1885 -122160 1574 1887 -122160 1915 1920 -122160 1583 1519 -122180 1551 1269 -122180 1792 1885 -122180 1574 1887 -122180 1915 1920 -122180 1583 1519 -122180 1684 1855 -122200 1599 1512 -122200 1599 1882 -122200 1465 1789 -122200 1792 1885 -122200 1727 1845 -122200 1574 1887 -122200 1915 1920 -122200 1583 1519 -122200 1684 1855 -122220 1792 1885 -122220 1502 1906 -122220 1727 1845 -122220 1574 1887 -122220 1915 1920 -122220 1583 1519 -122220 1684 1855 -122240 1574 1887 -122240 1770 1792 -122240 1880 1885 -122240 1915 1920 -122240 1583 1519 -122240 1684 1855 -122260 1435 1755 -122260 1696 1875 -122260 1583 1519 -122260 1519 1885 -122260 1583 1792 -122260 1880 1628 -122260 1583 1885 -122260 1551 1269 -122260 1684 1855 -122260 1707 1698 -122280 1575 1679 -122280 1583 1792 -122280 1880 1628 -122280 1727 1845 -122280 1583 1885 -122280 1551 1269 -122280 1684 1855 -122280 1707 1698 -122300 1880 1628 -122300 1502 1906 -122300 1727 1845 -122300 1792 1885 -122300 1583 1885 -122300 1583 1519 -122300 1700 1598 -122300 1551 1269 -122300 1684 1855 -122300 1707 1698 -122320 1792 1885 -122320 1792 1583 -122320 1583 1884 -122320 1583 1885 -122320 1583 1519 -122320 1700 1598 -122320 1551 1269 -122320 1684 1855 -122320 1855 1770 -122320 1707 1698 -122340 1551 1269 -122340 1684 1855 -122340 1599 1519 -122340 1855 1770 -122340 1707 1698 -122340 1583 1599 -122360 1792 1885 -122360 1707 1698 -122360 1583 1519 -122360 1583 1599 -122380 1920 1700 -122380 1707 1698 -122380 1551 1269 -122380 1825 1599 -122380 1599 1519 -122380 1583 1519 -122380 1845 1727 -122380 1583 1599 -122400 1583 1519 -122400 1845 1727 -122400 1679 1885 -122400 1825 1519 -122400 1792 1770 -122400 1583 1599 -122400 1792 1885 -122420 1880 1825 -122420 1880 1583 -122420 1599 1825 -122420 1628 1463 -122420 1825 1519 -122420 1792 1770 -122420 1575 1770 -122420 1551 1269 -122420 1583 1599 -122420 1792 1885 -122420 1792 1575 -122420 1575 1885 -122440 1792 1770 -122440 1575 1770 -122440 1583 1825 -122440 1679 1770 -122440 1885 1770 -122440 1698 1707 -122440 1551 1269 -122440 1583 1599 -122440 1792 1885 -122440 1792 1575 -122440 1575 1885 -122460 1599 1825 -122460 1698 1707 -122460 1551 1269 -122460 1583 1599 -122460 1792 1885 -122460 1792 1575 -122460 1575 1885 -122480 1684 1855 -122480 1551 1269 -122480 1677 1701 -122480 1583 1599 -122480 1792 1885 -122480 1792 1575 -122480 1575 1885 -122500 1551 1269 -122500 1583 1825 -122500 1592 1433 -122500 1599 1825 -122500 1677 1701 -122500 1924 1478 -122500 1583 1599 -122500 1792 1885 -122500 1792 1575 -122500 1575 1885 -122520 1727 1845 -122520 1583 1599 -122520 1698 1707 -122520 1792 1885 -122520 1792 1575 -122520 1575 1885 -122540 1583 1599 -122540 1698 1707 -122540 1792 1885 -122540 1792 1575 -122540 1575 1885 -122560 1803 1623 -122560 1551 1269 -122560 1727 1845 -122560 1463 1599 -122560 1698 1707 -122560 1599 1628 -122560 1792 1885 -122560 1792 1575 -122560 1575 1885 -122560 1825 1583 -122580 1924 1478 -122580 1698 1707 -122580 1599 1628 -122580 1825 1519 -122580 1792 1885 -122580 1792 1575 -122580 1575 1885 -122580 1825 1583 -122600 1599 1628 -122600 1583 1519 -122600 1727 1845 -122600 1825 1519 -122600 1551 1269 -122600 1792 1885 -122600 1599 1437 -122600 1792 1575 -122600 1575 1885 -122600 1825 1583 -122620 1684 1857 -122620 1727 1845 -122620 1825 1519 -122620 1551 1269 -122620 1792 1885 -122620 1599 1437 -122620 1792 1575 -122620 1575 1885 -122620 1829 1886 -122620 1825 1583 -122640 1679 1792 -122640 1727 1845 -122640 1825 1519 -122640 1921 1462 -122640 1551 1269 -122640 1583 1519 -122640 1628 1767 -122640 1792 1885 -122640 1599 1437 -122640 1792 1575 -122640 1575 1885 -122640 1829 1886 -122640 1825 1583 -122660 1551 1269 -122660 1583 1519 -122660 1628 1767 -122660 1792 1885 -122660 1599 1437 -122660 1684 1857 -122660 1792 1575 -122660 1575 1885 -122660 1829 1886 -122660 1825 1583 -122680 1599 1437 -122680 1684 1857 -122680 1792 1575 -122680 1575 1885 -122680 1829 1886 -122680 1825 1583 -122700 1792 1575 -122700 1575 1885 -122700 1628 1767 -122700 1829 1886 -122700 1583 1519 -122700 1882 1920 -122700 1699 1886 -122700 1825 1583 -122720 1845 1727 -122720 1628 1767 -122720 1924 1478 -122720 1829 1886 -122720 1699 1829 -122720 1583 1519 -122720 1882 1920 -122720 1699 1886 -122720 1825 1583 -122740 1924 1478 -122740 1829 1886 -122740 1463 1628 -122740 1792 1885 -122740 1699 1829 -122740 1595 1767 -122740 1583 1519 -122740 1882 1920 -122740 1906 1502 -122740 1699 1886 -122740 1825 1583 -122760 1551 1269 -122760 1592 1880 -122760 1771 1914 -122760 1792 1885 -122760 1699 1829 -122760 1845 1727 -122760 1595 1767 -122760 1583 1519 -122760 1882 1920 -122760 1906 1502 -122760 1699 1886 -122760 1825 1583 -122780 1792 1885 -122780 1699 1829 -122780 1845 1727 -122780 1595 1767 -122780 1583 1519 -122780 1882 1920 -122780 1906 1502 -122780 1699 1886 -122780 1825 1583 -122800 1583 1519 -122800 1882 1920 -122800 1551 1269 -122800 1906 1502 -122800 1699 1886 -122800 1825 1583 -122800 1829 1886 -122820 1579 1500 -122820 1595 1767 -122820 1789 1465 -122820 1918 1500 -122820 1551 1269 -122820 1906 1502 -122820 1699 1829 -122820 1699 1886 -122820 1825 1583 -122820 1829 1886 -122840 1583 1519 -122840 1628 1463 -122840 1727 1845 -122840 1551 1269 -122840 1906 1502 -122840 1699 1829 -122840 1699 1886 -122840 1825 1583 -122840 1829 1886 -122860 1551 1269 -122860 1608 1530 -122860 1918 1495 -122860 1789 1465 -122860 1906 1502 -122860 1699 1829 -122860 1699 1886 -122860 1825 1583 -122860 1829 1886 -122880 1590 1871 -122880 1707 1453 -122880 1789 1465 -122880 1906 1502 -122880 1825 1519 -122880 1699 1829 -122880 1699 1886 -122880 1825 1583 -122880 1829 1886 -122900 1551 1269 -122900 1825 1519 -122900 1583 1519 -122900 1699 1829 -122900 1699 1886 -122900 1825 1583 -122900 1829 1886 -122920 1555 1734 -122920 1595 1767 -122920 1608 1530 -122920 1614 1698 -122920 1633 1465 -122920 1707 1492 -122920 1825 1519 -122920 1428 1495 -122920 1583 1519 -122920 1699 1829 -122920 1699 1886 -122920 1698 1707 -122920 1825 1583 -122920 1829 1886 -122940 1551 1269 -122940 1623 1894 -122940 1698 1473 -122940 1698 1894 -122940 1707 1465 -122940 1707 1771 -122940 1789 1465 -122940 1866 1452 -122940 1874 1502 -122940 1894 1452 -122940 1906 1502 -122940 1452 1492 -122940 1465 1492 -122940 1583 1519 -122940 1699 1829 -122940 1699 1886 -122940 1698 1707 -122940 1825 1583 -122940 1829 1886 -122960 1583 1519 -122960 1595 1767 -122960 1699 1829 -122960 1699 1886 -122960 1862 1486 -122960 1892 1898 -122960 1698 1707 -122960 1894 1492 -122960 1825 1583 -122960 1829 1886 -122980 1698 1707 -122980 1825 1884 -122980 1894 1492 -122980 1825 1583 -122980 1829 1886 -123000 1628 1463 -123000 1477 1892 -123000 1892 1898 -123000 1825 1583 -123000 1829 1886 -123020 1551 1269 -123020 1825 1519 -123020 1892 1898 -123020 1825 1583 -123020 1829 1886 -123040 1465 1735 -123040 1700 1659 -123040 1590 1871 -123040 1892 1898 -123040 1825 1583 -123040 1829 1886 -123060 1687 1841 -123060 1628 1463 -123060 1825 1519 -123060 1583 1519 -123060 1825 1583 -123060 1829 1886 -123080 1583 1525 -123080 1628 1463 -123080 1687 1901 -123080 1825 1519 -123080 1583 1519 -123080 1825 1583 -123080 1829 1886 -123100 1551 1269 -123100 1740 1919 -123100 1825 1519 -123100 1583 1519 -123100 1825 1583 -123100 1829 1886 -123120 1880 1886 -123120 1813 1659 -123120 1841 1901 -123120 1477 1892 -123120 1583 1519 -123120 1825 1583 -123120 1829 1886 -123140 1664 1821 -123140 1583 1519 -123140 1593 1787 -123140 1892 1898 -123140 1551 1269 -123140 1829 1880 -123140 1463 1628 -123140 1749 1757 -123140 1684 1441 -123140 1825 1583 -123140 1829 1886 -123160 1551 1269 -123160 1829 1880 -123160 1463 1628 -123160 1477 1898 -123160 1880 1886 -123160 1698 1707 -123160 1749 1757 -123160 1684 1441 -123160 1825 1583 -123160 1829 1886 -123180 1551 1882 -123180 1593 1512 -123180 1477 1898 -123180 1880 1886 -123180 1813 1659 -123180 1698 1707 -123180 1749 1757 -123180 1684 1441 -123180 1825 1519 -123180 1583 1519 -123180 1825 1583 -123180 1829 1886 -123200 1670 1908 -123200 1813 1659 -123200 1698 1707 -123200 1749 1757 -123200 1684 1441 -123200 1825 1519 -123200 1583 1519 -123200 1825 1583 -123200 1829 1886 -123220 1808 1908 -123220 1684 1441 -123220 1439 1453 -123220 1884 1825 -123220 1477 1892 -123220 1825 1519 -123220 1892 1898 -123220 1583 1519 -123220 1825 1583 -123220 1829 1886 -123220 1551 1269 -123240 1549 1825 -123240 1811 1876 -123240 1583 1519 -123240 1825 1583 -123240 1829 1886 -123240 1551 1269 -123260 1813 1659 -123260 1825 1583 -123260 1884 1583 -123260 1684 1628 -123260 1829 1886 -123260 1670 1908 -123260 1551 1269 -123280 1549 1825 -123280 1453 1439 -123280 1684 1628 -123280 1816 1881 -123280 1829 1886 -123280 1670 1908 -123280 1551 1269 -123300 1684 1628 -123300 1816 1881 -123300 1796 1899 -123300 1829 1886 -123300 1670 1908 -123300 1551 1269 -123300 1694 1880 -123320 1670 1908 -123320 1551 1269 -123320 1694 1880 -123320 1583 1525 -123340 1670 1908 -123340 1551 1269 -123340 1694 1880 -123340 1583 1525 -123360 1670 1908 -123360 1825 1519 -123360 1549 1884 -123360 1551 1269 -123360 1694 1880 -123360 1583 1525 -123380 1549 1884 -123380 1551 1269 -123380 1684 1767 -123380 1813 1659 -123380 1583 1825 -123380 1829 1886 -123380 1694 1880 -123380 1583 1525 -123400 1684 1617 -123400 1816 1721 -123400 1816 1881 -123400 1816 1823 -123400 1829 1886 -123400 1694 1880 -123400 1583 1525 -123420 1816 1823 -123420 1439 1453 -123420 1829 1886 -123420 1694 1880 -123420 1583 1525 -123440 1439 1453 -123440 1704 1643 -123440 1829 1886 -123440 1694 1880 -123440 1583 1525 -123460 1670 1908 -123460 1684 1617 -123460 1761 1643 -123460 1551 1269 -123460 1531 1512 -123460 1829 1886 -123460 1813 1659 -123460 1694 1880 -123460 1583 1525 -123480 1551 1269 -123480 1531 1512 -123480 1829 1886 -123480 1439 1453 -123480 1813 1659 -123480 1694 1880 -123480 1583 1525 -123500 1549 1583 -123500 1684 1441 -123500 1439 1453 -123500 1704 1643 -123500 1813 1659 -123500 1694 1880 -123500 1531 1599 -123500 1583 1525 -123520 1670 1908 -123520 1813 1659 -123520 1694 1880 -123520 1531 1599 -123520 1583 1525 -123540 1813 1704 -123540 1813 1659 -123540 1694 1880 -123540 1531 1599 -123540 1583 1525 -123560 1684 1463 -123560 1694 1880 -123560 1512 1531 -123560 1829 1886 -123560 1599 1512 -123560 1531 1599 -123560 1583 1525 -123580 1829 1886 -123580 1599 1512 -123580 1920 1704 -123580 1920 1643 -123580 1628 1783 -123580 1531 1599 -123580 1583 1525 -123600 1920 1704 -123600 1920 1643 -123600 1628 1783 -123600 1628 1463 -123600 1531 1599 -123600 1704 1643 -123600 1583 1525 -123600 1694 1829 -123620 1884 1583 -123620 1549 1583 -123620 1704 1643 -123620 1670 1908 -123620 1540 1542 -123620 1583 1525 -123620 1694 1829 -123640 1540 1542 -123640 1593 1521 -123640 1583 1525 -123640 1694 1829 -123660 1825 1519 -123660 1704 1839 -123660 1670 1908 -123660 1583 1525 -123660 1704 1643 -123660 1694 1829 -123680 1670 1908 -123680 1884 1583 -123680 1583 1525 -123680 1549 1583 -123680 1704 1643 -123680 1684 1908 -123680 1694 1829 -123700 1549 1583 -123700 1704 1643 -123700 1684 1908 -123700 1783 1531 -123700 1694 1829 -123720 1670 1684 -123720 1808 1628 -123720 1808 1583 -123720 1583 1767 -123720 1704 1643 -123720 1684 1908 -123720 1783 1531 -123720 1694 1886 -123720 1694 1829 -123720 1829 1886 -123740 1684 1908 -123740 1439 1453 -123740 1583 1463 -123740 1783 1531 -123740 1694 1886 -123740 1694 1829 -123740 1829 1886 -123760 1808 1628 -123760 1813 1659 -123760 1549 1525 -123760 1694 1886 -123760 1694 1829 -123760 1829 1886 -123780 1679 1575 -123780 1808 1583 -123780 1549 1525 -123780 1694 1886 -123780 1694 1829 -123780 1583 1519 -123780 1684 1908 -123780 1829 1886 -123800 1628 1808 -123800 1813 1659 -123800 1463 1531 -123800 1549 1525 -123800 1694 1886 -123800 1531 1628 -123800 1694 1829 -123800 1583 1519 -123800 1684 1908 -123800 1829 1886 -123820 1670 1908 -123820 1549 1525 -123820 1694 1886 -123820 1531 1628 -123820 1694 1829 -123820 1583 1519 -123820 1684 1908 -123820 1829 1886 -123820 1583 1531 -123840 1670 1684 -123840 1813 1659 -123840 1694 1829 -123840 1583 1519 -123840 1583 1825 -123840 1531 1825 -123840 1463 1628 -123840 1593 1521 -123840 1684 1908 -123840 1829 1886 -123840 1583 1531 -123860 1924 1808 -123860 1583 1825 -123860 1531 1825 -123860 1463 1628 -123860 1593 1521 -123860 1549 1525 -123860 1825 1519 -123860 1684 1908 -123860 1829 1886 -123860 1583 1531 -123880 1593 1521 -123880 1670 1684 -123880 1549 1525 -123880 1825 1519 -123880 1684 1908 -123880 1829 1886 -123880 1583 1531 -123900 1670 1684 -123900 1549 1525 -123900 1825 1519 -123900 1575 1704 -123900 1583 1519 -123900 1684 1908 -123900 1583 1825 -123900 1531 1825 -123900 1829 1886 -123900 1670 1908 -123900 1583 1531 -123920 1531 1519 -123920 1825 1519 -123920 1575 1704 -123920 1583 1519 -123920 1684 1908 -123920 1583 1825 -123920 1531 1825 -123920 1829 1886 -123920 1670 1908 -123920 1583 1531 -123920 1593 1521 -123920 1599 1882 -123940 1924 1478 -123940 1549 1825 -123940 1684 1908 -123940 1583 1825 -123940 1694 1886 -123940 1531 1825 -123940 1549 1525 -123940 1857 1617 -123940 1829 1886 -123940 1670 1908 -123940 1583 1531 -123940 1593 1521 -123940 1599 1882 -123960 1549 1525 -123960 1679 1643 -123960 1813 1659 -123960 1857 1617 -123960 1441 1617 -123960 1829 1886 -123960 1670 1684 -123960 1670 1908 -123960 1575 1704 -123960 1575 1643 -123960 1583 1531 -123960 1593 1521 -123960 1599 1882 -123980 1441 1617 -123980 1829 1886 -123980 1670 1684 -123980 1670 1908 -123980 1684 1908 -123980 1575 1704 -123980 1575 1643 -123980 1583 1531 -123980 1593 1521 -123980 1599 1882 -124000 1829 1643 -124000 1829 1886 -124000 1704 1886 -124000 1670 1684 -124000 1670 1908 -124000 1684 1908 -124000 1575 1704 -124000 1575 1643 -124000 1583 1531 -124000 1593 1521 -124000 1599 1882 -124020 1441 1617 -124020 1857 1617 -124020 1670 1684 -124020 1670 1908 -124020 1684 1908 -124020 1575 1704 -124020 1575 1643 -124020 1583 1531 -124020 1593 1521 -124020 1599 1882 -124020 1825 1519 -124040 1549 1829 -124040 1825 1531 -124040 1441 1617 -124040 1441 1857 -124040 1463 1767 -124040 1857 1617 -124040 1670 1684 -124040 1670 1908 -124040 1684 1908 -124040 1575 1704 -124040 1575 1643 -124040 1583 1531 -124040 1593 1521 -124040 1599 1882 -124040 1829 1886 -124040 1825 1519 -124060 1670 1684 -124060 1670 1908 -124060 1684 1908 -124060 1813 1659 -124060 1575 1704 -124060 1575 1643 -124060 1583 1531 -124060 1593 1521 -124060 1599 1882 -124060 1829 1886 -124060 1825 1519 -124080 1704 1643 -124080 1575 1704 -124080 1575 1643 -124080 1583 1531 -124080 1593 1521 -124080 1599 1882 -124080 1829 1886 -124080 1825 1519 -124100 1575 1704 -124100 1575 1643 -124100 1583 1531 -124100 1593 1521 -124100 1599 1882 -124100 1829 1886 -124100 1825 1519 -124120 1531 1829 -124120 1829 1525 -124120 1583 1531 -124120 1684 1783 -124120 1593 1521 -124120 1599 1882 -124120 1670 1908 -124120 1829 1886 -124120 1825 1519 -124140 1829 1563 -124140 1575 1643 -124140 1583 1531 -124140 1684 1783 -124140 1593 1521 -124140 1599 1882 -124140 1670 1908 -124140 1829 1886 -124140 1825 1519 -124140 1441 1617 -124160 1575 1704 -124160 1704 1643 -124160 1583 1531 -124160 1684 1783 -124160 1563 1592 -124160 1593 1521 -124160 1599 1882 -124160 1670 1908 -124160 1829 1886 -124160 1825 1519 -124160 1441 1617 -124180 1684 1783 -124180 1563 1592 -124180 1593 1521 -124180 1825 1583 -124180 1599 1882 -124180 1670 1908 -124180 1829 1886 -124180 1825 1519 -124180 1441 1617 -124200 1825 1583 -124200 1583 1525 -124200 1583 1519 -124200 1599 1882 -124200 1670 1908 -124200 1829 1886 -124200 1825 1519 -124200 1441 1617 -124220 1920 1563 -124220 1920 1643 -124220 1563 1592 -124220 1599 1882 -124220 1553 1583 -124220 1670 1908 -124220 1829 1886 -124220 1825 1519 -124220 1441 1617 -124240 1563 1592 -124240 1599 1882 -124240 1553 1583 -124240 1825 1583 -124240 1583 1519 -124240 1670 1908 -124240 1829 1886 -124240 1825 1519 -124240 1441 1617 -124260 1553 1825 -124260 1553 1583 -124260 1813 1659 -124260 1825 1583 -124260 1583 1519 -124260 1670 1908 -124260 1829 1886 -124260 1825 1519 -124260 1441 1617 -124280 1670 1908 -124280 1829 1886 -124280 1549 1583 -124280 1825 1519 -124280 1441 1617 -124280 1583 1525 -124300 1829 1886 -124300 1549 1583 -124300 1825 1519 -124300 1531 1783 -124300 1441 1617 -124300 1583 1525 -124320 1684 1840 -124320 1829 1886 -124320 1549 1583 -124320 1825 1519 -124320 1531 1783 -124320 1441 1617 -124320 1549 1525 -124320 1583 1525 -124320 1670 1908 -124340 1669 1754 -124340 1549 1583 -124340 1825 1519 -124340 1840 1463 -124340 1531 1783 -124340 1704 1643 -124340 1441 1617 -124340 1593 1521 -124340 1549 1525 -124340 1583 1525 -124340 1670 1908 -124360 1825 1884 -124360 1704 1643 -124360 1884 1583 -124360 1441 1617 -124360 1593 1521 -124360 1825 1525 -124360 1884 1525 -124360 1549 1525 -124360 1583 1825 -124360 1583 1525 -124360 1670 1908 -124360 1829 1886 -124380 1531 1783 -124380 1441 1617 -124380 1549 1825 -124380 1593 1521 -124380 1825 1525 -124380 1884 1525 -124380 1549 1525 -124380 1583 1825 -124380 1583 1525 -124380 1549 1583 -124380 1825 1519 -124380 1670 1908 -124380 1829 1886 -124400 1549 1825 -124400 1593 1521 -124400 1599 1512 -124400 1825 1884 -124400 1825 1525 -124400 1884 1525 -124400 1549 1525 -124400 1583 1884 -124400 1857 1441 -124400 1583 1825 -124400 1583 1525 -124400 1583 1519 -124400 1549 1583 -124400 1825 1519 -124400 1670 1908 -124400 1829 1886 -124420 1549 1525 -124420 1704 1643 -124420 1583 1884 -124420 1857 1441 -124420 1549 1519 -124420 1583 1825 -124420 1583 1525 -124420 1583 1519 -124420 1549 1583 -124420 1825 1519 -124420 1519 1525 -124420 1670 1908 -124420 1441 1617 -124420 1829 1886 -124440 1669 1754 -124440 1549 1825 -124440 1549 1519 -124440 1583 1825 -124440 1825 1884 -124440 1583 1525 -124440 1583 1519 -124440 1549 1583 -124440 1593 1521 -124440 1825 1519 -124440 1519 1525 -124440 1670 1908 -124440 1840 1767 -124440 1441 1617 -124440 1829 1886 -124460 1583 1525 -124460 1583 1519 -124460 1531 1783 -124460 1549 1583 -124460 1583 1884 -124460 1593 1521 -124460 1825 1519 -124460 1519 1525 -124460 1670 1908 -124460 1840 1767 -124460 1441 1617 -124460 1829 1886 -124480 1669 1754 -124480 1549 1583 -124480 1549 1519 -124480 1704 1643 -124480 1583 1884 -124480 1593 1521 -124480 1825 1519 -124480 1519 1525 -124480 1670 1908 -124480 1583 1825 -124480 1840 1767 -124480 1441 1617 -124480 1829 1886 -124500 1563 1592 -124500 1825 1519 -124500 1519 1525 -124500 1670 1908 -124500 1882 1531 -124500 1549 1825 -124500 1583 1825 -124500 1840 1767 -124500 1441 1617 -124500 1829 1886 -124520 1670 1908 -124520 1732 1754 -124520 1882 1531 -124520 1549 1825 -124520 1583 1825 -124520 1840 1767 -124520 1593 1521 -124520 1549 1583 -124520 1441 1617 -124520 1829 1886 -124540 1549 1825 -124540 1563 1592 -124540 1583 1825 -124540 1840 1767 -124540 1512 1531 -124540 1593 1521 -124540 1549 1583 -124540 1441 1617 -124540 1704 1643 -124540 1829 1886 -124560 1593 1521 -124560 1594 1475 -124560 1670 1908 -124560 1549 1583 -124560 1441 1617 -124560 1704 1643 -124560 1829 1886 -124580 1593 1521 -124580 1594 1475 -124580 1670 1908 -124580 1512 1531 -124580 1549 1825 -124580 1549 1583 -124580 1583 1825 -124580 1882 1531 -124580 1441 1617 -124580 1704 1643 -124580 1829 1886 -124600 1670 1908 -124600 1512 1531 -124600 1549 1825 -124600 1549 1583 -124600 1583 1825 -124600 1882 1531 -124600 1441 1617 -124600 1704 1643 -124600 1829 1886 -124620 1549 1825 -124620 1549 1583 -124620 1583 1825 -124620 1829 1908 -124620 1593 1521 -124620 1882 1531 -124620 1783 1531 -124620 1441 1617 -124620 1704 1643 -124620 1829 1886 -124640 1441 1617 -124640 1512 1531 -124640 1704 1643 -124640 1463 1628 -124640 1829 1886 -124660 1924 1478 -124660 1678 1684 -124660 1704 1643 -124660 1463 1628 -124660 1583 1525 -124660 1829 1886 -124680 1563 1592 -124680 1463 1628 -124680 1599 1512 -124680 1583 1525 -124680 1829 1886 -124700 1684 1882 -124700 1704 1643 -124700 1882 1678 -124700 1583 1525 -124700 1840 1767 -124700 1678 1684 -124700 1829 1886 -124720 1576 1835 -124720 1599 1512 -124720 1563 1592 -124720 1583 1525 -124720 1840 1767 -124720 1463 1628 -124720 1678 1684 -124720 1825 1519 -124720 1829 1886 -124740 1563 1592 -124740 1704 1643 -124740 1583 1525 -124740 1840 1767 -124740 1463 1628 -124740 1835 1772 -124740 1678 1684 -124740 1825 1519 -124740 1829 1886 -124760 1924 1478 -124760 1829 1678 -124760 1576 1626 -124760 1835 1772 -124760 1678 1684 -124760 1890 1525 -124760 1825 1519 -124760 1678 1886 -124760 1626 1772 -124760 1835 1626 -124760 1829 1886 -124780 1678 1684 -124780 1628 1463 -124780 1840 1767 -124780 1890 1525 -124780 1825 1519 -124780 1678 1886 -124780 1626 1772 -124780 1835 1626 -124780 1704 1643 -124780 1829 1886 -124780 1806 1767 -124800 1825 1519 -124800 1829 1678 -124800 1678 1886 -124800 1835 1772 -124800 1626 1772 -124800 1835 1626 -124800 1583 1882 -124800 1704 1643 -124800 1829 1886 -124800 1806 1767 -124820 1549 1825 -124820 1549 1884 -124820 1806 1840 -124820 1835 1772 -124820 1840 1767 -124820 1626 1772 -124820 1835 1626 -124820 1583 1882 -124820 1704 1643 -124820 1829 1886 -124820 1806 1767 -124840 1835 1626 -124840 1583 1882 -124840 1628 1463 -124840 1829 1678 -124840 1704 1643 -124840 1829 1886 -124840 1806 1767 -124840 1890 1525 -124860 1583 1882 -124860 1628 1463 -124860 1857 1617 -124860 1829 1678 -124860 1704 1643 -124860 1678 1886 -124860 1829 1886 -124860 1806 1767 -124860 1890 1525 -124880 1549 1890 -124880 1829 1678 -124880 1704 1643 -124880 1678 1886 -124880 1829 1886 -124880 1806 1767 -124880 1890 1525 -124900 1924 1478 -124900 1829 1886 -124900 1592 1563 -124900 1806 1767 -124900 1890 1525 -124920 1806 1767 -124920 1857 1617 -124920 1890 1525 -124940 1806 1767 -124940 1704 1643 -124940 1857 1617 -124940 1890 1525 -124940 1829 1886 -124960 1924 1478 -124960 1890 1525 -124960 1825 1519 -124960 1829 1886 -124980 1924 1478 -124980 1549 1519 -124980 1890 1525 -124980 1549 1825 -124980 1825 1519 -124980 1829 1886 -124980 1806 1767 -125000 1549 1825 -125000 1825 1519 -125000 1829 1886 -125000 1806 1767 -125020 1704 1643 -125020 1829 1886 -125020 1563 1592 -125020 1857 1617 -125020 1890 1525 -125020 1806 1767 -125040 1441 1617 -125040 1829 1886 -125040 1563 1592 -125040 1857 1617 -125040 1890 1525 -125040 1825 1519 -125040 1806 1767 -125060 1563 1592 -125060 1704 1643 -125060 1857 1617 -125060 1890 1525 -125060 1825 1519 -125060 1806 1767 -125080 1704 1643 -125080 1583 1882 -125080 1857 1617 -125080 1890 1525 -125080 1825 1519 -125080 1806 1767 -125100 1890 1525 -125100 1825 1519 -125100 1806 1767 -125120 1669 1754 -125120 1549 1525 -125120 1704 1643 -125120 1890 1525 -125120 1521 1787 -125120 1829 1886 -125120 1857 1617 -125120 1825 1519 -125120 1806 1767 -125140 1829 1886 -125140 1840 1806 -125140 1840 1767 -125140 1857 1617 -125140 1825 1519 -125140 1806 1767 -125160 1549 1525 -125160 1857 1617 -125160 1521 1787 -125160 1592 1563 -125160 1825 1519 -125160 1806 1767 -125160 1441 1617 -125180 1592 1563 -125180 1890 1525 -125180 1825 1519 -125180 1806 1767 -125180 1441 1617 -125200 1549 1890 -125200 1592 1563 -125200 1890 1525 -125200 1825 1519 -125200 1806 1767 -125200 1441 1617 -125220 1549 1890 -125220 1592 1563 -125220 1890 1525 -125220 1521 1787 -125220 1825 1519 -125220 1704 1643 -125220 1806 1767 -125220 1441 1617 -125240 1825 1519 -125240 1704 1643 -125240 1806 1767 -125240 1441 1617 -125260 1704 1643 -125260 1549 1890 -125260 1890 1525 -125260 1592 1563 -125260 1806 1767 -125260 1441 1617 -125280 1549 1890 -125280 1890 1525 -125280 1592 1563 -125280 1806 1767 -125280 1441 1617 -125280 1825 1519 -125300 1825 1884 -125300 1592 1563 -125300 1806 1767 -125300 1441 1617 -125300 1825 1519 -125320 1592 1563 -125320 1704 1643 -125320 1598 1628 -125320 1890 1525 -125320 1806 1767 -125320 1441 1617 -125320 1825 1519 -125340 1669 1754 -125340 1437 1840 -125340 1441 1857 -125340 1592 1563 -125340 1704 1643 -125340 1598 1628 -125340 1890 1525 -125340 1806 1767 -125340 1441 1617 -125340 1825 1519 -125360 1694 1617 -125360 1592 1563 -125360 1857 1617 -125360 1694 1857 -125360 1704 1643 -125360 1598 1628 -125360 1890 1525 -125360 1806 1767 -125360 1441 1617 -125360 1678 1684 -125360 1825 1519 -125380 1669 1754 -125380 1549 1525 -125380 1694 1857 -125380 1704 1643 -125380 1598 1628 -125380 1583 1882 -125380 1890 1525 -125380 1806 1767 -125380 1441 1617 -125380 1678 1684 -125380 1825 1519 -125400 1583 1882 -125400 1890 1525 -125400 1806 1767 -125400 1441 1617 -125400 1678 1684 -125400 1563 1592 -125400 1825 1519 -125420 1583 1882 -125420 1890 1525 -125420 1806 1767 -125420 1441 1617 -125420 1628 1463 -125420 1704 1643 -125420 1678 1684 -125420 1563 1592 -125420 1825 1519 -125440 1563 1839 -125440 1806 1767 -125440 1441 1617 -125440 1628 1463 -125440 1704 1643 -125440 1678 1684 -125440 1563 1592 -125440 1825 1519 -125460 1669 1754 -125460 1583 1882 -125460 1441 1641 -125460 1617 1641 -125460 1806 1767 -125460 1441 1617 -125460 1628 1463 -125460 1704 1643 -125460 1678 1684 -125460 1563 1592 -125460 1825 1519 -125480 1679 1575 -125480 1441 1617 -125480 1890 1525 -125480 1628 1463 -125480 1599 1882 -125480 1704 1643 -125480 1678 1684 -125480 1563 1592 -125480 1825 1519 -125500 1583 1882 -125500 1441 1617 -125500 1617 1806 -125500 1890 1525 -125500 1628 1463 -125500 1840 1598 -125500 1599 1882 -125500 1704 1643 -125500 1678 1684 -125500 1549 1525 -125500 1563 1592 -125500 1825 1519 -125520 1628 1463 -125520 1840 1598 -125520 1599 1882 -125520 1704 1643 -125520 1512 1531 -125520 1678 1684 -125520 1549 1525 -125520 1563 1592 -125520 1825 1519 -125540 1704 1643 -125540 1512 1531 -125540 1678 1684 -125540 1549 1525 -125540 1563 1592 -125540 1825 1519 -125560 1678 1684 -125560 1583 1882 -125560 1549 1890 -125560 1890 1525 -125560 1549 1525 -125560 1563 1592 -125560 1825 1519 -125580 1549 1890 -125580 1890 1525 -125580 1549 1525 -125580 1825 1463 -125580 1704 1643 -125580 1563 1592 -125580 1825 1519 -125600 1549 1525 -125600 1825 1463 -125600 1704 1643 -125600 1563 1592 -125600 1825 1519 -125620 1563 1592 -125620 1599 1882 -125620 1890 1525 -125620 1825 1519 -125640 1678 1592 -125640 1678 1839 -125640 1563 1592 -125640 1599 1882 -125640 1890 1525 -125640 1825 1519 -125660 1825 1884 -125660 1441 1617 -125660 1825 1519 -125680 1549 1525 -125680 1617 1767 -125680 1825 1519 -125680 1808 1897 -125700 1825 1519 -125700 1704 1643 -125700 1808 1897 -125720 1704 1643 -125720 1884 1825 -125720 1599 1882 -125720 1521 1787 -125720 1808 1897 -125720 1563 1592 -125740 1549 1890 -125740 1617 1767 -125740 1808 1897 -125740 1890 1525 -125740 1678 1908 -125740 1563 1592 -125760 1808 1897 -125760 1890 1525 -125760 1884 1825 -125760 1678 1908 -125760 1563 1592 -125780 1808 1897 -125780 1704 1643 -125780 1890 1525 -125780 1884 1825 -125780 1678 1908 -125780 1563 1592 -125800 1884 1825 -125800 1678 1908 -125800 1563 1592 -125800 1684 1463 -125820 1563 1592 -125820 1643 1908 -125820 1704 1643 -125820 1684 1463 -125840 1704 1643 -125840 1684 1463 -125860 1598 1767 -125860 1684 1463 -125860 1617 1767 -125860 1549 1890 -125880 1684 1463 -125880 1704 1643 -125880 1617 1767 -125880 1549 1890 -125900 1617 1767 -125900 1549 1890 -125900 1890 1525 -125920 1599 1512 -125920 1825 1609 -125920 1617 1767 -125920 1549 1890 -125920 1890 1525 -125940 1549 1890 -125940 1890 1525 -125960 1563 1592 -125960 1549 1890 -125960 1890 1525 -125980 1549 1890 -125980 1890 1525 -126000 1549 1890 -126000 1704 1643 -126000 1449 1521 -126000 1603 1562 -126000 1890 1525 -126020 1920 1609 -126020 1603 1562 -126020 1703 1635 -126020 1890 1525 -126020 1549 1525 -126040 1563 1592 -126040 1703 1609 -126040 1704 1643 -126040 1890 1525 -126040 1441 1617 -126040 1549 1525 -126060 1449 1603 -126060 1593 1644 -126060 1603 1562 -126060 1890 1525 -126060 1441 1617 -126060 1549 1525 -126060 1684 1593 -126080 1603 1562 -126080 1825 1601 -126080 1609 1635 -126080 1884 1519 -126080 1643 1644 -126080 1890 1525 -126080 1562 1449 -126080 1441 1617 -126080 1549 1525 -126080 1704 1643 -126080 1684 1593 -126100 1563 1593 -126100 1563 1643 -126100 1825 1635 -126100 1890 1525 -126100 1813 1644 -126100 1562 1449 -126100 1877 1908 -126100 1441 1617 -126100 1549 1525 -126100 1704 1643 -126100 1684 1593 -126120 1684 1563 -126120 1813 1644 -126120 1562 1449 -126120 1825 1884 -126120 1825 1519 -126120 1593 1598 -126120 1479 1908 -126120 1877 1908 -126120 1920 1601 -126120 1441 1617 -126120 1884 1519 -126120 1549 1525 -126120 1704 1643 -126120 1479 1877 -126120 1684 1593 -126140 1920 1601 -126140 1549 1890 -126140 1441 1628 -126140 1441 1609 -126140 1890 1525 -126140 1684 1644 -126140 1441 1617 -126140 1884 1519 -126140 1549 1525 -126140 1704 1643 -126140 1479 1877 -126140 1684 1593 -126160 1890 1525 -126160 1684 1644 -126160 1562 1449 -126160 1441 1617 -126160 1884 1519 -126160 1549 1525 -126160 1808 1479 -126160 1704 1643 -126160 1479 1877 -126160 1684 1593 -126180 1808 1877 -126180 1684 1644 -126180 1562 1449 -126180 1441 1617 -126180 1609 1643 -126180 1884 1519 -126180 1549 1525 -126180 1808 1479 -126180 1549 1890 -126180 1704 1643 -126180 1813 1644 -126180 1479 1877 -126180 1684 1593 -126180 1598 1635 -126200 1857 1441 -126200 1857 1617 -126200 1549 1525 -126200 1679 1575 -126200 1808 1479 -126200 1463 1628 -126200 1767 1900 -126200 1908 1877 -126200 1549 1890 -126200 1704 1643 -126200 1813 1644 -126200 1479 1877 -126200 1684 1593 -126200 1890 1525 -126200 1908 1479 -126200 1598 1635 -126220 1549 1890 -126220 1704 1643 -126220 1479 1711 -126220 1813 1644 -126220 1479 1877 -126220 1684 1593 -126220 1890 1525 -126220 1908 1479 -126220 1598 1635 -126240 1813 1644 -126240 1479 1877 -126240 1825 1519 -126240 1617 1857 -126240 1877 1908 -126240 1884 1643 -126240 1825 1643 -126240 1684 1593 -126240 1890 1525 -126240 1908 1479 -126240 1598 1635 -126260 1884 1643 -126260 1884 1519 -126260 1679 1575 -126260 1441 1617 -126260 1825 1643 -126260 1441 1857 -126260 1684 1593 -126260 1890 1525 -126260 1908 1479 -126260 1598 1635 -126280 1549 1890 -126280 1441 1857 -126280 1713 1857 -126280 1711 1473 -126280 1684 1593 -126280 1441 1713 -126280 1877 1908 -126280 1479 1877 -126280 1890 1525 -126280 1908 1479 -126280 1598 1635 -126300 1441 1857 -126300 1713 1857 -126300 1711 1473 -126300 1684 1593 -126300 1441 1713 -126300 1877 1908 -126300 1479 1877 -126300 1563 1592 -126300 1890 1525 -126300 1908 1479 -126300 1598 1635 -126320 1920 1617 -126320 1684 1593 -126320 1441 1713 -126320 1599 1882 -126320 1643 1825 -126320 1803 1678 -126320 1475 1594 -126320 1877 1908 -126320 1549 1525 -126320 1479 1877 -126320 1563 1592 -126320 1669 1754 -126320 1890 1525 -126320 1908 1479 -126320 1598 1635 -126340 1643 1825 -126340 1670 1711 -126340 1884 1825 -126340 1803 1678 -126340 1475 1594 -126340 1698 1707 -126340 1704 1519 -126340 1463 1628 -126340 1877 1908 -126340 1549 1525 -126340 1704 1643 -126340 1479 1877 -126340 1563 1592 -126340 1669 1754 -126340 1890 1525 -126340 1908 1479 -126340 1598 1635 -126360 1920 1598 -126360 1549 1525 -126360 1704 1643 -126360 1592 1617 -126360 1479 1877 -126360 1563 1592 -126360 1441 1713 -126360 1669 1754 -126360 1890 1525 -126360 1908 1479 -126360 1598 1635 -126380 1643 1525 -126380 1857 1641 -126380 1563 1592 -126380 1698 1707 -126380 1594 1475 -126380 1877 1908 -126380 1884 1519 -126380 1441 1713 -126380 1643 1519 -126380 1669 1754 -126380 1890 1525 -126380 1704 1519 -126380 1908 1479 -126380 1598 1635 -126380 1670 1711 -126400 1884 1704 -126400 1884 1643 -126400 1884 1519 -126400 1549 1890 -126400 1441 1713 -126400 1449 1521 -126400 1643 1519 -126400 1549 1525 -126400 1669 1754 -126400 1890 1525 -126400 1704 1519 -126400 1908 1479 -126400 1617 1628 -126400 1598 1635 -126400 1670 1711 -126420 1698 1740 -126420 1847 1503 -126420 1920 1598 -126420 1549 1525 -126420 1669 1754 -126420 1890 1525 -126420 1924 1478 -126420 1704 1519 -126420 1908 1479 -126420 1617 1628 -126420 1598 1635 -126420 1877 1908 -126420 1670 1711 -126440 1920 1598 -126440 1549 1890 -126440 1549 1525 -126440 1825 1704 -126440 1707 1839 -126440 1608 1530 -126440 1669 1754 -126440 1890 1525 -126440 1924 1478 -126440 1704 1519 -126440 1908 1479 -126440 1617 1628 -126440 1598 1635 -126440 1877 1908 -126440 1670 1711 -126460 1573 1789 -126460 1608 1530 -126460 1635 1473 -126460 1848 1458 -126460 1684 1767 -126460 1669 1754 -126460 1890 1525 -126460 1924 1478 -126460 1704 1519 -126460 1908 1479 -126460 1617 1628 -126460 1598 1635 -126460 1877 1908 -126460 1670 1711 -126480 1542 1573 -126480 1549 1525 -126480 1684 1767 -126480 1707 1767 -126480 1789 1808 -126480 1549 1890 -126480 1669 1754 -126480 1890 1525 -126480 1924 1478 -126480 1704 1519 -126480 1877 1479 -126480 1908 1479 -126480 1617 1628 -126480 1598 1635 -126480 1877 1908 -126480 1670 1711 -126500 1549 1890 -126500 1669 1754 -126500 1890 1525 -126500 1924 1478 -126500 1704 1519 -126500 1877 1479 -126500 1908 1479 -126500 1617 1628 -126500 1598 1635 -126500 1877 1908 -126500 1670 1711 -126520 1573 1458 -126520 1608 1530 -126520 1643 1825 -126520 1643 1884 -126520 1684 1767 -126520 1825 1884 -126520 1825 1519 -126520 1921 1462 -126520 1598 1920 -126520 1890 1525 -126520 1924 1478 -126520 1704 1825 -126520 1789 1808 -126520 1643 1519 -126520 1704 1519 -126520 1573 1452 -126520 1877 1479 -126520 1908 1479 -126520 1617 1628 -126520 1598 1635 -126520 1877 1908 -126520 1670 1711 -126540 1549 1525 -126540 1598 1920 -126540 1598 1530 -126540 1608 1635 -126540 1635 1920 -126540 1698 1523 -126540 1786 1500 -126540 1847 1452 -126540 1847 1503 -126540 1890 1525 -126540 1924 1478 -126540 1704 1825 -126540 1713 1441 -126540 1789 1808 -126540 1643 1519 -126540 1704 1519 -126540 1573 1452 -126540 1877 1479 -126540 1908 1479 -126540 1617 1628 -126540 1598 1635 -126540 1877 1908 -126540 1670 1711 -126560 1542 1641 -126560 1546 1468 -126560 1573 1808 -126560 1598 1458 -126560 1635 1458 -126560 1643 1825 -126560 1657 1769 -126560 1704 1825 -126560 1713 1441 -126560 1789 1808 -126560 1442 1455 -126560 1549 1890 -126560 1643 1519 -126560 1704 1519 -126560 1717 1458 -126560 1500 1511 -126560 1593 1449 -126560 1775 1808 -126560 1573 1452 -126560 1877 1479 -126560 1908 1479 -126560 1617 1628 -126560 1598 1635 -126560 1825 1919 -126560 1678 1848 -126560 1877 1908 -126560 1670 1711 -126580 1549 1890 -126580 1635 1473 -126580 1643 1884 -126580 1643 1519 -126580 1665 1775 -126580 1678 1765 -126580 1704 1519 -126580 1717 1458 -126580 1734 1868 -126580 1848 1517 -126580 1500 1511 -126580 1593 1449 -126580 1775 1808 -126580 1857 1441 -126580 1573 1452 -126580 1643 1704 -126580 1877 1479 -126580 1908 1479 -126580 1617 1628 -126580 1603 1449 -126580 1598 1635 -126580 1593 1603 -126580 1825 1919 -126580 1678 1848 -126580 1678 1517 -126580 1877 1908 -126580 1670 1711 -126600 1593 1449 -126600 1635 1688 -126600 1638 1906 -126600 1638 1894 -126600 1638 1911 -126600 1684 1711 -126600 1688 1717 -126600 1701 1885 -126600 1775 1808 -126600 1857 1441 -126600 1921 1462 -126600 1460 1499 -126600 1562 1641 -126600 1573 1452 -126600 1590 1455 -126600 1643 1704 -126600 1657 1769 -126600 1877 1479 -126600 1884 1519 -126600 1908 1479 -126600 1617 1628 -126600 1603 1449 -126600 1598 1635 -126600 1829 1886 -126600 1593 1603 -126600 1825 1919 -126600 1678 1848 -126600 1678 1517 -126600 1877 1908 -126600 1670 1711 -126620 1562 1641 -126620 1568 1635 -126620 1573 1452 -126620 1590 1455 -126620 1594 1475 -126620 1641 1698 -126620 1643 1704 -126620 1647 1889 -126620 1647 1466 -126620 1657 1769 -126620 1664 1821 -126620 1665 1775 -126620 1713 1441 -126620 1727 1845 -126620 1775 1908 -126620 1877 1479 -126620 1884 1519 -126620 1908 1479 -126620 1458 1473 -126620 1617 1628 -126620 1718 1889 -126620 1603 1449 -126620 1848 1905 -126620 1890 1525 -126620 1598 1635 -126620 1665 1808 -126620 1829 1886 -126620 1593 1603 -126620 1825 1919 -126620 1678 1848 -126620 1678 1517 -126620 1877 1908 -126620 1670 1711 -126640 1549 1890 -126640 1549 1525 -126640 1568 1688 -126640 1568 1469 -126640 1581 1635 -126640 1613 1685 -126640 1617 1628 -126640 1672 1717 -126640 1678 1905 -126640 1688 1717 -126640 1704 1483 -126640 1704 1893 -126640 1717 1469 -126640 1718 1889 -126640 1834 1491 -126640 1899 1520 -126640 1921 1462 -126640 1460 1499 -126640 1593 1449 -126640 1603 1449 -126640 1765 1894 -126640 1802 1865 -126640 1811 1876 -126640 1848 1905 -126640 1890 1525 -126640 1905 1517 -126640 1504 1528 -126640 1598 1635 -126640 1717 1473 -126640 1641 1908 -126640 1665 1808 -126640 1829 1886 -126640 1593 1603 -126640 1825 1919 -126640 1678 1848 -126640 1678 1517 -126640 1877 1908 -126640 1670 1711 -126660 1537 1581 -126660 1538 1426 -126660 1539 1635 -126660 1554 1848 -126660 1554 1678 -126660 1562 1908 -126660 1568 1520 -126660 1581 1904 -126660 1593 1449 -126660 1603 1449 -126660 1613 1482 -126660 1638 1713 -126660 1684 1767 -126660 1698 1465 -126660 1698 1911 -126660 1704 1458 -126660 1765 1894 -126660 1269 1440 -126660 1802 1865 -126660 1811 1876 -126660 1826 1519 -126660 1834 1903 -126660 1848 1905 -126660 1890 1525 -126660 1905 1517 -126660 1441 1491 -126660 1465 1491 -126660 1469 1520 -126660 1500 1511 -126660 1504 1528 -126660 1520 1527 -126660 1562 1707 -126660 1590 1455 -126660 1598 1635 -126660 1644 1921 -126660 1717 1473 -126660 1641 1908 -126660 1641 1765 -126660 1641 1877 -126660 1665 1808 -126660 1857 1441 -126660 1829 1886 -126660 1765 1908 -126660 1593 1603 -126660 1825 1919 -126660 1678 1848 -126660 1678 1517 -126660 1877 1908 -126660 1670 1711 -126680 1537 1643 -126680 1542 1834 -126680 1542 1491 -126680 1542 1765 -126680 1551 1556 -126680 1554 1448 -126680 1554 1485 -126680 1554 1517 -126680 1562 1707 -126680 1568 1458 -126680 1590 1455 -126680 1598 1635 -126680 1643 1704 -126680 1644 1921 -126680 1647 1792 -126680 1647 1708 -126680 1647 1885 -126680 1698 1908 -126680 1707 1479 -126680 1717 1473 -126680 1717 1469 -126680 1717 1921 -126680 1727 1492 -126680 1765 1834 -126680 1790 1442 -126680 1790 1455 -126680 1884 1519 -126680 1540 1520 -126680 1549 1890 -126680 1641 1908 -126680 1641 1765 -126680 1641 1877 -126680 1647 1487 -126680 1665 1808 -126680 1848 1517 -126680 1857 1441 -126680 1442 1455 -126680 1829 1886 -126680 1765 1908 -126680 1921 1462 -126680 1591 1858 -126680 1593 1603 -126680 1718 1889 -126680 1825 1919 -126680 1617 1628 -126680 1678 1848 -126680 1678 1517 -126680 1877 1908 -126680 1670 1711 -126700 1539 1568 -126700 1540 1520 -126700 1549 1890 -126700 1551 1269 -126700 1554 1808 -126700 1554 1915 -126700 1570 1492 -126700 1623 1437 -126700 1635 1875 -126700 1638 1698 -126700 1638 1740 -126700 1641 1698 -126700 1641 1908 -126700 1641 1765 -126700 1641 1877 -126700 1643 1728 -126700 1647 1487 -126700 1664 1520 -126700 1665 1808 -126700 1678 1680 -126700 1680 1848 -126700 1680 1455 -126700 1717 1458 -126700 1269 1440 -126700 1790 1451 -126700 1792 1451 -126700 1811 1876 -126700 1848 1428 -126700 1848 1517 -126700 1857 1441 -126700 1893 1469 -126700 1894 1491 -126700 1428 1517 -126700 1442 1455 -126700 1660 1692 -126700 1829 1886 -126700 1847 1503 -126700 1890 1525 -126700 1568 1483 -126700 1698 1707 -126700 1765 1908 -126700 1765 1877 -126700 1765 1479 -126700 1657 1769 -126700 1921 1462 -126700 1591 1858 -126700 1593 1603 -126700 1598 1875 -126700 1718 1889 -126700 1825 1919 -126700 1598 1715 -126700 1617 1628 -126700 1678 1848 -126700 1678 1517 -126700 1877 1908 -126700 1754 1821 -126700 1670 1711 -126720 1546 1713 -126720 1551 1440 -126720 1551 1482 -126720 1554 1448 -126720 1554 1502 -126720 1556 1920 -126720 1556 1568 -126720 1557 1499 -126720 1598 1635 -126720 1635 1715 -126720 1638 1707 -126720 1641 1911 -126720 1643 1704 -126720 1660 1692 -126720 1664 1527 -126720 1680 1459 -126720 1680 1428 -126720 1684 1900 -126720 1692 1802 -126720 1698 1834 -126720 1698 1485 -126720 1704 1520 -126720 1713 1807 -126720 1829 1886 -126720 1847 1503 -126720 1848 1865 -126720 1877 1479 -126720 1884 1519 -126720 1890 1525 -126720 1899 1458 -126720 1915 1455 -126720 1444 1466 -126720 1504 1528 -126720 1568 1483 -126720 1631 1503 -126720 1638 1911 -126720 1647 1482 -126720 1698 1707 -126720 1765 1908 -126720 1765 1877 -126720 1765 1479 -126720 1789 1857 -126720 1908 1479 -126720 1657 1769 -126720 1921 1462 -126720 1591 1858 -126720 1593 1603 -126720 1598 1875 -126720 1718 1889 -126720 1825 1919 -126720 1598 1715 -126720 1617 1628 -126720 1678 1848 -126720 1678 1517 -126720 1877 1908 -126720 1754 1821 -126720 1670 1711 -126720 1546 1557 -126740 1537 1532 -126740 1546 1847 -126740 1546 1708 -126740 1546 1503 -126740 1551 1269 -126740 1554 1435 -126740 1557 1503 -126740 1568 1483 -126740 1587 1504 -126740 1598 1701 -126740 1631 1503 -126740 1635 1875 -126740 1638 1792 -126740 1638 1513 -126740 1638 1911 -126740 1647 1482 -126740 1698 1707 -126740 1708 1848 -126740 1713 1907 -126740 1765 1466 -126740 1765 1908 -126740 1765 1877 -126740 1765 1479 -126740 1768 1811 -126740 1771 1908 -126740 1789 1857 -126740 1808 1915 -126740 1831 1460 -126740 1865 1517 -126740 1899 1532 -126740 1908 1479 -126740 1921 1461 -126740 1573 1455 -126740 1604 1786 -126740 1638 1885 -126740 1638 1641 -126740 1641 1792 -126740 1657 1769 -126740 1792 1885 -126740 1889 1458 -126740 1921 1462 -126740 1591 1858 -126740 1593 1603 -126740 1598 1875 -126740 1718 1889 -126740 1825 1919 -126740 1549 1890 -126740 1562 1908 -126740 1598 1715 -126740 1617 1628 -126740 1678 1848 -126740 1678 1517 -126740 1813 1872 -126740 1877 1908 -126740 1831 1499 -126740 1754 1821 -126740 1670 1711 -126740 1546 1557 -126760 1549 1525 -126760 1554 1834 -126760 1554 1661 -126760 1562 1652 -126760 1573 1455 -126760 1575 1679 -126760 1603 1449 -126760 1604 1786 -126760 1613 1847 -126760 1613 1503 -126760 1635 1701 -126760 1638 1897 -126760 1638 1885 -126760 1638 1641 -126760 1641 1792 -126760 1641 1765 -126760 1643 1704 -126760 1657 1769 -126760 1672 1889 -126760 1672 1718 -126760 1678 1680 -126760 1698 1491 -126760 1717 1893 -126760 1718 1728 -126760 1718 1458 -126760 1789 1834 -126760 1792 1885 -126760 1831 1907 -126760 1848 1914 -126760 1889 1458 -126760 1890 1525 -126760 1907 1923 -126760 1907 1499 -126760 1921 1462 -126760 1482 1503 -126760 1540 1672 -126760 1556 1504 -126760 1573 1452 -126760 1591 1858 -126760 1593 1603 -126760 1598 1875 -126760 1641 1885 -126760 1710 1455 -126760 1718 1889 -126760 1825 1919 -126760 1840 1487 -126760 1549 1890 -126760 1562 1908 -126760 1598 1715 -126760 1617 1628 -126760 1638 1765 -126760 1678 1848 -126760 1678 1517 -126760 1680 1517 -126760 1458 1532 -126760 1602 1631 -126760 1635 1715 -126760 1813 1872 -126760 1877 1479 -126760 1829 1886 -126760 1877 1908 -126760 1598 1635 -126760 1831 1499 -126760 1754 1821 -126760 1847 1503 -126760 1670 1711 -126760 1546 1557 -126760 1554 1857 -126780 1539 1717 -126780 1540 1672 -126780 1545 1582 -126780 1554 1789 -126780 1556 1504 -126780 1556 1889 -126780 1568 1483 -126780 1570 1734 -126780 1573 1907 -126780 1573 1452 -126780 1575 1591 -126780 1591 1858 -126780 1593 1603 -126780 1598 1875 -126780 1616 1518 -126780 1635 1875 -126780 1638 1528 -126780 1641 1771 -126780 1641 1444 -126780 1641 1885 -126780 1647 1806 -126780 1660 1692 -126780 1673 1516 -126780 1678 1914 -126780 1679 1858 -126780 1701 1473 -126780 1701 1898 -126780 1710 1455 -126780 1717 1461 -126780 1718 1889 -126780 1718 1461 -126780 1718 1446 -126780 1728 1428 -126780 1771 1885 -126780 1771 1790 -126780 1792 1528 -126780 1825 1919 -126780 1834 1491 -126780 1840 1487 -126780 1848 1517 -126780 1885 1448 -126780 1885 1513 -126780 1885 1897 -126780 1920 1473 -126780 1504 1522 -126780 1537 1568 -126780 1537 1718 -126780 1549 1890 -126780 1551 1808 -126780 1556 1718 -126780 1562 1908 -126780 1598 1715 -126780 1612 1847 -126780 1617 1628 -126780 1638 1765 -126780 1675 1749 -126780 1678 1848 -126780 1678 1517 -126780 1680 1517 -126780 1692 1829 -126780 1692 1886 -126780 1721 1796 -126780 1811 1923 -126780 1892 1898 -126780 1698 1707 -126780 1761 1493 -126780 1458 1532 -126780 1602 1631 -126780 1635 1715 -126780 1813 1872 -126780 1877 1479 -126780 1701 1920 -126780 1829 1886 -126780 1877 1908 -126780 1924 1478 -126780 1598 1635 -126780 1831 1499 -126780 1754 1821 -126780 1847 1503 -126780 1670 1711 -126780 1546 1557 -126780 1908 1479 -126780 1554 1857 -126800 1537 1568 -126800 1537 1556 -126800 1537 1718 -126800 1545 1613 -126800 1549 1890 -126800 1551 1808 -126800 1556 1664 -126800 1556 1718 -126800 1557 1767 -126800 1562 1908 -126800 1568 1664 -126800 1598 1715 -126800 1612 1847 -126800 1617 1628 -126800 1617 1894 -126800 1638 1792 -126800 1638 1897 -126800 1638 1765 -126800 1641 1528 -126800 1641 1790 -126800 1643 1462 -126800 1652 1865 -126800 1661 1900 -126800 1675 1749 -126800 1678 1848 -126800 1678 1680 -126800 1678 1517 -126800 1680 1517 -126800 1692 1829 -126800 1692 1886 -126800 1701 1477 -126800 1717 1921 -126800 1717 1718 -126800 1721 1796 -126800 1728 1458 -126800 1735 1465 -126800 1742 1520 -126800 1765 1897 -126800 1765 1471 -126800 1790 1876 -126800 1792 1885 -126800 1808 1455 -126800 1811 1923 -126800 1847 1482 -126800 1865 1466 -126800 1884 1519 -126800 1889 1899 -126800 1892 1898 -126800 1899 1462 -126800 1920 1477 -126800 1482 1503 -126800 1556 1462 -126800 1579 1787 -126800 1657 1769 -126800 1680 1848 -126800 1698 1707 -126800 1702 1901 -126800 1761 1493 -126800 1865 1491 -126800 1898 1920 -126800 1458 1532 -126800 1602 1613 -126800 1602 1631 -126800 1831 1460 -126800 1635 1715 -126800 1643 1704 -126800 1813 1872 -126800 1877 1479 -126800 1701 1920 -126800 1829 1886 -126800 1877 1908 -126800 1924 1478 -126800 1598 1635 -126800 1768 1504 -126800 1831 1499 -126800 1754 1821 -126800 1847 1503 -126800 1670 1711 -126800 1546 1557 -126800 1908 1479 -126800 1554 1857 -126820 1539 1703 -126820 1554 1811 -126820 1554 1923 -126820 1554 1441 -126820 1556 1462 -126820 1568 1462 -126820 1570 1573 -126820 1573 1455 -126820 1579 1787 -126820 1602 1482 -126820 1612 1426 -126820 1612 1517 -126820 1613 1482 -126820 1617 1441 -126820 1641 1471 -126820 1657 1769 -126820 1673 1899 -126820 1680 1848 -126820 1698 1707 -126820 1702 1901 -126820 1703 1717 -126820 1734 1913 -126820 1740 1876 -126820 1761 1493 -126820 1789 1857 -126820 1811 1857 -126820 1847 1517 -126820 1848 1901 -126820 1857 1876 -126820 1865 1491 -126820 1876 1907 -126820 1890 1924 -126820 1892 1920 -126820 1893 1458 -126820 1898 1920 -126820 1458 1532 -126820 1546 1661 -126820 1602 1613 -126820 1602 1631 -126820 1617 1857 -126820 1635 1875 -126820 1715 1875 -126820 1728 1920 -126820 1825 1919 -126820 1831 1460 -126820 1876 1923 -126820 1460 1499 -126820 1554 1617 -126820 1635 1715 -126820 1643 1704 -126820 1701 1728 -126820 1789 1441 -126820 1813 1872 -126820 1877 1479 -126820 1665 1519 -126820 1701 1920 -126820 1829 1886 -126820 1877 1908 -126820 1924 1478 -126820 1598 1875 -126820 1598 1635 -126820 1768 1504 -126820 1831 1499 -126820 1708 1808 -126820 1754 1821 -126820 1847 1503 -126820 1670 1711 -126820 1546 1557 -126820 1908 1479 -126820 1554 1857 -126820 1568 1483 -126820 1718 1889 -126840 1546 1661 -126840 1549 1890 -126840 1552 1443 -126840 1552 1613 -126840 1554 1789 -126840 1556 1703 -126840 1558 1516 -126840 1562 1877 -126840 1562 1582 -126840 1582 1707 -126840 1582 1698 -126840 1582 1638 -126840 1587 1701 -126840 1602 1613 -126840 1602 1631 -126840 1604 1721 -126840 1608 1532 -126840 1612 1901 -126840 1617 1857 -126840 1623 1865 -126840 1628 1485 -126840 1635 1875 -126840 1638 1707 -126840 1641 1907 -126840 1660 1692 -126840 1672 1532 -126840 1692 1848 -126840 1692 1772 -126840 1692 1499 -126840 1707 1908 -126840 1707 1471 -126840 1715 1875 -126840 1728 1920 -126840 1734 1749 -126840 1825 1919 -126840 1831 1460 -126840 1841 1848 -126840 1847 1510 -126840 1876 1923 -126840 1892 1458 -126840 1893 1428 -126840 1894 1465 -126840 1901 1510 -126840 1907 1471 -126840 1920 1473 -126840 1428 1458 -126840 1460 1499 -126840 1471 1479 -126840 1503 1510 -126840 1507 1530 -126840 1530 1532 -126840 1554 1617 -126840 1573 1452 -126840 1623 1437 -126840 1635 1715 -126840 1643 1704 -126840 1701 1728 -126840 1771 1792 -126840 1771 1885 -126840 1789 1441 -126840 1813 1872 -126840 1877 1479 -126840 1540 1672 -126840 1598 1715 -126840 1608 1530 -126840 1665 1519 -126840 1678 1848 -126840 1701 1920 -126840 1829 1886 -126840 1877 1908 -126840 1924 1478 -126840 1598 1875 -126840 1591 1858 -126840 1598 1635 -126840 1617 1789 -126840 1684 1840 -126840 1735 1465 -126840 1768 1504 -126840 1831 1499 -126840 1921 1462 -126840 1708 1808 -126840 1754 1821 -126840 1847 1503 -126840 1670 1711 -126840 1546 1557 -126840 1908 1479 -126840 1554 1857 -126840 1568 1483 -126840 1718 1889 -126860 1545 1647 -126860 1554 1617 -126860 1562 1698 -126860 1562 1707 -126860 1562 1455 -126860 1568 1889 -126860 1568 1718 -126860 1570 1485 -126860 1573 1452 -126860 1587 1458 -126860 1608 1899 -126860 1613 1442 -126860 1617 1441 -126860 1623 1437 -126860 1635 1715 -126860 1638 1698 -126860 1640 1718 -126860 1643 1704 -126860 1665 1825 -126860 1687 1841 -126860 1692 1829 -126860 1692 1886 -126860 1698 1528 -126860 1701 1728 -126860 1707 1907 -126860 1734 1886 -126860 1740 1497 -126860 1742 1520 -126860 1749 1757 -126860 1765 1455 -126860 1771 1792 -126860 1771 1885 -126860 1789 1441 -126860 1803 1441 -126860 1813 1872 -126860 1825 1884 -126860 1841 1510 -126860 1847 1886 -126860 1877 1479 -126860 1886 1503 -126860 1899 1530 -126860 1446 1458 -126860 1458 1516 -126860 1479 1485 -126860 1540 1672 -126860 1587 1899 -126860 1598 1715 -126860 1604 1901 -126860 1608 1530 -126860 1665 1519 -126860 1678 1848 -126860 1698 1707 -126860 1701 1920 -126860 1707 1764 -126860 1829 1886 -126860 1877 1908 -126860 1924 1478 -126860 1556 1718 -126860 1593 1603 -126860 1595 1654 -126860 1598 1875 -126860 1598 1703 -126860 1612 1678 -126860 1806 1808 -126860 1892 1898 -126860 1570 1582 -126860 1591 1858 -126860 1598 1635 -126860 1617 1789 -126860 1684 1840 -126860 1703 1875 -126860 1735 1465 -126860 1761 1493 -126860 1768 1504 -126860 1831 1499 -126860 1921 1462 -126860 1708 1808 -126860 1754 1821 -126860 1847 1503 -126860 1670 1711 -126860 1546 1557 -126860 1657 1769 -126860 1908 1479 -126860 1554 1857 -126860 1568 1483 -126860 1718 1889 -126880 1537 1483 -126880 1538 1524 -126880 1540 1672 -126880 1546 1554 -126880 1546 1900 -126880 1554 1557 -126880 1554 1441 -126880 1556 1568 -126880 1556 1527 -126880 1558 1516 -126880 1562 1564 -126880 1562 1886 -126880 1570 1437 -126880 1573 1885 -126880 1587 1899 -126880 1595 1886 -126880 1598 1715 -126880 1604 1901 -126880 1608 1530 -126880 1612 1848 -126880 1613 1692 -126880 1617 1908 -126880 1623 1908 -126880 1638 1465 -126880 1641 1901 -126880 1652 1466 -126880 1664 1458 -126880 1665 1519 -126880 1673 1516 -126880 1678 1848 -126880 1678 1829 -126880 1688 1899 -126880 1698 1707 -126880 1698 1485 -126880 1698 1479 -126880 1701 1920 -126880 1707 1764 -126880 1707 1479 -126880 1718 1520 -126880 1718 1527 -126880 1734 1855 -126880 1749 1761 -126880 1757 1761 -126880 1792 1452 -126880 1811 1923 -126880 1811 1876 -126880 1829 1886 -126880 1876 1923 -126880 1877 1908 -126880 1885 1452 -126880 1889 1520 -126880 1899 1461 -126880 1900 1518 -126880 1924 1478 -126880 1556 1889 -126880 1556 1718 -126880 1593 1603 -126880 1595 1654 -126880 1598 1875 -126880 1598 1703 -126880 1604 1641 -126880 1612 1678 -126880 1700 1848 -126880 1806 1808 -126880 1892 1898 -126880 1920 1473 -126880 1570 1582 -126880 1591 1858 -126880 1598 1635 -126880 1617 1789 -126880 1635 1875 -126880 1684 1840 -126880 1703 1875 -126880 1708 1806 -126880 1728 1920 -126880 1735 1465 -126880 1761 1493 -126880 1768 1504 -126880 1825 1919 -126880 1831 1499 -126880 1921 1462 -126880 1906 1455 -126880 1708 1808 -126880 1754 1821 -126880 1847 1503 -126880 1670 1711 -126880 1546 1557 -126880 1657 1769 -126880 1908 1479 -126880 1554 1857 -126880 1568 1483 -126880 1718 1889 -126900 1546 1616 -126900 1552 1749 -126900 1556 1889 -126900 1556 1458 -126900 1556 1462 -126900 1556 1718 -126900 1562 1848 -126900 1562 1612 -126900 1562 1734 -126900 1573 1829 -126900 1573 1886 -126900 1573 1877 -126900 1579 1503 -126900 1593 1603 -126900 1595 1654 -126900 1598 1875 -126900 1598 1703 -126900 1604 1641 -126900 1604 1269 -126900 1612 1680 -126900 1612 1678 -126900 1613 1426 -126900 1613 1687 -126900 1623 1771 -126900 1631 1898 -126900 1635 1703 -126900 1638 1894 -126900 1638 1487 -126900 1700 1848 -126900 1702 1269 -126900 1718 1458 -126900 1791 1453 -126900 1806 1808 -126900 1811 1465 -126900 1834 1903 -126900 1848 1503 -126900 1885 1485 -126900 1886 1452 -126900 1889 1458 -126900 1892 1898 -126900 1920 1473 -126900 1441 1485 -126900 1441 1479 -126900 1570 1582 -126900 1591 1858 -126900 1598 1635 -126900 1602 1898 -126900 1617 1829 -126900 1617 1789 -126900 1617 1479 -126900 1631 1892 -126900 1635 1875 -126900 1684 1840 -126900 1703 1875 -126900 1708 1806 -126900 1728 1920 -126900 1735 1465 -126900 1749 1493 -126900 1761 1493 -126900 1768 1504 -126900 1825 1919 -126900 1831 1499 -126900 1857 1441 -126900 1876 1465 -126900 1921 1462 -126900 1549 1525 -126900 1573 1452 -126900 1906 1455 -126900 1460 1499 -126900 1708 1808 -126900 1742 1520 -126900 1754 1821 -126900 1847 1503 -126900 1643 1704 -126900 1670 1711 -126900 1546 1557 -126900 1831 1460 -126900 1657 1769 -126900 1908 1479 -126900 1554 1857 -126900 1568 1483 -126900 1718 1889 -126920 1549 1890 -126920 1551 1923 -126920 1562 1579 -126920 1562 1499 -126920 1570 1617 -126920 1570 1886 -126920 1570 1582 -126920 1573 1855 -126920 1587 1671 -126920 1591 1858 -126920 1598 1635 -126920 1602 1898 -126920 1602 1892 -126920 1602 1757 -126920 1604 1792 -126920 1604 1885 -126920 1617 1829 -126920 1617 1789 -126920 1617 1886 -126920 1617 1479 -126920 1623 1841 -126920 1631 1892 -126920 1635 1875 -126920 1641 1901 -126920 1654 1510 -126920 1660 1692 -126920 1665 1519 -126920 1678 1786 -126920 1684 1840 -126920 1688 1492 -126920 1702 1792 -126920 1703 1875 -126920 1707 1754 -126920 1708 1806 -126920 1728 1920 -126920 1734 1848 -126920 1735 1465 -126920 1749 1761 -126920 1749 1493 -126920 1761 1493 -126920 1768 1504 -126920 1792 1485 -126920 1825 1919 -126920 1831 1499 -126920 1857 1441 -126920 1876 1465 -126920 1877 1886 -126920 1886 1479 -126920 1921 1462 -126920 1924 1478 -126920 1549 1525 -126920 1554 1441 -126920 1554 1886 -126920 1573 1641 -126920 1573 1452 -126920 1602 1749 -126920 1602 1631 -126920 1608 1530 -126920 1641 1855 -126920 1672 1920 -126920 1673 1899 -126920 1678 1685 -126920 1701 1532 -126920 1702 1841 -126920 1702 1901 -126920 1906 1455 -126920 1460 1499 -126920 1708 1808 -126920 1841 1885 -126920 1520 1530 -126920 1680 1772 -126920 1698 1707 -126920 1703 1920 -126920 1742 1520 -126920 1754 1821 -126920 1877 1908 -126920 1877 1479 -126920 1847 1503 -126920 1643 1704 -126920 1670 1711 -126920 1841 1901 -126920 1546 1557 -126920 1831 1460 -126920 1890 1525 -126920 1657 1769 -126920 1908 1479 -126920 1554 1857 -126920 1568 1483 -126920 1829 1441 -126920 1829 1886 -126920 1718 1889 -126940 1542 1841 -126940 1542 1426 -126940 1546 1613 -126940 1549 1525 -126940 1551 1900 -126940 1554 1441 -126940 1554 1886 -126940 1562 1503 -126940 1563 1592 -126940 1563 1458 -126940 1570 1485 -126940 1573 1616 -126940 1573 1641 -126940 1573 1452 -126940 1579 1602 -126940 1579 1631 -126940 1587 1919 -126940 1602 1688 -126940 1602 1749 -126940 1602 1631 -126940 1604 1901 -126940 1604 1765 -126940 1608 1530 -126940 1616 1740 -126940 1623 1885 -126940 1631 1749 -126940 1641 1855 -126940 1672 1920 -126940 1673 1899 -126940 1678 1685 -126940 1698 1465 -126940 1701 1532 -126940 1702 1841 -126940 1702 1901 -126940 1731 1457 -126940 1732 1919 -126940 1790 1806 -126940 1805 1888 -126940 1811 1876 -126940 1906 1455 -126940 1428 1458 -126940 1460 1499 -126940 1582 1907 -126940 1587 1889 -126940 1587 1718 -126940 1654 1808 -126940 1702 1885 -126940 1708 1808 -126940 1789 1452 -126940 1792 1841 -126940 1841 1885 -126940 1520 1530 -126940 1598 1875 -126940 1680 1772 -126940 1698 1707 -126940 1703 1920 -126940 1715 1875 -126940 1742 1520 -126940 1754 1821 -126940 1792 1885 -126940 1877 1908 -126940 1877 1479 -126940 1659 1439 -126940 1708 1517 -126940 1892 1898 -126940 1552 1453 -126940 1598 1715 -126940 1847 1503 -126940 1643 1704 -126940 1670 1711 -126940 1841 1901 -126940 1546 1557 -126940 1831 1460 -126940 1890 1525 -126940 1554 1617 -126940 1657 1769 -126940 1908 1479 -126940 1554 1857 -126940 1568 1483 -126940 1829 1441 -126940 1829 1886 -126940 1886 1441 -126940 1718 1889 -126960 1540 1672 -126960 1542 1546 -126960 1542 1853 -126960 1545 1625 -126960 1551 1426 -126960 1551 1908 -126960 1568 1921 -126960 1568 1587 -126960 1582 1513 -126960 1582 1907 -126960 1587 1664 -126960 1587 1889 -126960 1587 1921 -126960 1587 1718 -126960 1598 1473 -126960 1608 1492 -126960 1608 1701 -126960 1612 1518 -126960 1612 1767 -126960 1613 1792 -126960 1613 1700 -126960 1613 1765 -126960 1638 1894 -126960 1641 1765 -126960 1641 1901 -126960 1647 1493 -126960 1654 1808 -126960 1664 1492 -126960 1665 1519 -126960 1678 1883 -126960 1698 1923 -126960 1700 1740 -126960 1700 1885 -126960 1701 1742 -126960 1702 1792 -126960 1702 1885 -126960 1707 1923 -126960 1708 1808 -126960 1728 1920 -126960 1765 1792 -126960 1765 1901 -126960 1765 1841 -126960 1789 1452 -126960 1789 1806 -126960 1792 1841 -126960 1841 1885 -126960 1857 1426 -126960 1897 1924 -126960 1897 1487 -126960 1924 1478 -126960 1435 1452 -126960 1443 1453 -126960 1492 1520 -126960 1492 1530 -126960 1520 1530 -126960 1598 1875 -126960 1647 1761 -126960 1680 1772 -126960 1698 1707 -126960 1700 1765 -126960 1700 1901 -126960 1701 1520 -126960 1701 1921 -126960 1701 1462 -126960 1703 1920 -126960 1707 1764 -126960 1715 1875 -126960 1740 1497 -126960 1742 1520 -126960 1754 1821 -126960 1792 1885 -126960 1877 1908 -126960 1877 1479 -126960 1613 1901 -126960 1659 1439 -126960 1708 1517 -126960 1892 1898 -126960 1921 1462 -126960 1552 1453 -126960 1598 1715 -126960 1847 1503 -126960 1643 1704 -126960 1670 1711 -126960 1841 1901 -126960 1546 1557 -126960 1831 1460 -126960 1890 1525 -126960 1554 1617 -126960 1657 1769 -126960 1908 1479 -126960 1554 1857 -126960 1568 1483 -126960 1829 1441 -126960 1829 1886 -126960 1886 1441 -126960 1549 1890 -126960 1718 1889 -126980 1542 1642 -126980 1542 1654 -126980 1546 1642 -126980 1556 1458 -126980 1562 1696 -126980 1563 1579 -126980 1570 1617 -126980 1570 1485 -126980 1573 1765 -126980 1575 1679 -126980 1598 1875 -126980 1604 1855 -126980 1628 1463 -126980 1631 1688 -126980 1631 1731 -126980 1641 1841 -126980 1647 1761 -126980 1658 1835 -126980 1664 1462 -126980 1678 1706 -126980 1678 1887 -126980 1680 1772 -126980 1688 1913 -126980 1698 1707 -126980 1698 1491 -126980 1700 1765 -126980 1700 1901 -126980 1701 1520 -126980 1701 1921 -126980 1701 1462 -126980 1701 1889 -126980 1703 1920 -126980 1703 1883 -126980 1707 1764 -126980 1715 1473 -126980 1715 1875 -126980 1740 1497 -126980 1742 1520 -126980 1749 1516 -126980 1749 1892 -126980 1749 1438 -126980 1754 1821 -126980 1761 1493 -126980 1768 1438 -126980 1771 1440 -126980 1792 1485 -126980 1792 1885 -126980 1816 1881 -126980 1825 1853 -126980 1877 1908 -126980 1877 1479 -126980 1885 1485 -126980 1898 1477 -126980 1906 1523 -126980 1919 1921 -126980 1500 1511 -126980 1503 1511 -126980 1538 1524 -126980 1573 1700 -126980 1592 1858 -126980 1613 1841 -126980 1613 1901 -126980 1613 1702 -126980 1622 1835 -126980 1659 1439 -126980 1664 1889 -126980 1664 1718 -126980 1702 1841 -126980 1702 1901 -126980 1708 1517 -126980 1892 1898 -126980 1921 1462 -126980 1551 1269 -126980 1552 1453 -126980 1598 1715 -126980 1811 1876 -126980 1831 1499 -126980 1847 1503 -126980 1876 1923 -126980 1582 1593 -126980 1643 1704 -126980 1670 1711 -126980 1841 1901 -126980 1546 1557 -126980 1831 1460 -126980 1890 1525 -126980 1554 1617 -126980 1657 1769 -126980 1908 1479 -126980 1554 1857 -126980 1834 1903 -126980 1568 1483 -126980 1829 1441 -126980 1608 1530 -126980 1829 1886 -126980 1886 1441 -126980 1549 1890 -126980 1718 1889 -127000 1538 1524 -127000 1540 1920 -127000 1540 1672 -127000 1546 1562 -127000 1564 1908 -127000 1573 1595 -127000 1573 1700 -127000 1577 1913 -127000 1579 1458 -127000 1587 1527 -127000 1592 1858 -127000 1602 1911 -127000 1602 1631 -127000 1613 1841 -127000 1613 1901 -127000 1613 1702 -127000 1613 1641 -127000 1617 1642 -127000 1622 1835 -127000 1638 1458 -127000 1638 1717 -127000 1642 1886 -127000 1659 1439 -127000 1664 1889 -127000 1664 1718 -127000 1678 1680 -127000 1683 1516 -127000 1702 1841 -127000 1702 1901 -127000 1706 1790 -127000 1708 1517 -127000 1768 1493 -127000 1836 1427 -127000 1842 1887 -127000 1847 1427 -127000 1863 1427 -127000 1882 1900 -127000 1892 1898 -127000 1921 1462 -127000 1427 1503 -127000 1438 1516 -127000 1551 1269 -127000 1551 1426 -127000 1552 1453 -127000 1554 1886 -127000 1598 1715 -127000 1811 1876 -127000 1831 1499 -127000 1847 1503 -127000 1876 1923 -127000 1582 1593 -127000 1919 1462 -127000 1520 1530 -127000 1549 1525 -127000 1577 1599 -127000 1643 1704 -127000 1670 1711 -127000 1749 1757 -127000 1841 1901 -127000 1546 1557 -127000 1598 1473 -127000 1831 1460 -127000 1836 1863 -127000 1890 1525 -127000 1554 1617 -127000 1657 1769 -127000 1573 1452 -127000 1908 1479 -127000 1554 1857 -127000 1834 1903 -127000 1568 1483 -127000 1829 1441 -127000 1608 1530 -127000 1829 1886 -127000 1886 1441 -127000 1549 1890 -127000 1718 1889 -127020 1551 1857 -127020 1551 1642 -127020 1551 1269 -127020 1551 1426 -127020 1551 1617 -127020 1552 1453 -127020 1554 1886 -127020 1557 1427 -127020 1587 1718 -127020 1596 1792 -127020 1598 1715 -127020 1644 1677 -127020 1647 1913 -127020 1647 1516 -127020 1692 1427 -127020 1701 1897 -127020 1701 1882 -127020 1703 1840 -127020 1708 1808 -127020 1749 1913 -127020 1768 1899 -127020 1769 1427 -127020 1790 1511 -127020 1796 1839 -127020 1806 1841 -127020 1806 1901 -127020 1811 1876 -127020 1831 1499 -127020 1847 1503 -127020 1876 1923 -127020 1906 1455 -127020 1500 1511 -127020 1545 1768 -127020 1546 1510 -127020 1582 1593 -127020 1790 1455 -127020 1792 1885 -127020 1919 1462 -127020 1520 1530 -127020 1549 1525 -127020 1577 1599 -127020 1598 1871 -127020 1643 1704 -127020 1670 1711 -127020 1680 1772 -127020 1749 1757 -127020 1841 1901 -127020 1546 1557 -127020 1598 1473 -127020 1612 1775 -127020 1831 1460 -127020 1836 1863 -127020 1890 1525 -127020 1554 1617 -127020 1657 1769 -127020 1573 1452 -127020 1908 1479 -127020 1554 1857 -127020 1834 1903 -127020 1568 1483 -127020 1698 1707 -127020 1829 1441 -127020 1608 1530 -127020 1877 1908 -127020 1829 1886 -127020 1886 1441 -127020 1549 1890 -127020 1718 1889 -127020 1761 1493 -127040 1538 1524 -127040 1545 1768 -127040 1546 1510 -127040 1556 1876 -127040 1556 1487 -127040 1559 1461 -127040 1563 1592 -127040 1581 1661 -127040 1582 1593 -127040 1587 1872 -127040 1593 1907 -127040 1604 1513 -127040 1625 1688 -127040 1625 1731 -127040 1635 1688 -127040 1635 1898 -127040 1640 1887 -127040 1647 1761 -127040 1657 1790 -127040 1677 1688 -127040 1678 1848 -127040 1688 1920 -127040 1701 1502 -127040 1742 1520 -127040 1749 1761 -127040 1749 1493 -127040 1757 1493 -127040 1790 1455 -127040 1792 1885 -127040 1816 1881 -127040 1866 1479 -127040 1887 1530 -127040 1919 1462 -127040 1516 1527 -127040 1520 1530 -127040 1549 1525 -127040 1577 1599 -127040 1598 1871 -127040 1635 1899 -127040 1643 1704 -127040 1670 1711 -127040 1673 1731 -127040 1680 1772 -127040 1698 1735 -127040 1704 1492 -127040 1749 1757 -127040 1786 1517 -127040 1841 1901 -127040 1924 1502 -127040 1546 1557 -127040 1598 1473 -127040 1612 1775 -127040 1643 1492 -127040 1831 1460 -127040 1836 1863 -127040 1890 1525 -127040 1554 1617 -127040 1657 1769 -127040 1706 1805 -127040 1573 1452 -127040 1877 1479 -127040 1908 1479 -127040 1554 1857 -127040 1834 1903 -127040 1568 1483 -127040 1698 1707 -127040 1829 1441 -127040 1608 1530 -127040 1877 1908 -127040 1829 1886 -127040 1886 1441 -127040 1549 1890 -127040 1718 1889 -127040 1761 1493 -127060 1549 1525 -127060 1551 1886 -127060 1552 1443 -127060 1552 1453 -127060 1557 1808 -127060 1577 1599 -127060 1591 1765 -127060 1598 1524 -127060 1598 1871 -127060 1613 1901 -127060 1613 1702 -127060 1635 1899 -127060 1641 1702 -127060 1643 1704 -127060 1644 1899 -127060 1652 1511 -127060 1657 1471 -127060 1667 1471 -127060 1670 1711 -127060 1673 1731 -127060 1673 1887 -127060 1680 1816 -127060 1680 1772 -127060 1688 1899 -127060 1694 1491 -127060 1698 1803 -127060 1698 1735 -127060 1702 1901 -127060 1704 1492 -127060 1711 1887 -127060 1721 1518 -127060 1749 1757 -127060 1761 1913 -127060 1769 1471 -127060 1772 1881 -127060 1786 1517 -127060 1816 1823 -127060 1841 1901 -127060 1875 1887 -127060 1886 1497 -127060 1894 1458 -127060 1899 1457 -127060 1924 1502 -127060 1500 1511 -127060 1546 1557 -127060 1598 1473 -127060 1603 1622 -127060 1612 1775 -127060 1616 1706 -127060 1617 1857 -127060 1642 1907 -127060 1643 1492 -127060 1694 1900 -127060 1811 1923 -127060 1831 1460 -127060 1836 1863 -127060 1890 1525 -127060 1554 1617 -127060 1657 1769 -127060 1706 1805 -127060 1573 1452 -127060 1573 1654 -127060 1789 1920 -127060 1831 1499 -127060 1877 1479 -127060 1908 1479 -127060 1554 1857 -127060 1678 1816 -127060 1834 1903 -127060 1876 1923 -127060 1669 1754 -127060 1568 1483 -127060 1638 1807 -127060 1698 1707 -127060 1847 1503 -127060 1829 1441 -127060 1608 1530 -127060 1877 1908 -127060 1829 1886 -127060 1886 1441 -127060 1549 1890 -127060 1718 1889 -127060 1761 1493 -127080 1538 1749 -127080 1540 1672 -127080 1545 1635 -127080 1546 1557 -127080 1554 1886 -127080 1556 1570 -127080 1563 1592 -127080 1569 1887 -127080 1573 1595 -127080 1575 1688 -127080 1582 1593 -127080 1582 1485 -127080 1587 1647 -127080 1598 1473 -127080 1602 1887 -127080 1603 1622 -127080 1612 1775 -127080 1616 1706 -127080 1617 1857 -127080 1642 1907 -127080 1643 1492 -127080 1678 1823 -127080 1694 1900 -127080 1700 1839 -127080 1702 1841 -127080 1754 1435 -127080 1772 1816 -127080 1811 1923 -127080 1811 1511 -127080 1831 1460 -127080 1836 1863 -127080 1876 1511 -127080 1887 1899 -127080 1890 1525 -127080 1438 1524 -127080 1457 1492 -127080 1538 1524 -127080 1546 1681 -127080 1554 1269 -127080 1554 1617 -127080 1556 1732 -127080 1604 1513 -127080 1657 1769 -127080 1678 1881 -127080 1706 1805 -127080 1823 1881 -127080 1866 1908 -127080 1905 1517 -127080 1919 1462 -127080 1551 1857 -127080 1551 1554 -127080 1573 1452 -127080 1573 1654 -127080 1789 1920 -127080 1831 1499 -127080 1877 1479 -127080 1908 1479 -127080 1554 1857 -127080 1602 1631 -127080 1678 1816 -127080 1811 1876 -127080 1816 1881 -127080 1834 1903 -127080 1876 1923 -127080 1669 1754 -127080 1568 1483 -127080 1638 1807 -127080 1698 1707 -127080 1767 1840 -127080 1847 1503 -127080 1857 1441 -127080 1829 1441 -127080 1608 1530 -127080 1582 1907 -127080 1877 1908 -127080 1829 1886 -127080 1551 1617 -127080 1551 1269 -127080 1886 1441 -127080 1549 1890 -127080 1688 1457 -127080 1718 1889 -127080 1761 1493 -127100 1538 1524 -127100 1546 1681 -127100 1554 1269 -127100 1554 1617 -127100 1556 1652 -127100 1556 1732 -127100 1557 1613 -127100 1582 1706 -127100 1591 1765 -127100 1593 1437 -127100 1602 1911 -127100 1604 1513 -127100 1616 1805 -127100 1617 1740 -127100 1625 1673 -127100 1628 1711 -127100 1647 1889 -127100 1657 1769 -127100 1670 1711 -127100 1678 1881 -127100 1703 1840 -127100 1706 1907 -127100 1706 1805 -127100 1727 1845 -127100 1742 1520 -127100 1765 1876 -127100 1791 1453 -127100 1792 1885 -127100 1805 1485 -127100 1823 1881 -127100 1866 1908 -127100 1884 1887 -127100 1905 1517 -127100 1919 1462 -127100 1551 1857 -127100 1551 1554 -127100 1559 1461 -127100 1573 1452 -127100 1573 1654 -127100 1622 1498 -127100 1625 1825 -127100 1703 1711 -127100 1789 1920 -127100 1831 1499 -127100 1841 1471 -127100 1877 1479 -127100 1906 1455 -127100 1908 1479 -127100 1914 1440 -127100 1500 1511 -127100 1549 1525 -127100 1554 1857 -127100 1559 1887 -127100 1602 1631 -127100 1678 1816 -127100 1811 1876 -127100 1816 1881 -127100 1834 1903 -127100 1876 1923 -127100 1669 1754 -127100 1568 1483 -127100 1638 1807 -127100 1698 1707 -127100 1767 1840 -127100 1847 1503 -127100 1857 1441 -127100 1829 1441 -127100 1608 1530 -127100 1582 1907 -127100 1877 1908 -127100 1829 1886 -127100 1551 1617 -127100 1551 1269 -127100 1886 1441 -127100 1549 1890 -127100 1688 1457 -127100 1718 1889 -127100 1761 1493 -127100 1598 1871 -127120 1541 1608 -127120 1546 1554 -127120 1546 1907 -127120 1546 1485 -127120 1551 1857 -127120 1551 1554 -127120 1557 1907 -127120 1559 1461 -127120 1563 1592 -127120 1563 1487 -127120 1573 1452 -127120 1573 1654 -127120 1582 1790 -127120 1602 1890 -127120 1602 1519 -127120 1616 1437 -127120 1622 1498 -127120 1622 1676 -127120 1625 1825 -127120 1631 1899 -127120 1638 1919 -127120 1641 1526 -127120 1642 1523 -127120 1642 1887 -127120 1664 1439 -127120 1703 1711 -127120 1706 1855 -127120 1734 1848 -127120 1761 1458 -127120 1789 1920 -127120 1789 1458 -127120 1831 1499 -127120 1831 1460 -127120 1841 1471 -127120 1855 1437 -127120 1877 1479 -127120 1906 1455 -127120 1908 1479 -127120 1914 1440 -127120 1428 1520 -127120 1500 1511 -127120 1549 1525 -127120 1554 1441 -127120 1554 1886 -127120 1554 1857 -127120 1559 1887 -127120 1602 1825 -127120 1602 1899 -127120 1602 1884 -127120 1602 1631 -127120 1884 1899 -127120 1617 1269 -127120 1678 1816 -127120 1811 1876 -127120 1816 1881 -127120 1834 1903 -127120 1876 1923 -127120 1901 1471 -127120 1669 1754 -127120 1676 1831 -127120 1811 1923 -127120 1831 1498 -127120 1920 1458 -127120 1568 1483 -127120 1638 1807 -127120 1698 1707 -127120 1640 1853 -127120 1767 1840 -127120 1847 1503 -127120 1857 1441 -127120 1829 1441 -127120 1857 1886 -127120 1608 1530 -127120 1582 1907 -127120 1877 1908 -127120 1829 1886 -127120 1551 1617 -127120 1551 1269 -127120 1886 1441 -127120 1549 1890 -127120 1688 1457 -127120 1718 1889 -127120 1761 1493 -127120 1598 1871 -127140 1541 1520 -127140 1542 1708 -127140 1545 1635 -127140 1546 1711 -127140 1549 1525 -127140 1554 1441 -127140 1554 1886 -127140 1554 1857 -127140 1559 1887 -127140 1568 1473 -127140 1568 1749 -127140 1568 1789 -127140 1570 1479 -127140 1573 1805 -127140 1591 1528 -127140 1602 1825 -127140 1602 1899 -127140 1602 1884 -127140 1602 1631 -127140 1604 1914 -127140 1613 1641 -127140 1616 1440 -127140 1643 1704 -127140 1643 1858 -127140 1647 1911 -127140 1659 1894 -127140 1703 1858 -127140 1706 1901 -127140 1708 1808 -127140 1718 1527 -127140 1728 1768 -127140 1749 1428 -127140 1761 1789 -127140 1792 1886 -127140 1825 1899 -127140 1880 1921 -127140 1884 1899 -127140 1887 1435 -127140 1924 1502 -127140 1461 1519 -127140 1485 1529 -127140 1604 1437 -127140 1617 1269 -127140 1631 1825 -127140 1678 1816 -127140 1692 1427 -127140 1708 1786 -127140 1727 1845 -127140 1811 1876 -127140 1816 1881 -127140 1825 1884 -127140 1834 1903 -127140 1876 1923 -127140 1901 1471 -127140 1538 1524 -127140 1669 1754 -127140 1676 1498 -127140 1676 1831 -127140 1811 1923 -127140 1831 1498 -127140 1920 1458 -127140 1538 1579 -127140 1568 1483 -127140 1602 1640 -127140 1638 1807 -127140 1698 1707 -127140 1792 1885 -127140 1924 1492 -127140 1563 1579 -127140 1612 1775 -127140 1640 1853 -127140 1767 1840 -127140 1847 1503 -127140 1857 1441 -127140 1657 1769 -127140 1829 1441 -127140 1857 1886 -127140 1608 1530 -127140 1790 1426 -127140 1865 1914 -127140 1579 1524 -127140 1582 1907 -127140 1877 1908 -127140 1829 1886 -127140 1551 1617 -127140 1551 1269 -127140 1731 1443 -127140 1886 1441 -127140 1549 1890 -127140 1688 1457 -127140 1718 1889 -127140 1761 1493 -127140 1598 1871 -127140 1665 1519 -127160 1537 1703 -127160 1541 1921 -127160 1546 1557 -127160 1573 1796 -127160 1602 1461 -127160 1604 1437 -127160 1613 1711 -127160 1617 1269 -127160 1622 1816 -127160 1625 1825 -127160 1631 1825 -127160 1631 1461 -127160 1634 1728 -127160 1643 1876 -127160 1657 1706 -127160 1657 1667 -127160 1677 1749 -127160 1678 1816 -127160 1692 1427 -127160 1695 1526 -127160 1706 1471 -127160 1708 1786 -127160 1711 1792 -127160 1711 1887 -127160 1718 1749 -127160 1727 1845 -127160 1761 1438 -127160 1811 1876 -127160 1816 1881 -127160 1825 1884 -127160 1825 1461 -127160 1829 1857 -127160 1834 1903 -127160 1876 1923 -127160 1901 1471 -127160 1538 1524 -127160 1622 1676 -127160 1622 1685 -127160 1631 1899 -127160 1669 1754 -127160 1676 1498 -127160 1676 1831 -127160 1711 1440 -127160 1811 1923 -127160 1831 1498 -127160 1920 1458 -127160 1538 1579 -127160 1568 1483 -127160 1602 1640 -127160 1602 1853 -127160 1614 1526 -127160 1638 1807 -127160 1698 1707 -127160 1792 1885 -127160 1906 1437 -127160 1924 1492 -127160 1500 1511 -127160 1563 1579 -127160 1612 1775 -127160 1640 1853 -127160 1767 1840 -127160 1847 1503 -127160 1857 1441 -127160 1657 1769 -127160 1829 1441 -127160 1857 1886 -127160 1538 1563 -127160 1608 1530 -127160 1790 1426 -127160 1865 1914 -127160 1579 1524 -127160 1582 1907 -127160 1877 1908 -127160 1563 1524 -127160 1829 1886 -127160 1551 1617 -127160 1551 1269 -127160 1731 1443 -127160 1886 1441 -127160 1549 1890 -127160 1688 1457 -127160 1718 1889 -127160 1761 1493 -127160 1598 1871 -127160 1665 1519 -127180 1538 1524 -127180 1545 1430 -127180 1562 1892 -127180 1573 1427 -127180 1573 1839 -127180 1582 1499 -127180 1602 1899 -127180 1602 1884 -127180 1604 1906 -127180 1622 1676 -127180 1622 1685 -127180 1631 1640 -127180 1631 1899 -127180 1638 1825 -127180 1643 1704 -127180 1667 1841 -127180 1669 1754 -127180 1676 1498 -127180 1676 1831 -127180 1711 1440 -127180 1792 1886 -127180 1811 1923 -127180 1816 1823 -127180 1831 1498 -127180 1841 1471 -127180 1876 1887 -127180 1920 1458 -127180 1921 1461 -127180 1427 1485 -127180 1452 1499 -127180 1478 1492 -127180 1538 1579 -127180 1549 1525 -127180 1568 1483 -127180 1602 1640 -127180 1602 1853 -127180 1614 1526 -127180 1622 1831 -127180 1638 1807 -127180 1698 1707 -127180 1742 1520 -127180 1749 1789 -127180 1792 1885 -127180 1825 1921 -127180 1906 1437 -127180 1924 1492 -127180 1924 1502 -127180 1500 1511 -127180 1559 1463 -127180 1563 1579 -127180 1612 1775 -127180 1640 1853 -127180 1767 1840 -127180 1847 1503 -127180 1853 1884 -127180 1857 1441 -127180 1657 1769 -127180 1703 1470 -127180 1829 1441 -127180 1857 1886 -127180 1538 1563 -127180 1608 1530 -127180 1703 1707 -127180 1790 1426 -127180 1865 1914 -127180 1579 1524 -127180 1582 1907 -127180 1877 1908 -127180 1563 1524 -127180 1635 1443 -127180 1829 1886 -127180 1635 1731 -127180 1551 1617 -127180 1551 1269 -127180 1731 1443 -127180 1886 1441 -127180 1549 1890 -127180 1688 1457 -127180 1718 1889 -127180 1761 1493 -127180 1598 1871 -127180 1665 1519 -127180 1552 1453 -127200 1538 1579 -127200 1549 1525 -127200 1554 1665 -127200 1554 1463 -127200 1568 1761 -127200 1568 1483 -127200 1573 1831 -127200 1598 1458 -127200 1602 1640 -127200 1602 1853 -127200 1604 1437 -127200 1614 1526 -127200 1616 1513 -127200 1622 1769 -127200 1622 1831 -127200 1638 1921 -127200 1638 1807 -127200 1641 1526 -127200 1642 1863 -127200 1643 1765 -127200 1676 1708 -127200 1687 1907 -127200 1698 1707 -127200 1698 1703 -127200 1718 1520 -127200 1731 1816 -127200 1742 1520 -127200 1749 1789 -127200 1792 1885 -127200 1816 1836 -127200 1825 1921 -127200 1871 1458 -127200 1887 1469 -127200 1900 1911 -127200 1906 1437 -127200 1919 1532 -127200 1924 1492 -127200 1924 1502 -127200 1500 1511 -127200 1559 1463 -127200 1563 1579 -127200 1568 1493 -127200 1599 1882 -127200 1612 1775 -127200 1613 1840 -127200 1640 1853 -127200 1767 1840 -127200 1847 1503 -127200 1853 1884 -127200 1857 1441 -127200 1657 1769 -127200 1703 1470 -127200 1829 1441 -127200 1857 1886 -127200 1924 1478 -127200 1538 1563 -127200 1640 1884 -127200 1834 1903 -127200 1608 1530 -127200 1703 1707 -127200 1790 1426 -127200 1865 1914 -127200 1579 1524 -127200 1582 1907 -127200 1877 1908 -127200 1563 1524 -127200 1635 1443 -127200 1829 1886 -127200 1617 1269 -127200 1635 1731 -127200 1702 1841 -127200 1551 1617 -127200 1551 1269 -127200 1731 1443 -127200 1886 1441 -127200 1549 1890 -127200 1688 1457 -127200 1718 1889 -127200 1761 1493 -127200 1598 1871 -127200 1665 1519 -127200 1552 1453 -127220 1538 1592 -127220 1541 1718 -127220 1554 1635 -127220 1554 1573 -127220 1556 1616 -127220 1557 1579 -127220 1559 1463 -127220 1562 1816 -127220 1563 1592 -127220 1563 1579 -127220 1568 1920 -127220 1568 1493 -127220 1570 1616 -127220 1591 1865 -127220 1592 1487 -127220 1595 1437 -127220 1595 1654 -127220 1599 1882 -127220 1612 1775 -127220 1613 1840 -127220 1613 1665 -127220 1613 1898 -127220 1617 1441 -127220 1640 1853 -127220 1643 1469 -127220 1669 1754 -127220 1685 1816 -127220 1706 1471 -127220 1711 1441 -127220 1718 1880 -127220 1767 1840 -127220 1792 1865 -127220 1805 1870 -127220 1816 1523 -127220 1840 1898 -127220 1841 1855 -127220 1847 1503 -127220 1853 1884 -127220 1857 1441 -127220 1880 1889 -127220 1890 1525 -127220 1921 1532 -127220 1507 1522 -127220 1545 1768 -127220 1546 1579 -127220 1596 1792 -127220 1657 1769 -127220 1703 1470 -127220 1829 1441 -127220 1857 1886 -127220 1892 1898 -127220 1924 1478 -127220 1538 1563 -127220 1604 1857 -127220 1640 1884 -127220 1721 1816 -127220 1876 1479 -127220 1622 1695 -127220 1695 1526 -127220 1816 1823 -127220 1834 1903 -127220 1608 1530 -127220 1703 1707 -127220 1790 1426 -127220 1865 1914 -127220 1579 1524 -127220 1582 1907 -127220 1676 1498 -127220 1877 1908 -127220 1563 1524 -127220 1581 1479 -127220 1635 1443 -127220 1829 1886 -127220 1617 1269 -127220 1622 1526 -127220 1635 1731 -127220 1702 1841 -127220 1551 1617 -127220 1551 1269 -127220 1731 1443 -127220 1886 1441 -127220 1549 1890 -127220 1688 1457 -127220 1718 1889 -127220 1761 1493 -127220 1598 1871 -127220 1665 1519 -127220 1552 1453 -127240 1537 1647 -127240 1545 1768 -127240 1546 1520 -127240 1546 1579 -127240 1554 1816 -127240 1554 1821 -127240 1562 1768 -127240 1573 1673 -127240 1579 1520 -127240 1596 1792 -127240 1596 1885 -127240 1654 1437 -127240 1657 1769 -127240 1673 1825 -127240 1678 1459 -127240 1698 1707 -127240 1703 1470 -127240 1704 1792 -127240 1802 1816 -127240 1802 1440 -127240 1825 1921 -127240 1829 1441 -127240 1857 1886 -127240 1892 1898 -127240 1924 1502 -127240 1924 1478 -127240 1462 1532 -127240 1478 1492 -127240 1485 1517 -127240 1538 1563 -127240 1538 1524 -127240 1541 1880 -127240 1604 1857 -127240 1634 1920 -127240 1640 1884 -127240 1721 1816 -127240 1876 1479 -127240 1538 1579 -127240 1622 1695 -127240 1695 1526 -127240 1698 1703 -127240 1816 1823 -127240 1834 1903 -127240 1608 1530 -127240 1703 1707 -127240 1790 1426 -127240 1865 1914 -127240 1579 1524 -127240 1582 1907 -127240 1676 1498 -127240 1877 1908 -127240 1563 1524 -127240 1581 1479 -127240 1613 1625 -127240 1635 1443 -127240 1829 1886 -127240 1924 1492 -127240 1617 1269 -127240 1622 1526 -127240 1635 1731 -127240 1702 1841 -127240 1796 1816 -127240 1551 1617 -127240 1551 1269 -127240 1731 1443 -127240 1886 1441 -127240 1549 1890 -127240 1688 1457 -127240 1718 1889 -127240 1761 1493 -127240 1598 1871 -127240 1665 1519 -127240 1552 1453 -127260 1538 1563 -127260 1538 1524 -127260 1541 1880 -127260 1541 1881 -127260 1546 1708 -127260 1546 1557 -127260 1556 1643 -127260 1557 1749 -127260 1570 1479 -127260 1573 1440 -127260 1573 1921 -127260 1579 1708 -127260 1604 1857 -127260 1634 1920 -127260 1635 1821 -127260 1640 1884 -127260 1673 1865 -127260 1673 1914 -127260 1688 1911 -127260 1706 1471 -127260 1721 1816 -127260 1731 1821 -127260 1761 1863 -127260 1765 1889 -127260 1789 1427 -127260 1789 1435 -127260 1805 1888 -127260 1866 1908 -127260 1876 1479 -127260 1880 1462 -127260 1889 1502 -127260 1921 1440 -127260 1921 1523 -127260 1921 1532 -127260 1487 1520 -127260 1500 1511 -127260 1502 1532 -127260 1507 1522 -127260 1538 1579 -127260 1622 1695 -127260 1625 1825 -127260 1625 1821 -127260 1695 1526 -127260 1698 1703 -127260 1711 1802 -127260 1816 1823 -127260 1831 1499 -127260 1834 1903 -127260 1920 1483 -127260 1608 1530 -127260 1703 1707 -127260 1790 1426 -127260 1865 1914 -127260 1579 1524 -127260 1582 1907 -127260 1676 1498 -127260 1877 1908 -127260 1892 1477 -127260 1563 1579 -127260 1563 1524 -127260 1581 1479 -127260 1613 1625 -127260 1635 1443 -127260 1829 1886 -127260 1924 1492 -127260 1617 1269 -127260 1622 1526 -127260 1635 1731 -127260 1702 1841 -127260 1796 1816 -127260 1551 1617 -127260 1551 1269 -127260 1731 1443 -127260 1541 1462 -127260 1886 1441 -127260 1642 1704 -127260 1825 1510 -127260 1549 1890 -127260 1688 1457 -127260 1718 1889 -127260 1761 1493 -127260 1598 1871 -127260 1665 1519 -127260 1552 1453 -127280 1538 1579 -127280 1540 1520 -127280 1551 1604 -127280 1556 1427 -127280 1557 1599 -127280 1559 1569 -127280 1562 1635 -127280 1568 1920 -127280 1604 1617 -127280 1608 1502 -127280 1612 1775 -127280 1613 1825 -127280 1613 1821 -127280 1622 1695 -127280 1625 1825 -127280 1625 1821 -127280 1664 1728 -127280 1673 1433 -127280 1673 1718 -127280 1695 1526 -127280 1698 1703 -127280 1703 1520 -127280 1703 1764 -127280 1711 1802 -127280 1792 1427 -127280 1816 1823 -127280 1821 1825 -127280 1823 1881 -127280 1831 1499 -127280 1834 1903 -127280 1836 1882 -127280 1840 1892 -127280 1920 1483 -127280 1440 1502 -127280 1502 1530 -127280 1608 1530 -127280 1669 1754 -127280 1703 1707 -127280 1790 1426 -127280 1802 1469 -127280 1865 1914 -127280 1919 1924 -127280 1485 1517 -127280 1579 1524 -127280 1582 1907 -127280 1657 1769 -127280 1676 1498 -127280 1877 1908 -127280 1892 1477 -127280 1563 1579 -127280 1563 1524 -127280 1581 1479 -127280 1613 1625 -127280 1642 1643 -127280 1635 1443 -127280 1829 1886 -127280 1924 1492 -127280 1617 1269 -127280 1622 1526 -127280 1635 1731 -127280 1702 1841 -127280 1796 1816 -127280 1816 1881 -127280 1551 1617 -127280 1551 1269 -127280 1731 1443 -127280 1541 1462 -127280 1886 1441 -127280 1642 1704 -127280 1825 1510 -127280 1643 1704 -127280 1549 1890 -127280 1688 1457 -127280 1718 1889 -127280 1761 1493 -127280 1598 1871 -127280 1665 1519 -127280 1552 1453 -127300 1542 1554 -127300 1545 1430 -127300 1562 1613 -127300 1591 1865 -127300 1608 1530 -127300 1608 1866 -127300 1612 1802 -127300 1613 1921 -127300 1634 1920 -127300 1641 1695 -127300 1643 1520 -127300 1669 1754 -127300 1698 1764 -127300 1702 1901 -127300 1703 1707 -127300 1708 1789 -127300 1749 1765 -127300 1790 1426 -127300 1802 1469 -127300 1836 1502 -127300 1841 1901 -127300 1865 1914 -127300 1870 1906 -127300 1919 1924 -127300 1485 1517 -127300 1562 1882 -127300 1579 1524 -127300 1582 1907 -127300 1599 1532 -127300 1657 1769 -127300 1676 1498 -127300 1761 1438 -127300 1792 1885 -127300 1877 1908 -127300 1892 1477 -127300 1538 1563 -127300 1563 1579 -127300 1563 1524 -127300 1581 1479 -127300 1613 1625 -127300 1642 1643 -127300 1670 1908 -127300 1635 1443 -127300 1796 1881 -127300 1829 1886 -127300 1829 1441 -127300 1890 1525 -127300 1892 1898 -127300 1924 1492 -127300 1546 1557 -127300 1617 1269 -127300 1622 1526 -127300 1635 1731 -127300 1702 1841 -127300 1721 1816 -127300 1796 1816 -127300 1816 1881 -127300 1551 1617 -127300 1551 1269 -127300 1731 1443 -127300 1500 1511 -127300 1541 1462 -127300 1886 1441 -127300 1642 1704 -127300 1825 1510 -127300 1643 1704 -127300 1549 1890 -127300 1688 1457 -127300 1718 1889 -127300 1761 1493 -127300 1598 1871 -127300 1665 1519 -127300 1552 1453 -127320 1538 1579 -127320 1562 1440 -127320 1562 1882 -127320 1563 1633 -127320 1569 1520 -127320 1579 1524 -127320 1580 1816 -127320 1582 1907 -127320 1599 1440 -127320 1599 1882 -127320 1599 1532 -127320 1604 1857 -127320 1608 1520 -127320 1612 1692 -127320 1613 1825 -127320 1648 1685 -127320 1657 1769 -127320 1670 1877 -127320 1676 1498 -127320 1685 1696 -127320 1695 1526 -127320 1727 1845 -127320 1732 1889 -127320 1761 1438 -127320 1783 1531 -127320 1792 1885 -127320 1840 1477 -127320 1877 1908 -127320 1892 1477 -127320 1921 1520 -127320 1538 1563 -127320 1563 1579 -127320 1563 1524 -127320 1581 1479 -127320 1613 1625 -127320 1642 1643 -127320 1664 1728 -127320 1670 1908 -127320 1635 1443 -127320 1676 1790 -127320 1698 1707 -127320 1754 1906 -127320 1796 1881 -127320 1829 1886 -127320 1829 1441 -127320 1840 1892 -127320 1890 1525 -127320 1892 1898 -127320 1924 1492 -127320 1546 1557 -127320 1576 1680 -127320 1617 1269 -127320 1622 1526 -127320 1622 1695 -127320 1635 1731 -127320 1702 1841 -127320 1721 1816 -127320 1796 1816 -127320 1816 1823 -127320 1816 1881 -127320 1551 1617 -127320 1551 1269 -127320 1731 1443 -127320 1500 1511 -127320 1541 1462 -127320 1669 1906 -127320 1886 1441 -127320 1642 1704 -127320 1825 1510 -127320 1643 1704 -127320 1549 1890 -127320 1790 1498 -127320 1688 1457 -127320 1718 1889 -127320 1761 1493 -127320 1598 1871 -127320 1665 1519 -127320 1552 1453 -127340 1538 1563 -127340 1542 1765 -127340 1542 1789 -127340 1557 1684 -127340 1558 1516 -127340 1563 1592 -127340 1563 1579 -127340 1563 1524 -127340 1568 1768 -127340 1568 1514 -127340 1581 1479 -127340 1582 1667 -127340 1590 1522 -127340 1595 1654 -127340 1613 1625 -127340 1617 1857 -127340 1642 1643 -127340 1664 1728 -127340 1670 1908 -127340 1717 1439 -127340 1749 1757 -127340 1761 1883 -127340 1765 1532 -127340 1789 1532 -127340 1831 1499 -127340 1857 1497 -127340 1877 1479 -127340 1907 1908 -127340 1908 1479 -127340 1554 1434 -127340 1554 1612 -127340 1599 1825 -127340 1635 1443 -127340 1676 1790 -127340 1698 1707 -127340 1698 1764 -127340 1707 1764 -127340 1754 1906 -127340 1767 1892 -127340 1796 1881 -127340 1829 1857 -127340 1829 1886 -127340 1829 1441 -127340 1840 1892 -127340 1890 1525 -127340 1892 1898 -127340 1924 1492 -127340 1461 1500 -127340 1546 1557 -127340 1576 1680 -127340 1617 1269 -127340 1622 1526 -127340 1622 1695 -127340 1635 1731 -127340 1641 1526 -127340 1702 1841 -127340 1711 1802 -127340 1721 1816 -127340 1796 1816 -127340 1816 1823 -127340 1816 1881 -127340 1551 1617 -127340 1551 1269 -127340 1608 1919 -127340 1731 1443 -127340 1834 1903 -127340 1500 1511 -127340 1541 1462 -127340 1669 1906 -127340 1886 1441 -127340 1580 1628 -127340 1642 1704 -127340 1581 1908 -127340 1670 1479 -127340 1825 1510 -127340 1502 1530 -127340 1580 1463 -127340 1582 1437 -127340 1643 1704 -127340 1549 1890 -127340 1680 1835 -127340 1790 1498 -127340 1688 1457 -127340 1718 1889 -127340 1840 1898 -127340 1761 1493 -127340 1598 1871 -127340 1665 1519 -127340 1552 1453 -127360 1538 1579 -127360 1542 1688 -127360 1542 1749 -127360 1551 1857 -127360 1554 1434 -127360 1554 1612 -127360 1562 1880 -127360 1563 1618 -127360 1568 1443 -127360 1576 1835 -127360 1599 1825 -127360 1601 1652 -127360 1604 1839 -127360 1613 1483 -127360 1635 1443 -127360 1648 1696 -127360 1676 1790 -127360 1695 1526 -127360 1698 1707 -127360 1698 1764 -127360 1700 1718 -127360 1707 1764 -127360 1710 1734 -127360 1734 1786 -127360 1754 1906 -127360 1765 1443 -127360 1767 1892 -127360 1796 1881 -127360 1829 1857 -127360 1829 1886 -127360 1829 1441 -127360 1840 1892 -127360 1890 1525 -127360 1892 1898 -127360 1924 1492 -127360 1461 1500 -127360 1461 1511 -127360 1538 1524 -127360 1546 1557 -127360 1576 1680 -127360 1608 1520 -127360 1617 1269 -127360 1622 1526 -127360 1622 1695 -127360 1635 1731 -127360 1641 1526 -127360 1702 1841 -127360 1711 1802 -127360 1721 1816 -127360 1796 1816 -127360 1816 1823 -127360 1816 1881 -127360 1919 1492 -127360 1551 1617 -127360 1551 1269 -127360 1608 1919 -127360 1703 1707 -127360 1731 1443 -127360 1834 1903 -127360 1500 1511 -127360 1541 1462 -127360 1573 1919 -127360 1669 1906 -127360 1792 1885 -127360 1886 1441 -127360 1580 1628 -127360 1642 1704 -127360 1581 1908 -127360 1670 1479 -127360 1825 1510 -127360 1502 1530 -127360 1580 1463 -127360 1582 1437 -127360 1643 1704 -127360 1549 1890 -127360 1680 1835 -127360 1790 1498 -127360 1688 1457 -127360 1718 1889 -127360 1840 1898 -127360 1761 1493 -127360 1598 1871 -127360 1665 1519 -127360 1552 1453 -127380 1538 1524 -127380 1546 1557 -127380 1549 1525 -127380 1554 1568 -127380 1556 1601 -127380 1558 1516 -127380 1563 1592 -127380 1563 1579 -127380 1570 1707 -127380 1575 1761 -127380 1576 1680 -127380 1608 1520 -127380 1612 1532 -127380 1612 1613 -127380 1613 1625 -127380 1613 1635 -127380 1617 1269 -127380 1622 1526 -127380 1622 1695 -127380 1635 1880 -127380 1635 1731 -127380 1635 1532 -127380 1635 1502 -127380 1641 1734 -127380 1641 1526 -127380 1664 1728 -127380 1673 1440 -127380 1684 1888 -127380 1694 1717 -127380 1702 1841 -127380 1706 1901 -127380 1711 1857 -127380 1711 1802 -127380 1721 1816 -127380 1734 1806 -127380 1749 1757 -127380 1749 1821 -127380 1775 1898 -127380 1796 1816 -127380 1802 1857 -127380 1802 1469 -127380 1816 1823 -127380 1816 1881 -127380 1865 1876 -127380 1880 1532 -127380 1919 1492 -127380 1921 1492 -127380 1551 1617 -127380 1551 1269 -127380 1573 1608 -127380 1573 1520 -127380 1591 1471 -127380 1608 1919 -127380 1644 1661 -127380 1698 1487 -127380 1703 1707 -127380 1731 1443 -127380 1834 1903 -127380 1919 1924 -127380 1920 1505 -127380 1500 1511 -127380 1541 1462 -127380 1559 1463 -127380 1573 1919 -127380 1579 1524 -127380 1613 1518 -127380 1669 1754 -127380 1669 1906 -127380 1761 1920 -127380 1792 1885 -127380 1886 1441 -127380 1924 1520 -127380 1580 1628 -127380 1642 1704 -127380 1642 1643 -127380 1581 1908 -127380 1877 1908 -127380 1670 1479 -127380 1825 1510 -127380 1502 1530 -127380 1580 1463 -127380 1582 1437 -127380 1643 1704 -127380 1549 1890 -127380 1538 1563 -127380 1680 1835 -127380 1790 1498 -127380 1688 1457 -127380 1718 1889 -127380 1840 1898 -127380 1761 1493 -127380 1598 1871 -127380 1665 1519 -127380 1552 1453 -127400 1538 1511 -127400 1551 1568 -127400 1551 1617 -127400 1551 1269 -127400 1551 1857 -127400 1552 1819 -127400 1554 1562 -127400 1554 1532 -127400 1554 1613 -127400 1554 1502 -127400 1556 1865 -127400 1556 1718 -127400 1556 1889 -127400 1559 1580 -127400 1562 1530 -127400 1562 1483 -127400 1562 1612 -127400 1570 1708 -127400 1573 1608 -127400 1573 1520 -127400 1591 1471 -127400 1595 1654 -127400 1598 1845 -127400 1608 1492 -127400 1608 1919 -127400 1612 1502 -127400 1613 1532 -127400 1635 1647 -127400 1644 1661 -127400 1648 1920 -127400 1698 1803 -127400 1698 1487 -127400 1700 1876 -127400 1703 1707 -127400 1731 1443 -127400 1731 1532 -127400 1767 1789 -127400 1816 1442 -127400 1834 1903 -127400 1865 1889 -127400 1881 1442 -127400 1883 1516 -127400 1890 1525 -127400 1919 1520 -127400 1919 1924 -127400 1919 1478 -127400 1920 1505 -127400 1500 1511 -127400 1511 1524 -127400 1518 1532 -127400 1541 1462 -127400 1559 1463 -127400 1563 1511 -127400 1573 1919 -127400 1579 1524 -127400 1599 1882 -127400 1613 1518 -127400 1669 1754 -127400 1669 1906 -127400 1761 1920 -127400 1792 1885 -127400 1829 1441 -127400 1886 1441 -127400 1920 1493 -127400 1924 1520 -127400 1478 1520 -127400 1568 1684 -127400 1580 1628 -127400 1642 1704 -127400 1642 1643 -127400 1841 1448 -127400 1581 1908 -127400 1877 1908 -127400 1670 1479 -127400 1825 1510 -127400 1502 1530 -127400 1580 1463 -127400 1582 1437 -127400 1643 1704 -127400 1549 1890 -127400 1538 1563 -127400 1680 1835 -127400 1790 1498 -127400 1688 1457 -127400 1754 1906 -127400 1718 1889 -127400 1840 1898 -127400 1761 1493 -127400 1598 1871 -127400 1665 1519 -127400 1552 1453 -127420 1541 1574 -127420 1541 1462 -127420 1554 1688 -127420 1556 1681 -127420 1556 1886 -127420 1559 1463 -127420 1562 1518 -127420 1563 1579 -127420 1563 1511 -127420 1569 1458 -127420 1573 1919 -127420 1579 1524 -127420 1599 1882 -127420 1599 1510 -127420 1604 1816 -127420 1613 1518 -127420 1616 1855 -127420 1617 1886 -127420 1628 1463 -127420 1647 1452 -127420 1667 1865 -127420 1667 1718 -127420 1667 1889 -127420 1669 1754 -127420 1669 1906 -127420 1694 1717 -127420 1698 1461 -127420 1698 1511 -127420 1700 1526 -127420 1701 1883 -127420 1711 1740 -127420 1718 1865 -127420 1761 1920 -127420 1792 1885 -127420 1802 1469 -127420 1819 1453 -127420 1829 1441 -127420 1886 1441 -127420 1920 1493 -127420 1924 1520 -127420 1924 1478 -127420 1478 1520 -127420 1485 1517 -127420 1518 1530 -127420 1538 1524 -127420 1568 1684 -127420 1580 1628 -127420 1641 1460 -127420 1642 1704 -127420 1642 1643 -127420 1816 1823 -127420 1841 1448 -127420 1574 1518 -127420 1581 1908 -127420 1581 1877 -127420 1613 1625 -127420 1711 1908 -127420 1711 1877 -127420 1877 1908 -127420 1549 1525 -127420 1573 1924 -127420 1670 1479 -127420 1825 1510 -127420 1502 1530 -127420 1580 1463 -127420 1582 1437 -127420 1643 1704 -127420 1829 1886 -127420 1549 1890 -127420 1563 1524 -127420 1538 1563 -127420 1680 1835 -127420 1790 1498 -127420 1688 1457 -127420 1754 1906 -127420 1718 1889 -127420 1840 1898 -127420 1761 1493 -127420 1598 1871 -127420 1665 1519 -127420 1552 1453 -127440 1538 1524 -127440 1540 1554 -127440 1551 1568 -127440 1554 1579 -127440 1556 1441 -127440 1568 1684 -127440 1580 1628 -127440 1593 1765 -127440 1595 1816 -127440 1599 1499 -127440 1599 1884 -127440 1608 1483 -127440 1625 1882 -127440 1641 1460 -127440 1641 1710 -127440 1642 1704 -127440 1642 1643 -127440 1644 1661 -127440 1656 1717 -127440 1679 1821 -127440 1685 1443 -127440 1702 1448 -127440 1703 1707 -127440 1713 1734 -127440 1717 1511 -127440 1727 1819 -127440 1734 1848 -127440 1816 1823 -127440 1831 1526 -127440 1841 1448 -127440 1847 1503 -127440 1848 1517 -127440 1889 1921 -127440 1898 1477 -127440 1562 1613 -127440 1564 1681 -127440 1573 1478 -127440 1574 1518 -127440 1581 1908 -127440 1581 1877 -127440 1581 1711 -127440 1595 1654 -127440 1613 1825 -127440 1613 1625 -127440 1711 1908 -127440 1711 1877 -127440 1727 1845 -127440 1877 1908 -127440 1549 1525 -127440 1576 1680 -127440 1641 1713 -127440 1834 1903 -127440 1573 1924 -127440 1670 1479 -127440 1825 1510 -127440 1502 1530 -127440 1580 1463 -127440 1582 1437 -127440 1643 1704 -127440 1829 1886 -127440 1549 1890 -127440 1563 1524 -127440 1890 1525 -127440 1538 1563 -127440 1617 1441 -127440 1680 1835 -127440 1790 1498 -127440 1688 1457 -127440 1754 1906 -127440 1718 1889 -127440 1840 1898 -127440 1761 1493 -127440 1598 1871 -127440 1665 1519 -127440 1552 1453 -127460 1554 1592 -127460 1554 1651 -127460 1556 1617 -127460 1556 1532 -127460 1562 1825 -127460 1562 1613 -127460 1563 1703 -127460 1564 1681 -127460 1573 1478 -127460 1574 1518 -127460 1581 1908 -127460 1581 1877 -127460 1581 1711 -127460 1590 1664 -127460 1593 1848 -127460 1593 1676 -127460 1595 1654 -127460 1613 1825 -127460 1613 1882 -127460 1613 1625 -127460 1617 1532 -127460 1701 1717 -127460 1701 1511 -127460 1702 1841 -127460 1711 1908 -127460 1711 1877 -127460 1717 1803 -127460 1727 1845 -127460 1734 1448 -127460 1786 1451 -127460 1796 1816 -127460 1877 1908 -127460 1441 1532 -127460 1545 1531 -127460 1549 1525 -127460 1563 1698 -127460 1576 1680 -127460 1626 1680 -127460 1641 1713 -127460 1834 1903 -127460 1500 1511 -127460 1573 1924 -127460 1670 1479 -127460 1825 1510 -127460 1455 1517 -127460 1502 1530 -127460 1580 1463 -127460 1582 1437 -127460 1643 1704 -127460 1829 1886 -127460 1549 1890 -127460 1550 1572 -127460 1563 1524 -127460 1590 1717 -127460 1890 1525 -127460 1538 1563 -127460 1617 1441 -127460 1680 1835 -127460 1694 1491 -127460 1790 1498 -127460 1669 1906 -127460 1688 1457 -127460 1754 1906 -127460 1718 1889 -127460 1840 1898 -127460 1761 1493 -127460 1541 1462 -127460 1598 1871 -127460 1698 1703 -127460 1665 1519 -127460 1552 1453 -127480 1541 1518 -127480 1545 1531 -127480 1549 1525 -127480 1556 1816 -127480 1556 1881 -127480 1563 1698 -127480 1573 1520 -127480 1576 1680 -127480 1577 1882 -127480 1580 1628 -127480 1593 1437 -127480 1613 1530 -127480 1614 1532 -127480 1626 1680 -127480 1635 1664 -127480 1641 1713 -127480 1664 1516 -127480 1664 1487 -127480 1664 1439 -127480 1679 1821 -127480 1681 1513 -127480 1701 1504 -127480 1718 1470 -127480 1768 1446 -127480 1802 1469 -127480 1825 1525 -127480 1834 1903 -127480 1924 1520 -127480 1500 1511 -127480 1568 1840 -127480 1573 1924 -127480 1599 1644 -127480 1635 1439 -127480 1670 1479 -127480 1767 1840 -127480 1825 1510 -127480 1455 1517 -127480 1502 1530 -127480 1580 1463 -127480 1582 1437 -127480 1599 1884 -127480 1643 1704 -127480 1829 1886 -127480 1549 1890 -127480 1550 1572 -127480 1563 1524 -127480 1590 1717 -127480 1890 1525 -127480 1538 1563 -127480 1617 1441 -127480 1680 1835 -127480 1694 1491 -127480 1790 1498 -127480 1669 1906 -127480 1688 1457 -127480 1754 1906 -127480 1718 1889 -127480 1840 1898 -127480 1761 1493 -127480 1538 1524 -127480 1541 1462 -127480 1598 1871 -127480 1698 1703 -127480 1665 1519 -127480 1552 1453 -127500 1551 1568 -127500 1558 1516 -127500 1560 1498 -127500 1560 1790 -127500 1568 1840 -127500 1568 1802 -127500 1573 1924 -127500 1574 1819 -127500 1581 1908 -127500 1581 1479 -127500 1595 1654 -127500 1599 1644 -127500 1616 1876 -127500 1617 1816 -127500 1635 1439 -127500 1670 1479 -127500 1695 1731 -127500 1711 1479 -127500 1735 1503 -127500 1767 1840 -127500 1792 1885 -127500 1796 1881 -127500 1825 1510 -127500 1877 1479 -127500 1908 1479 -127500 1455 1517 -127500 1500 1516 -127500 1502 1530 -127500 1511 1516 -127500 1580 1463 -127500 1582 1437 -127500 1599 1884 -127500 1635 1666 -127500 1643 1704 -127500 1678 1835 -127500 1829 1886 -127500 1442 1446 -127500 1546 1557 -127500 1549 1890 -127500 1550 1572 -127500 1563 1524 -127500 1590 1717 -127500 1616 1831 -127500 1670 1711 -127500 1890 1525 -127500 1538 1563 -127500 1617 1441 -127500 1680 1835 -127500 1694 1491 -127500 1727 1845 -127500 1790 1498 -127500 1669 1906 -127500 1688 1457 -127500 1754 1906 -127500 1840 1892 -127500 1892 1898 -127500 1604 1924 -127500 1718 1889 -127500 1840 1898 -127500 1761 1493 -127500 1538 1524 -127500 1541 1462 -127500 1598 1871 -127500 1698 1703 -127500 1665 1519 -127500 1552 1453 -127500 1657 1769 -127520 1541 1574 -127520 1556 1731 -127520 1562 1731 -127520 1579 1792 -127520 1579 1883 -127520 1579 1590 -127520 1580 1463 -127520 1581 1877 -127520 1582 1437 -127520 1590 1792 -127520 1590 1511 -127520 1599 1884 -127520 1604 1520 -127520 1612 1792 -127520 1612 1717 -127520 1614 1816 -127520 1616 1513 -127520 1635 1666 -127520 1641 1503 -127520 1643 1704 -127520 1678 1835 -127520 1681 1876 -127520 1685 1443 -127520 1698 1708 -127520 1754 1426 -127520 1792 1511 -127520 1829 1886 -127520 1840 1477 -127520 1857 1870 -127520 1877 1470 -127520 1892 1477 -127520 1924 1520 -127520 1442 1446 -127520 1546 1557 -127520 1549 1890 -127520 1550 1572 -127520 1556 1568 -127520 1563 1524 -127520 1577 1882 -127520 1590 1717 -127520 1616 1831 -127520 1670 1711 -127520 1702 1901 -127520 1718 1921 -127520 1841 1901 -127520 1890 1525 -127520 1500 1511 -127520 1526 1528 -127520 1538 1563 -127520 1617 1441 -127520 1680 1835 -127520 1694 1491 -127520 1727 1845 -127520 1790 1498 -127520 1580 1628 -127520 1669 1906 -127520 1669 1754 -127520 1688 1457 -127520 1754 1906 -127520 1840 1892 -127520 1892 1898 -127520 1604 1924 -127520 1670 1877 -127520 1718 1889 -127520 1840 1898 -127520 1761 1493 -127520 1538 1524 -127520 1541 1462 -127520 1598 1871 -127520 1698 1703 -127520 1665 1519 -127520 1552 1453 -127520 1657 1769 -127540 1545 1531 -127540 1546 1557 -127540 1549 1890 -127540 1549 1525 -127540 1550 1572 -127540 1551 1802 -127540 1556 1568 -127540 1563 1524 -127540 1568 1520 -127540 1568 1882 -127540 1568 1798 -127540 1574 1520 -127540 1574 1502 -127540 1577 1882 -127540 1590 1643 -127540 1590 1717 -127540 1590 1885 -127540 1592 1635 -127540 1593 1437 -127540 1599 1519 -127540 1612 1708 -127540 1616 1831 -127540 1635 1821 -127540 1643 1792 -127540 1670 1711 -127540 1688 1530 -127540 1702 1841 -127540 1702 1901 -127540 1704 1717 -127540 1711 1877 -127540 1713 1532 -127540 1717 1792 -127540 1718 1921 -127540 1721 1816 -127540 1734 1834 -127540 1768 1528 -127540 1841 1901 -127540 1890 1525 -127540 1890 1430 -127540 1901 1448 -127540 1448 1532 -127540 1500 1511 -127540 1526 1528 -127540 1538 1563 -127540 1554 1613 -127540 1574 1890 -127540 1582 1672 -127540 1625 1866 -127540 1673 1887 -127540 1708 1717 -127540 1711 1528 -127540 1857 1886 -127540 1442 1520 -127540 1568 1510 -127540 1617 1441 -127540 1643 1717 -127540 1680 1835 -127540 1694 1491 -127540 1727 1845 -127540 1790 1498 -127540 1599 1882 -127540 1625 1728 -127540 1580 1628 -127540 1669 1906 -127540 1669 1754 -127540 1688 1457 -127540 1754 1906 -127540 1834 1903 -127540 1840 1892 -127540 1892 1898 -127540 1604 1924 -127540 1670 1877 -127540 1718 1889 -127540 1840 1898 -127540 1761 1493 -127540 1538 1524 -127540 1541 1462 -127540 1598 1871 -127540 1698 1703 -127540 1665 1519 -127540 1552 1453 -127540 1657 1769 -127560 1538 1563 -127560 1543 1498 -127560 1543 1790 -127560 1543 1503 -127560 1554 1613 -127560 1560 1582 -127560 1562 1568 -127560 1562 1599 -127560 1563 1698 -127560 1563 1885 -127560 1563 1703 -127560 1574 1890 -127560 1576 1680 -127560 1581 1883 -127560 1582 1672 -127560 1601 1652 -127560 1614 1426 -127560 1617 1734 -127560 1617 1479 -127560 1625 1866 -127560 1635 1530 -127560 1648 1696 -127560 1652 1711 -127560 1673 1887 -127560 1676 1503 -127560 1678 1680 -127560 1694 1704 -127560 1701 1461 -127560 1707 1908 -127560 1708 1717 -127560 1711 1528 -127560 1754 1426 -127560 1765 1503 -127560 1816 1479 -127560 1848 1503 -127560 1857 1886 -127560 1858 1448 -127560 1883 1908 -127560 1442 1520 -127560 1514 1520 -127560 1568 1510 -127560 1617 1441 -127560 1643 1717 -127560 1643 1439 -127560 1680 1835 -127560 1694 1491 -127560 1727 1845 -127560 1269 1870 -127560 1790 1498 -127560 1568 1825 -127560 1573 1478 -127560 1599 1882 -127560 1617 1816 -127560 1625 1728 -127560 1580 1628 -127560 1616 1889 -127560 1626 1520 -127560 1669 1906 -127560 1669 1754 -127560 1688 1457 -127560 1754 1906 -127560 1834 1903 -127560 1840 1892 -127560 1892 1898 -127560 1604 1924 -127560 1670 1877 -127560 1718 1889 -127560 1829 1886 -127560 1840 1898 -127560 1761 1493 -127560 1538 1524 -127560 1541 1462 -127560 1598 1871 -127560 1734 1441 -127560 1698 1703 -127560 1665 1519 -127560 1825 1510 -127560 1552 1453 -127560 1657 1769 -127580 1551 1870 -127580 1551 1269 -127580 1554 1872 -127580 1554 1462 -127580 1556 1692 -127580 1556 1734 -127580 1560 1664 -127580 1568 1574 -127580 1568 1510 -127580 1591 1641 -127580 1599 1446 -127580 1612 1491 -127580 1614 1685 -127580 1616 1513 -127580 1617 1441 -127580 1617 1470 -127580 1623 1706 -127580 1635 1749 -127580 1642 1681 -127580 1643 1708 -127580 1643 1516 -127580 1643 1717 -127580 1643 1439 -127580 1664 1831 -127580 1670 1711 -127580 1680 1835 -127580 1694 1491 -127580 1711 1883 -127580 1718 1513 -127580 1727 1845 -127580 1734 1816 -127580 1269 1870 -127580 1790 1498 -127580 1790 1796 -127580 1792 1885 -127580 1816 1441 -127580 1862 1470 -127580 1882 1446 -127580 1475 1522 -127580 1537 1628 -127580 1568 1825 -127580 1573 1478 -127580 1599 1882 -127580 1616 1718 -127580 1617 1816 -127580 1625 1728 -127580 1711 1877 -127580 1269 1886 -127580 1792 1908 -127580 1816 1881 -127580 1537 1580 -127580 1549 1890 -127580 1580 1628 -127580 1612 1694 -127580 1616 1889 -127580 1626 1520 -127580 1669 1906 -127580 1669 1754 -127580 1688 1457 -127580 1754 1906 -127580 1834 1903 -127580 1840 1892 -127580 1890 1525 -127580 1892 1898 -127580 1551 1886 -127580 1604 1924 -127580 1647 1713 -127580 1651 1883 -127580 1670 1877 -127580 1718 1889 -127580 1829 1886 -127580 1840 1898 -127580 1761 1493 -127580 1538 1524 -127580 1541 1462 -127580 1598 1871 -127580 1734 1441 -127580 1581 1908 -127580 1698 1703 -127580 1665 1519 -127580 1825 1510 -127580 1552 1453 -127580 1657 1769 -127600 1537 1628 -127600 1560 1831 -127600 1563 1698 -127600 1568 1825 -127600 1573 1478 -127600 1574 1825 -127600 1596 1427 -127600 1599 1882 -127600 1613 1914 -127600 1616 1718 -127600 1617 1816 -127600 1625 1728 -127600 1647 1901 -127600 1664 1887 -127600 1664 1479 -127600 1698 1908 -127600 1702 1841 -127600 1703 1908 -127600 1708 1516 -127600 1711 1877 -127600 1269 1886 -127600 1792 1908 -127600 1798 1877 -127600 1802 1901 -127600 1816 1881 -127600 1877 1883 -127600 1885 1908 -127600 1427 1483 -127600 1500 1511 -127600 1537 1580 -127600 1549 1890 -127600 1551 1857 -127600 1551 1829 -127600 1554 1871 -127600 1563 1524 -127600 1579 1717 -127600 1580 1628 -127600 1612 1694 -127600 1616 1889 -127600 1626 1520 -127600 1669 1906 -127600 1669 1754 -127600 1672 1498 -127600 1688 1457 -127600 1721 1816 -127600 1754 1906 -127600 1786 1517 -127600 1834 1903 -127600 1840 1892 -127600 1890 1525 -127600 1892 1898 -127600 1551 1886 -127600 1604 1924 -127600 1647 1713 -127600 1651 1883 -127600 1670 1877 -127600 1718 1889 -127600 1829 1886 -127600 1840 1898 -127600 1855 1427 -127600 1599 1499 -127600 1761 1493 -127600 1786 1455 -127600 1538 1524 -127600 1541 1462 -127600 1598 1871 -127600 1734 1441 -127600 1581 1908 -127600 1698 1703 -127600 1665 1519 -127600 1825 1510 -127600 1857 1470 -127600 1552 1453 -127600 1657 1769 -127620 1537 1568 -127620 1537 1580 -127620 1549 1890 -127620 1551 1857 -127620 1551 1829 -127620 1554 1871 -127620 1556 1601 -127620 1556 1580 -127620 1562 1678 -127620 1563 1524 -127620 1579 1717 -127620 1580 1906 -127620 1580 1628 -127620 1587 1688 -127620 1612 1694 -127620 1616 1889 -127620 1617 1887 -127620 1626 1520 -127620 1635 1469 -127620 1642 1681 -127620 1669 1906 -127620 1669 1754 -127620 1670 1479 -127620 1670 1711 -127620 1671 1491 -127620 1672 1498 -127620 1688 1457 -127620 1711 1479 -127620 1717 1811 -127620 1718 1513 -127620 1721 1816 -127620 1754 1906 -127620 1786 1517 -127620 1816 1887 -127620 1831 1887 -127620 1834 1903 -127620 1840 1892 -127620 1883 1511 -127620 1889 1513 -127620 1890 1525 -127620 1892 1898 -127620 1550 1572 -127620 1551 1886 -127620 1576 1680 -127620 1604 1924 -127620 1616 1513 -127620 1647 1713 -127620 1651 1883 -127620 1670 1427 -127620 1670 1877 -127620 1718 1889 -127620 1727 1845 -127620 1816 1823 -127620 1829 1886 -127620 1840 1898 -127620 1855 1427 -127620 1599 1499 -127620 1667 1889 -127620 1717 1442 -127620 1761 1493 -127620 1786 1455 -127620 1538 1524 -127620 1541 1462 -127620 1591 1858 -127620 1598 1871 -127620 1734 1441 -127620 1581 1908 -127620 1698 1703 -127620 1665 1519 -127620 1877 1427 -127620 1825 1510 -127620 1857 1470 -127620 1552 1453 -127620 1657 1769 -127640 1550 1572 -127640 1551 1886 -127640 1563 1885 -127640 1573 1922 -127640 1576 1680 -127640 1590 1727 -127640 1604 1924 -127640 1604 1478 -127640 1614 1520 -127640 1616 1513 -127640 1635 1857 -127640 1635 1870 -127640 1635 1887 -127640 1643 1715 -127640 1647 1713 -127640 1651 1883 -127640 1670 1427 -127640 1670 1877 -127640 1711 1877 -127640 1718 1889 -127640 1727 1845 -127640 1816 1823 -127640 1819 1866 -127640 1829 1886 -127640 1836 1487 -127640 1840 1898 -127640 1855 1427 -127640 1855 1483 -127640 1863 1438 -127640 1885 1908 -127640 1427 1479 -127640 1427 1483 -127640 1452 1471 -127640 1491 1502 -127640 1554 1692 -127640 1569 1742 -127640 1599 1499 -127640 1613 1643 -127640 1616 1718 -127640 1643 1704 -127640 1652 1426 -127640 1667 1889 -127640 1667 1718 -127640 1711 1427 -127640 1717 1442 -127640 1761 1493 -127640 1786 1455 -127640 1625 1728 -127640 1680 1835 -127640 1538 1524 -127640 1541 1462 -127640 1591 1858 -127640 1598 1871 -127640 1734 1441 -127640 1702 1841 -127640 1576 1835 -127640 1581 1908 -127640 1698 1703 -127640 1665 1519 -127640 1792 1885 -127640 1877 1427 -127640 1825 1510 -127640 1857 1470 -127640 1552 1453 -127640 1657 1769 -127660 1538 1563 -127660 1546 1557 -127660 1551 1684 -127660 1551 1767 -127660 1554 1692 -127660 1556 1590 -127660 1556 1727 -127660 1563 1792 -127660 1569 1742 -127660 1590 1514 -127660 1599 1499 -127660 1601 1692 -127660 1612 1427 -127660 1613 1643 -127660 1616 1718 -127660 1643 1704 -127660 1652 1426 -127660 1667 1889 -127660 1667 1718 -127660 1671 1479 -127660 1672 1498 -127660 1704 1819 -127660 1711 1427 -127660 1717 1442 -127660 1761 1531 -127660 1761 1493 -127660 1767 1840 -127660 1786 1455 -127660 1802 1471 -127660 1821 1427 -127660 1889 1921 -127660 1441 1517 -127660 1526 1528 -127660 1625 1728 -127660 1642 1681 -127660 1664 1754 -127660 1680 1835 -127660 1702 1718 -127660 1834 1903 -127660 1538 1524 -127660 1541 1462 -127660 1591 1858 -127660 1598 1871 -127660 1672 1676 -127660 1688 1457 -127660 1823 1881 -127660 1884 1499 -127660 1734 1441 -127660 1702 1841 -127660 1576 1835 -127660 1581 1908 -127660 1698 1703 -127660 1665 1519 -127660 1792 1885 -127660 1892 1898 -127660 1877 1427 -127660 1825 1510 -127660 1857 1470 -127660 1552 1453 -127660 1493 1531 -127660 1657 1769 -127680 1538 1711 -127680 1541 1643 -127680 1554 1517 -127680 1554 1734 -127680 1554 1887 -127680 1563 1698 -127680 1563 1587 -127680 1563 1798 -127680 1563 1479 -127680 1570 1587 -127680 1576 1680 -127680 1592 1479 -127680 1599 1446 -127680 1608 1883 -127680 1608 1651 -127680 1625 1728 -127680 1642 1681 -127680 1648 1696 -127680 1651 1883 -127680 1664 1754 -127680 1664 1669 -127680 1670 1479 -127680 1678 1772 -127680 1680 1835 -127680 1694 1435 -127680 1702 1718 -127680 1702 1921 -127680 1711 1524 -127680 1718 1921 -127680 1798 1479 -127680 1816 1823 -127680 1819 1460 -127680 1819 1439 -127680 1834 1903 -127680 1841 1921 -127680 1890 1525 -127680 1538 1524 -127680 1541 1462 -127680 1550 1572 -127680 1551 1269 -127680 1558 1516 -127680 1574 1825 -127680 1587 1479 -127680 1591 1858 -127680 1598 1871 -127680 1617 1829 -127680 1635 1857 -127680 1672 1676 -127680 1676 1498 -127680 1688 1457 -127680 1704 1443 -127680 1772 1503 -127680 1792 1479 -127680 1823 1881 -127680 1829 1441 -127680 1884 1499 -127680 1446 1499 -127680 1552 1761 -127680 1734 1441 -127680 1702 1841 -127680 1576 1835 -127680 1581 1908 -127680 1698 1703 -127680 1665 1519 -127680 1727 1845 -127680 1792 1885 -127680 1892 1898 -127680 1877 1427 -127680 1825 1510 -127680 1857 1470 -127680 1552 1453 -127680 1493 1531 -127680 1657 1769 -127700 1538 1579 -127700 1538 1524 -127700 1541 1462 -127700 1550 1572 -127700 1551 1269 -127700 1556 1819 -127700 1558 1516 -127700 1574 1825 -127700 1575 1462 -127700 1587 1479 -127700 1590 1593 -127700 1591 1858 -127700 1592 1514 -127700 1598 1871 -127700 1599 1499 -127700 1617 1829 -127700 1623 1706 -127700 1635 1857 -127700 1635 1470 -127700 1643 1443 -127700 1667 1907 -127700 1672 1676 -127700 1676 1498 -127700 1678 1700 -127700 1688 1457 -127700 1704 1443 -127700 1718 1841 -127700 1718 1452 -127700 1731 1888 -127700 1772 1503 -127700 1792 1798 -127700 1792 1479 -127700 1823 1881 -127700 1829 1441 -127700 1884 1499 -127700 1446 1499 -127700 1549 1525 -127700 1552 1761 -127700 1596 1855 -127700 1643 1704 -127700 1713 1802 -127700 1734 1441 -127700 1734 1517 -127700 1702 1841 -127700 1717 1427 -127700 1734 1839 -127700 1576 1835 -127700 1581 1908 -127700 1698 1703 -127700 1665 1519 -127700 1727 1845 -127700 1792 1885 -127700 1892 1898 -127700 1441 1517 -127700 1877 1427 -127700 1825 1510 -127700 1857 1470 -127700 1552 1453 -127700 1493 1531 -127700 1657 1769 -127700 1443 1487 -127720 1537 1572 -127720 1543 1678 -127720 1549 1525 -127720 1551 1886 -127720 1552 1761 -127720 1556 1688 -127720 1556 1457 -127720 1556 1701 -127720 1563 1688 -127720 1563 1922 -127720 1563 1711 -127720 1573 1734 -127720 1579 1708 -127720 1580 1661 -127720 1587 1688 -127720 1587 1792 -127720 1591 1905 -127720 1592 1711 -127720 1596 1855 -127720 1608 1821 -127720 1643 1704 -127720 1643 1493 -127720 1643 1847 -127720 1648 1847 -127720 1666 1866 -127720 1678 1482 -127720 1679 1906 -127720 1688 1792 -127720 1694 1435 -127720 1700 1871 -127720 1704 1761 -127720 1704 1493 -127720 1713 1802 -127720 1718 1921 -127720 1734 1441 -127720 1734 1517 -127720 1761 1920 -127720 1761 1847 -127720 1802 1841 -127720 1819 1457 -127720 1834 1903 -127720 1848 1887 -127720 1887 1503 -127720 1890 1525 -127720 1439 1528 -127720 1526 1528 -127720 1587 1885 -127720 1608 1807 -127720 1688 1885 -127720 1702 1841 -127720 1702 1718 -127720 1717 1427 -127720 1734 1839 -127720 1767 1892 -127720 1876 1923 -127720 1541 1872 -127720 1576 1835 -127720 1581 1908 -127720 1670 1711 -127720 1698 1703 -127720 1711 1479 -127720 1582 1593 -127720 1665 1519 -127720 1727 1845 -127720 1792 1885 -127720 1892 1898 -127720 1441 1517 -127720 1576 1680 -127720 1877 1427 -127720 1825 1510 -127720 1857 1470 -127720 1563 1792 -127720 1552 1453 -127720 1680 1835 -127720 1493 1531 -127720 1657 1769 -127720 1443 1487 -127740 1551 1269 -127740 1563 1866 -127740 1570 1847 -127740 1573 1710 -127740 1580 1871 -127740 1587 1885 -127740 1590 1839 -127740 1592 1885 -127740 1604 1821 -127740 1608 1807 -127740 1614 1678 -127740 1616 1426 -127740 1617 1497 -127740 1641 1839 -127740 1672 1498 -127740 1688 1885 -127740 1688 1711 -127740 1702 1841 -127740 1702 1718 -127740 1704 1453 -127740 1713 1821 -127740 1717 1427 -127740 1734 1839 -127740 1767 1892 -127740 1792 1866 -127740 1816 1881 -127740 1816 1444 -127740 1819 1462 -127740 1840 1898 -127740 1847 1491 -127740 1857 1441 -127740 1857 1517 -127740 1866 1885 -127740 1876 1923 -127740 1889 1921 -127740 1901 1532 -127740 1446 1499 -127740 1527 1531 -127740 1541 1872 -127740 1563 1885 -127740 1573 1829 -127740 1576 1835 -127740 1581 1908 -127740 1670 1711 -127740 1688 1922 -127740 1698 1703 -127740 1711 1479 -127740 1772 1503 -127740 1883 1437 -127740 1921 1452 -127740 1500 1511 -127740 1582 1593 -127740 1598 1871 -127740 1665 1519 -127740 1727 1845 -127740 1792 1885 -127740 1892 1898 -127740 1441 1517 -127740 1538 1524 -127740 1576 1680 -127740 1877 1427 -127740 1825 1510 -127740 1575 1906 -127740 1857 1470 -127740 1563 1792 -127740 1552 1453 -127740 1680 1835 -127740 1699 1530 -127740 1493 1531 -127740 1657 1769 -127740 1443 1487 -127760 1541 1872 -127760 1549 1890 -127760 1551 1573 -127760 1551 1734 -127760 1563 1698 -127760 1563 1813 -127760 1563 1885 -127760 1573 1829 -127760 1576 1835 -127760 1581 1908 -127760 1587 1608 -127760 1590 1811 -127760 1599 1754 -127760 1599 1623 -127760 1608 1465 -127760 1608 1717 -127760 1623 1789 -127760 1635 1734 -127760 1641 1441 -127760 1642 1681 -127760 1643 1704 -127760 1664 1734 -127760 1669 1754 -127760 1670 1479 -127760 1670 1711 -127760 1676 1498 -127760 1688 1922 -127760 1688 1708 -127760 1698 1792 -127760 1698 1703 -127760 1711 1479 -127760 1718 1921 -127760 1731 1839 -127760 1734 1517 -127760 1772 1503 -127760 1821 1439 -127760 1841 1921 -127760 1883 1437 -127760 1884 1499 -127760 1885 1904 -127760 1921 1452 -127760 1500 1511 -127760 1563 1581 -127760 1582 1593 -127760 1598 1871 -127760 1665 1519 -127760 1727 1845 -127760 1792 1885 -127760 1802 1865 -127760 1816 1823 -127760 1892 1898 -127760 1441 1517 -127760 1538 1524 -127760 1576 1680 -127760 1877 1427 -127760 1825 1510 -127760 1575 1906 -127760 1834 1903 -127760 1579 1717 -127760 1591 1858 -127760 1857 1470 -127760 1563 1792 -127760 1552 1453 -127760 1633 1772 -127760 1680 1835 -127760 1699 1530 -127760 1493 1531 -127760 1549 1525 -127760 1657 1769 -127760 1443 1487 -127760 1890 1525 -127780 1537 1839 -127780 1543 1551 -127780 1551 1769 -127780 1554 1839 -127780 1556 1698 -127780 1563 1581 -127780 1568 1821 -127780 1568 1590 -127780 1582 1593 -127780 1587 1502 -127780 1598 1871 -127780 1608 1703 -127780 1643 1528 -127780 1647 1841 -127780 1657 1455 -127780 1659 1661 -127780 1665 1519 -127780 1666 1688 -127780 1666 1703 -127780 1667 1865 -127780 1667 1713 -127780 1678 1872 -127780 1678 1731 -127780 1701 1883 -127780 1703 1711 -127780 1703 1479 -127780 1708 1904 -127780 1727 1845 -127780 1767 1898 -127780 1792 1885 -127780 1802 1865 -127780 1811 1517 -127780 1816 1881 -127780 1816 1883 -127780 1816 1823 -127780 1819 1491 -127780 1847 1462 -127780 1889 1471 -127780 1892 1898 -127780 1908 1479 -127780 1441 1517 -127780 1499 1520 -127780 1538 1524 -127780 1554 1811 -127780 1556 1847 -127780 1576 1680 -127780 1578 1920 -127780 1619 1908 -127780 1786 1437 -127780 1840 1886 -127780 1877 1427 -127780 1825 1510 -127780 1562 1755 -127780 1575 1906 -127780 1834 1903 -127780 1579 1717 -127780 1591 1858 -127780 1857 1470 -127780 1563 1792 -127780 1718 1889 -127780 1552 1453 -127780 1633 1772 -127780 1680 1835 -127780 1699 1530 -127780 1493 1531 -127780 1549 1525 -127780 1657 1769 -127780 1443 1487 -127780 1890 1525 -127800 1538 1524 -127800 1546 1557 -127800 1550 1554 -127800 1550 1451 -127800 1550 1517 -127800 1551 1269 -127800 1554 1664 -127800 1554 1811 -127800 1554 1684 -127800 1554 1517 -127800 1556 1847 -127800 1572 1482 -127800 1575 1491 -127800 1576 1680 -127800 1578 1920 -127800 1579 1698 -127800 1579 1877 -127800 1590 1819 -127800 1592 1688 -127800 1593 1786 -127800 1599 1517 -127800 1608 1698 -127800 1619 1908 -127800 1641 1657 -127800 1648 1731 -127800 1652 1426 -127800 1664 1482 -127800 1670 1688 -127800 1670 1711 -127800 1676 1498 -127800 1684 1482 -127800 1688 1908 -127800 1696 1731 -127800 1703 1708 -127800 1717 1427 -127800 1717 1877 -127800 1786 1437 -127800 1831 1841 -127800 1839 1848 -127800 1839 1451 -127800 1840 1886 -127800 1877 1427 -127800 1901 1905 -127800 1482 1517 -127800 1527 1531 -127800 1698 1708 -127800 1710 1441 -127800 1734 1886 -127800 1825 1510 -127800 1437 1455 -127800 1441 1492 -127800 1500 1511 -127800 1562 1873 -127800 1562 1755 -127800 1575 1906 -127800 1579 1427 -127800 1608 1688 -127800 1834 1903 -127800 1847 1485 -127800 1579 1717 -127800 1549 1890 -127800 1591 1858 -127800 1857 1470 -127800 1563 1792 -127800 1582 1455 -127800 1718 1889 -127800 1920 1526 -127800 1552 1453 -127800 1633 1772 -127800 1680 1835 -127800 1699 1530 -127800 1711 1479 -127800 1493 1531 -127800 1581 1479 -127800 1581 1711 -127800 1549 1525 -127800 1657 1769 -127800 1443 1487 -127800 1890 1525 -127820 1550 1492 -127820 1554 1574 -127820 1554 1462 -127820 1560 1713 -127820 1563 1590 -127820 1576 1835 -127820 1591 1786 -127820 1592 1883 -127820 1592 1798 -127820 1617 1786 -127820 1651 1462 -127820 1688 1877 -127820 1688 1798 -127820 1688 1479 -127820 1698 1883 -127820 1698 1708 -127820 1704 1920 -127820 1708 1502 -127820 1710 1441 -127820 1718 1880 -127820 1718 1462 -127820 1734 1886 -127820 1755 1873 -127820 1767 1886 -127820 1792 1885 -127820 1802 1841 -127820 1811 1901 -127820 1825 1510 -127820 1889 1462 -127820 1437 1455 -127820 1441 1492 -127820 1500 1511 -127820 1554 1889 -127820 1562 1873 -127820 1562 1755 -127820 1575 1906 -127820 1579 1427 -127820 1608 1688 -127820 1670 1479 -127820 1775 1816 -127820 1805 1888 -127820 1816 1823 -127820 1834 1903 -127820 1847 1485 -127820 1482 1520 -127820 1499 1520 -127820 1579 1717 -127820 1711 1877 -127820 1549 1890 -127820 1591 1858 -127820 1857 1470 -127820 1563 1792 -127820 1563 1885 -127820 1582 1455 -127820 1665 1519 -127820 1718 1889 -127820 1920 1526 -127820 1552 1453 -127820 1633 1772 -127820 1680 1835 -127820 1699 1530 -127820 1892 1898 -127820 1711 1479 -127820 1493 1531 -127820 1581 1479 -127820 1581 1711 -127820 1549 1525 -127820 1657 1769 -127820 1598 1871 -127820 1443 1487 -127820 1890 1525 -127840 1537 1821 -127840 1541 1679 -127840 1554 1889 -127840 1554 1718 -127840 1556 1485 -127840 1562 1873 -127840 1562 1755 -127840 1565 1802 -127840 1568 1578 -127840 1575 1906 -127840 1578 1520 -127840 1579 1427 -127840 1595 1790 -127840 1608 1688 -127840 1626 1651 -127840 1643 1704 -127840 1643 1920 -127840 1651 1889 -127840 1651 1718 -127840 1670 1479 -127840 1699 1502 -127840 1749 1906 -127840 1769 1492 -127840 1775 1816 -127840 1791 1462 -127840 1792 1908 -127840 1805 1888 -127840 1816 1823 -127840 1834 1903 -127840 1847 1485 -127840 1451 1517 -127840 1463 1464 -127840 1482 1520 -127840 1499 1520 -127840 1579 1717 -127840 1604 1749 -127840 1684 1451 -127840 1711 1877 -127840 1749 1807 -127840 1767 1840 -127840 1857 1441 -127840 1877 1479 -127840 1549 1890 -127840 1591 1858 -127840 1670 1711 -127840 1857 1470 -127840 1563 1792 -127840 1563 1885 -127840 1582 1455 -127840 1665 1519 -127840 1718 1889 -127840 1920 1526 -127840 1552 1453 -127840 1633 1772 -127840 1680 1835 -127840 1699 1530 -127840 1884 1499 -127840 1892 1898 -127840 1427 1524 -127840 1711 1479 -127840 1493 1531 -127840 1581 1479 -127840 1581 1711 -127840 1549 1525 -127840 1576 1680 -127840 1657 1769 -127840 1598 1871 -127840 1551 1269 -127840 1920 1528 -127840 1443 1487 -127840 1890 1525 -127860 1538 1427 -127860 1543 1685 -127860 1568 1572 -127860 1578 1482 -127860 1579 1717 -127860 1587 1718 -127860 1590 1811 -127860 1590 1830 -127860 1592 1485 -127860 1604 1883 -127860 1604 1749 -127860 1684 1451 -127860 1684 1886 -127860 1698 1889 -127860 1698 1718 -127860 1700 1727 -127860 1704 1731 -127860 1711 1877 -127860 1717 1442 -127860 1734 1840 -127860 1734 1898 -127860 1734 1767 -127860 1749 1883 -127860 1749 1807 -127860 1754 1464 -127860 1767 1840 -127860 1805 1520 -127860 1829 1520 -127860 1835 1492 -127860 1857 1441 -127860 1877 1479 -127860 1437 1455 -127860 1517 1520 -127860 1549 1890 -127860 1591 1858 -127860 1592 1688 -127860 1670 1711 -127860 1857 1470 -127860 1546 1557 -127860 1563 1792 -127860 1563 1885 -127860 1582 1455 -127860 1665 1519 -127860 1718 1889 -127860 1792 1885 -127860 1825 1510 -127860 1920 1526 -127860 1552 1453 -127860 1626 1453 -127860 1633 1772 -127860 1680 1835 -127860 1699 1530 -127860 1749 1757 -127860 1884 1499 -127860 1892 1898 -127860 1427 1524 -127860 1711 1479 -127860 1493 1531 -127860 1581 1479 -127860 1581 1711 -127860 1678 1874 -127860 1549 1525 -127860 1576 1680 -127860 1657 1769 -127860 1598 1871 -127860 1551 1269 -127860 1710 1441 -127860 1920 1528 -127860 1443 1487 -127860 1890 1525 -127880 1537 1520 -127880 1549 1890 -127880 1554 1819 -127880 1569 1458 -127880 1587 1889 -127880 1591 1858 -127880 1592 1688 -127880 1599 1512 -127880 1670 1711 -127880 1688 1711 -127880 1692 1495 -127880 1701 1455 -127880 1707 1491 -127880 1727 1807 -127880 1757 1883 -127880 1816 1881 -127880 1831 1495 -127880 1857 1470 -127880 1880 1435 -127880 1886 1520 -127880 1886 1495 -127880 1905 1471 -127880 1921 1462 -127880 1495 1520 -127880 1520 1532 -127880 1546 1557 -127880 1563 1792 -127880 1563 1885 -127880 1582 1455 -127880 1595 1654 -127880 1665 1519 -127880 1718 1889 -127880 1792 1885 -127880 1825 1510 -127880 1829 1451 -127880 1840 1892 -127880 1920 1526 -127880 1475 1522 -127880 1552 1453 -127880 1626 1453 -127880 1633 1772 -127880 1680 1835 -127880 1699 1530 -127880 1749 1757 -127880 1884 1499 -127880 1892 1898 -127880 1427 1524 -127880 1500 1511 -127880 1711 1479 -127880 1493 1531 -127880 1576 1835 -127880 1581 1479 -127880 1581 1711 -127880 1678 1874 -127880 1829 1886 -127880 1549 1525 -127880 1576 1680 -127880 1657 1769 -127880 1598 1871 -127880 1551 1269 -127880 1710 1441 -127880 1920 1528 -127880 1443 1487 -127880 1731 1493 -127880 1890 1525 -127900 1538 1427 -127900 1539 1905 -127900 1543 1685 -127900 1546 1557 -127900 1549 1569 -127900 1563 1792 -127900 1563 1688 -127900 1563 1885 -127900 1568 1435 -127900 1582 1455 -127900 1587 1688 -127900 1590 1495 -127900 1590 1455 -127900 1591 1470 -127900 1595 1654 -127900 1596 1502 -127900 1604 1883 -127900 1635 1754 -127900 1643 1704 -127900 1652 1865 -127900 1652 1907 -127900 1665 1519 -127900 1684 1829 -127900 1700 1734 -127900 1701 1437 -127900 1718 1889 -127900 1721 1816 -127900 1792 1885 -127900 1816 1502 -127900 1825 1890 -127900 1825 1510 -127900 1829 1451 -127900 1831 1520 -127900 1840 1898 -127900 1840 1892 -127900 1858 1901 -127900 1870 1463 -127900 1920 1526 -127900 1475 1522 -127900 1541 1679 -127900 1552 1453 -127900 1626 1453 -127900 1633 1772 -127900 1680 1835 -127900 1699 1530 -127900 1711 1877 -127900 1749 1757 -127900 1884 1499 -127900 1892 1898 -127900 1427 1524 -127900 1458 1520 -127900 1500 1511 -127900 1684 1451 -127900 1711 1479 -127900 1493 1531 -127900 1570 1666 -127900 1576 1835 -127900 1581 1479 -127900 1581 1711 -127900 1678 1874 -127900 1727 1845 -127900 1877 1479 -127900 1829 1886 -127900 1549 1525 -127900 1576 1680 -127900 1657 1769 -127900 1598 1871 -127900 1551 1269 -127900 1710 1441 -127900 1920 1528 -127900 1443 1487 -127900 1731 1493 -127900 1755 1873 -127900 1890 1525 -127920 1541 1679 -127920 1552 1626 -127920 1552 1453 -127920 1580 1628 -127920 1590 1635 -127920 1591 1635 -127920 1613 1889 -127920 1626 1453 -127920 1633 1772 -127920 1635 1821 -127920 1680 1835 -127920 1694 1427 -127920 1699 1530 -127920 1707 1502 -127920 1711 1877 -127920 1740 1497 -127920 1749 1757 -127920 1796 1831 -127920 1825 1884 -127920 1834 1903 -127920 1858 1470 -127920 1884 1499 -127920 1892 1898 -127920 1427 1524 -127920 1458 1520 -127920 1500 1511 -127920 1563 1440 -127920 1684 1451 -127920 1711 1479 -127920 1493 1531 -127920 1570 1666 -127920 1576 1835 -127920 1581 1479 -127920 1581 1877 -127920 1581 1711 -127920 1591 1858 -127920 1678 1874 -127920 1727 1845 -127920 1816 1881 -127920 1877 1479 -127920 1905 1471 -127920 1554 1688 -127920 1599 1512 -127920 1829 1886 -127920 1549 1525 -127920 1576 1680 -127920 1657 1769 -127920 1857 1470 -127920 1880 1495 -127920 1601 1911 -127920 1598 1871 -127920 1551 1269 -127920 1710 1441 -127920 1920 1528 -127920 1443 1487 -127920 1731 1493 -127920 1755 1873 -127920 1890 1525 -127940 1538 1592 -127940 1546 1557 -127940 1556 1761 -127940 1563 1440 -127940 1563 1511 -127940 1568 1807 -127940 1574 1531 -127940 1578 1495 -127940 1590 1664 -127940 1590 1767 -127940 1609 1518 -127940 1634 1802 -127940 1635 1441 -127940 1635 1641 -127940 1642 1757 -127940 1643 1821 -127940 1670 1440 -127940 1684 1451 -127940 1698 1871 -127940 1704 1754 -127940 1711 1479 -127940 1717 1907 -127940 1718 1458 -127940 1731 1531 -127940 1749 1905 -127940 1761 1531 -127940 1767 1840 -127940 1767 1892 -127940 1792 1885 -127940 1792 1805 -127940 1829 1451 -127940 1871 1889 -127940 1889 1458 -127940 1908 1440 -127940 1439 1462 -127940 1440 1479 -127940 1491 1530 -127940 1493 1531 -127940 1570 1666 -127940 1576 1835 -127940 1581 1479 -127940 1581 1877 -127940 1581 1711 -127940 1591 1858 -127940 1664 1821 -127940 1670 1877 -127940 1670 1479 -127940 1678 1874 -127940 1701 1437 -127940 1727 1845 -127940 1816 1881 -127940 1877 1908 -127940 1877 1479 -127940 1892 1477 -127940 1898 1477 -127940 1905 1471 -127940 1908 1479 -127940 1549 1890 -127940 1554 1688 -127940 1599 1512 -127940 1711 1908 -127940 1829 1886 -127940 1924 1478 -127940 1549 1525 -127940 1576 1680 -127940 1657 1769 -127940 1718 1889 -127940 1857 1470 -127940 1880 1495 -127940 1601 1911 -127940 1598 1871 -127940 1551 1269 -127940 1710 1441 -127940 1920 1528 -127940 1443 1487 -127940 1731 1493 -127940 1755 1873 -127940 1890 1525 -127960 1556 1920 -127960 1570 1666 -127960 1576 1835 -127960 1578 1877 -127960 1581 1479 -127960 1581 1908 -127960 1581 1877 -127960 1581 1711 -127960 1591 1858 -127960 1596 1841 -127960 1635 1735 -127960 1643 1704 -127960 1664 1821 -127960 1670 1877 -127960 1670 1479 -127960 1678 1874 -127960 1701 1437 -127960 1703 1866 -127960 1704 1437 -127960 1727 1845 -127960 1740 1497 -127960 1772 1441 -127960 1772 1434 -127960 1783 1526 -127960 1789 1458 -127960 1798 1908 -127960 1816 1881 -127960 1821 1532 -127960 1825 1519 -127960 1877 1908 -127960 1877 1479 -127960 1892 1477 -127960 1898 1477 -127960 1905 1471 -127960 1908 1479 -127960 1453 1531 -127960 1538 1524 -127960 1549 1890 -127960 1554 1688 -127960 1599 1512 -127960 1711 1908 -127960 1829 1886 -127960 1924 1478 -127960 1475 1522 -127960 1549 1525 -127960 1576 1680 -127960 1657 1769 -127960 1718 1889 -127960 1857 1470 -127960 1880 1495 -127960 1601 1911 -127960 1680 1835 -127960 1598 1871 -127960 1551 1269 -127960 1710 1441 -127960 1920 1528 -127960 1443 1487 -127960 1892 1898 -127960 1731 1493 -127960 1755 1873 -127960 1890 1525 -127980 1538 1524 -127980 1549 1890 -127980 1554 1688 -127980 1556 1520 -127980 1563 1688 -127980 1599 1512 -127980 1609 1518 -127980 1704 1772 -127980 1711 1908 -127980 1792 1458 -127980 1821 1455 -127980 1825 1446 -127980 1829 1886 -127980 1880 1532 -127980 1924 1478 -127980 1465 1500 -127980 1475 1522 -127980 1549 1525 -127980 1576 1680 -127980 1657 1769 -127980 1684 1451 -127980 1718 1889 -127980 1831 1471 -127980 1857 1470 -127980 1880 1495 -127980 1601 1911 -127980 1680 1835 -127980 1455 1463 -127980 1598 1871 -127980 1551 1269 -127980 1710 1441 -127980 1920 1528 -127980 1443 1487 -127980 1892 1898 -127980 1731 1493 -127980 1755 1873 -127980 1890 1525 -128000 1541 1575 -128000 1549 1525 -128000 1563 1433 -128000 1576 1680 -128000 1591 1858 -128000 1592 1908 -128000 1635 1834 -128000 1643 1437 -128000 1657 1769 -128000 1676 1498 -128000 1676 1434 -128000 1678 1680 -128000 1678 1874 -128000 1684 1451 -128000 1692 1829 -128000 1701 1437 -128000 1711 1847 -128000 1713 1855 -128000 1718 1889 -128000 1816 1881 -128000 1816 1502 -128000 1825 1499 -128000 1831 1471 -128000 1857 1470 -128000 1880 1495 -128000 1601 1911 -128000 1680 1835 -128000 1816 1823 -128000 1434 1498 -128000 1455 1463 -128000 1587 1775 -128000 1598 1871 -128000 1551 1269 -128000 1576 1835 -128000 1710 1441 -128000 1920 1528 -128000 1443 1487 -128000 1892 1898 -128000 1670 1711 -128000 1731 1493 -128000 1905 1471 -128000 1755 1873 -128000 1890 1525 -128020 1539 1749 -128020 1552 1623 -128020 1556 1848 -128020 1563 1465 -128020 1568 1581 -128020 1575 1679 -128020 1601 1911 -128020 1612 1732 -128020 1617 1441 -128020 1664 1877 -128020 1680 1835 -128020 1698 1825 -128020 1740 1530 -128020 1772 1880 -128020 1772 1532 -128020 1798 1444 -128020 1811 1871 -128020 1816 1823 -128020 1825 1519 -128020 1884 1499 -128020 1911 1465 -128020 1921 1462 -128020 1434 1498 -128020 1444 1527 -128020 1455 1463 -128020 1470 1530 -128020 1587 1775 -128020 1598 1871 -128020 1664 1479 -128020 1727 1845 -128020 1783 1526 -128020 1551 1269 -128020 1554 1575 -128020 1576 1835 -128020 1710 1441 -128020 1920 1528 -128020 1443 1487 -128020 1892 1898 -128020 1877 1479 -128020 1670 1711 -128020 1731 1493 -128020 1905 1471 -128020 1755 1873 -128020 1890 1525 -128020 1664 1821 -128020 1550 1635 -128040 1538 1563 -128040 1539 1754 -128040 1541 1554 -128040 1549 1890 -128040 1568 1772 -128040 1570 1427 -128040 1573 1470 -128040 1587 1775 -128040 1591 1689 -128040 1598 1871 -128040 1601 1698 -128040 1617 1641 -128040 1634 1880 -128040 1641 1441 -128040 1664 1479 -128040 1688 1491 -128040 1698 1908 -128040 1704 1470 -128040 1717 1876 -128040 1749 1921 -128040 1802 1426 -128040 1825 1499 -128040 1834 1903 -128040 1865 1880 -128040 1876 1880 -128040 1905 1532 -128040 1440 1491 -128040 1441 1470 -128040 1471 1532 -128040 1563 1491 -128040 1727 1845 -128040 1831 1460 -128040 1921 1471 -128040 1617 1857 -128040 1783 1526 -128040 1829 1886 -128040 1551 1269 -128040 1554 1575 -128040 1576 1835 -128040 1710 1441 -128040 1920 1528 -128040 1443 1487 -128040 1892 1898 -128040 1877 1479 -128040 1670 1711 -128040 1731 1493 -128040 1905 1471 -128040 1549 1525 -128040 1755 1873 -128040 1890 1525 -128040 1657 1769 -128040 1664 1821 -128040 1550 1635 -128060 1563 1491 -128060 1568 1457 -128060 1573 1754 -128060 1573 1740 -128060 1590 1626 -128060 1609 1518 -128060 1613 1907 -128060 1613 1427 -128060 1634 1802 -128060 1683 1426 -128060 1708 1448 -128060 1718 1889 -128060 1727 1845 -128060 1811 1531 -128060 1831 1905 -128060 1831 1460 -128060 1866 1444 -128060 1874 1503 -128060 1905 1921 -128060 1921 1471 -128060 1580 1772 -128060 1593 1521 -128060 1616 1463 -128060 1617 1857 -128060 1783 1526 -128060 1829 1886 -128060 1905 1462 -128060 1551 1269 -128060 1554 1575 -128060 1576 1835 -128060 1710 1441 -128060 1920 1528 -128060 1443 1487 -128060 1580 1628 -128060 1892 1898 -128060 1648 1696 -128060 1735 1465 -128060 1877 1479 -128060 1670 1711 -128060 1731 1493 -128060 1905 1471 -128060 1549 1525 -128060 1592 1491 -128060 1755 1873 -128060 1890 1525 -128060 1657 1769 -128060 1664 1821 -128060 1550 1635 -128080 1541 1698 -128080 1554 1727 -128080 1556 1848 -128080 1563 1698 -128080 1573 1871 -128080 1575 1727 -128080 1580 1772 -128080 1593 1521 -128080 1616 1463 -128080 1617 1857 -128080 1628 1772 -128080 1630 1531 -128080 1652 1880 -128080 1656 1919 -128080 1688 1495 -128080 1688 1727 -128080 1698 1491 -128080 1783 1526 -128080 1807 1458 -128080 1825 1519 -128080 1829 1886 -128080 1831 1471 -128080 1840 1517 -128080 1905 1452 -128080 1905 1462 -128080 1907 1495 -128080 1452 1471 -128080 1551 1269 -128080 1554 1575 -128080 1576 1835 -128080 1582 1749 -128080 1591 1858 -128080 1592 1433 -128080 1680 1689 -128080 1688 1457 -128080 1710 1441 -128080 1767 1840 -128080 1835 1875 -128080 1920 1528 -128080 1443 1487 -128080 1543 1685 -128080 1580 1628 -128080 1643 1704 -128080 1831 1462 -128080 1892 1898 -128080 1569 1626 -128080 1648 1696 -128080 1735 1465 -128080 1761 1791 -128080 1796 1816 -128080 1877 1479 -128080 1670 1711 -128080 1731 1493 -128080 1905 1471 -128080 1664 1877 -128080 1549 1525 -128080 1592 1491 -128080 1755 1873 -128080 1890 1525 -128080 1657 1769 -128080 1664 1821 -128080 1550 1635 -128100 1538 1524 -128100 1551 1269 -128100 1554 1575 -128100 1563 1727 -128100 1576 1835 -128100 1582 1749 -128100 1591 1858 -128100 1592 1433 -128100 1601 1503 -128100 1626 1871 -128100 1678 1680 -128100 1680 1689 -128100 1688 1457 -128100 1688 1772 -128100 1689 1835 -128100 1701 1530 -128100 1708 1530 -128100 1710 1441 -128100 1715 1919 -128100 1767 1840 -128100 1794 1802 -128100 1802 1865 -128100 1823 1881 -128100 1835 1875 -128100 1855 1426 -128100 1865 1880 -128100 1875 1503 -128100 1892 1517 -128100 1920 1528 -128100 1433 1491 -128100 1443 1487 -128100 1543 1685 -128100 1580 1628 -128100 1635 1676 -128100 1643 1704 -128100 1683 1865 -128100 1831 1462 -128100 1892 1898 -128100 1455 1463 -128100 1569 1626 -128100 1648 1696 -128100 1687 1702 -128100 1735 1465 -128100 1761 1791 -128100 1874 1458 -128100 1460 1499 -128100 1796 1816 -128100 1877 1479 -128100 1670 1711 -128100 1731 1493 -128100 1905 1471 -128100 1664 1877 -128100 1598 1871 -128100 1698 1707 -128100 1549 1525 -128100 1592 1491 -128100 1755 1873 -128100 1890 1525 -128100 1657 1769 -128100 1664 1821 -128100 1550 1635 -128120 1541 1491 -128120 1543 1685 -128120 1550 1560 -128120 1580 1628 -128120 1598 1626 -128120 1635 1676 -128120 1643 1704 -128120 1647 1831 -128120 1680 1503 -128120 1683 1865 -128120 1694 1426 -128120 1695 1717 -128120 1702 1441 -128120 1706 1749 -128120 1728 1440 -128120 1802 1880 -128120 1825 1499 -128120 1829 1886 -128120 1831 1462 -128120 1847 1906 -128120 1892 1898 -128120 1441 1451 -128120 1455 1463 -128120 1499 1519 -128120 1569 1626 -128120 1587 1775 -128120 1648 1696 -128120 1687 1702 -128120 1735 1465 -128120 1761 1443 -128120 1761 1527 -128120 1761 1791 -128120 1825 1469 -128120 1874 1458 -128120 1460 1499 -128120 1796 1816 -128120 1877 1479 -128120 1538 1426 -128120 1670 1711 -128120 1731 1493 -128120 1819 1913 -128120 1905 1471 -128120 1664 1877 -128120 1598 1871 -128120 1698 1707 -128120 1549 1890 -128120 1549 1525 -128120 1592 1491 -128120 1755 1873 -128120 1890 1525 -128120 1657 1769 -128120 1664 1821 -128120 1727 1845 -128120 1550 1635 -128120 1560 1680 -128140 1543 1749 -128140 1554 1679 -128140 1562 1591 -128140 1568 1704 -128140 1568 1643 -128140 1569 1626 -128140 1576 1835 -128140 1579 1596 -128140 1580 1643 -128140 1581 1876 -128140 1587 1775 -128140 1596 1906 -128140 1596 1717 -128140 1612 1865 -128140 1623 1875 -128140 1641 1441 -128140 1643 1427 -128140 1643 1791 -128140 1648 1672 -128140 1648 1696 -128140 1687 1702 -128140 1701 1907 -128140 1717 1906 -128140 1721 1816 -128140 1721 1823 -128140 1735 1465 -128140 1761 1443 -128140 1761 1527 -128140 1761 1791 -128140 1764 1847 -128140 1767 1840 -128140 1772 1906 -128140 1816 1881 -128140 1825 1469 -128140 1840 1479 -128140 1874 1458 -128140 1460 1499 -128140 1580 1427 -128140 1664 1684 -128140 1796 1816 -128140 1796 1881 -128140 1802 1865 -128140 1816 1855 -128140 1877 1479 -128140 1475 1522 -128140 1538 1426 -128140 1670 1711 -128140 1684 1451 -128140 1731 1493 -128140 1761 1495 -128140 1819 1913 -128140 1905 1471 -128140 1664 1877 -128140 1598 1871 -128140 1664 1479 -128140 1698 1707 -128140 1549 1890 -128140 1552 1453 -128140 1549 1525 -128140 1554 1575 -128140 1592 1491 -128140 1755 1873 -128140 1890 1525 -128140 1920 1528 -128140 1657 1769 -128140 1551 1269 -128140 1664 1821 -128140 1727 1845 -128140 1550 1635 -128140 1560 1680 -128160 1543 1685 -128160 1563 1707 -128160 1574 1643 -128160 1579 1772 -128160 1579 1590 -128160 1580 1427 -128160 1580 1628 -128160 1590 1694 -128160 1592 1717 -128160 1598 1427 -128160 1623 1680 -128160 1623 1835 -128160 1647 1675 -128160 1656 1446 -128160 1664 1684 -128160 1678 1689 -128160 1684 1479 -128160 1698 1717 -128160 1704 1495 -128160 1704 1791 -128160 1731 1920 -128160 1772 1865 -128160 1772 1802 -128160 1772 1876 -128160 1794 1880 -128160 1796 1816 -128160 1796 1881 -128160 1796 1823 -128160 1802 1865 -128160 1816 1855 -128160 1829 1886 -128160 1847 1440 -128160 1857 1517 -128160 1865 1876 -128160 1877 1479 -128160 1884 1499 -128160 1455 1463 -128160 1475 1522 -128160 1495 1502 -128160 1538 1426 -128160 1603 1449 -128160 1669 1754 -128160 1670 1711 -128160 1673 1768 -128160 1684 1451 -128160 1731 1493 -128160 1761 1495 -128160 1819 1913 -128160 1905 1471 -128160 1664 1877 -128160 1598 1871 -128160 1664 1479 -128160 1672 1696 -128160 1698 1707 -128160 1541 1707 -128160 1549 1890 -128160 1592 1707 -128160 1426 1524 -128160 1552 1453 -128160 1683 1880 -128160 1549 1525 -128160 1554 1575 -128160 1592 1491 -128160 1755 1873 -128160 1890 1525 -128160 1920 1528 -128160 1657 1769 -128160 1551 1269 -128160 1664 1821 -128160 1727 1845 -128160 1550 1635 -128160 1560 1680 -128180 1538 1426 -128180 1541 1604 -128180 1542 1457 -128180 1568 1805 -128180 1590 1816 -128180 1592 1604 -128180 1596 1613 -128180 1603 1449 -128180 1643 1704 -128180 1648 1696 -128180 1652 1923 -128180 1664 1898 -128180 1669 1754 -128180 1670 1711 -128180 1673 1768 -128180 1680 1897 -128180 1684 1451 -128180 1685 1749 -128180 1688 1865 -128180 1688 1802 -128180 1695 1443 -128180 1727 1775 -128180 1731 1493 -128180 1740 1772 -128180 1761 1495 -128180 1767 1840 -128180 1819 1913 -128180 1835 1897 -128180 1901 1517 -128180 1905 1471 -128180 1635 1676 -128180 1664 1877 -128180 1678 1708 -128180 1688 1772 -128180 1592 1698 -128180 1598 1871 -128180 1617 1857 -128180 1648 1672 -128180 1664 1479 -128180 1672 1696 -128180 1698 1707 -128180 1434 1493 -128180 1541 1707 -128180 1549 1890 -128180 1592 1707 -128180 1426 1524 -128180 1541 1698 -128180 1552 1453 -128180 1598 1626 -128180 1617 1441 -128180 1683 1880 -128180 1495 1527 -128180 1549 1525 -128180 1554 1575 -128180 1592 1491 -128180 1755 1873 -128180 1890 1525 -128180 1920 1528 -128180 1775 1845 -128180 1874 1458 -128180 1657 1769 -128180 1551 1269 -128180 1664 1821 -128180 1727 1845 -128180 1550 1635 -128180 1560 1680 -128200 1560 1835 -128200 1574 1711 -128200 1603 1756 -128200 1604 1491 -128200 1635 1676 -128200 1664 1877 -128200 1678 1708 -128200 1688 1772 -128200 1707 1876 -128200 1708 1835 -128200 1711 1761 -128200 1731 1427 -128200 1798 1437 -128200 1805 1825 -128200 1829 1886 -128200 1921 1462 -128200 1477 1498 -128200 1592 1698 -128200 1598 1871 -128200 1617 1857 -128200 1648 1672 -128200 1664 1479 -128200 1672 1696 -128200 1698 1707 -128200 1757 1921 -128200 1816 1881 -128200 1847 1440 -128200 1434 1493 -128200 1541 1707 -128200 1549 1890 -128200 1592 1707 -128200 1802 1865 -128200 1426 1524 -128200 1541 1698 -128200 1552 1453 -128200 1598 1626 -128200 1617 1441 -128200 1683 1880 -128200 1794 1880 -128200 1877 1479 -128200 1495 1527 -128200 1549 1525 -128200 1554 1575 -128200 1592 1491 -128200 1755 1873 -128200 1890 1525 -128200 1816 1823 -128200 1920 1528 -128200 1775 1845 -128200 1874 1458 -128200 1603 1689 -128200 1563 1688 -128200 1657 1769 -128200 1551 1269 -128200 1664 1821 -128200 1727 1845 -128200 1550 1635 -128200 1560 1680 -128220 1539 1708 -128220 1543 1685 -128220 1587 1772 -128220 1591 1858 -128220 1592 1698 -128220 1598 1871 -128220 1604 1717 -128220 1617 1857 -128220 1643 1704 -128220 1648 1672 -128220 1664 1479 -128220 1672 1696 -128220 1684 1451 -128220 1698 1707 -128220 1698 1717 -128220 1701 1877 -128220 1713 1427 -128220 1742 1802 -128220 1757 1921 -128220 1802 1437 -128220 1816 1881 -128220 1819 1913 -128220 1825 1499 -128220 1847 1440 -128220 1857 1441 -128220 1872 1514 -128220 1898 1477 -128220 1908 1433 -128220 1919 1441 -128220 1434 1493 -128220 1538 1426 -128220 1541 1707 -128220 1543 1706 -128220 1549 1890 -128220 1550 1835 -128220 1592 1707 -128220 1625 1703 -128220 1675 1865 -128220 1772 1487 -128220 1802 1865 -128220 1905 1471 -128220 1426 1524 -128220 1541 1698 -128220 1552 1453 -128220 1598 1626 -128220 1617 1441 -128220 1683 1880 -128220 1792 1885 -128220 1794 1880 -128220 1877 1479 -128220 1495 1527 -128220 1549 1525 -128220 1554 1575 -128220 1592 1491 -128220 1755 1873 -128220 1890 1525 -128220 1816 1823 -128220 1920 1528 -128220 1775 1845 -128220 1874 1458 -128220 1603 1689 -128220 1727 1775 -128220 1892 1898 -128220 1563 1688 -128220 1796 1816 -128220 1657 1769 -128220 1551 1269 -128220 1664 1821 -128220 1727 1845 -128220 1550 1635 -128220 1560 1680 -128240 1538 1426 -128240 1538 1524 -128240 1541 1707 -128240 1543 1706 -128240 1549 1890 -128240 1550 1835 -128240 1569 1598 -128240 1592 1707 -128240 1625 1703 -128240 1635 1676 -128240 1643 1921 -128240 1643 1819 -128240 1643 1462 -128240 1645 1876 -128240 1670 1487 -128240 1675 1865 -128240 1684 1711 -128240 1684 1877 -128240 1684 1479 -128240 1704 1921 -128240 1717 1847 -128240 1756 1453 -128240 1757 1875 -128240 1772 1487 -128240 1792 1887 -128240 1796 1823 -128240 1802 1865 -128240 1819 1921 -128240 1819 1462 -128240 1871 1530 -128240 1876 1493 -128240 1877 1451 -128240 1885 1887 -128240 1905 1471 -128240 1921 1462 -128240 1426 1524 -128240 1439 1448 -128240 1451 1479 -128240 1541 1698 -128240 1552 1453 -128240 1569 1626 -128240 1598 1626 -128240 1617 1441 -128240 1683 1880 -128240 1711 1877 -128240 1711 1479 -128240 1735 1465 -128240 1783 1787 -128240 1787 1526 -128240 1792 1885 -128240 1794 1880 -128240 1877 1479 -128240 1495 1527 -128240 1549 1525 -128240 1554 1575 -128240 1592 1491 -128240 1755 1873 -128240 1890 1525 -128240 1507 1522 -128240 1608 1694 -128240 1816 1823 -128240 1920 1528 -128240 1775 1845 -128240 1874 1458 -128240 1603 1689 -128240 1727 1775 -128240 1892 1898 -128240 1563 1688 -128240 1796 1816 -128240 1657 1769 -128240 1551 1269 -128240 1664 1821 -128240 1727 1845 -128240 1550 1635 -128240 1560 1680 -128260 1541 1698 -128260 1541 1717 -128260 1551 1835 -128260 1552 1453 -128260 1568 1876 -128260 1568 1479 -128260 1569 1626 -128260 1574 1434 -128260 1598 1626 -128260 1617 1441 -128260 1617 1857 -128260 1617 1919 -128260 1643 1701 -128260 1676 1921 -128260 1680 1761 -128260 1683 1880 -128260 1684 1451 -128260 1689 1802 -128260 1701 1731 -128260 1703 1841 -128260 1711 1877 -128260 1711 1479 -128260 1731 1882 -128260 1731 1877 -128260 1731 1479 -128260 1735 1465 -128260 1757 1471 -128260 1783 1787 -128260 1787 1526 -128260 1792 1885 -128260 1794 1880 -128260 1876 1514 -128260 1877 1479 -128260 1905 1487 -128260 1908 1495 -128260 1924 1478 -128260 1495 1527 -128260 1549 1525 -128260 1554 1575 -128260 1592 1698 -128260 1592 1491 -128260 1688 1717 -128260 1707 1491 -128260 1711 1731 -128260 1721 1816 -128260 1755 1873 -128260 1890 1525 -128260 1507 1522 -128260 1608 1694 -128260 1684 1498 -128260 1816 1823 -128260 1920 1528 -128260 1775 1845 -128260 1874 1458 -128260 1603 1689 -128260 1727 1775 -128260 1892 1898 -128260 1563 1688 -128260 1796 1816 -128260 1657 1769 -128260 1551 1269 -128260 1664 1821 -128260 1727 1845 -128260 1550 1635 -128260 1560 1680 -128280 1549 1890 -128280 1549 1525 -128280 1554 1575 -128280 1568 1786 -128280 1568 1731 -128280 1568 1527 -128280 1568 1711 -128280 1572 1711 -128280 1576 1443 -128280 1582 1437 -128280 1592 1698 -128280 1592 1491 -128280 1630 1921 -128280 1643 1704 -128280 1643 1664 -128280 1643 1463 -128280 1645 1495 -128280 1647 1831 -128280 1684 1473 -128280 1688 1717 -128280 1688 1491 -128280 1698 1717 -128280 1703 1479 -128280 1707 1491 -128280 1707 1717 -128280 1711 1731 -128280 1721 1816 -128280 1755 1873 -128280 1756 1479 -128280 1767 1840 -128280 1802 1865 -128280 1876 1434 -128280 1882 1519 -128280 1890 1525 -128280 1921 1462 -128280 1441 1517 -128280 1507 1522 -128280 1543 1706 -128280 1608 1694 -128280 1635 1676 -128280 1684 1498 -128280 1816 1823 -128280 1871 1530 -128280 1876 1469 -128280 1920 1528 -128280 1453 1493 -128280 1775 1845 -128280 1874 1458 -128280 1876 1890 -128280 1603 1689 -128280 1727 1775 -128280 1892 1898 -128280 1563 1688 -128280 1796 1816 -128280 1552 1626 -128280 1657 1769 -128280 1551 1269 -128280 1664 1821 -128280 1727 1845 -128280 1698 1707 -128280 1550 1635 -128280 1572 1731 -128280 1592 1717 -128280 1560 1680 -128300 1543 1706 -128300 1592 1688 -128300 1592 1847 -128300 1598 1643 -128300 1608 1694 -128300 1617 1919 -128300 1635 1676 -128300 1645 1756 -128300 1669 1754 -128300 1677 1479 -128300 1683 1880 -128300 1684 1498 -128300 1701 1825 -128300 1711 1877 -128300 1715 1905 -128300 1816 1823 -128300 1825 1499 -128300 1855 1923 -128300 1857 1441 -128300 1871 1530 -128300 1876 1491 -128300 1876 1469 -128300 1901 1451 -128300 1920 1528 -128300 1426 1524 -128300 1453 1493 -128300 1570 1761 -128300 1657 1517 -128300 1711 1908 -128300 1775 1845 -128300 1825 1890 -128300 1874 1458 -128300 1876 1890 -128300 1908 1479 -128300 1593 1526 -128300 1603 1689 -128300 1727 1775 -128300 1819 1913 -128300 1892 1898 -128300 1538 1426 -128300 1563 1688 -128300 1711 1479 -128300 1796 1816 -128300 1552 1626 -128300 1626 1453 -128300 1626 1527 -128300 1657 1769 -128300 1551 1269 -128300 1664 1821 -128300 1727 1845 -128300 1698 1707 -128300 1550 1635 -128300 1572 1731 -128300 1592 1717 -128300 1560 1680 -128300 1877 1908 -128320 1538 1524 -128320 1552 1527 -128320 1570 1761 -128320 1574 1876 -128320 1593 1783 -128320 1612 1717 -128320 1645 1923 -128320 1657 1517 -128320 1701 1704 -128320 1711 1841 -128320 1711 1908 -128320 1721 1816 -128320 1732 1761 -128320 1743 1905 -128320 1775 1845 -128320 1825 1890 -128320 1825 1519 -128320 1874 1458 -128320 1876 1890 -128320 1877 1479 -128320 1884 1890 -128320 1908 1479 -128320 1913 1471 -128320 1593 1526 -128320 1603 1689 -128320 1617 1514 -128320 1727 1775 -128320 1786 1519 -128320 1819 1913 -128320 1892 1898 -128320 1538 1426 -128320 1512 1531 -128320 1563 1688 -128320 1703 1920 -128320 1711 1479 -128320 1796 1816 -128320 1831 1532 -128320 1552 1626 -128320 1626 1453 -128320 1626 1527 -128320 1657 1769 -128320 1825 1876 -128320 1890 1499 -128320 1551 1269 -128320 1664 1821 -128320 1727 1845 -128320 1698 1707 -128320 1550 1635 -128320 1572 1731 -128320 1592 1717 -128320 1560 1680 -128320 1877 1908 -128340 1579 1761 -128340 1593 1526 -128340 1598 1704 -128340 1603 1689 -128340 1612 1841 -128340 1617 1441 -128340 1617 1514 -128340 1645 1756 -128340 1694 1761 -128340 1727 1775 -128340 1761 1426 -128340 1786 1519 -128340 1802 1865 -128340 1819 1913 -128340 1829 1886 -128340 1841 1495 -128340 1842 1920 -128340 1892 1898 -128340 1892 1919 -128340 1924 1478 -128340 1444 1487 -128340 1455 1463 -128340 1538 1426 -128340 1538 1694 -128340 1590 1487 -128340 1512 1531 -128340 1563 1688 -128340 1703 1920 -128340 1711 1479 -128340 1921 1462 -128340 1598 1643 -128340 1796 1816 -128340 1831 1532 -128340 1920 1479 -128340 1552 1626 -128340 1626 1453 -128340 1626 1527 -128340 1657 1769 -128340 1549 1525 -128340 1825 1876 -128340 1890 1499 -128340 1551 1269 -128340 1664 1821 -128340 1727 1845 -128340 1698 1707 -128340 1550 1635 -128340 1572 1731 -128340 1592 1717 -128340 1560 1680 -128340 1877 1908 -128360 1538 1426 -128360 1538 1579 -128360 1538 1694 -128360 1560 1808 -128360 1590 1487 -128360 1598 1473 -128360 1667 1761 -128360 1694 1426 -128360 1703 1479 -128360 1721 1816 -128360 1728 1857 -128360 1757 1913 -128360 1767 1840 -128360 1840 1857 -128360 1871 1530 -128360 1913 1471 -128360 1426 1524 -128360 1512 1531 -128360 1563 1688 -128360 1703 1920 -128360 1711 1920 -128360 1711 1479 -128360 1921 1462 -128360 1598 1528 -128360 1598 1643 -128360 1796 1816 -128360 1831 1532 -128360 1874 1458 -128360 1920 1479 -128360 1552 1626 -128360 1626 1453 -128360 1626 1527 -128360 1657 1769 -128360 1549 1525 -128360 1816 1881 -128360 1825 1876 -128360 1890 1499 -128360 1551 1269 -128360 1664 1821 -128360 1590 1519 -128360 1727 1845 -128360 1698 1707 -128360 1550 1635 -128360 1572 1731 -128360 1592 1717 -128360 1560 1680 -128360 1877 1908 -128380 1538 1495 -128380 1552 1527 -128380 1563 1688 -128380 1563 1717 -128380 1657 1517 -128380 1688 1847 -128380 1703 1920 -128380 1711 1920 -128380 1711 1479 -128380 1728 1517 -128380 1757 1471 -128380 1769 1441 -128380 1783 1526 -128380 1786 1923 -128380 1802 1865 -128380 1842 1920 -128380 1857 1451 -128380 1921 1462 -128380 1924 1510 -128380 1441 1517 -128380 1507 1522 -128380 1598 1528 -128380 1598 1643 -128380 1630 1443 -128380 1727 1775 -128380 1796 1816 -128380 1831 1532 -128380 1874 1458 -128380 1593 1783 -128380 1669 1754 -128380 1857 1441 -128380 1920 1479 -128380 1552 1626 -128380 1626 1453 -128380 1626 1527 -128380 1657 1769 -128380 1873 1920 -128380 1549 1525 -128380 1816 1881 -128380 1825 1876 -128380 1890 1499 -128380 1453 1493 -128380 1543 1728 -128380 1551 1269 -128380 1664 1821 -128380 1590 1519 -128380 1727 1845 -128380 1698 1707 -128380 1550 1635 -128380 1572 1731 -128380 1592 1717 -128380 1560 1680 -128380 1877 1908 -128400 1541 1698 -128400 1543 1923 -128400 1578 1688 -128400 1598 1528 -128400 1598 1643 -128400 1617 1923 -128400 1630 1443 -128400 1642 1471 -128400 1643 1704 -128400 1683 1479 -128400 1688 1717 -128400 1727 1775 -128400 1728 1434 -128400 1796 1816 -128400 1829 1886 -128400 1831 1532 -128400 1841 1901 -128400 1874 1458 -128400 1884 1890 -128400 1898 1901 -128400 1923 1517 -128400 1593 1783 -128400 1669 1754 -128400 1683 1920 -128400 1857 1441 -128400 1873 1479 -128400 1920 1479 -128400 1487 1493 -128400 1552 1626 -128400 1626 1453 -128400 1626 1527 -128400 1657 1769 -128400 1873 1920 -128400 1549 1525 -128400 1816 1881 -128400 1825 1876 -128400 1890 1499 -128400 1453 1493 -128400 1543 1728 -128400 1551 1269 -128400 1664 1821 -128400 1892 1898 -128400 1590 1519 -128400 1727 1845 -128400 1698 1707 -128400 1550 1635 -128400 1572 1731 -128400 1592 1717 -128400 1560 1680 -128400 1877 1908 -128420 1555 1428 -128420 1556 1921 -128420 1593 1526 -128420 1593 1783 -128420 1603 1689 -128420 1635 1676 -128420 1669 1754 -128420 1683 1920 -128420 1692 1841 -128420 1692 1901 -128420 1698 1717 -128420 1704 1866 -128420 1786 1452 -128420 1841 1919 -128420 1857 1441 -128420 1873 1479 -128420 1920 1479 -128420 1441 1444 -128420 1487 1493 -128420 1552 1626 -128420 1626 1453 -128420 1626 1527 -128420 1657 1769 -128420 1873 1920 -128420 1549 1525 -128420 1603 1680 -128420 1816 1881 -128420 1825 1876 -128420 1890 1499 -128420 1453 1493 -128420 1543 1728 -128420 1551 1269 -128420 1892 1923 -128420 1664 1821 -128420 1680 1443 -128420 1892 1898 -128420 1684 1498 -128420 1590 1519 -128420 1727 1845 -128420 1698 1707 -128420 1550 1635 -128420 1572 1731 -128420 1592 1717 -128420 1735 1465 -128420 1560 1680 -128420 1877 1908 -128420 1563 1688 -128440 1552 1626 -128440 1552 1527 -128440 1560 1449 -128440 1568 1487 -128440 1592 1688 -128440 1617 1514 -128440 1626 1453 -128440 1626 1527 -128440 1645 1756 -128440 1657 1769 -128440 1687 1702 -128440 1708 1848 -128440 1711 1479 -128440 1731 1487 -128440 1772 1908 -128440 1772 1877 -128440 1783 1526 -128440 1794 1495 -128440 1796 1881 -128440 1873 1920 -128440 1884 1499 -128440 1898 1923 -128440 1455 1463 -128440 1512 1531 -128440 1549 1525 -128440 1554 1575 -128440 1560 1603 -128440 1563 1578 -128440 1603 1680 -128440 1603 1443 -128440 1816 1881 -128440 1825 1876 -128440 1884 1890 -128440 1890 1499 -128440 1453 1493 -128440 1543 1728 -128440 1546 1557 -128440 1551 1269 -128440 1598 1528 -128440 1603 1449 -128440 1831 1532 -128440 1874 1458 -128440 1892 1923 -128440 1538 1524 -128440 1664 1821 -128440 1560 1443 -128440 1680 1443 -128440 1892 1898 -128440 1684 1498 -128440 1590 1519 -128440 1727 1845 -128440 1698 1707 -128440 1550 1635 -128440 1572 1731 -128440 1592 1717 -128440 1735 1465 -128440 1560 1680 -128440 1877 1908 -128440 1563 1688 -128460 1549 1525 -128460 1554 1575 -128460 1560 1603 -128460 1563 1578 -128460 1582 1514 -128460 1590 1825 -128460 1590 1626 -128460 1593 1783 -128460 1598 1643 -128460 1603 1680 -128460 1603 1443 -128460 1626 1890 -128460 1635 1808 -128460 1641 1479 -128460 1702 1923 -128460 1711 1905 -128460 1713 1530 -128460 1727 1775 -128460 1757 1857 -128460 1757 1514 -128460 1807 1876 -128460 1816 1881 -128460 1825 1876 -128460 1884 1890 -128460 1890 1499 -128460 1905 1479 -128460 1453 1493 -128460 1543 1728 -128460 1546 1557 -128460 1551 1269 -128460 1598 1528 -128460 1603 1449 -128460 1616 1798 -128460 1798 1885 -128460 1500 1511 -128460 1767 1840 -128460 1831 1532 -128460 1874 1458 -128460 1892 1923 -128460 1538 1524 -128460 1664 1821 -128460 1560 1443 -128460 1574 1890 -128460 1680 1443 -128460 1892 1898 -128460 1684 1498 -128460 1590 1519 -128460 1727 1845 -128460 1698 1707 -128460 1550 1635 -128460 1572 1731 -128460 1592 1717 -128460 1735 1465 -128460 1560 1680 -128460 1877 1908 -128460 1563 1688 -128480 1543 1728 -128480 1546 1557 -128480 1551 1269 -128480 1575 1786 -128480 1582 1441 -128480 1598 1528 -128480 1603 1449 -128480 1616 1798 -128480 1657 1819 -128480 1657 1517 -128480 1688 1717 -128480 1711 1479 -128480 1732 1755 -128480 1769 1819 -128480 1792 1885 -128480 1794 1495 -128480 1798 1885 -128480 1823 1881 -128480 1857 1441 -128480 1913 1517 -128480 1924 1478 -128480 1500 1511 -128480 1552 1453 -128480 1587 1604 -128480 1603 1520 -128480 1617 1441 -128480 1687 1702 -128480 1704 1876 -128480 1767 1840 -128480 1831 1532 -128480 1874 1458 -128480 1876 1528 -128480 1892 1923 -128480 1538 1524 -128480 1598 1704 -128480 1626 1825 -128480 1664 1821 -128480 1560 1443 -128480 1574 1890 -128480 1680 1443 -128480 1892 1898 -128480 1684 1498 -128480 1590 1519 -128480 1727 1845 -128480 1657 1769 -128480 1698 1707 -128480 1550 1635 -128480 1572 1731 -128480 1703 1920 -128480 1592 1717 -128480 1735 1465 -128480 1560 1680 -128480 1877 1908 -128480 1563 1688 -128500 1539 1603 -128500 1552 1453 -128500 1578 1688 -128500 1582 1857 -128500 1587 1604 -128500 1592 1688 -128500 1593 1783 -128500 1603 1520 -128500 1617 1441 -128500 1687 1702 -128500 1699 1464 -128500 1704 1876 -128500 1707 1847 -128500 1767 1840 -128500 1786 1487 -128500 1831 1532 -128500 1880 1449 -128500 1885 1491 -128500 1455 1530 -128500 1643 1703 -128500 1874 1458 -128500 1876 1528 -128500 1892 1923 -128500 1538 1524 -128500 1568 1574 -128500 1598 1704 -128500 1754 1913 -128500 1626 1825 -128500 1453 1493 -128500 1598 1876 -128500 1664 1821 -128500 1560 1443 -128500 1574 1890 -128500 1680 1443 -128500 1892 1898 -128500 1905 1924 -128500 1684 1498 -128500 1549 1525 -128500 1590 1519 -128500 1727 1845 -128500 1603 1880 -128500 1657 1769 -128500 1698 1707 -128500 1550 1635 -128500 1572 1731 -128500 1703 1920 -128500 1592 1717 -128500 1735 1465 -128500 1560 1680 -128500 1877 1908 -128500 1563 1688 -128520 1550 1676 -128520 1560 1880 -128520 1598 1528 -128520 1603 1449 -128520 1643 1703 -128520 1680 1880 -128520 1721 1881 -128520 1728 1772 -128520 1794 1495 -128520 1816 1881 -128520 1874 1458 -128520 1876 1528 -128520 1892 1923 -128520 1924 1478 -128520 1500 1511 -128520 1538 1524 -128520 1560 1603 -128520 1568 1574 -128520 1598 1704 -128520 1664 1452 -128520 1754 1913 -128520 1626 1825 -128520 1643 1704 -128520 1453 1493 -128520 1598 1876 -128520 1617 1857 -128520 1664 1821 -128520 1688 1717 -128520 1711 1877 -128520 1560 1443 -128520 1574 1890 -128520 1680 1443 -128520 1877 1479 -128520 1892 1898 -128520 1905 1924 -128520 1684 1498 -128520 1549 1525 -128520 1590 1519 -128520 1727 1845 -128520 1603 1880 -128520 1657 1769 -128520 1698 1707 -128520 1550 1635 -128520 1572 1731 -128520 1908 1479 -128520 1703 1920 -128520 1592 1717 -128520 1735 1465 -128520 1560 1680 -128520 1877 1908 -128520 1563 1688 -128540 1538 1524 -128540 1560 1603 -128540 1568 1805 -128540 1568 1574 -128540 1574 1590 -128540 1598 1704 -128540 1603 1680 -128540 1664 1452 -128540 1685 1749 -128540 1692 1441 -128540 1704 1920 -128540 1717 1847 -128540 1754 1913 -128540 1767 1840 -128540 1840 1913 -128540 1883 1913 -128540 1898 1923 -128540 1919 1441 -128540 1552 1453 -128540 1554 1604 -128540 1626 1825 -128540 1643 1704 -128540 1775 1845 -128540 1453 1493 -128540 1554 1587 -128540 1598 1876 -128540 1617 1857 -128540 1664 1821 -128540 1688 1717 -128540 1711 1877 -128540 1560 1443 -128540 1568 1890 -128540 1574 1890 -128540 1680 1443 -128540 1877 1479 -128540 1892 1898 -128540 1905 1924 -128540 1721 1816 -128540 1684 1498 -128540 1549 1525 -128540 1590 1519 -128540 1727 1845 -128540 1603 1880 -128540 1657 1769 -128540 1698 1707 -128540 1550 1635 -128540 1572 1731 -128540 1711 1479 -128540 1711 1908 -128540 1908 1479 -128540 1703 1920 -128540 1592 1717 -128540 1598 1842 -128540 1735 1465 -128540 1560 1680 -128540 1877 1908 -128540 1563 1688 -128560 1541 1464 -128560 1543 1434 -128560 1550 1841 -128560 1552 1453 -128560 1554 1604 -128560 1563 1578 -128560 1568 1493 -128560 1581 1591 -128560 1582 1831 -128560 1587 1604 -128560 1590 1819 -128560 1626 1825 -128560 1643 1704 -128560 1695 1875 -128560 1707 1847 -128560 1735 1816 -128560 1769 1532 -128560 1775 1845 -128560 1819 1519 -128560 1911 1524 -128560 1453 1493 -128560 1554 1587 -128560 1574 1913 -128560 1592 1688 -128560 1598 1876 -128560 1617 1857 -128560 1626 1493 -128560 1664 1821 -128560 1688 1717 -128560 1711 1877 -128560 1727 1775 -128560 1816 1881 -128560 1857 1441 -128560 1560 1443 -128560 1568 1890 -128560 1574 1890 -128560 1649 1880 -128560 1680 1443 -128560 1877 1479 -128560 1892 1898 -128560 1905 1924 -128560 1603 1649 -128560 1721 1816 -128560 1538 1493 -128560 1684 1498 -128560 1549 1525 -128560 1590 1519 -128560 1727 1845 -128560 1603 1880 -128560 1657 1769 -128560 1698 1707 -128560 1550 1635 -128560 1572 1731 -128560 1711 1479 -128560 1711 1908 -128560 1908 1479 -128560 1703 1920 -128560 1592 1717 -128560 1598 1842 -128560 1735 1465 -128560 1819 1913 -128560 1538 1825 -128560 1560 1680 -128560 1877 1908 -128560 1563 1688 -128580 1539 1841 -128580 1546 1557 -128580 1554 1587 -128580 1560 1841 -128580 1563 1592 -128580 1574 1913 -128580 1574 1626 -128580 1592 1688 -128580 1598 1876 -128580 1599 1512 -128580 1617 1857 -128580 1626 1493 -128580 1634 1491 -128580 1664 1821 -128580 1680 1841 -128580 1688 1717 -128580 1706 1857 -128580 1711 1877 -128580 1727 1775 -128580 1816 1881 -128580 1821 1530 -128580 1821 1452 -128580 1842 1876 -128580 1857 1441 -128580 1435 1502 -128580 1458 1528 -128580 1512 1531 -128580 1560 1443 -128580 1568 1890 -128580 1574 1890 -128580 1643 1876 -128580 1649 1880 -128580 1667 1816 -128580 1680 1443 -128580 1717 1847 -128580 1874 1458 -128580 1877 1479 -128580 1892 1898 -128580 1905 1924 -128580 1593 1526 -128580 1603 1649 -128580 1664 1452 -128580 1721 1816 -128580 1796 1816 -128580 1883 1463 -128580 1455 1530 -128580 1538 1493 -128580 1617 1892 -128580 1684 1498 -128580 1825 1493 -128580 1543 1437 -128580 1549 1525 -128580 1590 1519 -128580 1727 1845 -128580 1598 1643 -128580 1603 1880 -128580 1657 1769 -128580 1698 1707 -128580 1550 1635 -128580 1572 1731 -128580 1711 1479 -128580 1711 1908 -128580 1908 1479 -128580 1703 1920 -128580 1592 1717 -128580 1598 1842 -128580 1735 1465 -128580 1819 1913 -128580 1538 1825 -128580 1560 1680 -128580 1877 1908 -128580 1563 1688 -128600 1560 1443 -128600 1568 1890 -128600 1574 1890 -128600 1574 1590 -128600 1574 1519 -128600 1582 1706 -128600 1630 1831 -128600 1641 1707 -128600 1643 1876 -128600 1649 1880 -128600 1667 1816 -128600 1680 1443 -128600 1684 1451 -128600 1717 1727 -128600 1717 1847 -128600 1721 1796 -128600 1728 1517 -128600 1794 1495 -128600 1825 1890 -128600 1858 1923 -128600 1874 1458 -128600 1877 1479 -128600 1890 1469 -128600 1892 1898 -128600 1905 1924 -128600 1451 1498 -128600 1543 1434 -128600 1593 1526 -128600 1593 1783 -128600 1603 1649 -128600 1664 1452 -128600 1721 1816 -128600 1796 1816 -128600 1883 1463 -128600 1455 1530 -128600 1538 1493 -128600 1617 1898 -128600 1617 1892 -128600 1684 1498 -128600 1825 1493 -128600 1543 1437 -128600 1549 1525 -128600 1590 1519 -128600 1727 1845 -128600 1538 1890 -128600 1598 1704 -128600 1598 1643 -128600 1603 1880 -128600 1657 1769 -128600 1698 1707 -128600 1550 1635 -128600 1572 1731 -128600 1711 1479 -128600 1711 1908 -128600 1908 1479 -128600 1703 1920 -128600 1592 1717 -128600 1598 1842 -128600 1735 1465 -128600 1819 1913 -128600 1857 1892 -128600 1538 1825 -128600 1560 1680 -128600 1877 1908 -128600 1563 1688 -128600 1617 1441 -128620 1543 1434 -128620 1568 1805 -128620 1574 1767 -128620 1593 1526 -128620 1593 1783 -128620 1603 1649 -128620 1617 1857 -128620 1648 1696 -128620 1649 1808 -128620 1657 1706 -128620 1664 1452 -128620 1666 1885 -128620 1680 1841 -128620 1688 1913 -128620 1688 1731 -128620 1711 1877 -128620 1721 1816 -128620 1727 1775 -128620 1796 1816 -128620 1796 1881 -128620 1816 1881 -128620 1819 1876 -128620 1870 1498 -128620 1876 1913 -128620 1883 1463 -128620 1890 1426 -128620 1890 1493 -128620 1898 1441 -128620 1455 1530 -128620 1538 1493 -128620 1617 1898 -128620 1617 1892 -128620 1626 1493 -128620 1643 1704 -128620 1684 1498 -128620 1825 1493 -128620 1543 1437 -128620 1549 1525 -128620 1590 1519 -128620 1727 1845 -128620 1538 1890 -128620 1551 1269 -128620 1598 1704 -128620 1598 1643 -128620 1603 1880 -128620 1657 1769 -128620 1698 1707 -128620 1775 1845 -128620 1603 1528 -128620 1871 1530 -128620 1550 1635 -128620 1572 1731 -128620 1711 1479 -128620 1711 1908 -128620 1908 1479 -128620 1703 1920 -128620 1592 1717 -128620 1598 1842 -128620 1735 1465 -128620 1819 1913 -128620 1857 1892 -128620 1538 1825 -128620 1560 1680 -128620 1877 1908 -128620 1563 1688 -128620 1617 1441 -128640 1538 1493 -128640 1563 1664 -128640 1569 1603 -128640 1582 1443 -128640 1604 1471 -128640 1617 1898 -128640 1617 1892 -128640 1626 1493 -128640 1630 1443 -128640 1643 1704 -128640 1648 1792 -128640 1657 1487 -128640 1664 1458 -128640 1664 1451 -128640 1664 1806 -128640 1667 1453 -128640 1669 1754 -128640 1678 1841 -128640 1684 1498 -128640 1688 1458 -128640 1688 1806 -128640 1688 1527 -128640 1761 1847 -128640 1767 1840 -128640 1769 1487 -128640 1772 1840 -128640 1772 1519 -128640 1825 1493 -128640 1543 1437 -128640 1546 1557 -128640 1549 1525 -128640 1582 1630 -128640 1590 1519 -128640 1727 1845 -128640 1728 1517 -128640 1806 1458 -128640 1905 1924 -128640 1538 1890 -128640 1551 1269 -128640 1598 1704 -128640 1598 1643 -128640 1603 1880 -128640 1657 1769 -128640 1698 1707 -128640 1721 1881 -128640 1775 1845 -128640 1603 1528 -128640 1871 1530 -128640 1550 1635 -128640 1572 1731 -128640 1711 1479 -128640 1673 1875 -128640 1711 1908 -128640 1908 1479 -128640 1703 1920 -128640 1569 1520 -128640 1592 1717 -128640 1598 1842 -128640 1735 1465 -128640 1877 1479 -128640 1819 1913 -128640 1857 1892 -128640 1538 1825 -128640 1560 1680 -128640 1877 1908 -128640 1563 1688 -128640 1617 1441 -128640 1816 1823 -128660 1538 1519 -128660 1543 1437 -128660 1546 1557 -128660 1549 1525 -128660 1568 1455 -128660 1575 1679 -128660 1582 1630 -128660 1590 1667 -128660 1590 1519 -128660 1667 1913 -128660 1667 1772 -128660 1667 1806 -128660 1721 1816 -128660 1727 1845 -128660 1727 1775 -128660 1728 1517 -128660 1734 1792 -128660 1772 1806 -128660 1806 1458 -128660 1807 1427 -128660 1816 1881 -128660 1825 1455 -128660 1831 1857 -128660 1880 1528 -128660 1905 1924 -128660 1905 1478 -128660 1538 1890 -128660 1551 1269 -128660 1598 1704 -128660 1598 1643 -128660 1603 1880 -128660 1657 1769 -128660 1698 1707 -128660 1721 1881 -128660 1775 1845 -128660 1825 1890 -128660 1603 1528 -128660 1871 1530 -128660 1550 1635 -128660 1572 1731 -128660 1711 1479 -128660 1673 1875 -128660 1593 1449 -128660 1711 1908 -128660 1908 1479 -128660 1703 1920 -128660 1569 1520 -128660 1592 1717 -128660 1598 1842 -128660 1735 1465 -128660 1877 1479 -128660 1819 1913 -128660 1857 1892 -128660 1538 1825 -128660 1560 1680 -128660 1877 1908 -128660 1563 1688 -128660 1617 1441 -128660 1816 1823 -128680 1538 1890 -128680 1551 1269 -128680 1552 1453 -128680 1563 1568 -128680 1568 1688 -128680 1576 1688 -128680 1590 1664 -128680 1595 1883 -128680 1598 1704 -128680 1598 1643 -128680 1603 1880 -128680 1616 1798 -128680 1617 1857 -128680 1630 1831 -128680 1634 1734 -128680 1642 1898 -128680 1643 1842 -128680 1654 1841 -128680 1657 1769 -128680 1698 1707 -128680 1717 1727 -128680 1721 1881 -128680 1734 1491 -128680 1772 1458 -128680 1772 1871 -128680 1775 1845 -128680 1783 1526 -128680 1825 1890 -128680 1830 1841 -128680 1841 1919 -128680 1871 1458 -128680 1539 1587 -128680 1603 1528 -128680 1626 1493 -128680 1626 1527 -128680 1857 1441 -128680 1871 1530 -128680 1892 1441 -128680 1448 1487 -128680 1550 1635 -128680 1572 1731 -128680 1711 1877 -128680 1711 1479 -128680 1648 1798 -128680 1673 1875 -128680 1593 1449 -128680 1711 1908 -128680 1908 1479 -128680 1703 1920 -128680 1569 1520 -128680 1592 1717 -128680 1598 1842 -128680 1735 1465 -128680 1877 1479 -128680 1796 1881 -128680 1819 1913 -128680 1857 1892 -128680 1538 1825 -128680 1560 1680 -128680 1877 1908 -128680 1563 1688 -128680 1617 1441 -128680 1816 1823 -128700 1539 1587 -128700 1543 1684 -128700 1579 1764 -128700 1598 1772 -128700 1603 1528 -128700 1603 1883 -128700 1626 1493 -128700 1626 1527 -128700 1649 1857 -128700 1654 1919 -128700 1749 1847 -128700 1807 1427 -128700 1841 1883 -128700 1857 1441 -128700 1871 1530 -128700 1880 1883 -128700 1892 1441 -128700 1441 1466 -128700 1448 1487 -128700 1550 1635 -128700 1572 1731 -128700 1678 1841 -128700 1711 1877 -128700 1711 1479 -128700 1617 1892 -128700 1648 1798 -128700 1673 1875 -128700 1593 1449 -128700 1711 1908 -128700 1908 1479 -128700 1703 1920 -128700 1569 1520 -128700 1592 1717 -128700 1598 1842 -128700 1735 1465 -128700 1877 1479 -128700 1796 1881 -128700 1819 1913 -128700 1857 1892 -128700 1538 1825 -128700 1560 1680 -128700 1877 1908 -128700 1563 1688 -128700 1617 1441 -128700 1816 1823 -128720 1550 1635 -128720 1551 1269 -128720 1570 1630 -128720 1572 1731 -128720 1587 1617 -128720 1587 1630 -128720 1587 1831 -128720 1604 1463 -128720 1635 1772 -128720 1649 1898 -128720 1669 1754 -128720 1678 1841 -128720 1711 1877 -128720 1711 1479 -128720 1727 1517 -128720 1772 1434 -128720 1883 1520 -128720 1905 1924 -128720 1603 1680 -128720 1617 1892 -128720 1626 1731 -128720 1648 1798 -128720 1673 1875 -128720 1582 1443 -128720 1593 1449 -128720 1698 1707 -128720 1711 1908 -128720 1727 1845 -128720 1908 1479 -128720 1703 1920 -128720 1569 1520 -128720 1592 1717 -128720 1598 1842 -128720 1825 1890 -128720 1735 1465 -128720 1877 1479 -128720 1796 1881 -128720 1819 1913 -128720 1857 1892 -128720 1572 1626 -128720 1538 1825 -128720 1560 1680 -128720 1549 1525 -128720 1877 1908 -128720 1563 1688 -128720 1617 1441 -128720 1816 1823 -128740 1541 1579 -128740 1543 1498 -128740 1552 1453 -128740 1568 1635 -128740 1569 1695 -128740 1570 1520 -128740 1582 1905 -128740 1598 1530 -128740 1603 1680 -128740 1617 1892 -128740 1626 1731 -128740 1645 1495 -128740 1648 1798 -128740 1660 1692 -128740 1667 1870 -128740 1673 1875 -128740 1696 1798 -128740 1707 1493 -128740 1775 1517 -128740 1807 1427 -128740 1841 1503 -128740 1871 1530 -128740 1458 1469 -128740 1582 1443 -128740 1593 1449 -128740 1698 1707 -128740 1711 1908 -128740 1727 1845 -128740 1892 1441 -128740 1908 1479 -128740 1579 1727 -128740 1595 1654 -128740 1703 1920 -128740 1569 1520 -128740 1592 1717 -128740 1598 1842 -128740 1825 1890 -128740 1735 1465 -128740 1877 1479 -128740 1796 1881 -128740 1819 1913 -128740 1857 1892 -128740 1572 1626 -128740 1538 1825 -128740 1560 1680 -128740 1603 1880 -128740 1549 1525 -128740 1877 1908 -128740 1563 1688 -128740 1617 1441 -128740 1816 1823 -128760 1582 1443 -128760 1590 1498 -128760 1592 1731 -128760 1593 1449 -128760 1608 1455 -128760 1617 1772 -128760 1630 1461 -128760 1643 1704 -128760 1680 1695 -128760 1698 1707 -128760 1711 1908 -128760 1717 1731 -128760 1727 1845 -128760 1731 1768 -128760 1794 1855 -128760 1892 1441 -128760 1908 1479 -128760 1458 1504 -128760 1538 1890 -128760 1579 1727 -128760 1590 1684 -128760 1595 1654 -128760 1599 1512 -128760 1676 1498 -128760 1703 1920 -128760 1569 1520 -128760 1590 1876 -128760 1592 1717 -128760 1598 1842 -128760 1604 1463 -128760 1825 1890 -128760 1876 1898 -128760 1735 1465 -128760 1877 1479 -128760 1711 1479 -128760 1796 1881 -128760 1819 1913 -128760 1857 1892 -128760 1572 1626 -128760 1538 1825 -128760 1560 1680 -128760 1603 1880 -128760 1549 1525 -128760 1877 1908 -128760 1563 1688 -128760 1617 1441 -128760 1543 1831 -128760 1543 1630 -128760 1816 1823 -128780 1538 1890 -128780 1579 1731 -128780 1579 1479 -128780 1579 1727 -128780 1590 1684 -128780 1595 1654 -128780 1598 1813 -128780 1599 1512 -128780 1626 1504 -128780 1676 1498 -128780 1703 1920 -128780 1731 1495 -128780 1796 1816 -128780 1841 1919 -128780 1850 1868 -128780 1569 1520 -128780 1579 1877 -128780 1590 1876 -128780 1592 1717 -128780 1598 1842 -128780 1604 1463 -128780 1825 1890 -128780 1617 1892 -128780 1876 1898 -128780 1617 1857 -128780 1735 1465 -128780 1877 1479 -128780 1711 1479 -128780 1796 1881 -128780 1819 1913 -128780 1857 1892 -128780 1572 1626 -128780 1626 1871 -128780 1630 1831 -128780 1538 1825 -128780 1560 1680 -128780 1603 1880 -128780 1549 1525 -128780 1877 1908 -128780 1563 1688 -128780 1617 1441 -128780 1551 1269 -128780 1543 1831 -128780 1543 1630 -128780 1572 1871 -128780 1816 1823 -128800 1556 1921 -128800 1569 1520 -128800 1577 1703 -128800 1579 1908 -128800 1579 1877 -128800 1590 1840 -128800 1590 1641 -128800 1590 1498 -128800 1590 1876 -128800 1592 1717 -128800 1598 1842 -128800 1604 1463 -128800 1617 1684 -128800 1660 1692 -128800 1669 1754 -128800 1684 1441 -128800 1688 1695 -128800 1717 1495 -128800 1721 1796 -128800 1807 1427 -128800 1825 1890 -128800 1873 1427 -128800 1890 1525 -128800 1913 1504 -128800 1549 1890 -128800 1552 1453 -128800 1617 1892 -128800 1876 1898 -128800 1501 1521 -128800 1617 1857 -128800 1711 1877 -128800 1735 1465 -128800 1877 1479 -128800 1711 1908 -128800 1908 1479 -128800 1711 1479 -128800 1796 1881 -128800 1819 1913 -128800 1857 1892 -128800 1572 1626 -128800 1626 1871 -128800 1630 1831 -128800 1538 1825 -128800 1560 1680 -128800 1649 1699 -128800 1603 1880 -128800 1549 1525 -128800 1877 1908 -128800 1563 1688 -128800 1617 1441 -128800 1551 1269 -128800 1543 1831 -128800 1543 1630 -128800 1572 1871 -128800 1816 1823 -128800 1657 1769 -128820 1549 1890 -128820 1552 1453 -128820 1617 1703 -128820 1617 1892 -128820 1648 1696 -128820 1698 1495 -128820 1707 1495 -128820 1731 1458 -128820 1734 1491 -128820 1794 1855 -128820 1857 1441 -128820 1876 1898 -128820 1924 1478 -128820 1501 1521 -128820 1590 1905 -128820 1617 1857 -128820 1634 1491 -128820 1698 1707 -128820 1711 1877 -128820 1735 1465 -128820 1877 1479 -128820 1711 1908 -128820 1908 1479 -128820 1711 1479 -128820 1796 1881 -128820 1819 1913 -128820 1857 1892 -128820 1892 1441 -128820 1572 1626 -128820 1626 1871 -128820 1630 1831 -128820 1538 1825 -128820 1560 1680 -128820 1649 1699 -128820 1603 1880 -128820 1549 1525 -128820 1877 1908 -128820 1563 1688 -128820 1617 1441 -128820 1551 1269 -128820 1543 1831 -128820 1543 1630 -128820 1572 1871 -128820 1816 1823 -128820 1657 1769 -128840 1554 1440 -128840 1590 1905 -128840 1592 1458 -128840 1604 1495 -128840 1617 1857 -128840 1634 1491 -128840 1634 1734 -128840 1641 1892 -128840 1698 1707 -128840 1703 1876 -128840 1711 1877 -128840 1727 1845 -128840 1735 1465 -128840 1764 1458 -128840 1775 1517 -128840 1807 1427 -128840 1821 1858 -128840 1825 1495 -128840 1841 1503 -128840 1850 1498 -128840 1877 1479 -128840 1908 1493 -128840 1479 1493 -128840 1495 1519 -128840 1711 1908 -128840 1877 1458 -128840 1908 1458 -128840 1908 1479 -128840 1711 1479 -128840 1796 1881 -128840 1819 1913 -128840 1857 1892 -128840 1892 1441 -128840 1572 1626 -128840 1626 1871 -128840 1630 1831 -128840 1538 1825 -128840 1560 1680 -128840 1649 1699 -128840 1841 1919 -128840 1603 1880 -128840 1549 1525 -128840 1587 1883 -128840 1877 1908 -128840 1563 1688 -128840 1617 1441 -128840 1551 1269 -128840 1543 1831 -128840 1543 1630 -128840 1572 1871 -128840 1816 1823 -128840 1657 1769 -128860 1568 1880 -128860 1568 1570 -128860 1617 1892 -128860 1678 1868 -128860 1711 1908 -128860 1711 1717 -128860 1717 1908 -128860 1877 1458 -128860 1908 1458 -128860 1908 1479 -128860 1603 1680 -128860 1711 1479 -128860 1792 1885 -128860 1796 1881 -128860 1819 1913 -128860 1857 1892 -128860 1892 1441 -128860 1572 1626 -128860 1626 1871 -128860 1630 1831 -128860 1538 1825 -128860 1560 1680 -128860 1649 1699 -128860 1680 1880 -128860 1924 1478 -128860 1841 1919 -128860 1603 1880 -128860 1549 1525 -128860 1587 1883 -128860 1877 1908 -128860 1563 1688 -128860 1617 1441 -128860 1551 1269 -128860 1543 1831 -128860 1543 1630 -128860 1572 1871 -128860 1816 1823 -128860 1657 1769 -128880 1552 1453 -128880 1554 1440 -128880 1590 1740 -128880 1603 1680 -128880 1635 1426 -128880 1670 1711 -128880 1670 1479 -128880 1672 1684 -128880 1679 1479 -128880 1680 1495 -128880 1684 1688 -128880 1704 1920 -128880 1711 1479 -128880 1713 1427 -128880 1727 1845 -128880 1792 1885 -128880 1796 1881 -128880 1819 1913 -128880 1840 1495 -128880 1857 1892 -128880 1892 1441 -128880 1458 1513 -128880 1572 1626 -128880 1590 1711 -128880 1590 1479 -128880 1626 1871 -128880 1688 1427 -128880 1617 1857 -128880 1630 1831 -128880 1857 1441 -128880 1538 1825 -128880 1560 1680 -128880 1592 1717 -128880 1649 1699 -128880 1680 1880 -128880 1924 1478 -128880 1841 1919 -128880 1575 1479 -128880 1603 1880 -128880 1549 1525 -128880 1587 1883 -128880 1877 1908 -128880 1563 1688 -128880 1617 1441 -128880 1735 1465 -128880 1551 1269 -128880 1543 1831 -128880 1543 1630 -128880 1572 1871 -128880 1816 1823 -128880 1657 1769 -128900 1572 1825 -128900 1572 1626 -128900 1574 1876 -128900 1577 1850 -128900 1577 1868 -128900 1590 1711 -128900 1590 1670 -128900 1590 1479 -128900 1595 1703 -128900 1603 1667 -128900 1626 1913 -128900 1626 1873 -128900 1626 1871 -128900 1647 1761 -128900 1672 1892 -128900 1676 1448 -128900 1684 1452 -128900 1688 1427 -128900 1701 1492 -128900 1754 1504 -128900 1755 1813 -128900 1868 1904 -128900 1556 1921 -128900 1617 1857 -128900 1630 1831 -128900 1857 1441 -128900 1538 1825 -128900 1560 1680 -128900 1592 1717 -128900 1649 1699 -128900 1680 1880 -128900 1850 1868 -128900 1892 1898 -128900 1924 1478 -128900 1841 1919 -128900 1575 1479 -128900 1603 1880 -128900 1549 1525 -128900 1587 1883 -128900 1877 1908 -128900 1563 1688 -128900 1617 1441 -128900 1568 1659 -128900 1735 1465 -128900 1551 1269 -128900 1543 1831 -128900 1543 1630 -128900 1572 1871 -128900 1816 1823 -128900 1657 1769 -128920 1551 1574 -128920 1556 1921 -128920 1569 1487 -128920 1578 1592 -128920 1592 1772 -128920 1617 1857 -128920 1630 1831 -128920 1667 1503 -128920 1670 1479 -128920 1676 1439 -128920 1688 1698 -128920 1717 1772 -128920 1731 1427 -128920 1754 1495 -128920 1857 1441 -128920 1871 1913 -128920 1922 1471 -128920 1440 1513 -128920 1538 1825 -128920 1560 1680 -128920 1592 1717 -128920 1649 1699 -128920 1680 1880 -128920 1775 1517 -128920 1796 1881 -128920 1819 1913 -128920 1850 1868 -128920 1892 1898 -128920 1924 1478 -128920 1552 1453 -128920 1670 1711 -128920 1841 1919 -128920 1890 1525 -128920 1575 1479 -128920 1603 1880 -128920 1549 1890 -128920 1549 1525 -128920 1587 1883 -128920 1877 1908 -128920 1563 1688 -128920 1617 1441 -128920 1727 1845 -128920 1568 1659 -128920 1735 1465 -128920 1551 1269 -128920 1543 1831 -128920 1543 1630 -128920 1572 1871 -128920 1816 1823 -128920 1657 1769 -128940 1538 1825 -128940 1538 1519 -128940 1560 1680 -128940 1579 1440 -128940 1582 1688 -128940 1587 1680 -128940 1592 1717 -128940 1603 1680 -128940 1649 1699 -128940 1654 1876 -128940 1669 1495 -128940 1671 1767 -128940 1680 1880 -128940 1688 1847 -128940 1692 1427 -128940 1699 1727 -128940 1761 1825 -128940 1761 1819 -128940 1775 1517 -128940 1819 1490 -128940 1871 1490 -128940 1913 1490 -128940 1434 1458 -128940 1570 1427 -128940 1595 1654 -128940 1664 1892 -128940 1673 1439 -128940 1796 1881 -128940 1819 1913 -128940 1850 1868 -128940 1892 1898 -128940 1924 1478 -128940 1552 1453 -128940 1670 1711 -128940 1841 1919 -128940 1890 1525 -128940 1575 1479 -128940 1603 1880 -128940 1703 1876 -128940 1549 1890 -128940 1549 1525 -128940 1587 1883 -128940 1673 1676 -128940 1877 1908 -128940 1563 1688 -128940 1617 1441 -128940 1727 1845 -128940 1568 1659 -128940 1735 1465 -128940 1551 1269 -128940 1543 1831 -128940 1543 1630 -128940 1572 1871 -128940 1816 1823 -128940 1657 1769 -128960 1556 1921 -128960 1570 1427 -128960 1570 1731 -128960 1579 1908 -128960 1590 1520 -128960 1595 1654 -128960 1599 1512 -128960 1648 1798 -128960 1664 1892 -128960 1667 1920 -128960 1670 1688 -128960 1670 1490 -128960 1673 1439 -128960 1688 1711 -128960 1695 1772 -128960 1698 1731 -128960 1711 1490 -128960 1735 1761 -128960 1796 1881 -128960 1819 1913 -128960 1847 1522 -128960 1850 1868 -128960 1892 1898 -128960 1924 1478 -128960 1552 1453 -128960 1579 1592 -128960 1670 1711 -128960 1698 1441 -128960 1717 1772 -128960 1841 1919 -128960 1847 1458 -128960 1890 1525 -128960 1575 1479 -128960 1603 1880 -128960 1703 1876 -128960 1549 1890 -128960 1549 1525 -128960 1587 1883 -128960 1673 1676 -128960 1857 1441 -128960 1877 1908 -128960 1563 1688 -128960 1617 1441 -128960 1678 1841 -128960 1727 1845 -128960 1568 1659 -128960 1731 1427 -128960 1735 1465 -128960 1551 1269 -128960 1543 1831 -128960 1543 1630 -128960 1630 1831 -128960 1572 1871 -128960 1816 1823 -128960 1657 1769 -128980 1552 1453 -128980 1574 1437 -128980 1579 1592 -128980 1579 1688 -128980 1579 1717 -128980 1592 1755 -128980 1626 1665 -128980 1670 1711 -128980 1688 1740 -128980 1698 1441 -128980 1717 1772 -128980 1717 1517 -128980 1717 1755 -128980 1772 1513 -128980 1841 1919 -128980 1847 1458 -128980 1870 1452 -128980 1890 1525 -128980 1575 1479 -128980 1592 1717 -128980 1598 1667 -128980 1603 1880 -128980 1645 1756 -128980 1679 1490 -128980 1688 1517 -128980 1703 1876 -128980 1549 1890 -128980 1549 1525 -128980 1576 1493 -128980 1587 1883 -128980 1673 1676 -128980 1857 1441 -128980 1877 1908 -128980 1563 1688 -128980 1617 1441 -128980 1678 1841 -128980 1727 1845 -128980 1568 1659 -128980 1731 1427 -128980 1735 1465 -128980 1551 1269 -128980 1543 1831 -128980 1543 1630 -128980 1630 1831 -128980 1572 1871 -128980 1816 1823 -128980 1657 1769 -129000 1543 1761 -129000 1563 1717 -129000 1575 1490 -129000 1575 1479 -129000 1579 1517 -129000 1579 1847 -129000 1592 1688 -129000 1592 1717 -129000 1598 1667 -129000 1603 1880 -129000 1603 1492 -129000 1645 1458 -129000 1645 1756 -129000 1649 1699 -129000 1676 1439 -129000 1678 1492 -129000 1679 1490 -129000 1688 1517 -129000 1688 1717 -129000 1698 1522 -129000 1698 1754 -129000 1699 1845 -129000 1699 1727 -129000 1703 1876 -129000 1707 1427 -129000 1841 1492 -129000 1880 1492 -129000 1493 1495 -129000 1549 1890 -129000 1549 1525 -129000 1576 1493 -129000 1587 1883 -129000 1648 1798 -129000 1673 1676 -129000 1796 1881 -129000 1857 1441 -129000 1877 1908 -129000 1892 1898 -129000 1924 1478 -129000 1563 1688 -129000 1617 1857 -129000 1617 1441 -129000 1678 1841 -129000 1727 1845 -129000 1673 1761 -129000 1676 1761 -129000 1568 1659 -129000 1731 1427 -129000 1735 1465 -129000 1551 1269 -129000 1543 1831 -129000 1543 1630 -129000 1630 1831 -129000 1673 1439 -129000 1572 1871 -129000 1816 1823 -129000 1657 1769 -129020 1549 1890 -129020 1549 1525 -129020 1576 1493 -129020 1587 1883 -129020 1598 1643 -129020 1626 1847 -129020 1648 1798 -129020 1664 1876 -129020 1667 1847 -129020 1673 1676 -129020 1676 1495 -129020 1704 1920 -129020 1717 1772 -129020 1796 1881 -129020 1819 1479 -129020 1857 1441 -129020 1877 1908 -129020 1892 1898 -129020 1913 1479 -129020 1924 1478 -129020 1448 1451 -129020 1492 1504 -129020 1549 1755 -129020 1563 1688 -129020 1575 1679 -129020 1617 1857 -129020 1617 1441 -129020 1678 1841 -129020 1727 1845 -129020 1884 1499 -129020 1522 1524 -129020 1673 1761 -129020 1676 1761 -129020 1568 1659 -129020 1574 1437 -129020 1582 1443 -129020 1603 1522 -129020 1603 1524 -129020 1731 1427 -129020 1735 1465 -129020 1551 1269 -129020 1543 1831 -129020 1543 1630 -129020 1630 1831 -129020 1673 1439 -129020 1755 1890 -129020 1890 1525 -129020 1850 1868 -129020 1572 1871 -129020 1755 1525 -129020 1816 1823 -129020 1657 1769 -129040 1539 1855 -129040 1546 1557 -129040 1549 1755 -129040 1563 1688 -129040 1575 1679 -129040 1595 1703 -129040 1617 1857 -129040 1617 1441 -129040 1667 1850 -129040 1672 1717 -129040 1678 1841 -129040 1678 1503 -129040 1688 1455 -129040 1721 1816 -129040 1727 1845 -129040 1884 1499 -129040 1919 1504 -129040 1492 1527 -129040 1522 1524 -129040 1552 1453 -129040 1673 1761 -129040 1676 1761 -129040 1825 1874 -129040 1568 1659 -129040 1574 1437 -129040 1582 1443 -129040 1603 1522 -129040 1603 1524 -129040 1731 1427 -129040 1735 1465 -129040 1551 1269 -129040 1543 1831 -129040 1543 1630 -129040 1630 1831 -129040 1673 1439 -129040 1755 1890 -129040 1890 1525 -129040 1850 1868 -129040 1572 1871 -129040 1755 1525 -129040 1816 1823 -129040 1657 1769 -129060 1543 1706 -129060 1543 1439 -129060 1552 1453 -129060 1572 1592 -129060 1617 1876 -129060 1669 1754 -129060 1673 1761 -129060 1676 1761 -129060 1688 1868 -129060 1756 1458 -129060 1798 1885 -129060 1825 1874 -129060 1898 1479 -129060 1920 1453 -129060 1568 1659 -129060 1574 1437 -129060 1582 1443 -129060 1603 1522 -129060 1603 1524 -129060 1731 1427 -129060 1735 1465 -129060 1857 1441 -129060 1551 1269 -129060 1645 1458 -129060 1543 1831 -129060 1543 1630 -129060 1630 1831 -129060 1673 1676 -129060 1673 1439 -129060 1755 1890 -129060 1890 1525 -129060 1850 1868 -129060 1572 1871 -129060 1755 1525 -129060 1676 1439 -129060 1587 1883 -129060 1816 1823 -129060 1598 1711 -129060 1657 1769 -129080 1556 1921 -129080 1563 1578 -129080 1568 1659 -129080 1574 1437 -129080 1582 1443 -129080 1592 1855 -129080 1592 1455 -129080 1603 1876 -129080 1603 1522 -129080 1603 1524 -129080 1617 1441 -129080 1671 1767 -129080 1721 1816 -129080 1727 1845 -129080 1731 1427 -129080 1735 1465 -129080 1783 1791 -129080 1796 1816 -129080 1825 1890 -129080 1857 1441 -129080 1871 1490 -129080 1871 1479 -129080 1499 1519 -129080 1551 1269 -129080 1645 1458 -129080 1819 1913 -129080 1884 1499 -129080 1543 1831 -129080 1543 1630 -129080 1630 1831 -129080 1673 1676 -129080 1673 1439 -129080 1755 1890 -129080 1890 1525 -129080 1850 1868 -129080 1572 1871 -129080 1755 1525 -129080 1550 1761 -129080 1676 1439 -129080 1587 1883 -129080 1816 1823 -129080 1598 1711 -129080 1657 1769 -129100 1551 1269 -129100 1579 1592 -129100 1592 1649 -129100 1592 1772 -129100 1592 1717 -129100 1626 1688 -129100 1645 1458 -129100 1648 1798 -129100 1664 1684 -129100 1698 1455 -129100 1703 1892 -129100 1819 1913 -129100 1877 1908 -129100 1884 1499 -129100 1920 1453 -129100 1543 1831 -129100 1543 1630 -129100 1630 1831 -129100 1673 1676 -129100 1673 1439 -129100 1755 1890 -129100 1890 1525 -129100 1643 1704 -129100 1825 1874 -129100 1850 1868 -129100 1448 1451 -129100 1572 1871 -129100 1669 1754 -129100 1603 1761 -129100 1798 1885 -129100 1755 1525 -129100 1550 1761 -129100 1711 1479 -129100 1676 1439 -129100 1587 1883 -129100 1816 1823 -129100 1550 1603 -129100 1598 1711 -129100 1657 1769 -129120 1543 1673 -129120 1543 1831 -129120 1543 1676 -129120 1543 1630 -129120 1543 1439 -129120 1546 1768 -129120 1582 1667 -129120 1595 1654 -129120 1617 1857 -129120 1626 1461 -129120 1630 1831 -129120 1630 1439 -129120 1630 1676 -129120 1654 1769 -129120 1654 1657 -129120 1670 1479 -129120 1673 1676 -129120 1673 1439 -129120 1755 1890 -129120 1806 1490 -129120 1857 1441 -129120 1890 1525 -129120 1913 1499 -129120 1556 1921 -129120 1643 1704 -129120 1735 1465 -129120 1825 1874 -129120 1850 1868 -129120 1448 1451 -129120 1572 1871 -129120 1617 1441 -129120 1669 1754 -129120 1727 1845 -129120 1603 1761 -129120 1798 1885 -129120 1755 1525 -129120 1550 1761 -129120 1568 1659 -129120 1711 1479 -129120 1676 1439 -129120 1587 1883 -129120 1816 1823 -129120 1550 1603 -129120 1598 1711 -129120 1657 1769 -129140 1546 1921 -129140 1554 1427 -129140 1556 1921 -129140 1563 1717 -129140 1574 1490 -129140 1574 1703 -129140 1590 1923 -129140 1598 1479 -129140 1643 1704 -129140 1649 1772 -129140 1671 1767 -129140 1673 1448 -129140 1676 1831 -129140 1721 1816 -129140 1735 1465 -129140 1796 1816 -129140 1825 1874 -129140 1850 1520 -129140 1850 1868 -129140 1868 1520 -129140 1904 1479 -129140 1448 1451 -129140 1449 1521 -129140 1572 1871 -129140 1617 1441 -129140 1669 1754 -129140 1727 1845 -129140 1551 1269 -129140 1603 1761 -129140 1798 1885 -129140 1755 1525 -129140 1550 1761 -129140 1568 1659 -129140 1711 1479 -129140 1825 1913 -129140 1676 1439 -129140 1587 1883 -129140 1816 1823 -129140 1550 1603 -129140 1598 1711 -129140 1870 1441 -129140 1657 1769 -129160 1552 1453 -129160 1570 1698 -129160 1572 1871 -129160 1617 1441 -129160 1630 1437 -129160 1642 1492 -129160 1645 1458 -129160 1669 1754 -129160 1671 1754 -129160 1684 1490 -129160 1727 1845 -129160 1755 1890 -129160 1756 1458 -129160 1847 1521 -129160 1884 1499 -129160 1890 1525 -129160 1551 1269 -129160 1603 1761 -129160 1645 1756 -129160 1792 1798 -129160 1798 1885 -129160 1543 1439 -129160 1755 1525 -129160 1550 1761 -129160 1568 1659 -129160 1711 1479 -129160 1825 1913 -129160 1676 1439 -129160 1587 1883 -129160 1816 1823 -129160 1550 1603 -129160 1563 1578 -129160 1598 1711 -129160 1870 1441 -129160 1657 1769 -129180 1539 1570 -129180 1551 1269 -129180 1603 1761 -129180 1603 1490 -129180 1645 1756 -129180 1647 1471 -129180 1698 1471 -129180 1706 1451 -129180 1792 1798 -129180 1798 1885 -129180 1868 1487 -129180 1543 1439 -129180 1543 1831 -129180 1643 1704 -129180 1676 1831 -129180 1543 1676 -129180 1658 1427 -129180 1755 1525 -129180 1550 1761 -129180 1568 1659 -129180 1711 1479 -129180 1825 1913 -129180 1676 1439 -129180 1587 1883 -129180 1816 1823 -129180 1598 1479 -129180 1550 1603 -129180 1563 1578 -129180 1598 1711 -129180 1870 1441 -129180 1657 1769 -129200 1543 1439 -129200 1543 1831 -129200 1574 1767 -129200 1643 1704 -129200 1643 1920 -129200 1680 1840 -129200 1680 1466 -129200 1721 1816 -129200 1756 1904 -129200 1761 1493 -129200 1769 1898 -129200 1796 1816 -129200 1806 1519 -129200 1913 1519 -129200 1676 1831 -129200 1696 1798 -129200 1543 1676 -129200 1550 1630 -129200 1658 1427 -129200 1755 1525 -129200 1783 1528 -129200 1550 1761 -129200 1568 1659 -129200 1711 1479 -129200 1825 1913 -129200 1676 1439 -129200 1587 1883 -129200 1816 1823 -129200 1598 1479 -129200 1550 1603 -129200 1563 1578 -129200 1598 1711 -129200 1870 1441 -129200 1657 1769 -129220 1556 1921 -129220 1643 1731 -129220 1667 1786 -129220 1669 1680 -129220 1676 1831 -129220 1685 1492 -129220 1696 1798 -129220 1703 1892 -129220 1772 1806 -129220 1806 1825 -129220 1825 1519 -129220 1890 1525 -129220 1543 1676 -129220 1550 1630 -129220 1603 1630 -129220 1658 1427 -129220 1755 1525 -129220 1783 1528 -129220 1550 1761 -129220 1568 1659 -129220 1603 1761 -129220 1711 1479 -129220 1825 1913 -129220 1563 1717 -129220 1792 1798 -129220 1676 1439 -129220 1587 1883 -129220 1598 1670 -129220 1816 1823 -129220 1598 1479 -129220 1550 1603 -129220 1563 1578 -129220 1598 1711 -129220 1735 1465 -129220 1645 1756 -129220 1870 1441 -129220 1657 1769 -129240 1543 1676 -129240 1550 1630 -129240 1551 1437 -129240 1551 1269 -129240 1563 1904 -129240 1592 1643 -129240 1603 1630 -129240 1630 1761 -129240 1643 1704 -129240 1658 1427 -129240 1678 1772 -129240 1678 1919 -129240 1684 1703 -129240 1698 1790 -129240 1755 1525 -129240 1269 1437 -129240 1783 1528 -129240 1813 1880 -129240 1543 1451 -129240 1550 1761 -129240 1568 1659 -129240 1603 1761 -129240 1711 1479 -129240 1772 1919 -129240 1819 1825 -129240 1819 1913 -129240 1825 1913 -129240 1543 1439 -129240 1563 1717 -129240 1792 1798 -129240 1816 1881 -129240 1676 1439 -129240 1587 1883 -129240 1598 1670 -129240 1816 1823 -129240 1755 1890 -129240 1598 1479 -129240 1550 1603 -129240 1563 1578 -129240 1598 1711 -129240 1735 1465 -129240 1645 1756 -129240 1870 1441 -129240 1657 1769 -129260 1543 1451 -129260 1550 1761 -129260 1554 1880 -129260 1563 1455 -129260 1568 1659 -129260 1590 1678 -129260 1603 1761 -129260 1642 1492 -129260 1664 1898 -129260 1671 1839 -129260 1698 1761 -129260 1711 1479 -129260 1772 1919 -129260 1819 1825 -129260 1819 1913 -129260 1825 1913 -129260 1898 1923 -129260 1924 1478 -129260 1543 1439 -129260 1563 1717 -129260 1678 1761 -129260 1792 1798 -129260 1816 1881 -129260 1884 1890 -129260 1676 1439 -129260 1587 1883 -129260 1598 1670 -129260 1816 1823 -129260 1755 1890 -129260 1598 1479 -129260 1550 1603 -129260 1563 1578 -129260 1598 1711 -129260 1735 1465 -129260 1645 1756 -129260 1870 1441 -129260 1657 1769 -129280 1543 1439 -129280 1552 1658 -129280 1563 1717 -129280 1574 1913 -129280 1592 1847 -129280 1598 1847 -129280 1664 1692 -129280 1678 1761 -129280 1684 1857 -129280 1696 1798 -129280 1698 1703 -129280 1727 1845 -129280 1731 1847 -129280 1792 1798 -129280 1798 1885 -129280 1816 1881 -129280 1847 1530 -129280 1884 1890 -129280 1658 1731 -129280 1676 1439 -129280 1587 1883 -129280 1598 1670 -129280 1643 1704 -129280 1649 1908 -129280 1816 1823 -129280 1755 1890 -129280 1755 1525 -129280 1598 1479 -129280 1550 1603 -129280 1563 1578 -129280 1598 1711 -129280 1735 1465 -129280 1551 1269 -129280 1645 1756 -129280 1870 1441 -129280 1840 1913 -129280 1657 1769 -129300 1539 1455 -129300 1549 1890 -129300 1549 1755 -129300 1572 1526 -129300 1626 1441 -129300 1652 1673 -129300 1658 1731 -129300 1672 1847 -129300 1676 1706 -129300 1676 1439 -129300 1681 1471 -129300 1735 1847 -129300 1825 1905 -129300 1848 1906 -129300 1857 1441 -129300 1871 1526 -129300 1550 1831 -129300 1568 1659 -129300 1587 1883 -129300 1598 1670 -129300 1603 1831 -129300 1643 1704 -129300 1670 1711 -129300 1890 1525 -129300 1574 1840 -129300 1649 1908 -129300 1572 1871 -129300 1816 1823 -129300 1755 1890 -129300 1755 1525 -129300 1598 1479 -129300 1711 1479 -129300 1550 1603 -129300 1563 1578 -129300 1598 1711 -129300 1735 1465 -129300 1551 1269 -129300 1645 1756 -129300 1870 1441 -129300 1840 1913 -129300 1657 1769 -129320 1550 1831 -129320 1552 1731 -129320 1568 1659 -129320 1587 1883 -129320 1598 1670 -129320 1603 1831 -129320 1643 1704 -129320 1664 1692 -129320 1664 1477 -129320 1670 1711 -129320 1696 1798 -129320 1698 1703 -129320 1704 1772 -129320 1727 1471 -129320 1761 1772 -129320 1761 1461 -129320 1802 1865 -129320 1868 1471 -129320 1890 1525 -129320 1543 1439 -129320 1574 1840 -129320 1574 1913 -129320 1630 1731 -129320 1641 1847 -129320 1649 1908 -129320 1572 1871 -129320 1816 1823 -129320 1755 1890 -129320 1755 1525 -129320 1598 1479 -129320 1711 1479 -129320 1550 1603 -129320 1563 1578 -129320 1598 1711 -129320 1735 1465 -129320 1551 1269 -129320 1645 1756 -129320 1870 1441 -129320 1840 1913 -129320 1657 1769 -129340 1543 1439 -129340 1549 1825 -129340 1551 1492 -129340 1552 1530 -129340 1574 1840 -129340 1574 1913 -129340 1579 1735 -129340 1626 1684 -129340 1630 1530 -129340 1630 1731 -129340 1641 1847 -129340 1647 1868 -129340 1649 1908 -129340 1658 1786 -129340 1673 1794 -129340 1684 1857 -129340 1704 1761 -129340 1796 1816 -129340 1825 1905 -129340 1884 1905 -129340 1579 1455 -129340 1884 1890 -129340 1572 1871 -129340 1816 1823 -129340 1755 1890 -129340 1755 1525 -129340 1598 1479 -129340 1711 1479 -129340 1550 1603 -129340 1563 1578 -129340 1598 1711 -129340 1735 1465 -129340 1543 1676 -129340 1551 1269 -129340 1645 1756 -129340 1870 1441 -129340 1840 1913 -129340 1877 1908 -129340 1657 1769 -129360 1543 1706 -129360 1549 1890 -129360 1549 1884 -129360 1579 1455 -129360 1652 1673 -129360 1658 1680 -129360 1658 1437 -129360 1671 1839 -129360 1676 1439 -129360 1772 1490 -129360 1796 1823 -129360 1819 1913 -129360 1875 1458 -129360 1875 1471 -129360 1884 1890 -129360 1572 1871 -129360 1590 1530 -129360 1721 1823 -129360 1816 1823 -129360 1755 1890 -129360 1755 1525 -129360 1783 1528 -129360 1598 1479 -129360 1711 1479 -129360 1890 1525 -129360 1550 1603 -129360 1563 1578 -129360 1598 1711 -129360 1735 1465 -129360 1568 1659 -129360 1543 1676 -129360 1551 1269 -129360 1645 1756 -129360 1870 1441 -129360 1670 1479 -129360 1840 1913 -129360 1877 1908 -129360 1657 1769 -129380 1549 1755 -129380 1570 1574 -129380 1572 1871 -129380 1590 1530 -129380 1666 1530 -129380 1666 1678 -129380 1678 1713 -129380 1721 1823 -129380 1767 1840 -129380 1816 1823 -129380 1847 1875 -129380 1924 1478 -129380 1727 1845 -129380 1755 1890 -129380 1755 1525 -129380 1783 1528 -129380 1598 1479 -129380 1598 1670 -129380 1684 1892 -129380 1711 1479 -129380 1796 1816 -129380 1890 1525 -129380 1550 1603 -129380 1563 1578 -129380 1598 1711 -129380 1735 1465 -129380 1568 1659 -129380 1626 1684 -129380 1543 1676 -129380 1649 1908 -129380 1551 1269 -129380 1645 1756 -129380 1870 1441 -129380 1670 1479 -129380 1840 1913 -129380 1877 1908 -129380 1657 1769 -129400 1543 1680 -129400 1543 1550 -129400 1556 1921 -129400 1570 1455 -129400 1664 1923 -129400 1666 1752 -129400 1727 1845 -129400 1752 1530 -129400 1755 1890 -129400 1755 1525 -129400 1783 1528 -129400 1823 1881 -129400 1825 1905 -129400 1850 1908 -129400 1858 1906 -129400 1892 1898 -129400 1908 1517 -129400 1549 1890 -129400 1598 1479 -129400 1598 1670 -129400 1684 1892 -129400 1711 1479 -129400 1796 1816 -129400 1890 1525 -129400 1550 1603 -129400 1563 1578 -129400 1598 1711 -129400 1616 1906 -129400 1684 1857 -129400 1735 1465 -129400 1819 1913 -129400 1568 1659 -129400 1626 1857 -129400 1626 1684 -129400 1543 1676 -129400 1649 1908 -129400 1825 1519 -129400 1551 1269 -129400 1645 1756 -129400 1870 1441 -129400 1670 1479 -129400 1840 1913 -129400 1877 1908 -129400 1657 1769 -129420 1538 1466 -129420 1543 1678 -129420 1543 1671 -129420 1549 1890 -129420 1587 1590 -129420 1598 1479 -129420 1598 1670 -129420 1652 1790 -129420 1670 1711 -129420 1676 1493 -129420 1684 1892 -129420 1698 1808 -129420 1711 1479 -129420 1721 1816 -129420 1731 1755 -129420 1796 1816 -129420 1796 1823 -129420 1890 1525 -129420 1905 1519 -129420 1920 1479 -129420 1550 1603 -129420 1563 1578 -129420 1598 1711 -129420 1616 1906 -129420 1652 1673 -129420 1684 1857 -129420 1735 1465 -129420 1752 1766 -129420 1796 1881 -129420 1819 1913 -129420 1549 1525 -129420 1568 1659 -129420 1572 1871 -129420 1590 1728 -129420 1604 1808 -129420 1626 1857 -129420 1626 1684 -129420 1892 1477 -129420 1543 1676 -129420 1649 1908 -129420 1825 1519 -129420 1551 1269 -129420 1645 1756 -129420 1870 1441 -129420 1670 1479 -129420 1840 1913 -129420 1877 1908 -129420 1657 1769 -129440 1543 1590 -129440 1550 1603 -129440 1550 1671 -129440 1559 1887 -129440 1563 1578 -129440 1590 1673 -129440 1590 1847 -129440 1598 1711 -129440 1616 1906 -129440 1652 1673 -129440 1664 1692 -129440 1678 1847 -129440 1684 1857 -129440 1721 1796 -129440 1732 1855 -129440 1735 1465 -129440 1752 1923 -129440 1752 1766 -129440 1796 1881 -129440 1819 1913 -129440 1908 1517 -129440 1549 1525 -129440 1551 1492 -129440 1568 1659 -129440 1572 1871 -129440 1590 1728 -129440 1604 1808 -129440 1626 1857 -129440 1626 1684 -129440 1713 1530 -129440 1892 1477 -129440 1543 1676 -129440 1649 1908 -129440 1676 1526 -129440 1727 1845 -129440 1825 1519 -129440 1551 1269 -129440 1645 1756 -129440 1870 1441 -129440 1670 1479 -129440 1840 1913 -129440 1877 1908 -129440 1657 1769 -129440 1892 1898 -129460 1549 1525 -129460 1551 1492 -129460 1568 1659 -129460 1572 1871 -129460 1590 1728 -129460 1590 1752 -129460 1604 1808 -129460 1626 1857 -129460 1626 1684 -129460 1671 1678 -129460 1713 1530 -129460 1734 1491 -129460 1269 1492 -129460 1857 1441 -129460 1882 1512 -129460 1892 1477 -129460 1904 1455 -129460 1924 1525 -129460 1426 1501 -129460 1495 1501 -129460 1543 1676 -129460 1543 1526 -129460 1549 1890 -129460 1649 1908 -129460 1676 1752 -129460 1676 1526 -129460 1727 1845 -129460 1767 1913 -129460 1825 1519 -129460 1551 1269 -129460 1570 1920 -129460 1645 1756 -129460 1870 1441 -129460 1670 1479 -129460 1840 1913 -129460 1877 1908 -129460 1657 1769 -129460 1892 1898 -129480 1543 1752 -129480 1543 1676 -129480 1543 1526 -129480 1549 1890 -129480 1574 1603 -129480 1593 1501 -129480 1649 1908 -129480 1671 1727 -129480 1676 1752 -129480 1676 1526 -129480 1727 1752 -129480 1727 1845 -129480 1752 1845 -129480 1754 1913 -129480 1767 1913 -129480 1790 1493 -129480 1796 1816 -129480 1819 1913 -129480 1825 1519 -129480 1890 1513 -129480 1890 1519 -129480 1905 1519 -129480 1908 1517 -129480 1913 1455 -129480 1439 1451 -129480 1503 1526 -129480 1551 1269 -129480 1570 1920 -129480 1603 1831 -129480 1645 1756 -129480 1850 1908 -129480 1870 1441 -129480 1884 1905 -129480 1670 1479 -129480 1676 1469 -129480 1840 1913 -129480 1877 1908 -129480 1657 1769 -129480 1735 1465 -129480 1892 1898 -129500 1543 1664 -129500 1543 1455 -129500 1551 1269 -129500 1570 1920 -129500 1603 1831 -129500 1616 1821 -129500 1617 1441 -129500 1645 1756 -129500 1664 1455 -129500 1678 1269 -129500 1680 1752 -129500 1680 1493 -129500 1684 1857 -129500 1761 1792 -129500 1783 1528 -129500 1823 1881 -129500 1850 1908 -129500 1868 1471 -129500 1870 1441 -129500 1884 1905 -129500 1892 1455 -129500 1603 1507 -129500 1664 1892 -129500 1670 1479 -129500 1676 1469 -129500 1840 1913 -129500 1877 1908 -129500 1657 1769 -129500 1816 1823 -129500 1649 1517 -129500 1735 1465 -129500 1892 1898 -129520 1551 1678 -129520 1551 1503 -129520 1568 1659 -129520 1603 1507 -129520 1664 1898 -129520 1664 1892 -129520 1670 1479 -129520 1676 1469 -129520 1721 1816 -129520 1727 1845 -129520 1761 1769 -129520 1761 1798 -129520 1819 1913 -129520 1840 1913 -129520 1847 1522 -129520 1883 1497 -129520 1890 1519 -129520 1590 1923 -129520 1877 1908 -129520 1924 1478 -129520 1538 1524 -129520 1657 1769 -129520 1796 1816 -129520 1816 1823 -129520 1890 1513 -129520 1549 1513 -129520 1649 1517 -129520 1735 1465 -129520 1574 1463 -129520 1892 1898 -129540 1538 1522 -129540 1563 1578 -129540 1582 1475 -129540 1590 1923 -129540 1664 1514 -129540 1669 1754 -129540 1671 1680 -129540 1684 1913 -129540 1692 1455 -129540 1734 1491 -129540 1877 1908 -129540 1924 1478 -129540 1538 1524 -129540 1543 1479 -129540 1549 1890 -129540 1572 1871 -129540 1657 1769 -129540 1796 1816 -129540 1816 1823 -129540 1857 1441 -129540 1884 1905 -129540 1890 1513 -129540 1549 1513 -129540 1649 1517 -129540 1735 1465 -129540 1574 1463 -129540 1645 1756 -129540 1892 1898 -129560 1538 1524 -129560 1543 1479 -129560 1549 1890 -129560 1572 1871 -129560 1593 1426 -129560 1647 1752 -129560 1657 1769 -129560 1671 1455 -129560 1678 1728 -129560 1680 1455 -129560 1695 1761 -129560 1703 1904 -129560 1711 1479 -129560 1717 1752 -129560 1732 1855 -129560 1786 1455 -129560 1796 1816 -129560 1816 1881 -129560 1816 1823 -129560 1857 1441 -129560 1884 1905 -129560 1890 1513 -129560 1495 1530 -129560 1670 1711 -129560 1570 1920 -129560 1549 1513 -129560 1568 1659 -129560 1598 1479 -129560 1649 1517 -129560 1735 1465 -129560 1574 1463 -129560 1645 1756 -129560 1892 1898 -129580 1539 1579 -129580 1551 1269 -129580 1582 1443 -129580 1593 1845 -129580 1593 1727 -129580 1647 1816 -129580 1664 1913 -129580 1669 1754 -129580 1670 1711 -129580 1676 1922 -129580 1707 1765 -129580 1752 1458 -129580 1914 1427 -129580 1543 1711 -129580 1570 1920 -129580 1734 1491 -129580 1825 1884 -129580 1549 1513 -129580 1568 1659 -129580 1598 1479 -129580 1630 1676 -129580 1649 1517 -129580 1735 1465 -129580 1574 1463 -129580 1645 1756 -129580 1805 1501 -129580 1892 1898 -129580 1825 1519 -129600 1543 1711 -129600 1570 1920 -129600 1598 1667 -129600 1616 1906 -129600 1626 1913 -129600 1630 1922 -129600 1660 1692 -129600 1695 1761 -129600 1703 1904 -129600 1717 1742 -129600 1734 1491 -129600 1792 1885 -129600 1825 1884 -129600 1884 1519 -129600 1892 1913 -129600 1549 1513 -129600 1568 1659 -129600 1598 1479 -129600 1630 1676 -129600 1649 1517 -129600 1657 1769 -129600 1735 1465 -129600 1816 1881 -129600 1816 1823 -129600 1857 1441 -129600 1563 1578 -129600 1574 1463 -129600 1645 1756 -129600 1679 1816 -129600 1805 1501 -129600 1877 1908 -129600 1892 1898 -129600 1825 1519 -129620 1549 1513 -129620 1568 1659 -129620 1568 1479 -129620 1592 1667 -129620 1598 1479 -129620 1630 1676 -129620 1642 1492 -129620 1649 1517 -129620 1652 1707 -129620 1657 1769 -129620 1676 1922 -129620 1695 1427 -129620 1727 1845 -129620 1735 1465 -129620 1816 1881 -129620 1816 1823 -129620 1857 1441 -129620 1868 1458 -129620 1908 1517 -129620 1491 1504 -129620 1543 1526 -129620 1563 1578 -129620 1574 1463 -129620 1645 1756 -129620 1679 1816 -129620 1805 1501 -129620 1877 1908 -129620 1796 1816 -129620 1892 1898 -129620 1626 1840 -129620 1825 1519 -129620 1876 1440 -129640 1543 1526 -129640 1563 1578 -129640 1574 1463 -129640 1645 1756 -129640 1648 1696 -129640 1660 1692 -129640 1669 1754 -129640 1679 1816 -129640 1684 1507 -129640 1703 1904 -129640 1715 1717 -129640 1792 1885 -129640 1805 1501 -129640 1877 1908 -129640 1900 1464 -129640 1924 1478 -129640 1672 1920 -129640 1796 1816 -129640 1892 1898 -129640 1626 1840 -129640 1645 1443 -129640 1825 1519 -129640 1876 1440 -129640 1513 1525 -129640 1870 1441 -129660 1549 1850 -129660 1592 1667 -129660 1642 1857 -129660 1642 1479 -129660 1672 1920 -129660 1679 1823 -129660 1707 1865 -129660 1735 1465 -129660 1759 1427 -129660 1796 1816 -129660 1802 1923 -129660 1857 1441 -129660 1892 1898 -129660 1552 1695 -129660 1613 1876 -129660 1695 1761 -129660 1552 1759 -129660 1626 1840 -129660 1645 1443 -129660 1759 1761 -129660 1825 1884 -129660 1711 1479 -129660 1825 1519 -129660 1850 1868 -129660 1876 1440 -129660 1513 1525 -129660 1549 1513 -129660 1870 1441 -129660 1572 1871 -129660 1549 1525 -129680 1552 1695 -129680 1563 1578 -129680 1579 1692 -129680 1598 1672 -129680 1604 1269 -129680 1608 1667 -129680 1613 1876 -129680 1616 1906 -129680 1617 1857 -129680 1642 1839 -129680 1657 1769 -129680 1659 1672 -129680 1667 1706 -129680 1667 1455 -129680 1684 1507 -129680 1695 1761 -129680 1711 1439 -129680 1761 1427 -129680 1783 1528 -129680 1819 1913 -129680 1850 1908 -129680 1865 1900 -129680 1865 1495 -129680 1439 1479 -129680 1441 1479 -129680 1451 1479 -129680 1552 1759 -129680 1626 1840 -129680 1645 1443 -129680 1695 1759 -129680 1759 1761 -129680 1790 1426 -129680 1825 1884 -129680 1877 1908 -129680 1711 1479 -129680 1825 1519 -129680 1802 1495 -129680 1850 1868 -129680 1876 1440 -129680 1669 1754 -129680 1513 1525 -129680 1549 1513 -129680 1645 1756 -129680 1870 1441 -129680 1572 1871 -129680 1549 1525 -129700 1551 1572 -129700 1551 1871 -129700 1552 1759 -129700 1604 1865 -129700 1626 1840 -129700 1645 1443 -129700 1695 1759 -129700 1707 1923 -129700 1759 1761 -129700 1761 1871 -129700 1269 1871 -129700 1790 1426 -129700 1790 1530 -129700 1816 1873 -129700 1825 1884 -129700 1877 1908 -129700 1884 1519 -129700 1570 1920 -129700 1626 1684 -129700 1711 1479 -129700 1761 1865 -129700 1825 1519 -129700 1802 1495 -129700 1850 1868 -129700 1876 1440 -129700 1735 1465 -129700 1669 1754 -129700 1513 1525 -129700 1549 1513 -129700 1645 1756 -129700 1870 1441 -129700 1572 1871 -129700 1549 1525 -129720 1539 1924 -129720 1550 1629 -129720 1551 1761 -129720 1551 1269 -129720 1552 1427 -129720 1570 1920 -129720 1572 1495 -129720 1574 1463 -129720 1577 1875 -129720 1579 1659 -129720 1582 1692 -129720 1591 1495 -129720 1626 1684 -129720 1652 1495 -129720 1670 1479 -129720 1670 1711 -129720 1711 1479 -129720 1727 1790 -129720 1731 1877 -129720 1761 1865 -129720 1761 1802 -129720 1802 1865 -129720 1825 1519 -129720 1868 1884 -129720 1543 1526 -129720 1657 1769 -129720 1802 1495 -129720 1850 1868 -129720 1876 1440 -129720 1735 1465 -129720 1669 1754 -129720 1513 1525 -129720 1549 1513 -129720 1645 1756 -129720 1870 1441 -129720 1572 1871 -129720 1549 1525 -129740 1543 1526 -129740 1551 1871 -129740 1587 1887 -129740 1590 1911 -129740 1595 1654 -129740 1603 1629 -129740 1603 1701 -129740 1657 1769 -129740 1670 1684 -129740 1802 1495 -129740 1850 1868 -129740 1868 1908 -129740 1876 1440 -129740 1877 1908 -129740 1892 1898 -129740 1514 1530 -129740 1552 1695 -129740 1591 1802 -129740 1626 1664 -129740 1735 1465 -129740 1669 1754 -129740 1513 1525 -129740 1549 1513 -129740 1645 1756 -129740 1870 1441 -129740 1572 1871 -129740 1549 1525 -129760 1551 1269 -129760 1552 1695 -129760 1591 1802 -129760 1591 1495 -129760 1626 1664 -129760 1629 1919 -129760 1649 1517 -129760 1692 1458 -129760 1711 1507 -129760 1711 1877 -129760 1735 1465 -129760 1752 1443 -129760 1792 1885 -129760 1819 1913 -129760 1873 1924 -129760 1883 1505 -129760 1448 1493 -129760 1579 1659 -129760 1591 1923 -129760 1591 1911 -129760 1669 1754 -129760 1848 1504 -129760 1513 1525 -129760 1549 1513 -129760 1645 1756 -129760 1870 1441 -129760 1670 1479 -129760 1572 1871 -129760 1626 1684 -129760 1549 1525 -129780 1579 1659 -129780 1591 1923 -129780 1591 1911 -129780 1616 1906 -129780 1617 1857 -129780 1634 1491 -129780 1660 1692 -129780 1669 1754 -129780 1698 1757 -129780 1701 1528 -129780 1701 1504 -129780 1701 1732 -129780 1802 1495 -129780 1848 1504 -129780 1877 1507 -129780 1911 1923 -129780 1427 1490 -129780 1570 1920 -129780 1513 1525 -129780 1549 1513 -129780 1645 1756 -129780 1870 1441 -129780 1539 1924 -129780 1670 1908 -129780 1670 1877 -129780 1670 1479 -129780 1877 1908 -129780 1877 1479 -129780 1908 1479 -129780 1572 1871 -129780 1626 1684 -129780 1549 1525 -129800 1550 1680 -129800 1551 1269 -129800 1568 1703 -129800 1570 1920 -129800 1592 1731 -129800 1652 1495 -129800 1671 1808 -129800 1685 1464 -129800 1706 1892 -129800 1805 1501 -129800 1850 1868 -129800 1513 1525 -129800 1549 1513 -129800 1551 1572 -129800 1919 1500 -129800 1563 1578 -129800 1645 1756 -129800 1870 1441 -129800 1500 1511 -129800 1539 1924 -129800 1670 1908 -129800 1670 1877 -129800 1670 1479 -129800 1877 1908 -129800 1877 1479 -129800 1908 1479 -129800 1657 1769 -129800 1572 1871 -129800 1626 1684 -129800 1549 1525 -129800 1735 1465 -129820 1549 1513 -129820 1550 1685 -129820 1551 1572 -129820 1556 1921 -129820 1591 1629 -129820 1591 1911 -129820 1616 1906 -129820 1629 1732 -129820 1629 1798 -129820 1683 1461 -129820 1685 1880 -129820 1717 1752 -129820 1816 1881 -129820 1919 1500 -129820 1563 1578 -129820 1645 1756 -129820 1802 1495 -129820 1819 1913 -129820 1870 1441 -129820 1500 1511 -129820 1539 1924 -129820 1587 1887 -129820 1670 1908 -129820 1670 1877 -129820 1670 1479 -129820 1783 1504 -129820 1877 1908 -129820 1877 1479 -129820 1908 1479 -129820 1550 1880 -129820 1657 1769 -129820 1572 1871 -129820 1626 1684 -129820 1549 1525 -129820 1735 1465 -129840 1563 1578 -129840 1569 1703 -129840 1601 1451 -129840 1614 1500 -129840 1634 1491 -129840 1645 1756 -129840 1667 1487 -129840 1699 1752 -129840 1706 1521 -129840 1752 1458 -129840 1802 1495 -129840 1819 1913 -129840 1850 1868 -129840 1870 1441 -129840 1887 1442 -129840 1898 1529 -129840 1500 1511 -129840 1539 1924 -129840 1587 1887 -129840 1670 1908 -129840 1670 1877 -129840 1670 1479 -129840 1783 1504 -129840 1877 1908 -129840 1877 1479 -129840 1908 1479 -129840 1919 1529 -129840 1485 1529 -129840 1550 1880 -129840 1657 1769 -129840 1572 1871 -129840 1626 1684 -129840 1569 1598 -129840 1794 1880 -129840 1549 1525 -129840 1550 1794 -129840 1735 1465 -129860 1539 1924 -129860 1556 1921 -129860 1587 1887 -129860 1598 1654 -129860 1599 1882 -129860 1622 1625 -129860 1626 1908 -129860 1670 1908 -129860 1670 1877 -129860 1670 1479 -129860 1749 1873 -129860 1783 1504 -129860 1829 1886 -129860 1848 1504 -129860 1875 1458 -129860 1877 1908 -129860 1877 1479 -129860 1883 1505 -129860 1908 1479 -129860 1919 1529 -129860 1485 1529 -129860 1550 1880 -129860 1552 1695 -129860 1657 1769 -129860 1673 1466 -129860 1513 1525 -129860 1572 1871 -129860 1626 1684 -129860 1569 1598 -129860 1794 1880 -129860 1816 1881 -129860 1549 1525 -129860 1550 1794 -129860 1735 1465 -129860 1598 1742 -129860 1711 1479 -129880 1550 1880 -129880 1551 1572 -129880 1552 1695 -129880 1593 1876 -129880 1614 1511 -129880 1630 1908 -129880 1657 1769 -129880 1673 1466 -129880 1752 1840 -129880 1752 1443 -129880 1840 1908 -129880 1570 1920 -129880 1601 1451 -129880 1601 1485 -129880 1645 1756 -129880 1513 1525 -129880 1572 1871 -129880 1626 1684 -129880 1870 1441 -129880 1451 1485 -129880 1569 1598 -129880 1794 1880 -129880 1816 1881 -129880 1549 1525 -129880 1550 1794 -129880 1735 1465 -129880 1598 1742 -129880 1711 1479 -129900 1570 1920 -129900 1601 1529 -129900 1601 1451 -129900 1601 1485 -129900 1617 1479 -129900 1645 1756 -129900 1667 1462 -129900 1706 1448 -129900 1819 1913 -129900 1911 1923 -129900 1921 1462 -129900 1485 1529 -129900 1513 1525 -129900 1572 1871 -129900 1594 1475 -129900 1599 1882 -129900 1626 1684 -129900 1670 1877 -129900 1752 1924 -129900 1825 1519 -129900 1870 1441 -129900 1451 1529 -129900 1451 1485 -129900 1701 1761 -129900 1569 1598 -129900 1794 1880 -129900 1816 1881 -129900 1549 1525 -129900 1550 1794 -129900 1735 1465 -129900 1598 1742 -129900 1711 1479 -129900 1877 1908 -129920 1539 1754 -129920 1572 1871 -129920 1587 1887 -129920 1594 1475 -129920 1599 1882 -129920 1622 1731 -129920 1626 1684 -129920 1664 1875 -129920 1667 1803 -129920 1670 1877 -129920 1717 1796 -129920 1752 1924 -129920 1771 1921 -129920 1783 1528 -129920 1825 1519 -129920 1870 1441 -129920 1451 1529 -129920 1451 1485 -129920 1500 1511 -129920 1545 1731 -129920 1574 1463 -129920 1575 1908 -129920 1701 1761 -129920 1868 1921 -129920 1556 1771 -129920 1569 1598 -129920 1669 1754 -129920 1794 1880 -129920 1816 1881 -129920 1549 1525 -129920 1550 1794 -129920 1735 1465 -129920 1598 1742 -129920 1711 1479 -129920 1877 1908 -129920 1670 1908 -129940 1545 1731 -129940 1556 1850 -129940 1556 1868 -129940 1574 1463 -129940 1575 1908 -129940 1575 1679 -129940 1657 1769 -129940 1660 1692 -129940 1679 1908 -129940 1680 1850 -129940 1701 1761 -129940 1850 1868 -129940 1868 1921 -129940 1876 1521 -129940 1556 1771 -129940 1569 1598 -129940 1669 1754 -129940 1794 1880 -129940 1816 1881 -129940 1829 1510 -129940 1829 1854 -129940 1854 1886 -129940 1485 1529 -129940 1549 1525 -129940 1886 1510 -129940 1550 1880 -129940 1550 1794 -129940 1735 1465 -129940 1829 1886 -129940 1598 1742 -129940 1711 1479 -129940 1877 1908 -129940 1670 1908 -129960 1556 1579 -129960 1556 1462 -129960 1556 1771 -129960 1569 1598 -129960 1570 1920 -129960 1579 1921 -129960 1599 1882 -129960 1669 1754 -129960 1700 1790 -129960 1794 1880 -129960 1816 1881 -129960 1829 1510 -129960 1829 1854 -129960 1854 1886 -129960 1485 1529 -129960 1549 1525 -129960 1579 1462 -129960 1819 1913 -129960 1886 1510 -129960 1918 1451 -129960 1921 1462 -129960 1550 1880 -129960 1550 1794 -129960 1735 1465 -129960 1829 1886 -129960 1904 1451 -129960 1598 1742 -129960 1870 1441 -129960 1670 1877 -129960 1711 1479 -129960 1877 1908 -129960 1670 1908 -129980 1549 1525 -129980 1549 1717 -129980 1551 1269 -129980 1570 1617 -129980 1575 1752 -129980 1579 1462 -129980 1617 1842 -129980 1673 1466 -129980 1717 1455 -129980 1819 1913 -129980 1886 1510 -129980 1918 1451 -129980 1921 1462 -129980 1550 1880 -129980 1550 1794 -129980 1721 1816 -129980 1735 1465 -129980 1829 1886 -129980 1904 1451 -129980 1598 1742 -129980 1870 1441 -129980 1670 1877 -129980 1711 1479 -129980 1657 1769 -129980 1877 1908 -129980 1670 1908 -130000 1550 1880 -130000 1550 1794 -130000 1551 1572 -130000 1556 1700 -130000 1556 1829 -130000 1579 1700 -130000 1593 1868 -130000 1706 1880 -130000 1718 1518 -130000 1721 1816 -130000 1731 1526 -130000 1735 1465 -130000 1752 1908 -130000 1783 1504 -130000 1783 1528 -130000 1803 1451 -130000 1825 1519 -130000 1829 1886 -130000 1850 1448 -130000 1857 1441 -130000 1904 1451 -130000 1570 1920 -130000 1582 1526 -130000 1598 1742 -130000 1735 1752 -130000 1829 1918 -130000 1870 1441 -130000 1550 1706 -130000 1670 1877 -130000 1711 1479 -130000 1657 1769 -130000 1877 1908 -130000 1670 1908 -130020 1554 1718 -130020 1569 1598 -130020 1570 1920 -130020 1582 1526 -130020 1598 1742 -130020 1599 1882 -130020 1635 1718 -130020 1684 1717 -130020 1700 1829 -130020 1735 1752 -130020 1796 1816 -130020 1816 1823 -130020 1829 1918 -130020 1841 1901 -130020 1870 1441 -130020 1465 1471 -130020 1550 1706 -130020 1673 1880 -130020 1700 1462 -130020 1848 1504 -130020 1886 1919 -130020 1670 1877 -130020 1921 1462 -130020 1479 1507 -130020 1545 1579 -130020 1711 1479 -130020 1669 1754 -130020 1718 1889 -130020 1657 1769 -130020 1877 1908 -130020 1670 1908 -130040 1550 1706 -130040 1574 1463 -130040 1593 1790 -130040 1598 1654 -130040 1664 1735 -130040 1673 1880 -130040 1689 1918 -130040 1700 1462 -130040 1708 1790 -130040 1715 1794 -130040 1829 1919 -130040 1848 1504 -130040 1857 1441 -130040 1886 1919 -130040 1485 1502 -130040 1545 1706 -130040 1545 1556 -130040 1670 1877 -130040 1711 1507 -130040 1921 1462 -130040 1479 1507 -130040 1545 1579 -130040 1579 1706 -130040 1441 1492 -130040 1711 1479 -130040 1669 1754 -130040 1829 1886 -130040 1718 1889 -130040 1657 1769 -130040 1877 1908 -130040 1670 1908 -130060 1545 1921 -130060 1545 1706 -130060 1545 1556 -130060 1556 1889 -130060 1670 1877 -130060 1673 1889 -130060 1689 1502 -130060 1708 1731 -130060 1711 1507 -130060 1718 1918 -130060 1721 1816 -130060 1816 1823 -130060 1836 1921 -130060 1854 1510 -130060 1898 1462 -130060 1921 1462 -130060 1479 1507 -130060 1504 1528 -130060 1545 1579 -130060 1556 1706 -130060 1579 1921 -130060 1579 1706 -130060 1441 1492 -130060 1541 1437 -130060 1711 1479 -130060 1669 1754 -130060 1706 1921 -130060 1829 1886 -130060 1718 1889 -130060 1657 1769 -130060 1877 1908 -130060 1670 1908 -130080 1545 1579 -130080 1556 1706 -130080 1579 1921 -130080 1579 1706 -130080 1582 1876 -130080 1684 1717 -130080 1700 1886 -130080 1707 1428 -130080 1717 1806 -130080 1783 1504 -130080 1880 1451 -130080 1880 1918 -130080 1886 1889 -130080 1441 1492 -130080 1517 1520 -130080 1537 1689 -130080 1541 1437 -130080 1711 1479 -130080 1803 1451 -130080 1803 1918 -130080 1829 1919 -130080 1918 1451 -130080 1538 1524 -130080 1669 1754 -130080 1700 1889 -130080 1700 1718 -130080 1802 1495 -130080 1706 1921 -130080 1829 1886 -130080 1718 1889 -130080 1657 1769 -130080 1877 1908 -130080 1670 1908 -130100 1537 1689 -130100 1537 1451 -130100 1541 1437 -130100 1542 1789 -130100 1550 1707 -130100 1556 1707 -130100 1556 1428 -130100 1670 1877 -130100 1689 1451 -130100 1689 1918 -130100 1707 1462 -130100 1711 1479 -130100 1717 1767 -130100 1740 1517 -130100 1749 1920 -130100 1803 1451 -130100 1803 1918 -130100 1829 1919 -130100 1857 1441 -130100 1918 1451 -130100 1921 1428 -130100 1538 1524 -130100 1626 1715 -130100 1669 1754 -130100 1700 1889 -130100 1700 1718 -130100 1707 1889 -130100 1718 1880 -130100 1802 1495 -130100 1545 1706 -130100 1545 1462 -130100 1848 1504 -130100 1689 1803 -130100 1706 1921 -130100 1684 1463 -130100 1829 1886 -130100 1718 1889 -130100 1549 1525 -130100 1657 1769 -130100 1877 1908 -130100 1670 1908 -130120 1537 1918 -130120 1538 1524 -130120 1555 1673 -130120 1574 1463 -130120 1593 1731 -130120 1599 1882 -130120 1626 1715 -130120 1626 1502 -130120 1635 1731 -130120 1669 1754 -130120 1673 1718 -130120 1700 1889 -130120 1700 1707 -130120 1700 1428 -130120 1700 1718 -130120 1706 1462 -130120 1707 1889 -130120 1707 1919 -130120 1717 1857 -130120 1718 1836 -130120 1718 1880 -130120 1728 1428 -130120 1749 1465 -130120 1802 1495 -130120 1836 1889 -130120 1836 1428 -130120 1884 1519 -130120 1898 1523 -130120 1545 1706 -130120 1545 1462 -130120 1574 1684 -130120 1579 1462 -130120 1678 1703 -130120 1700 1829 -130120 1707 1718 -130120 1718 1728 -130120 1848 1504 -130120 1545 1579 -130120 1579 1706 -130120 1689 1803 -130120 1706 1921 -130120 1707 1886 -130120 1718 1428 -130120 1555 1502 -130120 1579 1921 -130120 1684 1463 -130120 1829 1886 -130120 1718 1889 -130120 1549 1525 -130120 1657 1769 -130120 1877 1908 -130120 1670 1908 -130140 1537 1556 -130140 1537 1502 -130140 1545 1921 -130140 1545 1706 -130140 1545 1462 -130140 1549 1825 -130140 1572 1871 -130140 1574 1684 -130140 1579 1462 -130140 1609 1688 -130140 1613 1439 -130140 1626 1718 -130140 1660 1692 -130140 1673 1676 -130140 1678 1703 -130140 1678 1479 -130140 1678 1711 -130140 1700 1829 -130140 1707 1428 -130140 1707 1718 -130140 1718 1728 -130140 1728 1433 -130140 1731 1834 -130140 1825 1884 -130140 1825 1525 -130140 1825 1519 -130140 1829 1898 -130140 1848 1504 -130140 1479 1493 -130140 1545 1579 -130140 1579 1706 -130140 1689 1803 -130140 1706 1921 -130140 1707 1886 -130140 1711 1479 -130140 1718 1428 -130140 1555 1502 -130140 1579 1921 -130140 1803 1880 -130140 1886 1898 -130140 1684 1463 -130140 1803 1918 -130140 1829 1886 -130140 1718 1889 -130140 1549 1525 -130140 1670 1877 -130140 1657 1769 -130140 1877 1908 -130140 1670 1908 -130160 1545 1579 -130160 1579 1706 -130160 1582 1593 -130160 1689 1880 -130160 1689 1803 -130160 1706 1921 -130160 1707 1886 -130160 1711 1479 -130160 1718 1428 -130160 1796 1823 -130160 1836 1502 -130160 1886 1889 -130160 1886 1428 -130160 1889 1428 -130160 1555 1502 -130160 1579 1921 -130160 1796 1816 -130160 1803 1880 -130160 1884 1519 -130160 1886 1898 -130160 1921 1462 -130160 1684 1463 -130160 1803 1918 -130160 1689 1918 -130160 1816 1823 -130160 1829 1886 -130160 1718 1889 -130160 1549 1525 -130160 1670 1877 -130160 1657 1769 -130160 1877 1908 -130160 1670 1908 -130180 1550 1569 -130180 1555 1502 -130180 1556 1834 -130180 1570 1598 -130180 1572 1871 -130180 1574 1684 -130180 1579 1921 -130180 1796 1816 -130180 1803 1880 -130180 1829 1428 -130180 1884 1519 -130180 1886 1898 -130180 1921 1462 -130180 1554 1470 -130180 1660 1692 -130180 1669 1754 -130180 1684 1463 -130180 1803 1918 -130180 1689 1918 -130180 1645 1756 -130180 1718 1836 -130180 1816 1823 -130180 1836 1889 -130180 1829 1886 -130180 1718 1889 -130180 1549 1525 -130180 1670 1877 -130180 1657 1769 -130180 1877 1908 -130180 1670 1908 -130200 1543 1727 -130200 1545 1443 -130200 1551 1572 -130200 1554 1470 -130200 1556 1502 -130200 1579 1623 -130200 1599 1882 -130200 1660 1692 -130200 1669 1754 -130200 1684 1463 -130200 1702 1901 -130200 1707 1836 -130200 1707 1829 -130200 1707 1886 -130200 1718 1880 -130200 1792 1885 -130200 1803 1918 -130200 1880 1889 -130200 1689 1918 -130200 1819 1913 -130200 1582 1593 -130200 1645 1756 -130200 1718 1836 -130200 1816 1823 -130200 1834 1880 -130200 1836 1889 -130200 1462 1518 -130200 1816 1881 -130200 1829 1886 -130200 1538 1524 -130200 1718 1889 -130200 1549 1525 -130200 1670 1877 -130200 1657 1769 -130200 1877 1908 -130200 1670 1908 -130220 1550 1688 -130220 1568 1617 -130220 1569 1742 -130220 1579 1482 -130220 1623 1715 -130220 1689 1918 -130220 1703 1717 -130220 1752 1924 -130220 1819 1913 -130220 1574 1463 -130220 1579 1921 -130220 1579 1829 -130220 1582 1593 -130220 1645 1756 -130220 1718 1836 -130220 1816 1823 -130220 1829 1921 -130220 1834 1880 -130220 1836 1889 -130220 1462 1518 -130220 1816 1881 -130220 1829 1886 -130220 1538 1524 -130220 1718 1889 -130220 1549 1525 -130220 1670 1877 -130220 1579 1886 -130220 1657 1769 -130220 1877 1908 -130220 1670 1908 -130240 1549 1563 -130240 1550 1749 -130240 1555 1502 -130240 1563 1740 -130240 1574 1463 -130240 1579 1921 -130240 1579 1829 -130240 1582 1593 -130240 1645 1756 -130240 1684 1913 -130240 1688 1749 -130240 1718 1836 -130240 1735 1898 -130240 1816 1823 -130240 1829 1921 -130240 1834 1880 -130240 1836 1889 -130240 1836 1502 -130240 1918 1451 -130240 1462 1518 -130240 1556 1836 -130240 1816 1881 -130240 1829 1462 -130240 1829 1886 -130240 1921 1462 -130240 1538 1524 -130240 1718 1889 -130240 1886 1921 -130240 1549 1525 -130240 1579 1462 -130240 1623 1688 -130240 1670 1877 -130240 1796 1816 -130240 1579 1886 -130240 1657 1769 -130240 1877 1908 -130240 1886 1462 -130240 1570 1503 -130240 1670 1908 -130260 1556 1836 -130260 1572 1871 -130260 1599 1882 -130260 1688 1502 -130260 1707 1836 -130260 1707 1462 -130260 1731 1530 -130260 1749 1502 -130260 1816 1881 -130260 1829 1462 -130260 1829 1886 -130260 1834 1451 -130260 1921 1462 -130260 1473 1530 -130260 1538 1524 -130260 1623 1749 -130260 1717 1503 -130260 1718 1889 -130260 1825 1525 -130260 1886 1921 -130260 1549 1525 -130260 1579 1462 -130260 1623 1688 -130260 1670 1877 -130260 1796 1816 -130260 1579 1886 -130260 1657 1769 -130260 1877 1908 -130260 1886 1462 -130260 1549 1740 -130260 1570 1503 -130260 1670 1908 -130280 1538 1524 -130280 1579 1921 -130280 1623 1749 -130280 1643 1518 -130280 1643 1502 -130280 1688 1749 -130280 1688 1493 -130280 1717 1503 -130280 1718 1889 -130280 1718 1428 -130280 1718 1836 -130280 1749 1493 -130280 1823 1881 -130280 1825 1525 -130280 1886 1921 -130280 1889 1433 -130280 1493 1502 -130280 1549 1525 -130280 1579 1462 -130280 1582 1593 -130280 1623 1688 -130280 1623 1493 -130280 1670 1877 -130280 1816 1823 -130280 1796 1816 -130280 1579 1886 -130280 1657 1769 -130280 1688 1886 -130280 1834 1903 -130280 1877 1908 -130280 1884 1519 -130280 1886 1462 -130280 1549 1740 -130280 1570 1503 -130280 1670 1908 -130300 1549 1525 -130300 1554 1530 -130300 1555 1579 -130300 1556 1688 -130300 1563 1717 -130300 1568 1441 -130300 1574 1463 -130300 1579 1462 -130300 1582 1593 -130300 1623 1688 -130300 1623 1880 -130300 1623 1493 -130300 1670 1877 -130300 1740 1525 -130300 1816 1881 -130300 1816 1823 -130300 1876 1521 -130300 1880 1493 -130300 1884 1525 -130300 1556 1569 -130300 1572 1871 -130300 1689 1451 -130300 1796 1816 -130300 1579 1688 -130300 1579 1886 -130300 1657 1769 -130300 1688 1886 -130300 1688 1462 -130300 1834 1903 -130300 1877 1908 -130300 1884 1519 -130300 1886 1462 -130300 1549 1740 -130300 1570 1503 -130300 1670 1908 -130320 1538 1522 -130320 1556 1569 -130320 1556 1623 -130320 1569 1742 -130320 1572 1871 -130320 1617 1441 -130320 1623 1742 -130320 1689 1451 -130320 1706 1708 -130320 1740 1825 -130320 1796 1816 -130320 1841 1901 -130320 1579 1688 -130320 1579 1886 -130320 1657 1769 -130320 1688 1886 -130320 1688 1462 -130320 1834 1903 -130320 1877 1908 -130320 1884 1519 -130320 1886 1462 -130320 1549 1740 -130320 1570 1503 -130320 1670 1908 -130320 1718 1889 -130340 1579 1688 -130340 1579 1921 -130340 1579 1886 -130340 1587 1887 -130340 1599 1622 -130340 1657 1769 -130340 1670 1877 -130340 1676 1731 -130340 1688 1886 -130340 1688 1829 -130340 1688 1462 -130340 1718 1493 -130340 1819 1913 -130340 1834 1903 -130340 1877 1908 -130340 1884 1519 -130340 1886 1921 -130340 1886 1462 -130340 1889 1493 -130340 1579 1462 -130340 1582 1593 -130340 1688 1921 -130340 1689 1834 -130340 1735 1889 -130340 1749 1479 -130340 1829 1886 -130340 1921 1462 -130340 1549 1740 -130340 1570 1503 -130340 1884 1525 -130340 1670 1908 -130340 1718 1889 -130340 1549 1525 -130360 1556 1569 -130360 1579 1462 -130360 1579 1623 -130360 1582 1593 -130360 1594 1475 -130360 1623 1462 -130360 1625 1834 -130360 1688 1880 -130360 1688 1921 -130360 1689 1834 -130360 1706 1455 -130360 1735 1889 -130360 1735 1493 -130360 1749 1479 -130360 1825 1525 -130360 1829 1886 -130360 1841 1901 -130360 1921 1462 -130360 1549 1740 -130360 1570 1503 -130360 1721 1816 -130360 1836 1479 -130360 1924 1517 -130360 1623 1886 -130360 1884 1525 -130360 1670 1908 -130360 1538 1522 -130360 1718 1889 -130360 1549 1525 -130380 1549 1740 -130380 1554 1530 -130380 1568 1808 -130380 1570 1717 -130380 1570 1503 -130380 1657 1769 -130380 1721 1816 -130380 1735 1523 -130380 1740 1825 -130380 1749 1836 -130380 1794 1880 -130380 1563 1717 -130380 1670 1877 -130380 1677 1749 -130380 1836 1479 -130380 1877 1908 -130380 1924 1517 -130380 1556 1479 -130380 1623 1886 -130380 1689 1451 -130380 1884 1525 -130380 1670 1908 -130380 1538 1522 -130380 1718 1889 -130380 1549 1525 -130400 1563 1717 -130400 1569 1742 -130400 1572 1871 -130400 1599 1882 -130400 1670 1877 -130400 1677 1749 -130400 1704 1706 -130400 1775 1835 -130400 1834 1521 -130400 1836 1479 -130400 1877 1908 -130400 1924 1458 -130400 1587 1887 -130400 1642 1913 -130400 1924 1517 -130400 1556 1479 -130400 1575 1766 -130400 1623 1886 -130400 1689 1451 -130400 1884 1525 -130400 1670 1908 -130400 1538 1522 -130400 1718 1889 -130400 1549 1525 -130420 1538 1717 -130420 1549 1740 -130420 1587 1887 -130420 1599 1512 -130420 1635 1918 -130420 1642 1913 -130420 1642 1819 -130420 1731 1455 -130420 1749 1521 -130420 1794 1880 -130420 1836 1889 -130420 1924 1517 -130420 1455 1465 -130420 1556 1479 -130420 1575 1766 -130420 1579 1829 -130420 1623 1886 -130420 1689 1451 -130420 1718 1479 -130420 1921 1462 -130420 1493 1521 -130420 1819 1913 -130420 1884 1525 -130420 1898 1437 -130420 1657 1769 -130420 1670 1908 -130420 1556 1718 -130420 1538 1522 -130420 1718 1889 -130420 1549 1525 -130440 1550 1704 -130440 1556 1479 -130440 1572 1871 -130440 1574 1740 -130440 1575 1766 -130440 1579 1635 -130440 1579 1829 -130440 1623 1886 -130440 1670 1835 -130440 1689 1451 -130440 1718 1479 -130440 1735 1521 -130440 1735 1493 -130440 1767 1913 -130440 1792 1885 -130440 1825 1525 -130440 1825 1519 -130440 1835 1908 -130440 1836 1521 -130440 1889 1479 -130440 1921 1462 -130440 1493 1521 -130440 1617 1441 -130440 1642 1441 -130440 1819 1913 -130440 1884 1525 -130440 1898 1437 -130440 1617 1642 -130440 1657 1769 -130440 1670 1908 -130440 1884 1519 -130440 1556 1889 -130440 1556 1718 -130440 1538 1522 -130440 1718 1889 -130440 1549 1525 -130460 1545 1582 -130460 1551 1269 -130460 1574 1617 -130460 1574 1819 -130460 1617 1441 -130460 1635 1479 -130460 1642 1441 -130460 1670 1877 -130460 1677 1735 -130460 1717 1842 -130460 1819 1913 -130460 1884 1525 -130460 1898 1437 -130460 1451 1479 -130460 1617 1913 -130460 1617 1642 -130460 1642 1913 -130460 1657 1769 -130460 1670 1908 -130460 1825 1884 -130460 1884 1519 -130460 1556 1889 -130460 1556 1718 -130460 1556 1749 -130460 1538 1522 -130460 1718 1889 -130460 1549 1525 -130480 1550 1451 -130480 1574 1913 -130480 1617 1913 -130480 1617 1642 -130480 1630 1740 -130480 1642 1913 -130480 1749 1433 -130480 1749 1836 -130480 1792 1885 -130480 1835 1458 -130480 1549 1825 -130480 1657 1769 -130480 1670 1908 -130480 1718 1433 -130480 1825 1884 -130480 1825 1525 -130480 1556 1433 -130480 1884 1519 -130480 1889 1433 -130480 1556 1889 -130480 1556 1718 -130480 1574 1441 -130480 1829 1886 -130480 1550 1635 -130480 1556 1749 -130480 1538 1522 -130480 1551 1572 -130480 1718 1889 -130480 1549 1525 -130500 1545 1635 -130500 1545 1550 -130500 1549 1825 -130500 1635 1886 -130500 1657 1769 -130500 1670 1908 -130500 1718 1836 -130500 1718 1749 -130500 1718 1433 -130500 1742 1886 -130500 1819 1913 -130500 1825 1884 -130500 1825 1525 -130500 1884 1525 -130500 1898 1477 -130500 1556 1433 -130500 1825 1519 -130500 1884 1519 -130500 1889 1433 -130500 1556 1889 -130500 1556 1718 -130500 1574 1441 -130500 1829 1886 -130500 1550 1635 -130500 1556 1749 -130500 1538 1522 -130500 1575 1766 -130500 1717 1842 -130500 1551 1572 -130500 1718 1889 -130500 1549 1525 -130520 1545 1451 -130520 1545 1718 -130520 1556 1433 -130520 1572 1871 -130520 1579 1886 -130520 1582 1749 -130520 1717 1752 -130520 1749 1889 -130520 1825 1913 -130520 1825 1519 -130520 1884 1519 -130520 1889 1433 -130520 1556 1889 -130520 1556 1718 -130520 1574 1441 -130520 1718 1451 -130520 1829 1886 -130520 1889 1451 -130520 1550 1635 -130520 1556 1749 -130520 1787 1428 -130520 1538 1522 -130520 1575 1766 -130520 1717 1842 -130520 1749 1836 -130520 1551 1572 -130520 1545 1735 -130520 1556 1451 -130520 1718 1889 -130520 1549 1525 -130540 1545 1556 -130540 1545 1889 -130540 1556 1889 -130540 1556 1836 -130540 1556 1718 -130540 1574 1441 -130540 1579 1922 -130540 1579 1875 -130540 1710 1847 -130540 1711 1834 -130540 1718 1451 -130540 1718 1735 -130540 1735 1451 -130540 1749 1521 -130540 1819 1913 -130540 1829 1886 -130540 1836 1521 -130540 1877 1908 -130540 1889 1451 -130540 1519 1525 -130540 1545 1582 -130540 1550 1635 -130540 1556 1749 -130540 1556 1582 -130540 1582 1735 -130540 1670 1908 -130540 1670 1877 -130540 1787 1428 -130540 1538 1522 -130540 1575 1766 -130540 1717 1842 -130540 1749 1836 -130540 1545 1433 -130540 1551 1572 -130540 1556 1735 -130540 1545 1735 -130540 1556 1451 -130540 1718 1889 -130540 1549 1525 -130560 1545 1836 -130560 1545 1582 -130560 1545 1749 -130560 1550 1635 -130560 1550 1807 -130560 1556 1749 -130560 1556 1582 -130560 1572 1871 -130560 1579 1886 -130560 1582 1433 -130560 1582 1885 -130560 1582 1735 -130560 1625 1635 -130560 1635 1875 -130560 1670 1908 -130560 1670 1877 -130560 1787 1428 -130560 1825 1525 -130560 1545 1430 -130560 1538 1522 -130560 1575 1766 -130560 1717 1842 -130560 1749 1836 -130560 1545 1433 -130560 1551 1572 -130560 1556 1735 -130560 1735 1433 -130560 1545 1735 -130560 1556 1451 -130560 1549 1519 -130560 1718 1889 -130560 1549 1525 -130560 1884 1519 -130580 1545 1430 -130580 1656 1835 -130580 1806 1458 -130580 1538 1522 -130580 1575 1766 -130580 1635 1807 -130580 1717 1842 -130580 1749 1836 -130580 1545 1433 -130580 1545 1556 -130580 1550 1775 -130580 1551 1572 -130580 1556 1735 -130580 1735 1433 -130580 1545 1735 -130580 1556 1451 -130580 1549 1519 -130580 1718 1889 -130580 1519 1525 -130580 1549 1525 -130580 1884 1519 -130600 1538 1522 -130600 1574 1656 -130600 1575 1766 -130600 1582 1713 -130600 1635 1807 -130600 1717 1842 -130600 1735 1451 -130600 1749 1836 -130600 1767 1839 -130600 1839 1444 -130600 1545 1433 -130600 1545 1556 -130600 1549 1825 -130600 1550 1775 -130600 1551 1572 -130600 1556 1735 -130600 1735 1433 -130600 1796 1816 -130600 1816 1823 -130600 1545 1735 -130600 1556 1451 -130600 1721 1816 -130600 1549 1519 -130600 1718 1889 -130600 1519 1525 -130600 1549 1525 -130600 1884 1519 -130620 1545 1433 -130620 1545 1556 -130620 1545 1430 -130620 1549 1825 -130620 1550 1775 -130620 1551 1572 -130620 1556 1735 -130620 1556 1749 -130620 1556 1433 -130620 1574 1441 -130620 1613 1790 -130620 1635 1889 -130620 1656 1441 -130620 1671 1882 -130620 1707 1742 -130620 1735 1433 -130620 1735 1836 -130620 1742 1443 -130620 1749 1451 -130620 1796 1816 -130620 1816 1823 -130620 1458 1517 -130620 1545 1735 -130620 1550 1635 -130620 1556 1521 -130620 1556 1451 -130620 1572 1871 -130620 1721 1816 -130620 1545 1582 -130620 1549 1519 -130620 1718 1889 -130620 1617 1452 -130620 1519 1525 -130620 1549 1525 -130620 1884 1519 -130640 1545 1749 -130640 1545 1735 -130640 1550 1635 -130640 1556 1521 -130640 1556 1451 -130640 1556 1582 -130640 1556 1718 -130640 1569 1908 -130640 1572 1871 -130640 1577 1521 -130640 1582 1451 -130640 1635 1718 -130640 1635 1775 -130640 1645 1889 -130640 1645 1908 -130640 1670 1471 -130640 1707 1908 -130640 1718 1521 -130640 1721 1816 -130640 1735 1521 -130640 1749 1482 -130640 1783 1528 -130640 1825 1884 -130640 1825 1519 -130640 1829 1886 -130640 1913 1458 -130640 1924 1458 -130640 1545 1521 -130640 1545 1582 -130640 1549 1519 -130640 1556 1908 -130640 1657 1769 -130640 1579 1886 -130640 1718 1889 -130640 1617 1452 -130640 1519 1525 -130640 1549 1525 -130640 1884 1519 -130660 1538 1522 -130660 1545 1521 -130660 1545 1582 -130660 1549 1519 -130660 1552 1759 -130660 1556 1908 -130660 1579 1829 -130660 1617 1458 -130660 1623 1707 -130660 1657 1769 -130660 1678 1842 -130660 1718 1908 -130660 1819 1913 -130660 1883 1505 -130660 1884 1525 -130660 1889 1908 -130660 1579 1886 -130660 1718 1889 -130660 1617 1452 -130660 1847 1479 -130660 1519 1525 -130660 1549 1525 -130660 1884 1519 -130680 1539 1880 -130680 1551 1572 -130680 1552 1677 -130680 1556 1749 -130680 1579 1886 -130680 1717 1819 -130680 1718 1889 -130680 1924 1478 -130680 1538 1524 -130680 1617 1452 -130680 1648 1885 -130680 1847 1479 -130680 1519 1525 -130680 1549 1525 -130680 1884 1519 -130700 1538 1524 -130700 1568 1524 -130700 1582 1887 -130700 1593 1694 -130700 1626 1673 -130700 1634 1734 -130700 1670 1908 -130700 1684 1441 -130700 1884 1525 -130700 1617 1452 -130700 1648 1885 -130700 1847 1479 -130700 1519 1525 -130700 1549 1525 -130700 1884 1519 -130700 1657 1769 -130720 1556 1623 -130720 1678 1517 -130720 1884 1525 -130720 1617 1452 -130720 1648 1885 -130720 1847 1479 -130720 1593 1428 -130720 1921 1462 -130720 1519 1525 -130720 1549 1525 -130720 1884 1519 -130720 1657 1769 -130740 1575 1679 -130740 1593 1787 -130740 1617 1452 -130740 1648 1885 -130740 1670 1908 -130740 1787 1428 -130740 1819 1913 -130740 1847 1479 -130740 1918 1437 -130740 1485 1529 -130740 1538 1825 -130740 1593 1428 -130740 1857 1873 -130740 1883 1505 -130740 1921 1462 -130740 1519 1525 -130740 1549 1525 -130740 1718 1889 -130740 1771 1920 -130740 1884 1519 -130740 1657 1769 -130760 1538 1825 -130760 1538 1522 -130760 1538 1630 -130760 1752 1913 -130760 1840 1520 -130760 1441 1452 -130760 1593 1428 -130760 1857 1873 -130760 1883 1505 -130760 1921 1462 -130760 1519 1525 -130760 1549 1525 -130760 1718 1889 -130760 1771 1920 -130760 1884 1519 -130760 1657 1769 -130780 1549 1825 -130780 1575 1679 -130780 1580 1664 -130780 1593 1428 -130780 1634 1734 -130780 1670 1908 -130780 1857 1873 -130780 1883 1505 -130780 1921 1462 -130780 1519 1525 -130780 1549 1525 -130780 1718 1889 -130780 1538 1524 -130780 1771 1920 -130780 1617 1857 -130780 1884 1519 -130780 1657 1769 -130800 1549 1525 -130800 1718 1889 -130800 1538 1524 -130800 1580 1628 -130800 1694 1752 -130800 1771 1920 -130800 1617 1857 -130800 1884 1519 -130800 1551 1572 -130800 1657 1769 -130820 1538 1524 -130820 1570 1582 -130820 1572 1871 -130820 1580 1628 -130820 1694 1752 -130820 1582 1437 -130820 1771 1920 -130820 1617 1857 -130820 1884 1519 -130820 1551 1572 -130820 1657 1769 -130840 1538 1522 -130840 1582 1437 -130840 1628 1463 -130840 1648 1893 -130840 1771 1920 -130840 1841 1901 -130840 1617 1857 -130840 1884 1519 -130840 1551 1572 -130840 1657 1769 -130860 1551 1269 -130860 1617 1857 -130860 1884 1519 -130860 1551 1572 -130860 1657 1769 -130880 1538 1522 -130880 1538 1524 -130880 1634 1491 -130880 1656 1840 -130880 1884 1519 -130880 1522 1524 -130880 1552 1677 -130880 1551 1572 -130880 1628 1463 -130880 1657 1769 -130900 1552 1677 -130900 1551 1572 -130900 1628 1463 -130900 1657 1769 -130920 1538 1522 -130920 1551 1572 -130920 1603 1791 -130920 1689 1858 -130920 1628 1463 -130920 1884 1519 -130920 1538 1524 -130920 1657 1769 -130940 1628 1463 -130940 1884 1519 -130940 1538 1524 -130940 1752 1766 -130940 1847 1479 -130940 1574 1684 -130940 1657 1769 -130960 1538 1524 -130960 1551 1572 -130960 1580 1752 -130960 1660 1692 -130960 1752 1766 -130960 1802 1495 -130960 1847 1479 -130960 1574 1684 -130960 1657 1769 -130960 1617 1857 -130980 1574 1684 -130980 1603 1689 -130980 1657 1769 -130980 1538 1522 -130980 1617 1857 -131000 1537 1626 -131000 1598 1754 -131000 1847 1479 -131000 1538 1522 -131000 1551 1572 -131000 1660 1692 -131000 1617 1857 -131000 1617 1507 -131000 1538 1524 -131020 1538 1522 -131020 1551 1572 -131020 1551 1871 -131020 1552 1582 -131020 1582 1490 -131020 1591 1495 -131020 1592 1752 -131020 1592 1630 -131020 1660 1692 -131020 1694 1441 -131020 1694 1786 -131020 1752 1766 -131020 1617 1857 -131020 1684 1840 -131020 1617 1507 -131020 1657 1769 -131020 1802 1495 -131020 1538 1524 -131040 1549 1786 -131040 1559 1765 -131040 1563 1678 -131040 1563 1694 -131040 1563 1574 -131040 1572 1604 -131040 1587 1887 -131040 1590 1629 -131040 1616 1474 -131040 1617 1857 -131040 1648 1885 -131040 1684 1840 -131040 1713 1871 -131040 1732 1468 -131040 1732 1855 -131040 1743 1808 -131040 1783 1528 -131040 1792 1798 -131040 1847 1479 -131040 1855 1491 -131040 1497 1511 -131040 1616 1906 -131040 1617 1507 -131040 1629 1911 -131040 1657 1769 -131040 1802 1493 -131040 1802 1495 -131040 1582 1493 -131040 1614 1713 -131040 1857 1507 -131040 1500 1511 -131040 1538 1524 -131040 1572 1871 -131060 1564 1761 -131060 1572 1614 -131060 1582 1495 -131060 1590 1596 -131060 1596 1616 -131060 1596 1906 -131060 1596 1914 -131060 1604 1713 -131060 1614 1871 -131060 1616 1906 -131060 1617 1507 -131060 1629 1911 -131060 1652 1761 -131060 1657 1769 -131060 1695 1761 -131060 1701 1761 -131060 1761 1802 -131060 1761 1495 -131060 1802 1493 -131060 1802 1495 -131060 1904 1914 -131060 1563 1522 -131060 1582 1493 -131060 1614 1713 -131060 1677 1701 -131060 1769 1887 -131060 1783 1461 -131060 1857 1507 -131060 1427 1490 -131060 1500 1511 -131060 1538 1524 -131060 1563 1524 -131060 1572 1871 -131060 1660 1692 -131060 1734 1491 -131060 1538 1563 -131080 1551 1652 -131080 1551 1495 -131080 1563 1522 -131080 1582 1802 -131080 1582 1493 -131080 1591 1648 -131080 1614 1713 -131080 1652 1495 -131080 1657 1887 -131080 1677 1701 -131080 1696 1923 -131080 1752 1766 -131080 1769 1887 -131080 1269 1495 -131080 1783 1461 -131080 1802 1862 -131080 1857 1507 -131080 1427 1490 -131080 1500 1511 -131080 1538 1524 -131080 1551 1269 -131080 1563 1524 -131080 1743 1808 -131080 1572 1871 -131080 1660 1692 -131080 1734 1491 -131080 1617 1857 -131080 1538 1563 -131100 1538 1524 -131100 1551 1269 -131100 1563 1524 -131100 1572 1604 -131100 1629 1911 -131100 1634 1734 -131100 1657 1769 -131100 1701 1848 -131100 1713 1848 -131100 1713 1871 -131100 1743 1808 -131100 1792 1885 -131100 1842 1857 -131100 1848 1871 -131100 1461 1528 -131100 1572 1871 -131100 1660 1692 -131100 1734 1491 -131100 1924 1478 -131100 1617 1857 -131100 1538 1563 -131100 1617 1842 -131120 1549 1825 -131120 1549 1563 -131120 1572 1871 -131120 1634 1491 -131120 1660 1692 -131120 1734 1491 -131120 1734 1855 -131120 1752 1766 -131120 1783 1461 -131120 1840 1441 -131120 1924 1478 -131120 1500 1511 -131120 1598 1740 -131120 1617 1857 -131120 1538 1825 -131120 1825 1524 -131120 1593 1521 -131120 1538 1563 -131120 1563 1825 -131120 1617 1842 -131140 1538 1524 -131140 1564 1923 -131140 1598 1740 -131140 1616 1906 -131140 1617 1857 -131140 1634 1734 -131140 1702 1841 -131140 1617 1441 -131140 1538 1825 -131140 1825 1524 -131140 1593 1521 -131140 1857 1441 -131140 1538 1563 -131140 1563 1825 -131140 1743 1808 -131140 1825 1522 -131140 1563 1524 -131140 1617 1842 -131160 1603 1689 -131160 1617 1441 -131160 1734 1491 -131160 1538 1825 -131160 1825 1524 -131160 1572 1871 -131160 1593 1521 -131160 1657 1769 -131160 1857 1441 -131160 1857 1507 -131160 1538 1563 -131160 1563 1825 -131160 1743 1808 -131160 1825 1522 -131160 1563 1524 -131160 1684 1840 -131160 1617 1842 -131180 1538 1825 -131180 1538 1524 -131180 1598 1664 -131180 1599 1882 -131180 1670 1908 -131180 1802 1495 -131180 1825 1524 -131180 1572 1871 -131180 1593 1521 -131180 1657 1769 -131180 1857 1441 -131180 1857 1507 -131180 1924 1478 -131180 1538 1563 -131180 1563 1825 -131180 1743 1808 -131180 1825 1522 -131180 1563 1524 -131180 1684 1840 -131180 1617 1842 -131200 1572 1871 -131200 1593 1521 -131200 1657 1769 -131200 1677 1701 -131200 1734 1491 -131200 1848 1427 -131200 1857 1441 -131200 1857 1507 -131200 1924 1478 -131200 1538 1563 -131200 1563 1825 -131200 1743 1808 -131200 1825 1522 -131200 1563 1524 -131200 1684 1840 -131200 1582 1593 -131200 1617 1842 -131200 1441 1507 -131220 1538 1563 -131220 1563 1825 -131220 1617 1857 -131220 1743 1808 -131220 1802 1495 -131220 1825 1522 -131220 1563 1524 -131220 1684 1840 -131220 1582 1593 -131220 1617 1842 -131220 1441 1507 -131240 1563 1524 -131240 1670 1908 -131240 1678 1766 -131240 1684 1840 -131240 1734 1491 -131240 1752 1766 -131240 1831 1491 -131240 1924 1478 -131240 1582 1593 -131240 1617 1842 -131240 1678 1752 -131240 1538 1524 -131240 1441 1507 -131260 1563 1786 -131260 1582 1593 -131260 1592 1786 -131260 1617 1857 -131260 1617 1842 -131260 1842 1857 -131260 1857 1441 -131260 1500 1511 -131260 1678 1752 -131260 1825 1524 -131260 1538 1825 -131260 1538 1524 -131260 1441 1507 -131280 1924 1478 -131280 1572 1871 -131280 1678 1752 -131280 1563 1592 -131280 1825 1524 -131280 1538 1825 -131280 1538 1524 -131280 1441 1507 -131300 1678 1752 -131300 1563 1592 -131300 1582 1593 -131300 1441 1617 -131300 1840 1857 -131300 1825 1524 -131300 1538 1825 -131300 1538 1524 -131300 1441 1507 -131300 1842 1617 -131320 1840 1857 -131320 1463 1754 -131320 1825 1524 -131320 1538 1825 -131320 1538 1524 -131320 1441 1507 -131320 1842 1617 -131340 1549 1525 -131340 1554 1530 -131340 1582 1593 -131340 1752 1766 -131340 1441 1617 -131340 1825 1524 -131340 1538 1825 -131340 1538 1524 -131340 1441 1507 -131340 1842 1617 -131360 1924 1478 -131360 1441 1617 -131360 1825 1524 -131360 1538 1825 -131360 1538 1524 -131360 1441 1507 -131360 1842 1617 -131380 1689 1603 -131380 1752 1766 -131380 1538 1825 -131380 1538 1524 -131380 1441 1507 -131380 1842 1617 -131400 1538 1825 -131400 1461 1783 -131400 1825 1524 -131400 1538 1524 -131400 1463 1787 -131400 1441 1507 -131400 1842 1617 -131420 1538 1524 -131420 1678 1684 -131420 1884 1825 -131420 1582 1521 -131420 1463 1787 -131420 1441 1617 -131420 1593 1521 -131420 1582 1593 -131420 1441 1507 -131420 1842 1617 -131440 1582 1521 -131440 1478 1524 -131440 1463 1787 -131440 1441 1617 -131440 1593 1521 -131440 1582 1593 -131440 1441 1507 -131440 1842 1617 -131460 1549 1825 -131460 1689 1603 -131460 1463 1787 -131460 1754 1617 -131460 1825 1522 -131460 1825 1519 -131460 1441 1617 -131460 1593 1521 -131460 1582 1593 -131460 1441 1507 -131460 1842 1617 -131480 1538 1924 -131480 1924 1478 -131480 1441 1617 -131480 1441 1842 -131480 1669 1754 -131480 1593 1521 -131480 1582 1593 -131480 1441 1507 -131480 1842 1617 -131500 1669 1754 -131500 1731 1752 -131500 1570 1752 -131500 1593 1521 -131500 1582 1593 -131500 1441 1507 -131500 1842 1617 -131520 1563 1699 -131520 1825 1884 -131520 1884 1580 -131520 1580 1628 -131520 1603 1689 -131520 1582 1593 -131520 1441 1507 -131520 1842 1617 -131540 1669 1754 -131540 1603 1689 -131540 1582 1593 -131540 1808 1743 -131540 1441 1507 -131540 1842 1617 -131560 1582 1593 -131560 1808 1743 -131560 1441 1507 -131560 1842 1617 -131580 1599 1786 -131580 1501 1680 -131580 1593 1521 -131580 1808 1743 -131580 1441 1507 -131580 1842 1617 -131600 1678 1463 -131600 1684 1825 -131600 1593 1521 -131600 1808 1743 -131600 1437 1628 -131600 1441 1507 -131600 1842 1617 -131620 1808 1743 -131620 1437 1628 -131620 1441 1507 -131620 1842 1617 -131640 1437 1628 -131640 1582 1603 -131640 1437 1463 -131640 1463 1628 -131640 1441 1507 -131640 1842 1617 -131660 1699 1592 -131660 1582 1603 -131660 1825 1884 -131660 1580 1463 -131660 1437 1463 -131660 1463 1628 -131660 1441 1507 -131660 1842 1617 -131680 1593 1521 -131680 1580 1463 -131680 1437 1463 -131680 1463 1628 -131680 1441 1507 -131680 1842 1617 -131700 1580 1463 -131700 1437 1463 -131700 1463 1628 -131700 1441 1507 -131700 1842 1617 -131720 1669 1754 -131720 1437 1463 -131720 1808 1743 -131720 1463 1628 -131720 1441 1507 -131720 1842 1617 -131740 1808 1743 -131740 1458 1530 -131740 1463 1628 -131740 1689 1603 -131740 1441 1507 -131740 1842 1617 -131760 1580 1463 -131760 1689 1603 -131760 1441 1507 -131760 1669 1754 -131760 1842 1617 -131780 1689 1603 -131780 1563 1694 -131780 1441 1507 -131780 1669 1754 -131780 1842 1617 -131800 1808 1743 -131800 1563 1694 -131800 1441 1507 -131800 1669 1754 -131800 1593 1787 -131800 1842 1617 -131820 1549 1825 -131820 1437 1628 -131820 1441 1507 -131820 1669 1754 -131820 1593 1787 -131820 1842 1617 -131840 1678 1679 -131840 1594 1475 -131840 1825 1519 -131840 1563 1592 -131840 1669 1754 -131840 1593 1787 -131840 1463 1628 -131840 1842 1617 -131860 1563 1592 -131860 1884 1531 -131860 1669 1754 -131860 1835 1658 -131860 1840 1754 -131860 1593 1787 -131860 1463 1628 -131860 1669 1840 -131860 1842 1617 -131880 1669 1754 -131880 1563 1694 -131880 1835 1658 -131880 1580 1628 -131880 1840 1754 -131880 1593 1787 -131880 1580 1463 -131880 1463 1628 -131880 1669 1840 -131880 1842 1617 -131900 1593 1787 -131900 1580 1463 -131900 1463 1628 -131900 1669 1840 -131900 1842 1617 -131920 1593 1521 -131920 1580 1463 -131920 1463 1628 -131920 1669 1840 -131920 1884 1519 -131920 1842 1617 -131940 1689 1603 -131940 1580 1463 -131940 1463 1628 -131940 1669 1840 -131940 1840 1754 -131940 1825 1884 -131940 1884 1519 -131940 1563 1592 -131940 1842 1617 -131960 1669 1840 -131960 1669 1754 -131960 1678 1593 -131960 1840 1754 -131960 1593 1521 -131960 1825 1884 -131960 1684 1507 -131960 1884 1519 -131960 1825 1519 -131960 1563 1592 -131960 1842 1617 -131980 1684 1507 -131980 1884 1519 -131980 1580 1463 -131980 1463 1825 -131980 1825 1519 -131980 1563 1592 -131980 1463 1628 -131980 1842 1617 -132000 1563 1592 -132000 1825 1884 -132000 1840 1521 -132000 1593 1521 -132000 1463 1628 -132000 1842 1617 -132020 1580 1593 -132020 1463 1521 -132020 1840 1754 -132020 1463 1593 -132020 1463 1628 -132020 1593 1628 -132020 1842 1617 -132040 1884 1519 -132040 1840 1754 -132040 1882 1512 -132040 1592 1563 -132040 1463 1593 -132040 1463 1628 -132040 1593 1628 -132040 1842 1617 -132060 1549 1519 -132060 1882 1512 -132060 1592 1563 -132060 1463 1593 -132060 1463 1628 -132060 1593 1628 -132060 1842 1617 -132080 1628 1521 -132080 1592 1563 -132080 1463 1593 -132080 1463 1628 -132080 1593 1628 -132080 1825 1519 -132080 1842 1617 -132100 1563 1617 -132100 1580 1463 -132100 1592 1563 -132100 1840 1754 -132100 1463 1593 -132100 1463 1628 -132100 1593 1628 -132100 1825 1519 -132100 1842 1617 -132120 1592 1563 -132120 1840 1754 -132120 1463 1593 -132120 1463 1628 -132120 1593 1628 -132120 1825 1519 -132120 1842 1617 -132140 1840 1754 -132140 1463 1593 -132140 1463 1628 -132140 1669 1754 -132140 1593 1628 -132140 1825 1519 -132140 1842 1617 -132160 1563 1592 -132160 1840 1754 -132160 1463 1593 -132160 1463 1628 -132160 1669 1754 -132160 1593 1628 -132160 1825 1519 -132160 1842 1617 -132180 1669 1754 -132180 1840 1857 -132180 1840 1463 -132180 1463 1754 -132180 1857 1463 -132180 1593 1628 -132180 1825 1519 -132180 1842 1617 -132200 1669 1463 -132200 1840 1593 -132200 1857 1463 -132200 1463 1507 -132200 1882 1512 -132200 1563 1592 -132200 1593 1628 -132200 1825 1519 -132200 1692 1660 -132200 1842 1617 -132220 1669 1754 -132220 1563 1592 -132220 1593 1628 -132220 1825 1519 -132220 1692 1660 -132220 1684 1857 -132220 1842 1617 -132240 1549 1525 -132240 1512 1786 -132240 1692 1660 -132240 1684 1857 -132240 1842 1617 -132260 1519 1825 -132260 1463 1628 -132260 1593 1628 -132260 1512 1882 -132260 1692 1660 -132260 1580 1593 -132260 1684 1857 -132260 1842 1617 -132280 1692 1660 -132280 1580 1593 -132280 1684 1857 -132280 1669 1754 -132280 1842 1617 -132300 1549 1600 -132300 1549 1519 -132300 1692 1660 -132300 1825 1600 -132300 1580 1593 -132300 1600 1525 -132300 1684 1857 -132300 1669 1754 -132300 1842 1617 -132320 1684 1857 -132320 1463 1593 -132320 1669 1754 -132320 1842 1617 -132340 1669 1754 -132340 1549 1519 -132340 1692 1660 -132340 1842 1617 -132360 1441 1857 -132360 1441 1524 -132360 1549 1519 -132360 1692 1660 -132360 1842 1617 -132380 1549 1519 -132380 1600 1825 -132380 1549 1600 -132380 1692 1660 -132380 1842 1617 -132400 1600 1825 -132400 1549 1600 -132400 1441 1857 -132400 1692 1660 -132400 1842 1617 -132400 1840 1507 -132420 1549 1600 -132420 1441 1857 -132420 1692 1660 -132420 1825 1531 -132420 1463 1521 -132420 1842 1617 -132420 1840 1507 -132440 1549 1531 -132440 1531 1600 -132440 1463 1521 -132440 1684 1857 -132440 1549 1519 -132440 1842 1617 -132440 1840 1507 -132460 1684 1857 -132460 1549 1519 -132460 1842 1617 -132460 1840 1507 -132480 1692 1531 -132480 1692 1660 -132480 1882 1512 -132480 1549 1519 -132480 1842 1617 -132480 1840 1507 -132500 1924 1600 -132500 1549 1519 -132500 1463 1521 -132500 1840 1522 -132500 1842 1617 -132500 1840 1507 -132520 1684 1857 -132520 1507 1522 -132520 1840 1522 -132520 1842 1617 -132520 1840 1507 -132540 1669 1754 -132540 1479 1847 -132540 1463 1521 -132540 1507 1522 -132540 1549 1519 -132540 1840 1522 -132540 1754 1524 -132540 1842 1617 -132540 1840 1507 -132560 1531 1825 -132560 1463 1787 -132560 1507 1522 -132560 1549 1519 -132560 1840 1522 -132560 1754 1524 -132560 1842 1617 -132560 1840 1507 -132580 1531 1825 -132580 1463 1787 -132580 1599 1512 -132580 1507 1522 -132580 1549 1519 -132580 1840 1522 -132580 1754 1524 -132580 1842 1617 -132580 1840 1507 -132600 1549 1519 -132600 1840 1522 -132600 1754 1524 -132600 1842 1617 -132600 1840 1507 -132620 1507 1522 -132620 1842 1617 -132620 1787 1463 -132620 1840 1507 -132640 1669 1754 -132640 1842 1617 -132640 1787 1463 -132640 1549 1519 -132640 1549 1600 -132640 1840 1507 -132660 1787 1463 -132660 1463 1599 -132660 1549 1825 -132660 1549 1519 -132660 1600 1884 -132660 1600 1519 -132660 1549 1600 -132660 1840 1507 -132680 1840 1522 -132680 1463 1599 -132680 1787 1521 -132680 1507 1522 -132680 1549 1825 -132680 1549 1519 -132680 1825 1600 -132680 1825 1884 -132680 1842 1617 -132680 1600 1884 -132680 1600 1519 -132680 1549 1600 -132680 1840 1507 -132700 1669 1754 -132700 1549 1825 -132700 1549 1519 -132700 1689 1603 -132700 1825 1600 -132700 1825 1884 -132700 1842 1617 -132700 1600 1884 -132700 1600 1519 -132700 1754 1524 -132700 1549 1600 -132700 1840 1507 -132720 1549 1600 -132720 1840 1522 -132720 1463 1786 -132720 1840 1507 -132720 1884 1519 -132720 1531 1512 -132740 1531 1463 -132740 1463 1786 -132740 1669 1754 -132740 1531 1599 -132740 1840 1507 -132740 1754 1524 -132740 1884 1519 -132740 1531 1512 -132760 1669 1754 -132760 1531 1599 -132760 1840 1507 -132760 1754 1524 -132760 1884 1519 -132760 1507 1522 -132760 1842 1617 -132760 1531 1512 -132780 1441 1694 -132780 1684 1740 -132780 1694 1507 -132780 1842 1617 -132780 1531 1512 -132800 1669 1754 -132800 1549 1519 -132800 1531 1512 -132800 1857 1617 -132820 1694 1857 -132820 1842 1617 -132840 1924 1478 -132840 1684 1694 -132840 1842 1617 -132840 1512 1531 -132840 1857 1617 -132840 1425 1557 -132860 1563 1592 -132860 1857 1617 -132860 1884 1519 -132860 1425 1774 -132860 1425 1557 -132880 1669 1754 -132880 1549 1600 -132880 1600 1519 -132880 1884 1519 -132880 1425 1774 -132880 1425 1557 -132900 1549 1525 -132900 1689 1530 -132900 1600 1884 -132900 1463 1825 -132900 1924 1478 -132900 1857 1617 -132900 1425 1774 -132900 1425 1557 -132920 1924 1478 -132920 1554 1689 -132920 1563 1592 -132920 1699 1507 -132920 1884 1519 -132920 1825 1519 -132920 1857 1617 -132920 1425 1774 -132920 1425 1557 -132940 1678 1503 -132940 1825 1519 -132940 1884 1600 -132940 1857 1617 -132940 1425 1774 -132940 1825 1600 -132940 1557 1658 -132940 1658 1425 -132940 1425 1557 -132960 1600 1519 -132960 1478 1524 -132960 1825 1884 -132960 1825 1519 -132960 1884 1600 -132960 1857 1617 -132960 1884 1519 -132960 1425 1774 -132960 1825 1600 -132960 1557 1658 -132960 1658 1425 -132960 1425 1557 -132980 1924 1524 -132980 1825 1884 -132980 1825 1519 -132980 1884 1600 -132980 1679 1575 -132980 1857 1617 -132980 1884 1519 -132980 1425 1774 -132980 1825 1600 -132980 1557 1658 -132980 1658 1425 -132980 1425 1557 -133000 1884 1600 -133000 1679 1575 -133000 1857 1617 -133000 1531 1512 -133000 1884 1519 -133000 1425 1774 -133000 1825 1600 -133000 1557 1658 -133000 1658 1425 -133000 1425 1557 -133020 1549 1825 -133020 1531 1512 -133020 1600 1519 -133020 1884 1519 -133020 1825 1525 -133020 1425 1774 -133020 1825 1600 -133020 1557 1658 -133020 1658 1425 -133020 1658 1903 -133020 1658 1703 -133020 1425 1703 -133020 1557 1703 -133020 1703 1900 -133020 1425 1557 -133020 1425 1903 -133020 1557 1903 -133040 1425 1774 -133040 1519 1825 -133040 1703 1774 -133040 1825 1600 -133040 1557 1658 -133040 1658 1425 -133040 1658 1903 -133040 1658 1900 -133040 1658 1703 -133040 1425 1703 -133040 1557 1703 -133040 1557 1900 -133040 1703 1900 -133040 1703 1903 -133040 1900 1903 -133040 1425 1900 -133040 1425 1557 -133040 1425 1903 -133040 1557 1903 -133060 1549 1825 -133060 1884 1825 -133060 1857 1617 -133060 1603 1791 -133060 1825 1525 -133060 1825 1600 -133060 1557 1658 -133060 1658 1425 -133060 1658 1903 -133060 1658 1900 -133060 1658 1703 -133060 1425 1703 -133060 1557 1703 -133060 1557 1900 -133060 1703 1900 -133060 1703 1903 -133060 1900 1903 -133060 1425 1900 -133060 1425 1557 -133060 1425 1903 -133060 1557 1903 -133080 1554 1580 -133080 1684 1740 -133080 1549 1525 -133080 1825 1600 -133080 1557 1658 -133080 1658 1425 -133080 1658 1903 -133080 1658 1900 -133080 1658 1703 -133080 1425 1703 -133080 1557 1703 -133080 1557 1900 -133080 1703 1900 -133080 1703 1903 -133080 1900 1903 -133080 1425 1900 -133080 1425 1557 -133080 1425 1903 -133080 1557 1903 -133100 1549 1825 -133100 1549 1525 -133100 1549 1463 -133100 1825 1525 -133100 1554 1463 -133100 1825 1600 -133100 1557 1658 -133100 1658 1425 -133100 1658 1903 -133100 1658 1900 -133100 1658 1703 -133100 1425 1703 -133100 1557 1703 -133100 1557 1900 -133100 1703 1900 -133100 1703 1903 -133100 1900 1903 -133100 1425 1900 -133100 1425 1557 -133100 1425 1903 -133100 1557 1903 -133120 1554 1463 -133120 1825 1463 -133120 1825 1600 -133120 1825 1519 -133120 1557 1658 -133120 1658 1425 -133120 1658 1903 -133120 1658 1900 -133120 1658 1703 -133120 1425 1703 -133120 1557 1703 -133120 1557 1900 -133120 1703 1900 -133120 1703 1903 -133120 1900 1903 -133120 1425 1900 -133120 1425 1557 -133120 1425 1903 -133120 1557 1903 -133140 1538 1524 -133140 1825 1884 -133140 1825 1600 -133140 1825 1519 -133140 1557 1658 -133140 1658 1425 -133140 1658 1903 -133140 1658 1900 -133140 1658 1703 -133140 1425 1703 -133140 1557 1703 -133140 1557 1900 -133140 1703 1900 -133140 1703 1903 -133140 1900 1903 -133140 1425 1900 -133140 1425 1557 -133140 1425 1903 -133140 1557 1903 -133160 1825 1600 -133160 1699 1441 -133160 1786 1882 -133160 1580 1463 -133160 1522 1524 -133160 1825 1519 -133160 1557 1658 -133160 1658 1425 -133160 1658 1903 -133160 1658 1900 -133160 1658 1703 -133160 1425 1703 -133160 1557 1703 -133160 1557 1900 -133160 1703 1900 -133160 1703 1903 -133160 1900 1903 -133160 1425 1900 -133160 1425 1557 -133160 1425 1903 -133160 1557 1903 -133180 1580 1463 -133180 1522 1524 -133180 1825 1519 -133180 1557 1658 -133180 1658 1425 -133180 1658 1903 -133180 1658 1900 -133180 1658 1703 -133180 1425 1703 -133180 1557 1703 -133180 1557 1900 -133180 1703 1900 -133180 1703 1903 -133180 1900 1903 -133180 1425 1900 -133180 1425 1557 -133180 1425 1903 -133180 1557 1903 -133200 1554 1592 -133200 1580 1463 -133200 1522 1524 -133200 1825 1884 -133200 1825 1519 -133200 1557 1658 -133200 1658 1425 -133200 1658 1903 -133200 1658 1900 -133200 1658 1703 -133200 1425 1703 -133200 1557 1703 -133200 1557 1900 -133200 1703 1900 -133200 1703 1903 -133200 1900 1903 -133200 1425 1900 -133200 1425 1557 -133200 1425 1903 -133200 1557 1903 -133220 1679 1575 -133220 1463 1754 -133220 1825 1884 -133220 1884 1519 -133220 1825 1519 -133220 1557 1658 -133220 1658 1425 -133220 1658 1903 -133220 1658 1900 -133220 1658 1703 -133220 1425 1703 -133220 1557 1703 -133220 1557 1900 -133220 1703 1900 -133220 1703 1903 -133220 1900 1903 -133220 1425 1900 -133220 1425 1557 -133220 1425 1903 -133220 1557 1903 -133240 1857 1617 -133240 1825 1519 -133240 1825 1600 -133240 1557 1658 -133240 1658 1425 -133240 1658 1903 -133240 1658 1900 -133240 1658 1703 -133240 1425 1703 -133240 1557 1703 -133240 1557 1900 -133240 1703 1900 -133240 1703 1903 -133240 1900 1903 -133240 1425 1900 -133240 1425 1557 -133240 1425 1903 -133240 1557 1903 -133260 1825 1600 -133260 1825 1884 -133260 1557 1658 -133260 1658 1425 -133260 1658 1903 -133260 1658 1900 -133260 1658 1703 -133260 1425 1703 -133260 1557 1703 -133260 1557 1900 -133260 1703 1900 -133260 1703 1903 -133260 1900 1903 -133260 1425 1900 -133260 1425 1557 -133260 1425 1903 -133260 1557 1903 -133280 1903 1774 -133280 1825 1463 -133280 1703 1524 -133280 1679 1575 -133280 1557 1658 -133280 1658 1425 -133280 1658 1903 -133280 1658 1900 -133280 1658 1703 -133280 1425 1703 -133280 1557 1703 -133280 1557 1900 -133280 1703 1900 -133280 1703 1903 -133280 1900 1903 -133280 1425 1900 -133280 1425 1557 -133280 1425 1903 -133280 1557 1903 -133300 1884 1600 -133300 1679 1825 -133300 1679 1575 -133300 1679 1519 -133300 1519 1575 -133300 1557 1658 -133300 1658 1425 -133300 1658 1903 -133300 1658 1900 -133300 1658 1703 -133300 1425 1703 -133300 1557 1703 -133300 1557 1900 -133300 1703 1900 -133300 1703 1903 -133300 1900 1903 -133300 1425 1900 -133300 1425 1557 -133300 1425 1903 -133300 1557 1903 -133320 1679 1575 -133320 1679 1519 -133320 1774 1903 -133320 1519 1575 -133320 1463 1628 -133320 1557 1658 -133320 1658 1425 -133320 1658 1903 -133320 1658 1900 -133320 1658 1703 -133320 1425 1703 -133320 1557 1703 -133320 1557 1900 -133320 1703 1900 -133320 1703 1903 -133320 1900 1903 -133320 1425 1900 -133320 1425 1557 -133320 1425 1903 -133320 1557 1903 -133340 1884 1600 -133340 1519 1575 -133340 1699 1463 -133340 1463 1628 -133340 1557 1658 -133340 1658 1425 -133340 1658 1903 -133340 1658 1900 -133340 1658 1703 -133340 1425 1703 -133340 1557 1703 -133340 1557 1900 -133340 1703 1900 -133340 1703 1903 -133340 1900 1903 -133340 1425 1900 -133340 1425 1557 -133340 1425 1903 -133340 1557 1903 -133360 1903 1774 -133360 1531 1512 -133360 1463 1628 -133360 1557 1658 -133360 1658 1425 -133360 1658 1903 -133360 1658 1900 -133360 1658 1703 -133360 1425 1703 -133360 1557 1703 -133360 1557 1900 -133360 1703 1900 -133360 1703 1903 -133360 1900 1903 -133360 1425 1900 -133360 1425 1557 -133360 1425 1903 -133360 1557 1903 -133380 1546 1516 -133380 1825 1524 -133380 1538 1694 -133380 1840 1857 -133380 1463 1628 -133380 1557 1658 -133380 1658 1425 -133380 1658 1903 -133380 1658 1900 -133380 1658 1703 -133380 1425 1703 -133380 1557 1703 -133380 1557 1900 -133380 1703 1900 -133380 1703 1903 -133380 1900 1903 -133380 1425 1900 -133380 1425 1557 -133380 1425 1903 -133380 1557 1903 -133400 1549 1525 -133400 1774 1903 -133400 1538 1694 -133400 1531 1512 -133400 1538 1524 -133400 1840 1857 -133400 1463 1628 -133400 1557 1658 -133400 1658 1425 -133400 1658 1903 -133400 1658 1900 -133400 1658 1703 -133400 1425 1703 -133400 1557 1703 -133400 1557 1900 -133400 1703 1900 -133400 1703 1903 -133400 1900 1903 -133400 1425 1900 -133400 1425 1557 -133400 1425 1903 -133400 1557 1903 -133420 1538 1694 -133420 1694 1524 -133420 1531 1512 -133420 1538 1524 -133420 1516 1546 -133420 1840 1857 -133420 1463 1628 -133420 1557 1658 -133420 1658 1425 -133420 1658 1903 -133420 1658 1900 -133420 1658 1703 -133420 1425 1703 -133420 1557 1703 -133420 1557 1900 -133420 1703 1900 -133420 1703 1903 -133420 1900 1903 -133420 1425 1900 -133420 1425 1557 -133420 1425 1903 -133420 1557 1903 -133440 1538 1524 -133440 1516 1546 -133440 1840 1857 -133440 1600 1884 -133440 1463 1628 -133440 1557 1658 -133440 1658 1425 -133440 1658 1903 -133440 1658 1900 -133440 1658 1703 -133440 1425 1703 -133440 1557 1703 -133440 1557 1900 -133440 1703 1900 -133440 1703 1903 -133440 1900 1903 -133440 1425 1900 -133440 1425 1557 -133440 1425 1903 -133440 1557 1903 -133460 1463 1628 -133460 1512 1531 -133460 1557 1658 -133460 1658 1425 -133460 1658 1903 -133460 1658 1900 -133460 1658 1703 -133460 1425 1703 -133460 1557 1703 -133460 1557 1900 -133460 1703 1900 -133460 1703 1903 -133460 1900 1903 -133460 1425 1900 -133460 1425 1557 -133460 1425 1903 -133460 1557 1903 -133480 1924 1525 -133480 1512 1531 -133480 1557 1658 -133480 1658 1425 -133480 1658 1903 -133480 1658 1900 -133480 1658 1703 -133480 1425 1703 -133480 1557 1703 -133480 1557 1900 -133480 1703 1900 -133480 1703 1903 -133480 1900 1903 -133480 1425 1900 -133480 1425 1557 -133480 1425 1903 -133480 1557 1903 -133480 1840 1857 -133500 1507 1522 -133500 1557 1658 -133500 1658 1425 -133500 1658 1903 -133500 1658 1900 -133500 1658 1703 -133500 1425 1703 -133500 1557 1703 -133500 1557 1900 -133500 1703 1900 -133500 1703 1903 -133500 1900 1903 -133500 1425 1900 -133500 1425 1557 -133500 1425 1903 -133500 1557 1903 -133500 1840 1857 -133520 1808 1743 -133520 1441 1598 -133520 1463 1628 -133520 1774 1903 -133520 1507 1522 -133520 1538 1524 -133520 1557 1658 -133520 1658 1425 -133520 1658 1903 -133520 1658 1900 -133520 1658 1703 -133520 1425 1703 -133520 1557 1703 -133520 1557 1900 -133520 1703 1900 -133520 1703 1903 -133520 1900 1903 -133520 1425 1900 -133520 1425 1557 -133520 1425 1903 -133520 1557 1903 -133520 1840 1857 -133540 1920 1441 -133540 1847 1479 -133540 1507 1522 -133540 1538 1524 -133540 1557 1658 -133540 1658 1425 -133540 1658 1903 -133540 1658 1900 -133540 1658 1703 -133540 1425 1703 -133540 1557 1703 -133540 1557 1900 -133540 1703 1900 -133540 1703 1903 -133540 1900 1903 -133540 1425 1900 -133540 1425 1557 -133540 1425 1903 -133540 1557 1903 -133540 1840 1857 -133560 1538 1524 -133560 1557 1658 -133560 1600 1519 -133560 1463 1628 -133560 1774 1903 -133560 1658 1425 -133560 1658 1903 -133560 1658 1900 -133560 1658 1703 -133560 1425 1703 -133560 1557 1703 -133560 1557 1900 -133560 1703 1900 -133560 1703 1903 -133560 1900 1903 -133560 1425 1900 -133560 1425 1557 -133560 1425 1903 -133560 1557 1903 -133560 1840 1857 -133580 1658 1425 -133580 1658 1903 -133580 1658 1900 -133580 1658 1703 -133580 1425 1703 -133580 1425 1774 -133580 1557 1703 -133580 1557 1900 -133580 1703 1900 -133580 1703 1903 -133580 1600 1825 -133580 1900 1903 -133580 1425 1900 -133580 1425 1557 -133580 1425 1903 -133580 1557 1903 -133580 1840 1857 -133580 1546 1516 -133580 1559 1580 -133600 1549 1825 -133600 1425 1900 -133600 1425 1557 -133600 1425 1903 -133600 1557 1903 -133600 1840 1857 -133600 1825 1519 -133600 1546 1516 -133600 1559 1580 -133620 1580 1825 -133620 1546 1516 -133620 1538 1524 -133620 1559 1580 -133640 1546 1516 -133640 1538 1524 -133640 1559 1580 -133660 1538 1524 -133660 1684 1522 -133660 1600 1825 -133660 1507 1522 -133660 1559 1580 -133660 1840 1857 -133680 1559 1580 -133680 1840 1857 -133700 1546 1516 -133700 1531 1599 -133700 1559 1580 -133700 1840 1857 -133720 1546 1516 -133720 1580 1628 -133720 1559 1628 -133720 1531 1599 -133720 1559 1580 -133720 1825 1463 -133720 1840 1857 -133740 1663 1818 -133740 1559 1628 -133740 1563 1592 -133740 1857 1825 -133740 1754 1825 -133740 1531 1599 -133740 1559 1580 -133740 1825 1463 -133740 1840 1857 -133760 1808 1743 -133760 1531 1599 -133760 1441 1617 -133760 1580 1463 -133760 1463 1628 -133760 1924 1478 -133760 1559 1580 -133760 1825 1463 -133760 1840 1857 -133780 1924 1478 -133780 1549 1600 -133780 1559 1580 -133780 1507 1522 -133780 1825 1628 -133780 1825 1463 -133780 1599 1512 -133780 1840 1857 -133800 1818 1663 -133800 1437 1603 -133800 1825 1628 -133800 1825 1463 -133800 1563 1592 -133800 1599 1531 -133800 1600 1519 -133800 1599 1512 -133800 1840 1857 -133800 1463 1628 -133820 1563 1592 -133820 1441 1617 -133820 1595 1654 -133820 1599 1531 -133820 1600 1519 -133820 1559 1580 -133820 1599 1512 -133820 1840 1857 -133820 1463 1628 -133820 1549 1825 -133840 1559 1580 -133840 1818 1525 -133840 1599 1512 -133840 1840 1857 -133840 1463 1628 -133840 1808 1743 -133840 1449 1603 -133840 1549 1825 -133840 1924 1848 -133860 1599 1512 -133860 1478 1848 -133860 1840 1857 -133860 1463 1628 -133860 1808 1743 -133860 1449 1603 -133860 1549 1825 -133860 1924 1848 -133880 1546 1431 -133880 1684 1522 -133880 1563 1592 -133880 1840 1857 -133880 1841 1901 -133880 1463 1628 -133880 1808 1743 -133880 1449 1603 -133880 1769 1657 -133880 1549 1825 -133880 1924 1848 -133900 1808 1743 -133900 1449 1603 -133900 1769 1657 -133900 1531 1512 -133900 1549 1825 -133900 1924 1848 -133920 1563 1592 -133920 1449 1603 -133920 1599 1512 -133920 1600 1519 -133920 1769 1657 -133920 1531 1512 -133920 1549 1825 -133920 1924 1848 -133940 1599 1882 -133940 1531 1512 -133940 1531 1599 -133940 1840 1617 -133940 1546 1516 -133940 1549 1825 -133940 1924 1848 -133960 1792 1885 -133960 1808 1743 -133960 1531 1512 -133960 1531 1599 -133960 1840 1617 -133960 1441 1617 -133960 1538 1524 -133960 1841 1901 -133960 1546 1516 -133960 1563 1592 -133960 1549 1825 -133960 1924 1848 -133980 1538 1524 -133980 1841 1901 -133980 1857 1617 -133980 1546 1516 -133980 1563 1592 -133980 1549 1825 -133980 1924 1848 -134000 1546 1516 -134000 1563 1592 -134000 1808 1743 -134000 1549 1825 -134000 1924 1848 -134020 1538 1524 -134020 1463 1754 -134020 1507 1522 -134020 1808 1743 -134020 1792 1885 -134020 1549 1825 -134020 1924 1478 -134020 1669 1754 -134020 1924 1848 -134020 1600 1519 -134040 1563 1592 -134040 1531 1512 -134040 1478 1848 -134040 1769 1657 -134040 1808 1743 -134040 1792 1885 -134040 1549 1825 -134040 1924 1478 -134040 1669 1754 -134040 1924 1848 -134040 1600 1519 -134060 1808 1743 -134060 1841 1901 -134060 1792 1885 -134060 1549 1825 -134060 1538 1524 -134060 1924 1478 -134060 1669 1754 -134060 1924 1848 -134060 1600 1519 -134080 1531 1512 -134080 1792 1885 -134080 1549 1825 -134080 1538 1524 -134080 1924 1478 -134080 1669 1754 -134080 1924 1848 -134080 1600 1519 -134100 1792 1885 -134100 1628 1463 -134100 1549 1825 -134100 1538 1524 -134100 1924 1478 -134100 1669 1754 -134100 1924 1848 -134100 1563 1592 -134100 1600 1519 -134100 1478 1848 -134120 1538 1524 -134120 1924 1478 -134120 1669 1754 -134120 1663 1818 -134120 1924 1848 -134120 1563 1592 -134120 1600 1519 -134120 1478 1848 -134120 1769 1657 -134140 1924 1525 -134140 1663 1818 -134140 1924 1848 -134140 1563 1592 -134140 1531 1512 -134140 1600 1519 -134140 1478 1848 -134140 1769 1657 -134160 1924 1848 -134160 1563 1592 -134160 1694 1617 -134160 1531 1512 -134160 1593 1521 -134160 1600 1519 -134160 1478 1848 -134160 1769 1657 -134160 1669 1754 -134160 1507 1522 -134160 1924 1478 -134180 1669 1754 -134180 1431 1516 -134180 1507 1522 -134180 1549 1825 -134180 1924 1478 -134200 1549 1825 -134200 1512 1531 -134200 1924 1478 -134200 1848 1600 -134200 1563 1592 -134200 1769 1657 -134220 1924 1478 -134220 1694 1617 -134220 1848 1600 -134220 1563 1592 -134220 1920 1483 -134220 1769 1657 -134240 1684 1507 -134240 1848 1600 -134240 1829 1886 -134240 1563 1592 -134240 1600 1519 -134240 1920 1483 -134240 1769 1657 -134260 1530 1608 -134260 1819 1661 -134260 1829 1886 -134260 1512 1531 -134260 1563 1592 -134260 1600 1519 -134260 1920 1483 -134260 1769 1657 -134280 1818 1663 -134280 1847 1768 -134280 1563 1592 -134280 1600 1519 -134280 1920 1483 -134280 1769 1657 -134300 1829 1886 -134300 1507 1522 -134300 1563 1592 -134300 1848 1600 -134300 1537 1443 -134300 1600 1519 -134300 1920 1483 -134300 1769 1657 -134320 1507 1522 -134320 1563 1592 -134320 1848 1600 -134320 1537 1443 -134320 1600 1519 -134320 1920 1483 -134320 1769 1657 -134340 1546 1516 -134340 1563 1592 -134340 1599 1512 -134340 1549 1600 -134340 1559 1580 -134340 1848 1600 -134340 1537 1443 -134340 1600 1519 -134340 1920 1483 -134340 1769 1657 -134360 1549 1600 -134360 1559 1580 -134360 1848 1600 -134360 1537 1443 -134360 1600 1519 -134360 1920 1483 -134360 1769 1657 -134380 1920 1531 -134380 1537 1443 -134380 1443 1580 -134380 1818 1663 -134380 1537 1580 -134380 1600 1519 -134380 1669 1818 -134380 1920 1483 -134380 1563 1592 -134380 1769 1657 -134400 1537 1598 -134400 1924 1478 -134400 1818 1663 -134400 1703 1525 -134400 1592 1786 -134400 1538 1786 -134400 1507 1522 -134400 1537 1580 -134400 1600 1519 -134400 1593 1521 -134400 1669 1818 -134400 1920 1483 -134400 1563 1592 -134400 1769 1657 -134420 1538 1786 -134420 1546 1516 -134420 1703 1603 -134420 1825 1519 -134420 1507 1522 -134420 1537 1580 -134420 1441 1617 -134420 1600 1519 -134420 1549 1825 -134420 1593 1521 -134420 1669 1818 -134420 1920 1483 -134420 1563 1592 -134420 1769 1657 -134440 1537 1580 -134440 1463 1628 -134440 1441 1617 -134440 1600 1519 -134440 1549 1825 -134440 1593 1521 -134440 1669 1818 -134440 1920 1483 -134440 1563 1592 -134440 1769 1657 -134460 1538 1786 -134460 1600 1825 -134460 1825 1519 -134460 1441 1617 -134460 1600 1519 -134460 1549 1825 -134460 1593 1521 -134460 1669 1818 -134460 1920 1483 -134460 1563 1592 -134460 1769 1657 -134480 1441 1617 -134480 1600 1519 -134480 1549 1600 -134480 1549 1825 -134480 1593 1521 -134480 1669 1818 -134480 1920 1483 -134480 1563 1592 -134480 1769 1657 -134500 1538 1699 -134500 1549 1600 -134500 1549 1825 -134500 1689 1806 -134500 1593 1521 -134500 1617 1531 -134500 1669 1818 -134500 1537 1580 -134500 1825 1519 -134500 1600 1825 -134500 1920 1483 -134500 1563 1592 -134500 1769 1657 -134520 1546 1516 -134520 1441 1617 -134520 1669 1818 -134520 1537 1580 -134520 1825 1519 -134520 1600 1825 -134520 1920 1483 -134520 1563 1592 -134520 1769 1657 -134540 1684 1441 -134540 1441 1617 -134540 1669 1818 -134540 1689 1806 -134540 1593 1521 -134540 1537 1580 -134540 1825 1519 -134540 1600 1825 -134540 1920 1483 -134540 1563 1592 -134540 1769 1657 -134560 1669 1818 -134560 1689 1806 -134560 1593 1521 -134560 1595 1654 -134560 1887 1659 -134560 1537 1580 -134560 1463 1628 -134560 1600 1519 -134560 1825 1519 -134560 1600 1825 -134560 1920 1483 -134560 1563 1592 -134560 1769 1657 -134580 1549 1600 -134580 1431 1516 -134580 1531 1443 -134580 1599 1512 -134580 1537 1580 -134580 1818 1754 -134580 1463 1628 -134580 1600 1519 -134580 1825 1519 -134580 1600 1825 -134580 1920 1483 -134580 1924 1887 -134580 1563 1592 -134580 1769 1657 -134600 1537 1580 -134600 1549 1825 -134600 1684 1659 -134600 1818 1754 -134600 1463 1628 -134600 1600 1519 -134600 1478 1887 -134600 1825 1519 -134600 1531 1599 -134600 1600 1825 -134600 1920 1483 -134600 1924 1887 -134600 1563 1592 -134600 1769 1657 -134620 1669 1754 -134620 1463 1628 -134620 1600 1519 -134620 1478 1887 -134620 1825 1519 -134620 1754 1628 -134620 1531 1599 -134620 1600 1825 -134620 1920 1483 -134620 1924 1887 -134620 1563 1592 -134620 1769 1657 -134620 1595 1654 -134640 1689 1806 -134640 1818 1663 -134640 1531 1599 -134640 1600 1825 -134640 1537 1580 -134640 1920 1483 -134640 1924 1887 -134640 1563 1592 -134640 1769 1657 -134640 1595 1654 -134660 1531 1599 -134660 1840 1857 -134660 1848 1887 -134660 1600 1825 -134660 1537 1580 -134660 1825 1519 -134660 1920 1483 -134660 1924 1887 -134660 1563 1592 -134660 1769 1657 -134660 1595 1654 -134680 1694 1441 -134680 1841 1901 -134680 1792 1885 -134680 1600 1825 -134680 1600 1519 -134680 1537 1580 -134680 1825 1519 -134680 1920 1483 -134680 1924 1887 -134680 1563 1592 -134680 1769 1657 -134680 1595 1654 -134700 1669 1754 -134700 1537 1580 -134700 1848 1887 -134700 1825 1519 -134700 1599 1531 -134700 1920 1483 -134700 1924 1887 -134700 1563 1592 -134700 1769 1657 -134700 1595 1654 -134720 1537 1580 -134720 1538 1524 -134720 1924 1478 -134720 1546 1516 -134720 1431 1516 -134720 1437 1787 -134720 1848 1887 -134720 1825 1519 -134720 1599 1531 -134720 1600 1825 -134720 1920 1483 -134720 1924 1887 -134720 1563 1592 -134720 1769 1657 -134720 1595 1654 -134740 1840 1857 -134740 1599 1531 -134740 1628 1914 -134740 1684 1659 -134740 1600 1825 -134740 1920 1483 -134740 1924 1887 -134740 1563 1592 -134740 1769 1657 -134740 1595 1654 -134760 1792 1885 -134760 1537 1580 -134760 1694 1441 -134760 1684 1659 -134760 1600 1825 -134760 1920 1483 -134760 1924 1887 -134760 1563 1592 -134760 1769 1657 -134760 1595 1654 -134780 1475 1628 -134780 1684 1659 -134780 1600 1825 -134780 1920 1483 -134780 1857 1617 -134780 1924 1887 -134780 1563 1592 -134780 1769 1657 -134780 1595 1654 -134800 1920 1483 -134800 1857 1617 -134800 1478 1887 -134800 1924 1887 -134800 1563 1592 -134800 1769 1657 -134800 1595 1654 -134820 1924 1887 -134820 1825 1600 -134820 1825 1848 -134820 1563 1592 -134820 1694 1441 -134820 1769 1657 -134820 1595 1654 -134840 1806 1598 -134840 1600 1890 -134840 1890 1519 -134840 1549 1600 -134840 1563 1592 -134840 1694 1441 -134840 1600 1519 -134840 1857 1617 -134840 1848 1887 -134840 1825 1890 -134840 1669 1754 -134840 1825 1519 -134840 1617 1769 -134840 1617 1657 -134840 1769 1657 -134840 1595 1654 -134860 1538 1524 -134860 1549 1600 -134860 1563 1592 -134860 1694 1441 -134860 1600 1519 -134860 1857 1769 -134860 1857 1657 -134860 1857 1617 -134860 1848 1887 -134860 1825 1890 -134860 1628 1475 -134860 1669 1754 -134860 1825 1519 -134860 1600 1806 -134860 1617 1769 -134860 1617 1657 -134860 1769 1657 -134860 1600 1825 -134860 1595 1654 -134860 1806 1848 -134860 1920 1483 -134880 1549 1890 -134880 1825 1887 -134880 1825 1806 -134880 1628 1475 -134880 1669 1754 -134880 1531 1512 -134880 1825 1519 -134880 1600 1806 -134880 1617 1769 -134880 1617 1657 -134880 1769 1657 -134880 1600 1825 -134880 1595 1654 -134880 1806 1848 -134880 1920 1483 -134900 1669 1754 -134900 1694 1441 -134900 1600 1519 -134900 1531 1512 -134900 1825 1519 -134900 1600 1806 -134900 1617 1769 -134900 1617 1657 -134900 1769 1657 -134900 1600 1825 -134900 1595 1654 -134900 1806 1848 -134900 1920 1483 -134920 1531 1512 -134920 1825 1519 -134920 1600 1806 -134920 1825 1890 -134920 1617 1769 -134920 1617 1657 -134920 1769 1657 -134920 1600 1825 -134920 1924 1887 -134920 1563 1592 -134920 1595 1654 -134920 1806 1848 -134920 1920 1483 -134940 1538 1524 -134940 1924 1478 -134940 1549 1600 -134940 1549 1806 -134940 1825 1848 -134940 1825 1890 -134940 1890 1600 -134940 1890 1848 -134940 1478 1887 -134940 1617 1769 -134940 1617 1657 -134940 1769 1657 -134940 1600 1825 -134940 1924 1887 -134940 1563 1592 -134940 1595 1654 -134940 1806 1848 -134940 1920 1483 -134960 1441 1694 -134960 1839 1740 -134960 1599 1882 -134960 1769 1657 -134960 1600 1825 -134960 1924 1887 -134960 1563 1592 -134960 1595 1654 -134960 1806 1848 -134960 1920 1483 -134980 1478 1887 -134980 1507 1522 -134980 1538 1524 -134980 1600 1825 -134980 1806 1890 -134980 1924 1887 -134980 1563 1592 -134980 1595 1654 -134980 1806 1848 -134980 1920 1483 -135000 1538 1524 -135000 1847 1479 -135000 1848 1890 -135000 1599 1882 -135000 1600 1825 -135000 1806 1890 -135000 1924 1887 -135000 1563 1592 -135000 1769 1657 -135000 1595 1654 -135000 1806 1848 -135000 1920 1483 -135020 1806 1890 -135020 1449 1603 -135020 1825 1519 -135020 1924 1887 -135020 1694 1441 -135020 1563 1592 -135020 1769 1657 -135020 1595 1654 -135020 1806 1848 -135020 1920 1483 -135040 1924 1887 -135040 1669 1754 -135040 1549 1525 -135040 1774 1523 -135040 1694 1441 -135040 1684 1740 -135040 1563 1592 -135040 1769 1657 -135040 1595 1654 -135040 1806 1848 -135040 1920 1483 -135060 1694 1441 -135060 1924 1478 -135060 1538 1524 -135060 1684 1740 -135060 1449 1603 -135060 1563 1592 -135060 1537 1603 -135060 1825 1600 -135060 1769 1657 -135060 1469 1523 -135060 1595 1654 -135060 1806 1848 -135060 1920 1483 -135080 1924 1478 -135080 1669 1754 -135080 1441 1657 -135080 1531 1512 -135080 1642 1643 -135080 1538 1524 -135080 1684 1740 -135080 1449 1603 -135080 1825 1519 -135080 1563 1592 -135080 1537 1603 -135080 1599 1882 -135080 1825 1600 -135080 1769 1657 -135080 1469 1523 -135080 1600 1519 -135080 1595 1654 -135080 1806 1848 -135080 1920 1483 -135100 1538 1524 -135100 1684 1740 -135100 1449 1603 -135100 1847 1768 -135100 1825 1519 -135100 1563 1592 -135100 1479 1847 -135100 1598 1663 -135100 1537 1603 -135100 1599 1882 -135100 1825 1600 -135100 1769 1657 -135100 1469 1523 -135100 1600 1519 -135100 1595 1654 -135100 1806 1848 -135100 1920 1483 -135120 1792 1885 -135120 1920 1617 -135120 1563 1592 -135120 1512 1531 -135120 1479 1847 -135120 1598 1663 -135120 1537 1603 -135120 1599 1882 -135120 1825 1600 -135120 1769 1657 -135120 1469 1523 -135120 1600 1519 -135120 1595 1654 -135120 1806 1848 -135120 1920 1483 -135140 1538 1524 -135140 1479 1847 -135140 1598 1663 -135140 1740 1914 -135140 1537 1603 -135140 1684 1740 -135140 1704 1643 -135140 1599 1882 -135140 1890 1769 -135140 1825 1600 -135140 1890 1657 -135140 1769 1657 -135140 1469 1523 -135140 1600 1519 -135140 1595 1654 -135140 1806 1848 -135140 1920 1483 -135160 1792 1885 -135160 1537 1603 -135160 1441 1617 -135160 1684 1740 -135160 1704 1643 -135160 1599 1882 -135160 1890 1769 -135160 1563 1592 -135160 1825 1600 -135160 1890 1657 -135160 1769 1657 -135160 1469 1523 -135160 1600 1519 -135160 1595 1654 -135160 1806 1848 -135160 1920 1483 -135180 1538 1524 -135180 1563 1592 -135180 1531 1512 -135180 1825 1600 -135180 1711 1479 -135180 1694 1617 -135180 1479 1847 -135180 1890 1657 -135180 1769 1657 -135180 1469 1523 -135180 1600 1519 -135180 1595 1654 -135180 1806 1848 -135180 1920 1483 -135200 1479 1847 -135200 1890 1769 -135200 1890 1657 -135200 1769 1657 -135200 1523 1882 -135200 1684 1914 -135200 1469 1882 -135200 1469 1523 -135200 1600 1519 -135200 1595 1654 -135200 1806 1848 -135200 1920 1483 -135220 1684 1914 -135220 1441 1914 -135220 1507 1524 -135220 1537 1603 -135220 1538 1522 -135220 1924 1478 -135220 1825 1600 -135220 1825 1519 -135220 1538 1524 -135220 1441 1617 -135220 1469 1882 -135220 1469 1523 -135220 1600 1519 -135220 1595 1654 -135220 1512 1531 -135220 1563 1592 -135220 1806 1848 -135220 1920 1483 -135240 1537 1603 -135240 1538 1522 -135240 1924 1478 -135240 1825 1600 -135240 1825 1519 -135240 1848 1890 -135240 1538 1524 -135240 1806 1890 -135240 1441 1617 -135240 1469 1882 -135240 1469 1523 -135240 1600 1519 -135240 1595 1654 -135240 1512 1531 -135240 1563 1592 -135240 1806 1848 -135240 1920 1483 -135260 1538 1524 -135260 1549 1890 -135260 1806 1890 -135260 1441 1617 -135260 1469 1882 -135260 1469 1523 -135260 1600 1519 -135260 1825 1890 -135260 1523 1882 -135260 1595 1654 -135260 1512 1531 -135260 1914 1684 -135260 1563 1592 -135260 1806 1848 -135260 1920 1483 -135280 1549 1825 -135280 1431 1516 -135280 1441 1694 -135280 1848 1890 -135280 1595 1654 -135280 1599 1882 -135280 1512 1531 -135280 1537 1603 -135280 1914 1684 -135280 1563 1592 -135280 1806 1848 -135280 1920 1483 -135300 1920 1625 -135300 1920 1598 -135300 1924 1478 -135300 1818 1663 -135300 1825 1890 -135300 1890 1519 -135300 1512 1531 -135300 1537 1603 -135300 1914 1684 -135300 1563 1592 -135300 1806 1848 -135300 1920 1483 -135320 1538 1522 -135320 1848 1890 -135320 1825 1519 -135320 1806 1890 -135320 1598 1663 -135320 1890 1811 -135320 1593 1521 -135320 1537 1603 -135320 1914 1684 -135320 1563 1592 -135320 1806 1848 -135320 1920 1483 -135320 1806 1811 -135320 1811 1848 -135340 1538 1507 -135340 1806 1890 -135340 1818 1598 -135340 1699 1443 -135340 1598 1663 -135340 1890 1811 -135340 1593 1521 -135340 1537 1603 -135340 1914 1684 -135340 1563 1592 -135340 1806 1848 -135340 1920 1483 -135340 1806 1811 -135340 1811 1848 -135360 1811 1825 -135360 1841 1901 -135360 1593 1521 -135360 1549 1519 -135360 1537 1603 -135360 1538 1524 -135360 1914 1684 -135360 1563 1592 -135360 1806 1848 -135360 1920 1483 -135360 1806 1811 -135360 1811 1848 -135380 1549 1519 -135380 1818 1663 -135380 1598 1663 -135380 1537 1603 -135380 1538 1524 -135380 1914 1684 -135380 1563 1592 -135380 1806 1848 -135380 1920 1483 -135380 1806 1811 -135380 1811 1848 -135400 1537 1603 -135400 1538 1524 -135400 1914 1684 -135400 1608 1530 -135400 1563 1592 -135400 1538 1507 -135400 1507 1524 -135400 1449 1582 -135400 1806 1848 -135400 1920 1483 -135400 1806 1811 -135400 1811 1848 -135420 1549 1519 -135420 1806 1825 -135420 1811 1825 -135420 1825 1848 -135420 1563 1592 -135420 1704 1643 -135420 1538 1507 -135420 1507 1524 -135420 1449 1582 -135420 1806 1848 -135420 1920 1483 -135420 1806 1811 -135420 1811 1848 -135440 1689 1525 -135440 1818 1663 -135440 1563 1592 -135440 1704 1643 -135440 1825 1525 -135440 1538 1507 -135440 1507 1524 -135440 1449 1582 -135440 1806 1848 -135440 1920 1483 -135440 1806 1811 -135440 1811 1848 -135460 1825 1848 -135460 1608 1530 -135460 1538 1507 -135460 1549 1519 -135460 1507 1524 -135460 1449 1582 -135460 1806 1848 -135460 1920 1483 -135460 1806 1811 -135460 1811 1848 -135480 1538 1507 -135480 1549 1519 -135480 1592 1563 -135480 1531 1512 -135480 1818 1663 -135480 1593 1521 -135480 1507 1524 -135480 1449 1582 -135480 1549 1825 -135480 1806 1848 -135480 1920 1483 -135480 1825 1519 -135480 1806 1811 -135480 1811 1848 -135500 1689 1600 -135500 1818 1663 -135500 1593 1521 -135500 1507 1524 -135500 1538 1524 -135500 1449 1582 -135500 1549 1825 -135500 1806 1848 -135500 1920 1483 -135500 1825 1519 -135500 1806 1811 -135500 1811 1848 -135520 1538 1507 -135520 1538 1524 -135520 1449 1582 -135520 1549 1825 -135520 1806 1848 -135520 1531 1512 -135520 1920 1483 -135520 1825 1519 -135520 1563 1592 -135520 1806 1811 -135520 1811 1848 -135540 1835 1598 -135540 1507 1522 -135540 1549 1825 -135540 1806 1848 -135540 1531 1512 -135540 1920 1483 -135540 1825 1519 -135540 1563 1592 -135540 1806 1811 -135540 1811 1848 -135560 1739 1603 -135560 1546 1516 -135560 1818 1663 -135560 1437 1603 -135560 1507 1522 -135560 1752 1766 -135560 1549 1825 -135560 1806 1848 -135560 1808 1848 -135560 1531 1512 -135560 1538 1507 -135560 1689 1835 -135560 1920 1483 -135560 1825 1519 -135560 1563 1592 -135560 1806 1811 -135560 1811 1848 -135580 1546 1431 -135580 1549 1808 -135580 1549 1825 -135580 1549 1806 -135580 1806 1848 -135580 1806 1825 -135580 1808 1848 -135580 1848 1825 -135580 1825 1811 -135580 1531 1512 -135580 1538 1507 -135580 1689 1835 -135580 1920 1483 -135580 1549 1848 -135580 1549 1811 -135580 1825 1519 -135580 1563 1592 -135580 1806 1811 -135580 1811 1848 -135600 1920 1441 -135600 1538 1507 -135600 1538 1524 -135600 1530 1608 -135600 1689 1835 -135600 1443 1603 -135600 1441 1890 -135600 1507 1524 -135600 1510 1919 -135600 1920 1483 -135600 1549 1848 -135600 1549 1811 -135600 1825 1519 -135600 1848 1519 -135600 1563 1592 -135600 1806 1811 -135600 1811 1848 -135620 1920 1483 -135620 1549 1848 -135620 1549 1811 -135620 1549 1806 -135620 1825 1519 -135620 1825 1848 -135620 1848 1519 -135620 1519 1811 -135620 1563 1592 -135620 1806 1811 -135620 1811 1848 -135640 1546 1516 -135640 1549 1559 -135640 1684 1791 -135640 1825 1848 -135640 1598 1628 -135640 1848 1519 -135640 1519 1811 -135640 1663 1818 -135640 1563 1592 -135640 1806 1811 -135640 1811 1848 -135660 1563 1699 -135660 1563 1443 -135660 1663 1818 -135660 1702 1901 -135660 1538 1507 -135660 1563 1592 -135660 1920 1483 -135660 1806 1811 -135660 1811 1848 -135680 1663 1818 -135680 1689 1835 -135680 1702 1901 -135680 1866 1901 -135680 1538 1507 -135680 1563 1592 -135680 1593 1521 -135680 1811 1825 -135680 1825 1848 -135680 1920 1483 -135680 1806 1811 -135680 1811 1848 -135700 1538 1507 -135700 1563 1592 -135700 1848 1890 -135700 1593 1521 -135700 1811 1825 -135700 1825 1848 -135700 1600 1825 -135700 1825 1890 -135700 1920 1483 -135700 1806 1811 -135700 1811 1848 -135720 1563 1592 -135720 1573 1600 -135720 1573 1825 -135720 1573 1684 -135720 1663 1818 -135720 1811 1890 -135720 1821 1841 -135720 1821 1901 -135720 1848 1890 -135720 1593 1521 -135720 1811 1825 -135720 1825 1848 -135720 1600 1825 -135720 1825 1890 -135720 1507 1524 -135720 1920 1483 -135720 1806 1811 -135720 1811 1848 -135740 1546 1516 -135740 1563 1699 -135740 1593 1521 -135740 1600 1848 -135740 1600 1811 -135740 1664 1821 -135740 1806 1825 -135740 1811 1825 -135740 1825 1848 -135740 1600 1825 -135740 1603 1669 -135740 1847 1479 -135740 1825 1890 -135740 1507 1524 -135740 1538 1507 -135740 1628 1740 -135740 1920 1483 -135740 1806 1848 -135740 1806 1811 -135740 1811 1848 -135760 1563 1592 -135760 1600 1825 -135760 1603 1669 -135760 1847 1479 -135760 1848 1890 -135760 1431 1516 -135760 1825 1890 -135760 1507 1524 -135760 1538 1507 -135760 1628 1740 -135760 1920 1483 -135760 1806 1848 -135760 1806 1811 -135760 1811 1848 -135780 1538 1522 -135780 1625 1920 -135780 1825 1890 -135780 1890 1525 -135780 1507 1524 -135780 1512 1531 -135780 1538 1507 -135780 1628 1740 -135780 1920 1483 -135780 1603 1463 -135780 1806 1848 -135780 1806 1811 -135780 1811 1848 -135800 1563 1920 -135800 1664 1698 -135800 1664 1821 -135800 1848 1890 -135800 1507 1524 -135800 1512 1531 -135800 1538 1507 -135800 1628 1740 -135800 1582 1593 -135800 1920 1483 -135800 1603 1463 -135800 1806 1848 -135800 1806 1811 -135800 1811 1848 -135820 1590 1786 -135820 1593 1521 -135820 1669 1437 -135820 1698 1821 -135820 1702 1901 -135820 1920 1441 -135820 1431 1516 -135820 1698 1707 -135820 1538 1507 -135820 1628 1740 -135820 1582 1593 -135820 1920 1483 -135820 1603 1463 -135820 1806 1848 -135820 1806 1811 -135820 1811 1848 -135840 1538 1524 -135840 1698 1707 -135840 1512 1531 -135840 1538 1507 -135840 1507 1524 -135840 1628 1740 -135840 1582 1593 -135840 1920 1483 -135840 1603 1463 -135840 1806 1848 -135840 1806 1811 -135840 1811 1848 -135860 1538 1507 -135860 1507 1524 -135860 1628 1740 -135860 1816 1823 -135860 1848 1890 -135860 1582 1593 -135860 1920 1483 -135860 1603 1463 -135860 1806 1848 -135860 1806 1811 -135860 1811 1848 -135880 1551 1562 -135880 1628 1740 -135880 1663 1818 -135880 1816 1823 -135880 1664 1821 -135880 1806 1890 -135880 1848 1890 -135880 1443 1487 -135880 1582 1593 -135880 1546 1516 -135880 1920 1483 -135880 1603 1463 -135880 1698 1707 -135880 1806 1848 -135880 1806 1811 -135880 1811 1848 -135900 1664 1821 -135900 1806 1890 -135900 1836 1847 -135900 1848 1890 -135900 1443 1487 -135900 1582 1593 -135900 1546 1516 -135900 1570 1731 -135900 1920 1483 -135900 1603 1463 -135900 1698 1707 -135900 1806 1848 -135900 1806 1811 -135900 1811 1848 -135920 1546 1431 -135920 1582 1593 -135920 1593 1521 -135920 1485 1529 -135920 1546 1468 -135920 1663 1818 -135920 1546 1516 -135920 1468 1516 -135920 1570 1731 -135920 1920 1483 -135920 1603 1463 -135920 1698 1707 -135920 1806 1848 -135920 1806 1811 -135920 1811 1848 -135940 1546 1468 -135940 1645 1756 -135940 1663 1818 -135940 1431 1516 -135940 1546 1516 -135940 1562 1443 -135940 1580 1463 -135940 1599 1512 -135940 1628 1740 -135940 1468 1516 -135940 1570 1731 -135940 1920 1483 -135940 1603 1463 -135940 1698 1707 -135940 1806 1848 -135940 1806 1811 -135940 1811 1848 -135960 1546 1516 -135960 1562 1443 -135960 1580 1463 -135960 1599 1512 -135960 1628 1740 -135960 1689 1503 -135960 1752 1766 -135960 1754 1487 -135960 1792 1885 -135960 1468 1516 -135960 1507 1522 -135960 1522 1524 -135960 1541 1699 -135960 1570 1731 -135960 1920 1483 -135960 1603 1463 -135960 1698 1707 -135960 1806 1848 -135960 1806 1811 -135960 1811 1848 -135980 1541 1699 -135980 1570 1731 -135980 1582 1593 -135980 1680 1698 -135980 1816 1882 -135980 1431 1516 -135980 1920 1483 -135980 1603 1463 -135980 1698 1707 -135980 1806 1848 -135980 1806 1811 -135980 1811 1848 -135980 1645 1756 -136000 1580 1740 -136000 1599 1531 -136000 1645 1877 -136000 1663 1818 -136000 1734 1491 -136000 1920 1483 -136000 1603 1463 -136000 1698 1707 -136000 1806 1848 -136000 1806 1811 -136000 1811 1848 -136000 1645 1756 -136020 1563 1673 -136020 1570 1731 -136020 1580 1437 -136020 1663 1818 -136020 1734 1491 -136020 1798 1901 -136020 1920 1483 -136020 1791 1825 -136020 1798 1831 -136020 1603 1463 -136020 1825 1519 -136020 1698 1707 -136020 1600 1756 -136020 1806 1848 -136020 1806 1811 -136020 1811 1848 -136020 1645 1756 -136040 1538 1507 -136040 1560 1924 -136040 1562 1580 -136040 1591 1858 -136040 1599 1882 -136040 1600 1645 -136040 1791 1825 -136040 1798 1831 -136040 1841 1901 -136040 1874 1532 -136040 1431 1516 -136040 1603 1463 -136040 1702 1841 -136040 1562 1443 -136040 1825 1519 -136040 1698 1707 -136040 1600 1756 -136040 1806 1848 -136040 1806 1811 -136040 1811 1848 -136040 1645 1756 -136060 1563 1908 -136060 1580 1684 -136060 1603 1463 -136060 1617 1908 -136060 1702 1841 -136060 1562 1443 -136060 1645 1825 -136060 1756 1825 -136060 1798 1913 -136060 1600 1825 -136060 1825 1519 -136060 1698 1707 -136060 1920 1483 -136060 1600 1756 -136060 1806 1848 -136060 1806 1811 -136060 1811 1848 -136060 1645 1756 -136080 1560 1754 -136080 1560 1443 -136080 1562 1443 -136080 1563 1648 -136080 1645 1825 -136080 1756 1825 -136080 1798 1913 -136080 1560 1580 -136080 1562 1740 -136080 1600 1825 -136080 1740 1443 -136080 1825 1519 -136080 1698 1707 -136080 1600 1645 -136080 1920 1483 -136080 1600 1756 -136080 1806 1848 -136080 1806 1811 -136080 1811 1848 -136080 1645 1756 -136100 1546 1516 -136100 1546 1431 -136100 1560 1580 -136100 1562 1740 -136100 1562 1839 -136100 1580 1831 -136100 1600 1825 -136100 1740 1443 -136100 1754 1840 -136100 1791 1825 -136100 1825 1519 -136100 1593 1521 -136100 1670 1908 -136100 1570 1731 -136100 1522 1524 -136100 1698 1707 -136100 1600 1645 -136100 1920 1483 -136100 1600 1756 -136100 1806 1848 -136100 1806 1811 -136100 1811 1848 -136100 1645 1756 -136120 1580 1913 -136120 1587 1491 -136120 1593 1521 -136120 1670 1908 -136120 1708 1460 -136120 1831 1443 -136120 1570 1731 -136120 1522 1524 -136120 1669 1754 -136120 1698 1707 -136120 1600 1645 -136120 1740 1831 -136120 1920 1483 -136120 1600 1756 -136120 1806 1848 -136120 1806 1811 -136120 1811 1848 -136120 1645 1756 -136140 1538 1522 -136140 1538 1524 -136140 1551 1914 -136140 1551 1591 -136140 1570 1731 -136140 1600 1825 -136140 1707 1491 -136140 1806 1890 -136140 1522 1524 -136140 1591 1818 -136140 1669 1754 -136140 1698 1707 -136140 1600 1645 -136140 1791 1825 -136140 1734 1491 -136140 1740 1831 -136140 1825 1519 -136140 1840 1463 -136140 1920 1483 -136140 1562 1470 -136140 1798 1913 -136140 1600 1756 -136140 1806 1848 -136140 1806 1811 -136140 1811 1848 -136140 1645 1756 -136160 1591 1818 -136160 1645 1825 -136160 1667 1767 -136160 1669 1754 -136160 1698 1707 -136160 1593 1521 -136160 1600 1645 -136160 1756 1825 -136160 1791 1825 -136160 1818 1858 -136160 1512 1531 -136160 1734 1491 -136160 1740 1831 -136160 1825 1519 -136160 1840 1463 -136160 1920 1483 -136160 1562 1470 -136160 1798 1913 -136160 1600 1756 -136160 1806 1848 -136160 1806 1811 -136160 1811 1848 -136160 1645 1756 -136180 1593 1521 -136180 1600 1645 -136180 1603 1913 -136180 1663 1858 -136180 1689 1503 -136180 1702 1901 -136180 1756 1825 -136180 1791 1825 -136180 1818 1858 -136180 1841 1901 -136180 1914 1448 -136180 1512 1531 -136180 1734 1491 -136180 1740 1831 -136180 1825 1519 -136180 1840 1463 -136180 1538 1524 -136180 1920 1483 -136180 1549 1890 -136180 1562 1470 -136180 1798 1913 -136180 1600 1756 -136180 1806 1848 -136180 1806 1811 -136180 1811 1848 -136180 1645 1756 -136200 1546 1468 -136200 1591 1858 -136200 1670 1908 -136200 1707 1911 -136200 1734 1491 -136200 1740 1831 -136200 1792 1885 -136200 1825 1519 -136200 1840 1463 -136200 1507 1522 -136200 1538 1524 -136200 1920 1483 -136200 1549 1890 -136200 1562 1470 -136200 1798 1913 -136200 1600 1756 -136200 1806 1848 -136200 1806 1811 -136200 1811 1848 -136200 1645 1756 -136220 1538 1524 -136220 1603 1463 -136220 1767 1463 -136220 1825 1524 -136220 1920 1483 -136220 1538 1825 -136220 1593 1521 -136220 1694 1857 -136220 1549 1890 -136220 1562 1470 -136220 1507 1524 -136220 1600 1645 -136220 1798 1913 -136220 1600 1756 -136220 1806 1848 -136220 1806 1811 -136220 1811 1848 -136220 1645 1756 -136240 1538 1825 -136240 1538 1522 -136240 1593 1521 -136240 1670 1908 -136240 1694 1857 -136240 1707 1491 -136240 1708 1887 -136240 1914 1448 -136240 1522 1524 -136240 1549 1890 -136240 1562 1470 -136240 1570 1731 -136240 1857 1463 -136240 1507 1522 -136240 1507 1524 -136240 1562 1463 -136240 1600 1645 -136240 1798 1913 -136240 1600 1756 -136240 1806 1848 -136240 1806 1811 -136240 1811 1848 -136240 1645 1756 -136260 1538 1507 -136260 1549 1890 -136260 1562 1470 -136260 1570 1731 -136260 1708 1911 -136260 1857 1913 -136260 1857 1463 -136260 1507 1522 -136260 1507 1524 -136260 1538 1524 -136260 1562 1463 -136260 1582 1863 -136260 1512 1531 -136260 1600 1645 -136260 1798 1913 -136260 1791 1908 -136260 1600 1756 -136260 1806 1848 -136260 1806 1811 -136260 1811 1848 -136260 1645 1756 -136280 1538 1524 -136280 1562 1463 -136280 1582 1863 -136280 1591 1858 -136280 1512 1531 -136280 1600 1645 -136280 1798 1913 -136280 1791 1908 -136280 1670 1908 -136280 1600 1756 -136280 1806 1848 -136280 1806 1811 -136280 1811 1848 -136280 1645 1756 -136300 1551 1448 -136300 1600 1645 -136300 1695 1518 -136300 1798 1913 -136300 1791 1908 -136300 1549 1890 -136300 1857 1441 -136300 1670 1908 -136300 1600 1756 -136300 1806 1848 -136300 1806 1811 -136300 1811 1848 -136300 1645 1756 -136320 1582 1863 -136320 1792 1885 -136320 1798 1913 -136320 1898 1477 -136320 1562 1463 -136320 1791 1908 -136320 1549 1890 -136320 1857 1441 -136320 1670 1908 -136320 1923 1517 -136320 1600 1756 -136320 1806 1848 -136320 1806 1811 -136320 1811 1848 -136320 1645 1756 -136340 1562 1470 -136340 1562 1463 -136340 1642 1874 -136340 1707 1487 -136340 1767 1913 -136340 1767 1798 -136340 1835 1924 -136340 1840 1913 -136340 1791 1908 -136340 1549 1890 -136340 1857 1441 -136340 1670 1908 -136340 1923 1517 -136340 1600 1756 -136340 1806 1848 -136340 1806 1811 -136340 1811 1848 -136340 1645 1756 -136360 1570 1731 -136360 1600 1645 -136360 1628 1835 -136360 1791 1908 -136360 1877 1913 -136360 1792 1885 -136360 1798 1877 -136360 1549 1890 -136360 1582 1863 -136360 1857 1441 -136360 1670 1908 -136360 1923 1517 -136360 1798 1913 -136360 1600 1756 -136360 1806 1848 -136360 1806 1811 -136360 1811 1848 -136360 1645 1756 -136380 1792 1885 -136380 1798 1877 -136380 1911 1487 -136380 1538 1524 -136380 1549 1890 -136380 1582 1863 -136380 1857 1441 -136380 1670 1908 -136380 1923 1517 -136380 1798 1913 -136380 1600 1756 -136380 1689 1825 -136380 1806 1848 -136380 1806 1811 -136380 1811 1848 -136380 1645 1756 -136400 1538 1524 -136400 1549 1890 -136400 1582 1863 -136400 1600 1519 -136400 1695 1518 -136400 1789 1803 -136400 1847 1455 -136400 1570 1731 -136400 1628 1463 -136400 1669 1754 -136400 1857 1441 -136400 1670 1908 -136400 1601 1911 -136400 1923 1517 -136400 1798 1913 -136400 1600 1756 -136400 1689 1825 -136400 1806 1848 -136400 1806 1811 -136400 1811 1848 -136400 1645 1756 -136420 1570 1731 -136420 1628 1463 -136420 1669 1754 -136420 1710 1768 -136420 1857 1441 -136420 1670 1908 -136420 1792 1885 -136420 1601 1911 -136420 1923 1517 -136420 1798 1913 -136420 1600 1756 -136420 1689 1825 -136420 1806 1848 -136420 1806 1811 -136420 1811 1848 -136420 1645 1756 -136440 1582 1863 -136440 1670 1908 -136440 1695 1759 -136440 1768 1847 -136440 1792 1885 -136440 1818 1858 -136440 1600 1645 -136440 1601 1911 -136440 1923 1517 -136440 1798 1913 -136440 1600 1756 -136440 1689 1825 -136440 1562 1759 -136440 1562 1695 -136440 1806 1848 -136440 1806 1811 -136440 1811 1848 -136440 1645 1756 -136460 1628 1840 -136460 1669 1754 -136460 1835 1847 -136460 1890 1525 -136460 1600 1645 -136460 1601 1911 -136460 1570 1731 -136460 1923 1517 -136460 1798 1913 -136460 1600 1756 -136460 1685 1740 -136460 1689 1825 -136460 1562 1759 -136460 1562 1695 -136460 1806 1848 -136460 1806 1811 -136460 1811 1848 -136460 1645 1756 -136480 1538 1524 -136480 1600 1645 -136480 1601 1911 -136480 1617 1441 -136480 1617 1767 -136480 1628 1463 -136480 1684 1840 -136480 1711 1479 -136480 1740 1847 -136480 1765 1487 -136480 1798 1840 -136480 1570 1731 -136480 1771 1923 -136480 1771 1517 -136480 1923 1517 -136480 1798 1913 -136480 1840 1913 -136480 1600 1756 -136480 1685 1740 -136480 1689 1825 -136480 1873 1887 -136480 1562 1759 -136480 1562 1695 -136480 1806 1848 -136480 1806 1811 -136480 1811 1848 -136480 1645 1756 -136500 1570 1731 -136500 1582 1863 -136500 1645 1519 -136500 1669 1754 -136500 1684 1463 -136500 1767 1840 -136500 1771 1923 -136500 1771 1517 -136500 1923 1517 -136500 1798 1913 -136500 1840 1913 -136500 1600 1756 -136500 1600 1519 -136500 1685 1740 -136500 1689 1825 -136500 1873 1887 -136500 1670 1877 -136500 1562 1759 -136500 1562 1695 -136500 1806 1848 -136500 1806 1811 -136500 1811 1848 -136500 1645 1756 -136520 1634 1491 -136520 1711 1740 -136520 1798 1913 -136520 1840 1913 -136520 1876 1882 -136520 1459 1516 -136520 1460 1499 -136520 1600 1756 -136520 1600 1519 -136520 1617 1857 -136520 1685 1740 -136520 1689 1825 -136520 1873 1887 -136520 1877 1908 -136520 1670 1877 -136520 1789 1803 -136520 1562 1759 -136520 1562 1695 -136520 1806 1848 -136520 1806 1811 -136520 1811 1848 -136520 1645 1756 -136540 1570 1731 -136540 1600 1756 -136540 1600 1645 -136540 1600 1519 -136540 1617 1857 -136540 1617 1441 -136540 1628 1684 -136540 1670 1908 -136540 1685 1740 -136540 1689 1825 -136540 1767 1840 -136540 1818 1858 -136540 1873 1887 -136540 1877 1908 -136540 1670 1877 -136540 1789 1803 -136540 1562 1759 -136540 1562 1695 -136540 1601 1911 -136540 1806 1848 -136540 1806 1811 -136540 1811 1848 -136540 1645 1756 -136560 1670 1877 -136560 1684 1767 -136560 1740 1847 -136560 1789 1803 -136560 1831 1460 -136560 1549 1890 -136560 1562 1759 -136560 1628 1908 -136560 1538 1501 -136560 1562 1695 -136560 1601 1911 -136560 1831 1499 -136560 1806 1848 -136560 1806 1811 -136560 1811 1848 -136560 1798 1913 -136560 1645 1756 -136580 1549 1890 -136580 1562 1759 -136580 1617 1767 -136580 1628 1908 -136580 1645 1519 -136580 1685 1740 -136580 1857 1441 -136580 1538 1501 -136580 1600 1756 -136580 1628 1877 -136580 1689 1825 -136580 1549 1825 -136580 1873 1887 -136580 1562 1695 -136580 1601 1911 -136580 1831 1499 -136580 1806 1848 -136580 1806 1811 -136580 1811 1848 -136580 1877 1908 -136580 1798 1913 -136580 1645 1756 -136600 1538 1501 -136600 1546 1516 -136600 1546 1431 -136600 1600 1756 -136600 1625 1920 -136600 1628 1877 -136600 1684 1913 -136600 1689 1825 -136600 1789 1803 -136600 1792 1872 -136600 1549 1825 -136600 1873 1887 -136600 1562 1695 -136600 1601 1911 -136600 1831 1499 -136600 1831 1460 -136600 1806 1848 -136600 1806 1811 -136600 1811 1848 -136600 1877 1908 -136600 1603 1628 -136600 1798 1913 -136600 1645 1756 -136620 1549 1689 -136620 1549 1825 -136620 1603 1908 -136620 1617 1441 -136620 1685 1740 -136620 1767 1857 -136620 1840 1441 -136620 1873 1887 -136620 1877 1463 -136620 1913 1441 -136620 1512 1531 -136620 1562 1695 -136620 1601 1911 -136620 1767 1441 -136620 1831 1499 -136620 1831 1460 -136620 1460 1499 -136620 1603 1463 -136620 1617 1857 -136620 1806 1848 -136620 1806 1811 -136620 1857 1441 -136620 1811 1848 -136620 1877 1908 -136620 1645 1519 -136620 1603 1628 -136620 1798 1913 -136620 1645 1756 -136640 1543 1676 -136640 1562 1695 -136640 1599 1531 -136640 1601 1911 -136640 1617 1913 -136640 1669 1754 -136640 1676 1434 -136640 1767 1840 -136640 1767 1441 -136640 1768 1847 -136640 1831 1499 -136640 1831 1460 -136640 1887 1477 -136640 1894 1513 -136640 1460 1499 -136640 1549 1890 -136640 1603 1463 -136640 1617 1857 -136640 1628 1463 -136640 1670 1908 -136640 1670 1877 -136640 1789 1803 -136640 1806 1848 -136640 1806 1811 -136640 1854 1513 -136640 1857 1441 -136640 1811 1848 -136640 1600 1756 -136640 1877 1908 -136640 1645 1519 -136640 1603 1628 -136640 1798 1913 -136640 1645 1756 -136660 1542 1907 -136660 1549 1890 -136660 1563 1908 -136660 1570 1731 -136660 1603 1463 -136660 1617 1857 -136660 1628 1463 -136660 1670 1908 -136660 1670 1877 -136660 1708 1501 -136660 1789 1803 -136660 1806 1848 -136660 1806 1811 -136660 1854 1513 -136660 1857 1441 -136660 1873 1887 -136660 1431 1516 -136660 1459 1516 -136660 1538 1524 -136660 1600 1519 -136660 1617 1441 -136660 1811 1848 -136660 1600 1756 -136660 1756 1519 -136660 1877 1908 -136660 1645 1519 -136660 1603 1628 -136660 1798 1913 -136660 1645 1756 -136680 1538 1524 -136680 1600 1519 -136680 1601 1894 -136680 1617 1441 -136680 1634 1491 -136680 1676 1434 -136680 1684 1798 -136680 1689 1825 -136680 1768 1521 -136680 1811 1848 -136680 1600 1756 -136680 1601 1911 -136680 1755 1850 -136680 1755 1868 -136680 1850 1868 -136680 1756 1519 -136680 1877 1908 -136680 1645 1519 -136680 1603 1628 -136680 1798 1913 -136680 1645 1756 -136700 1543 1440 -136700 1543 1513 -136700 1600 1756 -136700 1601 1911 -136700 1603 1463 -136700 1613 1835 -136700 1613 1887 -136700 1617 1767 -136700 1698 1707 -136700 1698 1764 -136700 1755 1850 -136700 1755 1868 -136700 1767 1913 -136700 1840 1463 -136700 1850 1868 -136700 1868 1882 -136700 1898 1477 -136700 1449 1531 -136700 1460 1499 -136700 1562 1695 -136700 1669 1754 -136700 1755 1882 -136700 1756 1519 -136700 1789 1803 -136700 1767 1441 -136700 1877 1908 -136700 1645 1519 -136700 1603 1628 -136700 1798 1913 -136700 1538 1501 -136700 1645 1756 -136720 1562 1759 -136720 1562 1695 -136720 1600 1519 -136720 1642 1835 -136720 1645 1890 -136720 1669 1754 -136720 1684 1463 -136720 1755 1882 -136720 1756 1519 -136720 1789 1803 -136720 1894 1516 -136720 1501 1524 -136720 1767 1441 -136720 1767 1840 -136720 1877 1908 -136720 1645 1519 -136720 1890 1519 -136720 1603 1628 -136720 1798 1913 -136720 1538 1501 -136720 1645 1756 -136740 1538 1524 -136740 1570 1731 -136740 1603 1463 -136740 1617 1857 -136740 1628 1463 -136740 1676 1440 -136740 1727 1434 -136740 1767 1441 -136740 1790 1498 -136740 1840 1913 -136740 1840 1857 -136740 1767 1840 -136740 1840 1441 -136740 1877 1908 -136740 1645 1519 -136740 1698 1707 -136740 1890 1519 -136740 1908 1479 -136740 1603 1628 -136740 1798 1913 -136740 1538 1501 -136740 1645 1756 -136760 1562 1759 -136760 1600 1890 -136760 1600 1756 -136760 1601 1911 -136760 1645 1890 -136760 1669 1754 -136760 1676 1740 -136760 1689 1924 -136760 1711 1908 -136760 1756 1890 -136760 1767 1840 -136760 1840 1441 -136760 1877 1908 -136760 1501 1524 -136760 1645 1519 -136760 1698 1707 -136760 1877 1479 -136760 1890 1519 -136760 1600 1519 -136760 1711 1877 -136760 1752 1766 -136760 1756 1519 -136760 1667 1487 -136760 1908 1479 -136760 1603 1628 -136760 1798 1913 -136760 1711 1479 -136760 1538 1501 -136760 1645 1756 -136780 1617 1924 -136780 1645 1519 -136780 1689 1825 -136780 1698 1707 -136780 1711 1920 -136780 1857 1441 -136780 1877 1479 -136780 1890 1519 -136780 1543 1513 -136780 1570 1731 -136780 1600 1519 -136780 1711 1877 -136780 1752 1766 -136780 1756 1519 -136780 1789 1803 -136780 1667 1487 -136780 1908 1479 -136780 1603 1628 -136780 1798 1913 -136780 1711 1479 -136780 1538 1501 -136780 1549 1890 -136780 1645 1756 -136800 1543 1513 -136800 1570 1731 -136800 1600 1825 -136800 1600 1519 -136800 1711 1877 -136800 1752 1766 -136800 1756 1519 -136800 1767 1924 -136800 1789 1803 -136800 1924 1441 -136800 1825 1519 -136800 1667 1505 -136800 1667 1487 -136800 1667 1893 -136800 1487 1505 -136800 1711 1908 -136800 1877 1908 -136800 1908 1479 -136800 1603 1628 -136800 1798 1913 -136800 1711 1479 -136800 1538 1501 -136800 1549 1890 -136800 1645 1756 -136820 1617 1857 -136820 1684 1840 -136820 1684 1767 -136820 1756 1825 -136820 1767 1857 -136820 1825 1519 -136820 1617 1767 -136820 1877 1479 -136820 1887 1477 -136820 1578 1497 -136820 1578 1667 -136820 1667 1505 -136820 1667 1487 -136820 1893 1497 -136820 1487 1497 -136820 1497 1505 -136820 1578 1505 -136820 1667 1893 -136820 1893 1505 -136820 1487 1505 -136820 1578 1893 -136820 1578 1487 -136820 1711 1908 -136820 1877 1908 -136820 1893 1487 -136820 1908 1479 -136820 1603 1628 -136820 1798 1913 -136820 1711 1479 -136820 1538 1501 -136820 1562 1695 -136820 1549 1890 -136820 1645 1756 -136840 1538 1524 -136840 1600 1825 -136840 1617 1441 -136840 1625 1887 -136840 1634 1734 -136840 1667 1512 -136840 1711 1877 -136840 1727 1845 -136840 1767 1441 -136840 1767 1857 -136840 1768 1772 -136840 1825 1519 -136840 1840 1441 -136840 1907 1438 -136840 1505 1512 -136840 1601 1911 -136840 1617 1767 -136840 1877 1479 -136840 1887 1477 -136840 1578 1497 -136840 1578 1667 -136840 1667 1505 -136840 1667 1487 -136840 1893 1497 -136840 1487 1497 -136840 1497 1505 -136840 1578 1505 -136840 1667 1893 -136840 1893 1512 -136840 1893 1505 -136840 1487 1505 -136840 1578 1893 -136840 1578 1487 -136840 1711 1908 -136840 1877 1908 -136840 1893 1487 -136840 1908 1479 -136840 1603 1628 -136840 1798 1913 -136840 1711 1479 -136840 1538 1501 -136840 1562 1695 -136840 1549 1890 -136840 1645 1756 -136860 1578 1446 -136860 1600 1525 -136860 1601 1911 -136860 1617 1767 -136860 1667 1446 -136860 1767 1798 -136860 1767 1913 -136860 1877 1479 -136860 1887 1477 -136860 1446 1505 -136860 1446 1512 -136860 1446 1487 -136860 1446 1497 -136860 1578 1497 -136860 1578 1667 -136860 1667 1505 -136860 1667 1487 -136860 1789 1803 -136860 1893 1497 -136860 1487 1497 -136860 1497 1505 -136860 1578 1505 -136860 1667 1893 -136860 1893 1512 -136860 1893 1505 -136860 1487 1505 -136860 1578 1893 -136860 1578 1487 -136860 1711 1908 -136860 1877 1908 -136860 1893 1487 -136860 1908 1479 -136860 1603 1628 -136860 1798 1913 -136860 1562 1759 -136860 1680 1772 -136860 1711 1479 -136860 1538 1501 -136860 1562 1695 -136860 1549 1890 -136860 1645 1756 -136880 1549 1525 -136880 1563 1696 -136880 1578 1497 -136880 1578 1667 -136880 1667 1505 -136880 1667 1487 -136880 1684 1840 -136880 1789 1803 -136880 1893 1497 -136880 1487 1512 -136880 1487 1497 -136880 1497 1505 -136880 1578 1505 -136880 1667 1893 -136880 1893 1512 -136880 1893 1505 -136880 1487 1505 -136880 1578 1893 -136880 1578 1487 -136880 1711 1908 -136880 1877 1908 -136880 1893 1487 -136880 1908 1479 -136880 1538 1524 -136880 1603 1628 -136880 1798 1913 -136880 1562 1759 -136880 1680 1772 -136880 1711 1877 -136880 1711 1479 -136880 1538 1501 -136880 1562 1695 -136880 1549 1890 -136880 1645 1756 -136900 1563 1648 -136900 1578 1505 -136900 1601 1911 -136900 1667 1893 -136900 1676 1439 -136900 1774 1444 -136900 1857 1441 -136900 1893 1512 -136900 1893 1505 -136900 1487 1505 -136900 1501 1524 -136900 1505 1512 -136900 1578 1893 -136900 1578 1487 -136900 1711 1908 -136900 1877 1908 -136900 1893 1487 -136900 1908 1479 -136900 1617 1857 -136900 1538 1524 -136900 1603 1628 -136900 1798 1913 -136900 1562 1759 -136900 1680 1772 -136900 1669 1754 -136900 1711 1877 -136900 1711 1479 -136900 1538 1501 -136900 1562 1695 -136900 1877 1479 -136900 1549 1890 -136900 1645 1756 -136920 1578 1512 -136920 1578 1893 -136920 1578 1487 -136920 1642 1427 -136920 1684 1840 -136920 1688 1531 -136920 1711 1908 -136920 1877 1908 -136920 1887 1492 -136920 1893 1487 -136920 1907 1438 -136920 1908 1479 -136920 1549 1525 -136920 1617 1857 -136920 1890 1525 -136920 1538 1524 -136920 1603 1628 -136920 1798 1913 -136920 1562 1759 -136920 1680 1772 -136920 1669 1754 -136920 1711 1877 -136920 1711 1479 -136920 1538 1501 -136920 1570 1731 -136920 1908 1920 -136920 1562 1695 -136920 1877 1479 -136920 1549 1890 -136920 1645 1756 -136940 1549 1525 -136940 1617 1857 -136940 1688 1717 -136940 1727 1845 -136940 1890 1525 -136940 1538 1524 -136940 1603 1628 -136940 1684 1857 -136940 1798 1913 -136940 1767 1840 -136940 1501 1524 -136940 1562 1759 -136940 1680 1772 -136940 1669 1754 -136940 1711 1877 -136940 1711 1479 -136940 1538 1501 -136940 1570 1731 -136940 1908 1920 -136940 1562 1695 -136940 1877 1479 -136940 1549 1890 -136940 1645 1756 -136960 1538 1524 -136960 1603 1628 -136960 1617 1441 -136960 1677 1701 -136960 1684 1857 -136960 1688 1877 -136960 1688 1711 -136960 1798 1913 -136960 1887 1427 -136960 1767 1840 -136960 1789 1803 -136960 1501 1524 -136960 1562 1759 -136960 1680 1772 -136960 1669 1754 -136960 1711 1877 -136960 1711 1479 -136960 1538 1501 -136960 1570 1731 -136960 1908 1920 -136960 1562 1695 -136960 1877 1479 -136960 1549 1890 -136960 1645 1756 -136980 1569 1742 -136980 1676 1439 -136980 1689 1805 -136980 1727 1434 -136980 1767 1840 -136980 1617 1857 -136980 1789 1803 -136980 1887 1440 -136980 1501 1524 -136980 1562 1759 -136980 1680 1772 -136980 1669 1754 -136980 1711 1877 -136980 1711 1479 -136980 1538 1501 -136980 1570 1731 -136980 1908 1920 -136980 1562 1695 -136980 1572 1647 -136980 1877 1479 -136980 1549 1890 -136980 1645 1756 -137000 1549 1525 -137000 1617 1857 -137000 1617 1684 -137000 1628 1463 -137000 1659 1717 -137000 1789 1803 -137000 1882 1503 -137000 1887 1440 -137000 1890 1525 -137000 1501 1524 -137000 1562 1759 -137000 1617 1441 -137000 1680 1772 -137000 1664 1821 -137000 1669 1754 -137000 1711 1877 -137000 1711 1479 -137000 1538 1501 -137000 1570 1731 -137000 1908 1920 -137000 1562 1695 -137000 1572 1647 -137000 1877 1479 -137000 1549 1890 -137000 1645 1756 -137020 1562 1752 -137020 1562 1759 -137020 1569 1512 -137020 1569 1626 -137020 1569 1742 -137020 1616 1518 -137020 1617 1441 -137020 1626 1774 -137020 1630 1761 -137020 1680 1772 -137020 1742 1512 -137020 1767 1857 -137020 1664 1821 -137020 1669 1754 -137020 1711 1877 -137020 1711 1479 -137020 1440 1477 -137020 1538 1501 -137020 1570 1731 -137020 1603 1628 -137020 1908 1920 -137020 1798 1913 -137020 1562 1695 -137020 1572 1647 -137020 1877 1479 -137020 1549 1890 -137020 1645 1756 -137040 1543 1550 -137040 1617 1798 -137040 1664 1821 -137040 1669 1754 -137040 1549 1525 -137040 1711 1877 -137040 1711 1479 -137040 1718 1889 -137040 1440 1477 -137040 1538 1501 -137040 1570 1731 -137040 1603 1628 -137040 1501 1524 -137040 1887 1440 -137040 1908 1920 -137040 1798 1913 -137040 1562 1695 -137040 1572 1647 -137040 1877 1479 -137040 1549 1890 -137040 1645 1756 -137060 1540 1542 -137060 1549 1525 -137060 1579 1708 -137060 1642 1790 -137060 1664 1490 -137060 1711 1877 -137060 1711 1479 -137060 1718 1889 -137060 1727 1434 -137060 1731 1874 -137060 1767 1840 -137060 1440 1477 -137060 1538 1501 -137060 1570 1731 -137060 1603 1628 -137060 1684 1840 -137060 1752 1767 -137060 1501 1524 -137060 1887 1440 -137060 1908 1920 -137060 1798 1913 -137060 1680 1772 -137060 1562 1695 -137060 1572 1647 -137060 1877 1479 -137060 1549 1890 -137060 1645 1756 -137080 1538 1524 -137080 1538 1501 -137080 1570 1731 -137080 1603 1628 -137080 1664 1761 -137080 1684 1840 -137080 1695 1759 -137080 1752 1767 -137080 1915 1473 -137080 1562 1759 -137080 1664 1821 -137080 1501 1524 -137080 1887 1440 -137080 1908 1920 -137080 1798 1913 -137080 1680 1772 -137080 1562 1695 -137080 1670 1479 -137080 1572 1647 -137080 1877 1479 -137080 1549 1890 -137080 1645 1756 -137100 1550 1727 -137100 1562 1759 -137100 1664 1821 -137100 1669 1754 -137100 1684 1857 -137100 1756 1825 -137100 1825 1519 -137100 1600 1519 -137100 1708 1760 -137100 1440 1477 -137100 1501 1524 -137100 1670 1877 -137100 1887 1440 -137100 1908 1920 -137100 1727 1434 -137100 1798 1913 -137100 1680 1772 -137100 1562 1695 -137100 1670 1479 -137100 1598 1514 -137100 1572 1647 -137100 1877 1479 -137100 1549 1890 -137100 1645 1756 -137120 1549 1525 -137120 1600 1519 -137120 1617 1441 -137120 1630 1761 -137120 1630 1708 -137120 1706 1708 -137120 1708 1760 -137120 1708 1761 -137120 1752 1913 -137120 1440 1477 -137120 1501 1524 -137120 1603 1628 -137120 1670 1877 -137120 1887 1440 -137120 1890 1525 -137120 1908 1920 -137120 1563 1717 -137120 1727 1434 -137120 1798 1913 -137120 1680 1772 -137120 1600 1825 -137120 1562 1695 -137120 1670 1479 -137120 1598 1514 -137120 1572 1647 -137120 1877 1479 -137120 1549 1890 -137120 1645 1756 -137140 1603 1628 -137140 1617 1752 -137140 1630 1706 -137140 1648 1696 -137140 1670 1877 -137140 1752 1798 -137140 1761 1493 -137140 1789 1803 -137140 1887 1440 -137140 1890 1525 -137140 1908 1920 -137140 1563 1717 -137140 1727 1434 -137140 1798 1913 -137140 1669 1754 -137140 1680 1772 -137140 1600 1825 -137140 1538 1501 -137140 1562 1695 -137140 1670 1479 -137140 1598 1514 -137140 1572 1647 -137140 1877 1479 -137140 1549 1890 -137140 1645 1756 -137160 1562 1759 -137160 1563 1717 -137160 1570 1731 -137160 1727 1434 -137160 1760 1761 -137160 1767 1840 -137160 1798 1913 -137160 1669 1754 -137160 1680 1772 -137160 1802 1495 -137160 1600 1825 -137160 1513 1518 -137160 1538 1501 -137160 1562 1695 -137160 1670 1479 -137160 1598 1514 -137160 1572 1647 -137160 1877 1479 -137160 1549 1890 -137160 1645 1756 -137180 1555 1572 -137180 1603 1628 -137180 1669 1754 -137180 1680 1772 -137180 1802 1495 -137180 1501 1524 -137180 1600 1825 -137180 1670 1877 -137180 1708 1760 -137180 1908 1920 -137180 1513 1518 -137180 1538 1501 -137180 1562 1695 -137180 1670 1479 -137180 1907 1438 -137180 1598 1514 -137180 1761 1493 -137180 1572 1647 -137180 1877 1479 -137180 1549 1890 -137180 1645 1756 -137200 1562 1759 -137200 1600 1825 -137200 1617 1752 -137200 1628 1754 -137200 1634 1734 -137200 1670 1877 -137200 1676 1526 -137200 1708 1760 -137200 1789 1803 -137200 1908 1920 -137200 1513 1518 -137200 1538 1501 -137200 1562 1695 -137200 1600 1519 -137200 1670 1479 -137200 1907 1438 -137200 1598 1514 -137200 1761 1493 -137200 1572 1647 -137200 1877 1479 -137200 1711 1908 -137200 1549 1890 -137200 1645 1756 -137200 1727 1434 -137220 1538 1501 -137220 1562 1695 -137220 1579 1887 -137220 1600 1519 -137220 1664 1821 -137220 1670 1479 -137220 1711 1920 -137220 1749 1807 -137220 1752 1767 -137220 1756 1519 -137220 1821 1455 -137220 1907 1438 -137220 1915 1473 -137220 1598 1514 -137220 1645 1519 -137220 1752 1840 -137220 1752 1766 -137220 1761 1493 -137220 1572 1647 -137220 1798 1913 -137220 1877 1479 -137220 1603 1628 -137220 1711 1908 -137220 1501 1524 -137220 1549 1890 -137220 1645 1756 -137220 1727 1434 -137240 1568 1840 -137240 1568 1441 -137240 1568 1767 -137240 1572 1882 -137240 1598 1514 -137240 1645 1519 -137240 1647 1700 -137240 1647 1882 -137240 1708 1760 -137240 1752 1840 -137240 1752 1766 -137240 1761 1493 -137240 1767 1840 -137240 1789 1803 -137240 1563 1618 -137240 1570 1731 -137240 1572 1647 -137240 1711 1877 -137240 1572 1700 -137240 1700 1882 -137240 1798 1913 -137240 1877 1479 -137240 1600 1645 -137240 1600 1756 -137240 1603 1628 -137240 1711 1908 -137240 1711 1479 -137240 1877 1908 -137240 1501 1524 -137240 1549 1890 -137240 1645 1756 -137240 1908 1479 -137240 1727 1434 -137260 1538 1524 -137260 1562 1759 -137260 1563 1618 -137260 1568 1470 -137260 1570 1731 -137260 1572 1604 -137260 1572 1647 -137260 1604 1700 -137260 1613 1435 -137260 1670 1711 -137260 1711 1877 -137260 1513 1518 -137260 1538 1501 -137260 1572 1700 -137260 1700 1882 -137260 1749 1490 -137260 1798 1913 -137260 1840 1857 -137260 1877 1479 -137260 1887 1440 -137260 1600 1645 -137260 1617 1441 -137260 1670 1908 -137260 1600 1756 -137260 1603 1628 -137260 1680 1772 -137260 1670 1479 -137260 1711 1908 -137260 1711 1479 -137260 1877 1908 -137260 1501 1524 -137260 1549 1890 -137260 1645 1756 -137260 1908 1479 -137260 1727 1434 -137260 1500 1511 -137280 1538 1501 -137280 1572 1700 -137280 1630 1761 -137280 1700 1882 -137280 1749 1490 -137280 1752 1840 -137280 1798 1913 -137280 1840 1857 -137280 1877 1479 -137280 1887 1440 -137280 1600 1645 -137280 1617 1441 -137280 1670 1908 -137280 1600 1756 -137280 1603 1628 -137280 1680 1772 -137280 1598 1514 -137280 1670 1479 -137280 1711 1908 -137280 1711 1479 -137280 1877 1908 -137280 1501 1524 -137280 1562 1470 -137280 1549 1890 -137280 1645 1756 -137280 1908 1479 -137280 1727 1434 -137280 1500 1511 -137300 1570 1731 -137300 1600 1645 -137300 1617 1441 -137300 1670 1908 -137300 1752 1798 -137300 1600 1756 -137300 1603 1628 -137300 1680 1772 -137300 1767 1840 -137300 1598 1514 -137300 1670 1479 -137300 1711 1908 -137300 1711 1479 -137300 1877 1908 -137300 1921 1462 -137300 1501 1524 -137300 1562 1470 -137300 1549 1890 -137300 1645 1756 -137300 1908 1479 -137300 1727 1434 -137300 1500 1511 -137320 1546 1431 -137320 1552 1490 -137320 1562 1798 -137320 1600 1756 -137320 1603 1628 -137320 1617 1766 -137320 1630 1438 -137320 1669 1754 -137320 1670 1711 -137320 1680 1772 -137320 1718 1889 -137320 1718 1847 -137320 1752 1840 -137320 1767 1840 -137320 1538 1501 -137320 1598 1514 -137320 1613 1435 -137320 1670 1479 -137320 1711 1908 -137320 1711 1479 -137320 1752 1766 -137320 1798 1913 -137320 1877 1908 -137320 1921 1462 -137320 1501 1524 -137320 1562 1470 -137320 1549 1890 -137320 1645 1756 -137320 1908 1479 -137320 1727 1434 -137320 1500 1511 -137340 1538 1524 -137340 1538 1501 -137340 1598 1514 -137340 1613 1435 -137340 1617 1840 -137340 1617 1767 -137340 1642 1761 -137340 1670 1908 -137340 1670 1479 -137340 1711 1908 -137340 1711 1479 -137340 1752 1766 -137340 1798 1913 -137340 1877 1908 -137340 1890 1525 -137340 1921 1462 -137340 1501 1524 -137340 1562 1470 -137340 1761 1493 -137340 1430 1531 -137340 1549 1890 -137340 1603 1794 -137340 1617 1684 -137340 1645 1756 -137340 1603 1525 -137340 1908 1479 -137340 1727 1434 -137340 1500 1511 -137360 1562 1470 -137360 1628 1463 -137360 1680 1772 -137360 1761 1493 -137360 1789 1803 -137360 1908 1434 -137360 1430 1531 -137360 1549 1890 -137360 1603 1794 -137360 1617 1857 -137360 1684 1857 -137360 1617 1684 -137360 1645 1756 -137360 1603 1525 -137360 1908 1479 -137360 1600 1756 -137360 1727 1434 -137360 1500 1511 -137360 1917 1500 -137360 1917 1511 -137380 1549 1890 -137380 1574 1471 -137380 1600 1645 -137380 1603 1794 -137380 1603 1756 -137380 1617 1857 -137380 1670 1877 -137380 1684 1857 -137380 1847 1490 -137380 1898 1477 -137380 1907 1438 -137380 1538 1501 -137380 1549 1645 -137380 1617 1684 -137380 1645 1756 -137380 1921 1462 -137380 1574 1791 -137380 1656 1825 -137380 1677 1701 -137380 1603 1525 -137380 1908 1479 -137380 1570 1731 -137380 1598 1514 -137380 1549 1600 -137380 1549 1756 -137380 1600 1756 -137380 1727 1434 -137380 1500 1511 -137380 1917 1500 -137380 1917 1511 -137400 1538 1524 -137400 1538 1501 -137400 1549 1645 -137400 1617 1684 -137400 1645 1756 -137400 1921 1462 -137400 1501 1524 -137400 1545 1531 -137400 1574 1791 -137400 1628 1857 -137400 1656 1825 -137400 1677 1701 -137400 1603 1525 -137400 1628 1684 -137400 1430 1531 -137400 1449 1531 -137400 1669 1754 -137400 1689 1458 -137400 1789 1803 -137400 1798 1913 -137400 1908 1479 -137400 1680 1772 -137400 1570 1731 -137400 1598 1514 -137400 1549 1600 -137400 1549 1756 -137400 1600 1756 -137400 1727 1434 -137400 1500 1511 -137400 1917 1500 -137400 1917 1511 -137420 1545 1531 -137420 1574 1713 -137420 1574 1791 -137420 1603 1825 -137420 1628 1857 -137420 1656 1825 -137420 1677 1701 -137420 1684 1857 -137420 1774 1471 -137420 1887 1440 -137420 1563 1592 -137420 1603 1525 -137420 1628 1684 -137420 1430 1531 -137420 1449 1531 -137420 1669 1754 -137420 1689 1458 -137420 1718 1889 -137420 1789 1803 -137420 1630 1761 -137420 1798 1913 -137420 1908 1479 -137420 1680 1772 -137420 1570 1731 -137420 1598 1514 -137420 1549 1600 -137420 1549 1756 -137420 1600 1756 -137420 1727 1434 -137420 1911 1500 -137420 1500 1511 -137420 1911 1511 -137420 1917 1500 -137420 1917 1511 -137420 1911 1917 -137440 1546 1461 -137440 1563 1592 -137440 1603 1525 -137440 1628 1684 -137440 1695 1759 -137440 1708 1760 -137440 1752 1766 -137440 1430 1531 -137440 1449 1531 -137440 1669 1754 -137440 1670 1877 -137440 1689 1458 -137440 1718 1889 -137440 1789 1803 -137440 1825 1830 -137440 1630 1761 -137440 1798 1913 -137440 1908 1479 -137440 1921 1462 -137440 1680 1772 -137440 1570 1731 -137440 1598 1514 -137440 1756 1890 -137440 1549 1600 -137440 1549 1756 -137440 1600 1756 -137440 1727 1434 -137440 1911 1500 -137440 1500 1511 -137440 1911 1511 -137440 1917 1500 -137440 1917 1511 -137440 1649 1917 -137440 1911 1917 -137460 1669 1754 -137460 1670 1877 -137460 1677 1462 -137460 1689 1458 -137460 1718 1889 -137460 1789 1803 -137460 1825 1830 -137460 1907 1438 -137460 1630 1761 -137460 1798 1913 -137460 1908 1479 -137460 1921 1462 -137460 1680 1772 -137460 1570 1731 -137460 1598 1514 -137460 1600 1890 -137460 1549 1890 -137460 1756 1890 -137460 1549 1600 -137460 1549 1756 -137460 1600 1756 -137460 1727 1434 -137460 1649 1500 -137460 1911 1500 -137460 1500 1511 -137460 1649 1511 -137460 1911 1511 -137460 1917 1500 -137460 1917 1511 -137460 1649 1917 -137460 1649 1911 -137460 1911 1917 -137480 1539 1434 -137480 1600 1645 -137480 1617 1752 -137480 1630 1761 -137480 1684 1913 -137480 1713 1512 -137480 1713 1471 -137480 1718 1768 -137480 1798 1913 -137480 1908 1479 -137480 1921 1462 -137480 1430 1531 -137480 1449 1521 -137480 1501 1524 -137480 1680 1772 -137480 1752 1766 -137480 1562 1449 -137480 1563 1592 -137480 1562 1521 -137480 1570 1731 -137480 1598 1514 -137480 1645 1756 -137480 1600 1890 -137480 1549 1890 -137480 1550 1794 -137480 1756 1890 -137480 1549 1600 -137480 1549 1756 -137480 1600 1756 -137480 1727 1434 -137480 1649 1500 -137480 1911 1500 -137480 1500 1511 -137480 1649 1511 -137480 1911 1511 -137480 1917 1500 -137480 1917 1511 -137480 1649 1917 -137480 1649 1911 -137480 1911 1917 -137500 1617 1913 -137500 1680 1772 -137500 1695 1759 -137500 1752 1766 -137500 1887 1440 -137500 1562 1449 -137500 1563 1592 -137500 1562 1521 -137500 1570 1731 -137500 1598 1514 -137500 1645 1756 -137500 1789 1803 -137500 1600 1890 -137500 1689 1458 -137500 1549 1890 -137500 1550 1794 -137500 1756 1890 -137500 1549 1600 -137500 1549 1756 -137500 1600 1756 -137500 1727 1434 -137500 1649 1500 -137500 1911 1500 -137500 1500 1511 -137500 1649 1511 -137500 1911 1511 -137500 1917 1500 -137500 1917 1511 -137500 1649 1917 -137500 1649 1911 -137500 1911 1917 -137520 1562 1449 -137520 1563 1592 -137520 1600 1645 -137520 1630 1493 -137520 1670 1527 -137520 1805 1512 -137520 1921 1462 -137520 1449 1521 -137520 1562 1521 -137520 1570 1731 -137520 1598 1514 -137520 1645 1756 -137520 1789 1803 -137520 1550 1603 -137520 1600 1890 -137520 1617 1857 -137520 1689 1458 -137520 1908 1479 -137520 1617 1441 -137520 1430 1531 -137520 1549 1890 -137520 1550 1794 -137520 1756 1890 -137520 1549 1600 -137520 1549 1756 -137520 1600 1756 -137520 1727 1434 -137520 1649 1500 -137520 1911 1500 -137520 1500 1511 -137520 1649 1511 -137520 1911 1511 -137520 1917 1500 -137520 1917 1511 -137520 1649 1917 -137520 1649 1911 -137520 1911 1917 -137540 1550 1527 -137540 1562 1521 -137540 1570 1731 -137540 1574 1531 -137540 1598 1514 -137540 1645 1756 -137540 1756 1525 -137540 1789 1803 -137540 1825 1830 -137540 1550 1603 -137540 1600 1890 -137540 1603 1695 -137540 1798 1913 -137540 1617 1857 -137540 1689 1458 -137540 1908 1479 -137540 1550 1695 -137540 1617 1441 -137540 1430 1531 -137540 1549 1890 -137540 1550 1794 -137540 1756 1890 -137540 1545 1531 -137540 1549 1600 -137540 1549 1756 -137540 1600 1756 -137540 1857 1441 -137540 1727 1434 -137540 1649 1500 -137540 1911 1500 -137540 1500 1511 -137540 1649 1511 -137540 1911 1511 -137540 1917 1500 -137540 1917 1511 -137540 1649 1917 -137540 1649 1911 -137540 1911 1917 -137560 1546 1459 -137560 1550 1603 -137560 1600 1890 -137560 1603 1794 -137560 1603 1695 -137560 1670 1434 -137560 1798 1913 -137560 1915 1473 -137560 1617 1857 -137560 1670 1825 -137560 1670 1711 -137560 1689 1458 -137560 1908 1479 -137560 1550 1695 -137560 1600 1645 -137560 1603 1752 -137560 1603 1766 -137560 1617 1441 -137560 1430 1531 -137560 1549 1890 -137560 1550 1794 -137560 1711 1825 -137560 1756 1890 -137560 1545 1531 -137560 1549 1600 -137560 1549 1756 -137560 1600 1756 -137560 1857 1441 -137560 1680 1772 -137560 1727 1434 -137560 1649 1500 -137560 1911 1500 -137560 1500 1511 -137560 1649 1511 -137560 1911 1511 -137560 1917 1500 -137560 1917 1511 -137560 1649 1917 -137560 1649 1911 -137560 1911 1917 -137580 1550 1527 -137580 1598 1514 -137580 1617 1857 -137580 1669 1754 -137580 1670 1825 -137580 1670 1711 -137580 1689 1458 -137580 1825 1434 -137580 1908 1479 -137580 1550 1695 -137580 1600 1645 -137580 1603 1752 -137580 1603 1766 -137580 1617 1441 -137580 1645 1756 -137580 1907 1438 -137580 1430 1531 -137580 1549 1890 -137580 1550 1794 -137580 1562 1449 -137580 1562 1521 -137580 1711 1825 -137580 1752 1766 -137580 1756 1890 -137580 1545 1531 -137580 1549 1600 -137580 1549 1756 -137580 1600 1756 -137580 1562 1574 -137580 1857 1441 -137580 1680 1772 -137580 1727 1434 -137580 1649 1500 -137580 1911 1500 -137580 1500 1511 -137580 1649 1511 -137580 1911 1511 -137580 1917 1500 -137580 1917 1511 -137580 1649 1917 -137580 1649 1911 -137580 1911 1917 -137600 1550 1695 -137600 1600 1645 -137600 1603 1752 -137600 1603 1766 -137600 1617 1441 -137600 1645 1756 -137600 1752 1514 -137600 1890 1525 -137600 1894 1491 -137600 1894 1516 -137600 1907 1438 -137600 1915 1473 -137600 1430 1531 -137600 1549 1890 -137600 1550 1794 -137600 1562 1449 -137600 1562 1521 -137600 1574 1449 -137600 1574 1521 -137600 1711 1825 -137600 1630 1493 -137600 1752 1766 -137600 1756 1890 -137600 1570 1731 -137600 1798 1913 -137600 1545 1531 -137600 1549 1600 -137600 1549 1756 -137600 1600 1756 -137600 1630 1761 -137600 1562 1574 -137600 1857 1441 -137600 1680 1772 -137600 1727 1434 -137600 1649 1500 -137600 1911 1500 -137600 1500 1511 -137600 1649 1511 -137600 1911 1511 -137600 1917 1500 -137600 1917 1511 -137600 1649 1917 -137600 1649 1911 -137600 1911 1917 -137620 1549 1890 -137620 1550 1794 -137620 1562 1449 -137620 1562 1521 -137620 1574 1449 -137620 1574 1521 -137620 1689 1458 -137620 1711 1825 -137620 1756 1825 -137620 1630 1493 -137620 1711 1890 -137620 1752 1766 -137620 1756 1890 -137620 1550 1527 -137620 1570 1731 -137620 1798 1913 -137620 1545 1531 -137620 1549 1600 -137620 1549 1756 -137620 1600 1756 -137620 1630 1761 -137620 1825 1890 -137620 1562 1574 -137620 1857 1441 -137620 1680 1772 -137620 1727 1434 -137620 1649 1500 -137620 1911 1500 -137620 1500 1511 -137620 1649 1511 -137620 1911 1511 -137620 1917 1500 -137620 1917 1511 -137620 1649 1917 -137620 1649 1911 -137620 1911 1917 -137640 1546 1434 -137640 1563 1592 -137640 1630 1493 -137640 1645 1756 -137640 1711 1890 -137640 1752 1766 -137640 1756 1890 -137640 1756 1525 -137640 1825 1434 -137640 1890 1525 -137640 1920 1434 -137640 1538 1501 -137640 1545 1430 -137640 1550 1527 -137640 1570 1731 -137640 1593 1441 -137640 1789 1803 -137640 1798 1913 -137640 1545 1531 -137640 1549 1600 -137640 1549 1756 -137640 1549 1645 -137640 1593 1617 -137640 1600 1756 -137640 1600 1645 -137640 1630 1761 -137640 1688 1854 -137640 1825 1890 -137640 1430 1531 -137640 1562 1574 -137640 1857 1441 -137640 1680 1772 -137640 1727 1434 -137640 1649 1500 -137640 1911 1500 -137640 1500 1511 -137640 1649 1511 -137640 1911 1511 -137640 1917 1500 -137640 1917 1511 -137640 1649 1917 -137640 1649 1911 -137640 1911 1917 -137640 1550 1603 -137660 1538 1501 -137660 1545 1430 -137660 1546 1890 -137660 1550 1527 -137660 1570 1731 -137660 1574 1521 -137660 1593 1441 -137660 1603 1794 -137660 1754 1840 -137660 1789 1803 -137660 1798 1913 -137660 1501 1524 -137660 1545 1531 -137660 1549 1600 -137660 1549 1756 -137660 1549 1645 -137660 1593 1617 -137660 1600 1756 -137660 1600 1645 -137660 1630 1761 -137660 1688 1854 -137660 1825 1890 -137660 1689 1458 -137660 1727 1890 -137660 1430 1531 -137660 1562 1574 -137660 1857 1441 -137660 1550 1794 -137660 1680 1772 -137660 1727 1434 -137660 1649 1500 -137660 1911 1500 -137660 1500 1511 -137660 1649 1511 -137660 1911 1511 -137660 1917 1500 -137660 1917 1511 -137660 1649 1917 -137660 1649 1911 -137660 1911 1917 -137660 1550 1603 -137680 1545 1531 -137680 1549 1600 -137680 1549 1756 -137680 1549 1645 -137680 1593 1617 -137680 1600 1756 -137680 1600 1645 -137680 1630 1761 -137680 1688 1854 -137680 1752 1766 -137680 1756 1525 -137680 1825 1890 -137680 1825 1525 -137680 1550 1695 -137680 1591 1858 -137680 1603 1695 -137680 1645 1756 -137680 1689 1458 -137680 1727 1890 -137680 1890 1525 -137680 1430 1531 -137680 1562 1574 -137680 1857 1441 -137680 1550 1794 -137680 1680 1772 -137680 1727 1434 -137680 1649 1500 -137680 1911 1500 -137680 1500 1511 -137680 1649 1511 -137680 1911 1511 -137680 1917 1500 -137680 1917 1511 -137680 1649 1917 -137680 1649 1911 -137680 1911 1917 -137680 1550 1603 -137700 1538 1501 -137700 1550 1695 -137700 1591 1858 -137700 1593 1441 -137700 1600 1825 -137700 1603 1695 -137700 1645 1756 -137700 1689 1458 -137700 1727 1890 -137700 1789 1803 -137700 1890 1434 -137700 1890 1525 -137700 1913 1441 -137700 1920 1525 -137700 1430 1531 -137700 1562 1574 -137700 1857 1441 -137700 1550 1794 -137700 1562 1521 -137700 1680 1772 -137700 1718 1889 -137700 1727 1434 -137700 1798 1913 -137700 1649 1500 -137700 1911 1500 -137700 1500 1511 -137700 1649 1511 -137700 1911 1511 -137700 1917 1500 -137700 1917 1511 -137700 1649 1917 -137700 1649 1911 -137700 1911 1917 -137700 1549 1525 -137700 1550 1603 -137720 1546 1459 -137720 1550 1527 -137720 1562 1574 -137720 1574 1521 -137720 1727 1825 -137720 1857 1441 -137720 1550 1794 -137720 1562 1521 -137720 1603 1794 -137720 1688 1854 -137720 1924 1478 -137720 1630 1493 -137720 1684 1470 -137720 1630 1761 -137720 1680 1772 -137720 1718 1889 -137720 1825 1890 -137720 1727 1434 -137720 1570 1731 -137720 1798 1913 -137720 1649 1500 -137720 1911 1500 -137720 1500 1511 -137720 1649 1511 -137720 1911 1511 -137720 1917 1500 -137720 1917 1511 -137720 1649 1917 -137720 1649 1911 -137720 1908 1479 -137720 1911 1917 -137720 1549 1525 -137720 1550 1603 -137740 1550 1794 -137740 1562 1521 -137740 1591 1858 -137740 1603 1794 -137740 1634 1734 -137740 1688 1854 -137740 1732 1471 -137740 1752 1766 -137740 1792 1885 -137740 1907 1438 -137740 1924 1458 -137740 1924 1478 -137740 1630 1493 -137740 1684 1470 -137740 1630 1761 -137740 1680 1772 -137740 1684 1857 -137740 1718 1889 -137740 1825 1890 -137740 1727 1434 -137740 1570 1731 -137740 1798 1913 -137740 1857 1470 -137740 1649 1500 -137740 1911 1500 -137740 1500 1511 -137740 1649 1511 -137740 1911 1511 -137740 1917 1500 -137740 1917 1511 -137740 1649 1917 -137740 1649 1911 -137740 1908 1479 -137740 1911 1917 -137740 1549 1525 -137740 1550 1603 -137760 1600 1890 -137760 1628 1857 -137760 1630 1493 -137760 1684 1470 -137760 1825 1830 -137760 1894 1516 -137760 1630 1761 -137760 1680 1772 -137760 1684 1857 -137760 1718 1889 -137760 1727 1882 -137760 1789 1803 -137760 1825 1890 -137760 1915 1473 -137760 1727 1434 -137760 1882 1434 -137760 1570 1731 -137760 1798 1913 -137760 1857 1470 -137760 1649 1500 -137760 1911 1500 -137760 1500 1511 -137760 1649 1511 -137760 1911 1511 -137760 1917 1500 -137760 1917 1511 -137760 1649 1917 -137760 1649 1911 -137760 1908 1479 -137760 1911 1917 -137760 1549 1525 -137760 1550 1603 -137780 1630 1761 -137780 1680 1772 -137780 1684 1857 -137780 1718 1889 -137780 1727 1882 -137780 1789 1803 -137780 1825 1890 -137780 1913 1441 -137780 1915 1473 -137780 1727 1434 -137780 1882 1434 -137780 1570 1731 -137780 1798 1913 -137780 1857 1470 -137780 1649 1500 -137780 1911 1500 -137780 1500 1511 -137780 1649 1511 -137780 1890 1525 -137780 1911 1511 -137780 1917 1500 -137780 1917 1511 -137780 1649 1917 -137780 1649 1911 -137780 1908 1479 -137780 1911 1917 -137780 1550 1794 -137780 1549 1525 -137780 1550 1603 -137800 1599 1428 -137800 1599 1732 -137800 1628 1857 -137800 1684 1470 -137800 1727 1434 -137800 1732 1428 -137800 1882 1434 -137800 1570 1731 -137800 1798 1913 -137800 1857 1470 -137800 1649 1500 -137800 1911 1500 -137800 1500 1511 -137800 1549 1890 -137800 1649 1511 -137800 1890 1525 -137800 1911 1511 -137800 1917 1500 -137800 1917 1511 -137800 1649 1917 -137800 1649 1911 -137800 1908 1479 -137800 1911 1917 -137800 1550 1794 -137800 1549 1525 -137800 1550 1603 -137800 1645 1756 -137820 1538 1524 -137820 1538 1501 -137820 1546 1459 -137820 1570 1731 -137820 1628 1684 -137820 1684 1857 -137820 1688 1854 -137820 1689 1458 -137820 1798 1913 -137820 1857 1470 -137820 1649 1500 -137820 1680 1772 -137820 1911 1500 -137820 1500 1511 -137820 1549 1890 -137820 1649 1511 -137820 1669 1754 -137820 1890 1525 -137820 1911 1511 -137820 1917 1500 -137820 1917 1511 -137820 1924 1478 -137820 1562 1521 -137820 1649 1917 -137820 1649 1911 -137820 1908 1479 -137820 1911 1917 -137820 1550 1794 -137820 1549 1525 -137820 1550 1603 -137820 1645 1756 -137840 1599 1649 -137840 1599 1511 -137840 1599 1500 -137840 1599 1911 -137840 1649 1500 -137840 1680 1772 -137840 1752 1766 -137840 1911 1500 -137840 1500 1511 -137840 1501 1524 -137840 1549 1890 -137840 1649 1511 -137840 1669 1754 -137840 1683 1908 -137840 1727 1434 -137840 1890 1525 -137840 1911 1511 -137840 1917 1500 -137840 1917 1511 -137840 1924 1478 -137840 1562 1521 -137840 1599 1917 -137840 1649 1917 -137840 1649 1911 -137840 1908 1479 -137840 1911 1917 -137840 1593 1767 -137840 1603 1794 -137840 1617 1441 -137840 1550 1794 -137840 1915 1473 -137840 1549 1525 -137840 1550 1603 -137840 1645 1756 -137860 1549 1825 -137860 1549 1890 -137860 1574 1495 -137860 1630 1761 -137860 1630 1493 -137860 1649 1511 -137860 1669 1754 -137860 1683 1908 -137860 1727 1434 -137860 1798 1913 -137860 1825 1525 -137860 1890 1525 -137860 1911 1511 -137860 1917 1500 -137860 1917 1511 -137860 1924 1478 -137860 1546 1459 -137860 1562 1521 -137860 1599 1917 -137860 1600 1825 -137860 1649 1917 -137860 1649 1911 -137860 1802 1495 -137860 1908 1479 -137860 1911 1917 -137860 1593 1767 -137860 1603 1794 -137860 1617 1441 -137860 1550 1794 -137860 1915 1473 -137860 1549 1525 -137860 1825 1890 -137860 1550 1603 -137860 1645 1756 -137880 1546 1459 -137880 1562 1521 -137880 1599 1649 -137880 1599 1917 -137880 1600 1825 -137880 1600 1890 -137880 1649 1917 -137880 1649 1911 -137880 1688 1854 -137880 1717 1752 -137880 1754 1767 -137880 1798 1857 -137880 1802 1495 -137880 1898 1477 -137880 1908 1479 -137880 1911 1917 -137880 1593 1767 -137880 1603 1794 -137880 1617 1441 -137880 1684 1470 -137880 1550 1794 -137880 1501 1524 -137880 1915 1473 -137880 1549 1525 -137880 1825 1890 -137880 1550 1603 -137880 1645 1756 -137880 1538 1501 -137900 1574 1599 -137900 1593 1767 -137900 1599 1512 -137900 1599 1802 -137900 1599 1495 -137900 1603 1794 -137900 1617 1441 -137900 1669 1754 -137900 1684 1470 -137900 1718 1889 -137900 1766 1479 -137900 1924 1478 -137900 1550 1794 -137900 1798 1913 -137900 1495 1512 -137900 1501 1524 -137900 1630 1761 -137900 1915 1473 -137900 1549 1525 -137900 1825 1890 -137900 1550 1603 -137900 1645 1756 -137900 1680 1772 -137900 1538 1501 -137920 1550 1794 -137920 1599 1865 -137920 1798 1913 -137920 1865 1512 -137920 1495 1512 -137920 1501 1524 -137920 1600 1519 -137920 1630 1761 -137920 1908 1479 -137920 1915 1473 -137920 1549 1525 -137920 1600 1890 -137920 1825 1890 -137920 1752 1766 -137920 1550 1603 -137920 1570 1731 -137920 1645 1756 -137920 1680 1772 -137920 1538 1501 -137940 1599 1512 -137940 1600 1519 -137940 1630 1761 -137940 1683 1766 -137940 1689 1458 -137940 1759 1857 -137940 1825 1519 -137940 1908 1479 -137940 1915 1473 -137940 1549 1525 -137940 1600 1890 -137940 1825 1890 -137940 1593 1767 -137940 1752 1766 -137940 1717 1479 -137940 1550 1603 -137940 1570 1731 -137940 1645 1756 -137940 1680 1772 -137940 1538 1501 -137940 1688 1854 -137960 1549 1525 -137960 1562 1678 -137960 1599 1882 -137960 1600 1890 -137960 1669 1754 -137960 1718 1889 -137960 1825 1890 -137960 1593 1767 -137960 1717 1908 -137960 1752 1766 -137960 1717 1479 -137960 1550 1603 -137960 1570 1731 -137960 1645 1756 -137960 1680 1772 -137960 1538 1501 -137960 1688 1854 -137980 1562 1441 -137980 1562 1470 -137980 1600 1519 -137980 1501 1524 -137980 1593 1767 -137980 1617 1441 -137980 1717 1908 -137980 1752 1766 -137980 1717 1479 -137980 1598 1920 -137980 1600 1825 -137980 1550 1603 -137980 1570 1731 -137980 1645 1756 -137980 1680 1772 -137980 1538 1501 -137980 1688 1854 -138000 1550 1877 -138000 1562 1767 -138000 1593 1767 -138000 1603 1794 -138000 1617 1441 -138000 1717 1908 -138000 1752 1766 -138000 1562 1628 -138000 1600 1890 -138000 1717 1479 -138000 1825 1890 -138000 1825 1525 -138000 1890 1525 -138000 1908 1479 -138000 1598 1920 -138000 1600 1825 -138000 1550 1603 -138000 1570 1731 -138000 1645 1756 -138000 1562 1593 -138000 1680 1772 -138000 1538 1501 -138000 1630 1761 -138000 1688 1854 -138020 1562 1628 -138020 1600 1890 -138020 1669 1754 -138020 1717 1479 -138020 1825 1890 -138020 1825 1525 -138020 1890 1525 -138020 1908 1479 -138020 1598 1920 -138020 1600 1825 -138020 1550 1603 -138020 1570 1731 -138020 1645 1756 -138020 1562 1593 -138020 1680 1772 -138020 1538 1501 -138020 1630 1761 -138020 1688 1854 -138040 1598 1920 -138040 1617 1857 -138040 1549 1890 -138040 1562 1617 -138040 1600 1825 -138040 1877 1479 -138040 1550 1603 -138040 1570 1731 -138040 1645 1756 -138040 1562 1593 -138040 1680 1772 -138040 1538 1501 -138040 1630 1761 -138040 1688 1854 -138060 1549 1890 -138060 1752 1766 -138060 1825 1525 -138060 1562 1617 -138060 1600 1825 -138060 1877 1479 -138060 1550 1603 -138060 1570 1731 -138060 1645 1756 -138060 1648 1683 -138060 1789 1803 -138060 1562 1593 -138060 1890 1525 -138060 1680 1772 -138060 1538 1501 -138060 1877 1908 -138060 1630 1761 -138060 1688 1854 -138080 1562 1617 -138080 1600 1825 -138080 1617 1857 -138080 1877 1479 -138080 1887 1440 -138080 1550 1603 -138080 1570 1731 -138080 1645 1756 -138080 1648 1683 -138080 1598 1920 -138080 1789 1803 -138080 1562 1593 -138080 1890 1525 -138080 1680 1772 -138080 1538 1501 -138080 1877 1908 -138080 1908 1479 -138080 1630 1761 -138080 1688 1854 -138100 1550 1603 -138100 1570 1731 -138100 1617 1441 -138100 1645 1756 -138100 1648 1683 -138100 1752 1766 -138100 1924 1478 -138100 1598 1920 -138100 1648 1696 -138100 1789 1803 -138100 1562 1593 -138100 1890 1525 -138100 1825 1877 -138100 1680 1772 -138100 1538 1501 -138100 1603 1794 -138100 1877 1908 -138100 1908 1479 -138100 1630 1761 -138100 1688 1854 -138120 1598 1920 -138120 1599 1689 -138120 1648 1696 -138120 1789 1803 -138120 1562 1593 -138120 1825 1908 -138120 1825 1479 -138120 1890 1525 -138120 1825 1877 -138120 1680 1772 -138120 1600 1519 -138120 1538 1501 -138120 1603 1794 -138120 1877 1479 -138120 1877 1908 -138120 1908 1479 -138120 1630 1761 -138120 1688 1854 -138140 1562 1593 -138140 1563 1592 -138140 1570 1731 -138140 1599 1531 -138140 1825 1890 -138140 1825 1908 -138140 1825 1525 -138140 1825 1479 -138140 1890 1525 -138140 1924 1478 -138140 1752 1766 -138140 1825 1877 -138140 1669 1754 -138140 1680 1772 -138140 1600 1519 -138140 1538 1501 -138140 1603 1794 -138140 1617 1441 -138140 1877 1479 -138140 1877 1908 -138140 1908 1479 -138140 1630 1761 -138140 1688 1854 -138160 1549 1525 -138160 1599 1512 -138160 1659 1514 -138160 1752 1766 -138160 1825 1877 -138160 1669 1754 -138160 1680 1772 -138160 1600 1519 -138160 1598 1920 -138160 1538 1501 -138160 1603 1794 -138160 1617 1441 -138160 1877 1479 -138160 1877 1908 -138160 1908 1479 -138160 1630 1761 -138160 1688 1854 -138180 1628 1463 -138180 1669 1754 -138180 1680 1772 -138180 1787 1531 -138180 1600 1519 -138180 1562 1593 -138180 1598 1920 -138180 1538 1501 -138180 1789 1803 -138180 1603 1794 -138180 1617 1441 -138180 1877 1479 -138180 1877 1908 -138180 1908 1479 -138180 1630 1761 -138180 1688 1854 -138200 1549 1825 -138200 1549 1525 -138200 1570 1731 -138200 1628 1754 -138200 1767 1840 -138200 1907 1438 -138200 1600 1519 -138200 1562 1593 -138200 1598 1920 -138200 1538 1501 -138200 1789 1803 -138200 1603 1794 -138200 1617 1441 -138200 1877 1479 -138200 1877 1908 -138200 1908 1479 -138200 1630 1761 -138200 1688 1854 -138220 1659 1514 -138220 1669 1754 -138220 1757 1907 -138220 1792 1885 -138220 1600 1519 -138220 1562 1593 -138220 1598 1920 -138220 1538 1501 -138220 1789 1803 -138220 1603 1794 -138220 1617 1441 -138220 1877 1479 -138220 1877 1908 -138220 1908 1479 -138220 1630 1761 -138220 1688 1854 -138240 1549 1525 -138240 1600 1519 -138240 1684 1441 -138240 1562 1593 -138240 1570 1731 -138240 1598 1920 -138240 1645 1756 -138240 1538 1501 -138240 1684 1470 -138240 1789 1803 -138240 1550 1603 -138240 1603 1794 -138240 1617 1441 -138240 1431 1458 -138240 1877 1479 -138240 1877 1908 -138240 1908 1479 -138240 1630 1761 -138240 1688 1854 -138260 1562 1593 -138260 1570 1731 -138260 1598 1920 -138260 1645 1756 -138260 1538 1501 -138260 1550 1794 -138260 1684 1470 -138260 1757 1907 -138260 1789 1803 -138260 1440 1477 -138260 1550 1603 -138260 1603 1794 -138260 1825 1525 -138260 1617 1441 -138260 1431 1458 -138260 1877 1479 -138260 1877 1908 -138260 1908 1479 -138260 1630 1761 -138260 1688 1854 -138280 1538 1501 -138280 1550 1794 -138280 1684 1470 -138280 1757 1907 -138280 1789 1803 -138280 1440 1477 -138280 1600 1519 -138280 1669 1754 -138280 1550 1603 -138280 1603 1794 -138280 1825 1525 -138280 1617 1441 -138280 1431 1458 -138280 1877 1479 -138280 1877 1908 -138280 1908 1479 -138280 1630 1761 -138280 1688 1854 -138300 1591 1858 -138300 1600 1519 -138300 1603 1920 -138300 1669 1754 -138300 1550 1603 -138300 1562 1593 -138300 1603 1794 -138300 1825 1525 -138300 1570 1731 -138300 1598 1920 -138300 1617 1441 -138300 1431 1458 -138300 1877 1479 -138300 1877 1908 -138300 1908 1479 -138300 1630 1761 -138300 1688 1854 -138320 1538 1501 -138320 1550 1603 -138320 1562 1593 -138320 1603 1794 -138320 1645 1756 -138320 1789 1803 -138320 1825 1525 -138320 1550 1527 -138320 1767 1840 -138320 1798 1913 -138320 1549 1825 -138320 1915 1473 -138320 1570 1731 -138320 1598 1920 -138320 1617 1441 -138320 1431 1458 -138320 1877 1479 -138320 1877 1908 -138320 1908 1479 -138320 1630 1761 -138320 1688 1854 -138340 1538 1772 -138340 1550 1527 -138340 1767 1840 -138340 1798 1913 -138340 1549 1825 -138340 1915 1473 -138340 1570 1731 -138340 1598 1920 -138340 1600 1519 -138340 1617 1441 -138340 1431 1458 -138340 1669 1754 -138340 1877 1479 -138340 1877 1908 -138340 1908 1479 -138340 1630 1761 -138340 1688 1854 -138360 1549 1825 -138360 1645 1756 -138360 1695 1519 -138360 1759 1877 -138360 1789 1803 -138360 1915 1473 -138360 1570 1731 -138360 1598 1920 -138360 1600 1519 -138360 1617 1441 -138360 1680 1772 -138360 1765 1458 -138360 1765 1431 -138360 1431 1458 -138360 1669 1754 -138360 1877 1479 -138360 1877 1908 -138360 1908 1479 -138360 1562 1593 -138360 1538 1501 -138360 1630 1761 -138360 1688 1854 -138380 1549 1525 -138380 1570 1731 -138380 1598 1920 -138380 1695 1877 -138380 1591 1858 -138380 1600 1519 -138380 1617 1441 -138380 1680 1772 -138380 1765 1458 -138380 1765 1431 -138380 1431 1458 -138380 1669 1754 -138380 1877 1479 -138380 1877 1908 -138380 1908 1479 -138380 1562 1593 -138380 1538 1501 -138380 1630 1761 -138380 1688 1854 -138400 1550 1854 -138400 1591 1858 -138400 1600 1519 -138400 1617 1441 -138400 1628 1463 -138400 1708 1760 -138400 1617 1767 -138400 1680 1772 -138400 1752 1766 -138400 1765 1458 -138400 1765 1431 -138400 1431 1458 -138400 1669 1754 -138400 1877 1479 -138400 1877 1908 -138400 1908 1479 -138400 1767 1441 -138400 1563 1717 -138400 1562 1593 -138400 1538 1501 -138400 1630 1761 -138400 1688 1854 -138420 1550 1527 -138420 1562 1603 -138420 1617 1767 -138420 1680 1772 -138420 1695 1908 -138420 1695 1877 -138420 1752 1766 -138420 1549 1825 -138420 1601 1458 -138420 1765 1458 -138420 1765 1431 -138420 1431 1458 -138420 1549 1525 -138420 1601 1765 -138420 1601 1431 -138420 1669 1754 -138420 1877 1479 -138420 1570 1731 -138420 1593 1603 -138420 1598 1920 -138420 1877 1908 -138420 1908 1479 -138420 1767 1441 -138420 1563 1717 -138420 1562 1593 -138420 1538 1501 -138420 1630 1761 -138420 1688 1854 -138440 1549 1825 -138440 1562 1794 -138440 1593 1794 -138440 1601 1458 -138440 1628 1754 -138440 1687 1699 -138440 1765 1458 -138440 1765 1882 -138440 1765 1431 -138440 1882 1458 -138440 1915 1473 -138440 1431 1458 -138440 1549 1525 -138440 1601 1765 -138440 1601 1431 -138440 1669 1754 -138440 1877 1479 -138440 1570 1731 -138440 1593 1603 -138440 1598 1920 -138440 1600 1519 -138440 1877 1908 -138440 1908 1479 -138440 1767 1441 -138440 1563 1717 -138440 1825 1479 -138440 1562 1593 -138440 1538 1501 -138440 1617 1441 -138440 1630 1761 -138440 1688 1854 -138460 1549 1525 -138460 1601 1765 -138460 1601 1774 -138460 1601 1431 -138460 1669 1754 -138460 1752 1766 -138460 1789 1803 -138460 1825 1877 -138460 1877 1479 -138460 1458 1502 -138460 1570 1731 -138460 1593 1603 -138460 1598 1920 -138460 1600 1519 -138460 1695 1908 -138460 1695 1479 -138460 1877 1908 -138460 1908 1479 -138460 1562 1603 -138460 1591 1858 -138460 1695 1825 -138460 1767 1441 -138460 1563 1717 -138460 1825 1479 -138460 1562 1593 -138460 1825 1908 -138460 1538 1501 -138460 1680 1772 -138460 1617 1441 -138460 1630 1761 -138460 1688 1854 -138480 1570 1731 -138480 1593 1603 -138480 1598 1920 -138480 1600 1519 -138480 1630 1493 -138480 1695 1908 -138480 1695 1479 -138480 1765 1431 -138480 1877 1908 -138480 1908 1479 -138480 1562 1603 -138480 1591 1858 -138480 1600 1825 -138480 1617 1767 -138480 1695 1825 -138480 1767 1441 -138480 1907 1438 -138480 1563 1717 -138480 1599 1825 -138480 1825 1479 -138480 1562 1593 -138480 1825 1908 -138480 1538 1501 -138480 1680 1772 -138480 1617 1441 -138480 1630 1761 -138480 1688 1854 -138500 1549 1525 -138500 1562 1603 -138500 1591 1858 -138500 1600 1825 -138500 1617 1767 -138500 1695 1825 -138500 1695 1759 -138500 1767 1441 -138500 1825 1519 -138500 1907 1438 -138500 1563 1717 -138500 1599 1825 -138500 1613 1920 -138500 1669 1754 -138500 1825 1479 -138500 1915 1473 -138500 1562 1593 -138500 1825 1908 -138500 1538 1501 -138500 1680 1772 -138500 1617 1441 -138500 1630 1761 -138500 1688 1854 -138520 1550 1527 -138520 1562 1857 -138520 1563 1717 -138520 1599 1825 -138520 1600 1519 -138520 1613 1920 -138520 1669 1754 -138520 1791 1825 -138520 1825 1479 -138520 1915 1473 -138520 1562 1593 -138520 1825 1908 -138520 1538 1501 -138520 1680 1772 -138520 1789 1803 -138520 1617 1441 -138520 1630 1761 -138520 1688 1854 -138540 1562 1593 -138540 1562 1603 -138540 1591 1858 -138540 1593 1603 -138540 1603 1441 -138540 1825 1908 -138540 1887 1440 -138540 1538 1501 -138540 1617 1767 -138540 1680 1772 -138540 1789 1803 -138540 1767 1441 -138540 1617 1441 -138540 1630 1761 -138540 1688 1854 -138560 1538 1501 -138560 1549 1825 -138560 1549 1525 -138560 1579 1804 -138560 1617 1767 -138560 1680 1772 -138560 1789 1803 -138560 1825 1463 -138560 1600 1519 -138560 1603 1684 -138560 1669 1754 -138560 1550 1527 -138560 1767 1441 -138560 1617 1441 -138560 1630 1761 -138560 1688 1854 -138580 1562 1593 -138580 1645 1756 -138580 1695 1825 -138580 1924 1463 -138580 1600 1519 -138580 1603 1684 -138580 1669 1754 -138580 1550 1527 -138580 1767 1441 -138580 1617 1441 -138580 1630 1761 -138580 1688 1854 -138600 1562 1684 -138600 1563 1618 -138600 1591 1858 -138600 1600 1519 -138600 1603 1794 -138600 1603 1684 -138600 1613 1756 -138600 1669 1754 -138600 1550 1527 -138600 1593 1603 -138600 1684 1767 -138600 1767 1441 -138600 1592 1717 -138600 1680 1772 -138600 1617 1441 -138600 1630 1761 -138600 1688 1854 -138620 1538 1836 -138620 1550 1527 -138620 1562 1794 -138620 1593 1603 -138620 1599 1791 -138620 1684 1767 -138620 1562 1603 -138620 1767 1441 -138620 1825 1479 -138620 1592 1717 -138620 1603 1441 -138620 1562 1593 -138620 1680 1772 -138620 1617 1441 -138620 1630 1761 -138620 1688 1854 -138640 1549 1525 -138640 1552 1564 -138640 1562 1603 -138640 1613 1699 -138640 1684 1441 -138640 1767 1441 -138640 1825 1463 -138640 1825 1479 -138640 1924 1478 -138640 1549 1825 -138640 1592 1717 -138640 1603 1441 -138640 1562 1441 -138640 1562 1593 -138640 1680 1772 -138640 1617 1441 -138640 1630 1761 -138640 1688 1854 -138660 1549 1825 -138660 1591 1858 -138660 1592 1717 -138660 1599 1791 -138660 1600 1519 -138660 1603 1441 -138660 1603 1767 -138660 1907 1438 -138660 1562 1441 -138660 1669 1754 -138660 1550 1527 -138660 1617 1857 -138660 1562 1593 -138660 1680 1772 -138660 1617 1441 -138660 1645 1756 -138660 1630 1761 -138660 1688 1854 -138680 1562 1441 -138680 1563 1613 -138680 1593 1603 -138680 1613 1699 -138680 1630 1493 -138680 1669 1754 -138680 1678 1717 -138680 1550 1527 -138680 1562 1603 -138680 1603 1684 -138680 1617 1857 -138680 1643 1704 -138680 1857 1441 -138680 1549 1525 -138680 1562 1593 -138680 1680 1772 -138680 1617 1441 -138680 1645 1756 -138680 1630 1761 -138680 1688 1854 -138700 1550 1527 -138700 1562 1603 -138700 1591 1858 -138700 1603 1684 -138700 1617 1857 -138700 1643 1704 -138700 1718 1889 -138700 1857 1441 -138700 1549 1525 -138700 1562 1593 -138700 1563 1592 -138700 1603 1767 -138700 1680 1772 -138700 1617 1441 -138700 1628 1767 -138700 1645 1756 -138700 1630 1761 -138700 1688 1854 -138720 1549 1525 -138720 1562 1593 -138720 1562 1684 -138720 1563 1592 -138720 1570 1731 -138720 1603 1767 -138720 1628 1684 -138720 1680 1772 -138720 1684 1441 -138720 1874 1529 -138720 1617 1441 -138720 1628 1767 -138720 1645 1756 -138720 1669 1754 -138720 1630 1761 -138720 1688 1854 -138740 1562 1603 -138740 1603 1617 -138740 1603 1794 -138740 1617 1441 -138740 1617 1857 -138740 1628 1767 -138740 1708 1760 -138740 1708 1883 -138740 1757 1907 -138740 1924 1463 -138740 1630 1493 -138740 1645 1756 -138740 1669 1754 -138740 1630 1761 -138740 1603 1684 -138740 1538 1501 -138740 1688 1854 -138760 1563 1613 -138760 1593 1684 -138760 1599 1791 -138760 1630 1493 -138760 1642 1761 -138760 1645 1756 -138760 1669 1754 -138760 1761 1493 -138760 1883 1438 -138760 1549 1525 -138760 1630 1761 -138760 1767 1857 -138760 1857 1441 -138760 1603 1684 -138760 1538 1501 -138760 1550 1527 -138760 1688 1854 -138780 1549 1525 -138780 1603 1617 -138780 1630 1761 -138780 1708 1433 -138780 1767 1857 -138780 1857 1441 -138780 1718 1889 -138780 1603 1684 -138780 1617 1441 -138780 1538 1501 -138780 1550 1527 -138780 1600 1825 -138780 1546 1924 -138780 1680 1772 -138780 1688 1854 -138800 1570 1760 -138800 1617 1443 -138800 1617 1857 -138800 1630 1493 -138800 1669 1754 -138800 1718 1889 -138800 1731 1529 -138800 1731 1433 -138800 1570 1731 -138800 1603 1684 -138800 1617 1441 -138800 1538 1501 -138800 1550 1527 -138800 1600 1825 -138800 1789 1803 -138800 1546 1924 -138800 1680 1772 -138800 1688 1854 -138820 1570 1731 -138820 1600 1519 -138820 1603 1684 -138820 1617 1441 -138820 1628 1857 -138820 1628 1443 -138820 1708 1731 -138820 1731 1907 -138820 1756 1920 -138820 1760 1761 -138820 1761 1790 -138820 1767 1857 -138820 1767 1441 -138820 1883 1438 -138820 1550 1854 -138820 1562 1593 -138820 1570 1907 -138820 1684 1441 -138820 1538 1501 -138820 1550 1527 -138820 1600 1825 -138820 1630 1761 -138820 1789 1803 -138820 1546 1924 -138820 1680 1772 -138820 1549 1525 -138820 1688 1854 -138840 1550 1854 -138840 1562 1593 -138840 1570 1907 -138840 1669 1754 -138840 1684 1441 -138840 1684 1767 -138840 1731 1847 -138840 1857 1441 -138840 1924 1478 -138840 1924 1463 -138840 1538 1501 -138840 1550 1527 -138840 1600 1825 -138840 1630 1761 -138840 1789 1803 -138840 1546 1924 -138840 1603 1441 -138840 1643 1704 -138840 1645 1756 -138840 1680 1772 -138840 1549 1525 -138840 1688 1854 -138860 1538 1501 -138860 1546 1478 -138860 1550 1527 -138860 1600 1825 -138860 1617 1441 -138860 1630 1761 -138860 1754 1463 -138860 1789 1803 -138860 1546 1924 -138860 1603 1441 -138860 1643 1704 -138860 1562 1684 -138860 1645 1756 -138860 1680 1772 -138860 1549 1525 -138860 1688 1854 -138880 1546 1924 -138880 1603 1441 -138880 1630 1760 -138880 1669 1754 -138880 1767 1441 -138880 1841 1901 -138880 1579 1761 -138880 1628 1443 -138880 1643 1704 -138880 1924 1478 -138880 1562 1684 -138880 1563 1592 -138880 1825 1525 -138880 1857 1441 -138880 1549 1825 -138880 1915 1473 -138880 1570 1731 -138880 1645 1756 -138880 1680 1772 -138880 1549 1525 -138880 1688 1854 -138900 1579 1761 -138900 1628 1443 -138900 1630 1761 -138900 1643 1704 -138900 1882 1531 -138900 1924 1478 -138900 1562 1684 -138900 1563 1592 -138900 1825 1525 -138900 1857 1441 -138900 1549 1825 -138900 1915 1473 -138900 1538 1501 -138900 1570 1731 -138900 1645 1756 -138900 1680 1772 -138900 1549 1525 -138900 1688 1854 -138920 1538 1524 -138920 1546 1924 -138920 1562 1684 -138920 1563 1592 -138920 1579 1630 -138920 1600 1519 -138920 1669 1754 -138920 1718 1889 -138920 1825 1525 -138920 1857 1441 -138920 1546 1459 -138920 1549 1825 -138920 1915 1473 -138920 1538 1501 -138920 1570 1731 -138920 1645 1756 -138920 1680 1772 -138920 1549 1525 -138920 1688 1854 -138940 1546 1459 -138940 1546 1478 -138940 1550 1688 -138940 1550 1527 -138940 1560 1701 -138940 1708 1760 -138940 1767 1441 -138940 1459 1478 -138940 1549 1825 -138940 1600 1825 -138940 1915 1473 -138940 1538 1501 -138940 1570 1731 -138940 1645 1756 -138940 1680 1772 -138940 1562 1603 -138940 1549 1525 -138940 1688 1854 -138960 1549 1825 -138960 1599 1845 -138960 1630 1761 -138960 1825 1463 -138960 1600 1825 -138960 1669 1754 -138960 1695 1759 -138960 1915 1473 -138960 1538 1501 -138960 1570 1731 -138960 1645 1756 -138960 1680 1772 -138960 1562 1603 -138960 1563 1592 -138960 1549 1525 -138960 1688 1854 -138980 1600 1825 -138980 1669 1754 -138980 1695 1759 -138980 1915 1473 -138980 1501 1524 -138980 1538 1501 -138980 1570 1731 -138980 1645 1756 -138980 1680 1772 -138980 1546 1924 -138980 1562 1603 -138980 1563 1592 -138980 1549 1525 -138980 1688 1854 -139000 1538 1501 -139000 1570 1731 -139000 1599 1791 -139000 1645 1756 -139000 1680 1772 -139000 1767 1857 -139000 1789 1803 -139000 1825 1479 -139000 1546 1924 -139000 1603 1684 -139000 1767 1441 -139000 1857 1441 -139000 1562 1603 -139000 1563 1592 -139000 1600 1519 -139000 1549 1525 -139000 1688 1854 -139020 1546 1924 -139020 1550 1527 -139020 1562 1684 -139020 1603 1684 -139020 1708 1760 -139020 1767 1441 -139020 1857 1441 -139020 1924 1463 -139020 1562 1603 -139020 1563 1592 -139020 1600 1519 -139020 1512 1531 -139020 1600 1825 -139020 1549 1525 -139020 1688 1854 -139040 1562 1603 -139040 1563 1592 -139040 1603 1441 -139040 1645 1756 -139040 1684 1441 -139040 1501 1524 -139040 1600 1519 -139040 1754 1463 -139040 1512 1531 -139040 1600 1825 -139040 1680 1772 -139040 1549 1525 -139040 1538 1501 -139040 1688 1854 -139060 1600 1519 -139060 1857 1441 -139060 1546 1924 -139060 1754 1463 -139060 1512 1531 -139060 1789 1803 -139060 1921 1462 -139060 1600 1825 -139060 1680 1772 -139060 1549 1525 -139060 1538 1501 -139060 1688 1854 -139080 1546 1924 -139080 1570 1731 -139080 1754 1463 -139080 1825 1519 -139080 1451 1529 -139080 1512 1531 -139080 1562 1603 -139080 1617 1441 -139080 1767 1857 -139080 1789 1803 -139080 1921 1462 -139080 1600 1825 -139080 1680 1772 -139080 1549 1525 -139080 1538 1501 -139080 1731 1768 -139080 1915 1473 -139080 1688 1854 -139100 1558 1468 -139100 1562 1603 -139100 1579 1919 -139100 1617 1441 -139100 1643 1704 -139100 1718 1889 -139100 1767 1857 -139100 1789 1803 -139100 1921 1462 -139100 1669 1754 -139100 1857 1441 -139100 1600 1825 -139100 1680 1772 -139100 1549 1525 -139100 1538 1501 -139100 1731 1768 -139100 1915 1473 -139100 1688 1854 -139120 1600 1519 -139120 1669 1754 -139120 1684 1857 -139120 1698 1707 -139120 1707 1764 -139120 1857 1441 -139120 1924 1463 -139120 1512 1531 -139120 1546 1924 -139120 1600 1825 -139120 1680 1772 -139120 1549 1525 -139120 1538 1501 -139120 1731 1768 -139120 1915 1473 -139120 1688 1854 -139140 1546 1924 -139140 1563 1592 -139140 1600 1825 -139140 1643 1704 -139140 1643 1921 -139140 1704 1921 -139140 1767 1441 -139140 1789 1803 -139140 1825 1519 -139140 1921 1462 -139140 1451 1529 -139140 1680 1772 -139140 1549 1525 -139140 1538 1501 -139140 1731 1768 -139140 1915 1473 -139140 1688 1854 -139160 1680 1772 -139160 1546 1519 -139160 1549 1525 -139160 1538 1501 -139160 1546 1459 -139160 1698 1707 -139160 1731 1768 -139160 1915 1473 -139160 1688 1854 -139160 1857 1441 -139180 1546 1519 -139180 1549 1525 -139180 1600 1525 -139180 1678 1698 -139180 1678 1707 -139180 1600 1825 -139180 1924 1463 -139180 1538 1501 -139180 1546 1459 -139180 1767 1441 -139180 1698 1707 -139180 1825 1519 -139180 1731 1768 -139180 1915 1473 -139180 1688 1854 -139180 1857 1441 -139200 1546 1924 -139200 1549 1600 -139200 1562 1449 -139200 1562 1603 -139200 1562 1531 -139200 1599 1791 -139200 1600 1825 -139200 1603 1531 -139200 1749 1757 -139200 1774 1791 -139200 1921 1462 -139200 1924 1463 -139200 1538 1501 -139200 1546 1459 -139200 1563 1592 -139200 1678 1764 -139200 1767 1857 -139200 1767 1441 -139200 1698 1707 -139200 1698 1764 -139200 1825 1519 -139200 1707 1764 -139200 1731 1768 -139200 1825 1525 -139200 1915 1473 -139200 1688 1854 -139200 1857 1441 -139200 1669 1754 -139220 1538 1501 -139220 1546 1459 -139220 1546 1613 -139220 1549 1825 -139220 1550 1527 -139220 1563 1592 -139220 1678 1764 -139220 1757 1847 -139220 1767 1857 -139220 1767 1441 -139220 1549 1525 -139220 1512 1531 -139220 1698 1707 -139220 1698 1764 -139220 1825 1519 -139220 1707 1764 -139220 1731 1768 -139220 1825 1525 -139220 1915 1473 -139220 1688 1854 -139220 1857 1441 -139220 1669 1754 -139240 1546 1761 -139240 1549 1525 -139240 1613 1754 -139240 1718 1757 -139240 1749 1757 -139240 1512 1531 -139240 1698 1707 -139240 1698 1764 -139240 1825 1519 -139240 1599 1791 -139240 1628 1684 -139240 1707 1764 -139240 1731 1768 -139240 1825 1525 -139240 1915 1473 -139240 1688 1854 -139240 1857 1441 -139240 1669 1754 -139260 1549 1600 -139260 1600 1519 -139260 1630 1704 -139260 1643 1704 -139260 1678 1707 -139260 1698 1707 -139260 1698 1764 -139260 1825 1519 -139260 1550 1527 -139260 1600 1825 -139260 1599 1791 -139260 1628 1684 -139260 1707 1764 -139260 1731 1768 -139260 1628 1761 -139260 1825 1525 -139260 1915 1473 -139260 1688 1854 -139260 1857 1441 -139260 1669 1754 -139280 1550 1527 -139280 1600 1825 -139280 1684 1761 -139280 1924 1463 -139280 1599 1791 -139280 1628 1684 -139280 1707 1764 -139280 1731 1768 -139280 1538 1501 -139280 1628 1761 -139280 1825 1525 -139280 1915 1473 -139280 1688 1854 -139280 1857 1441 -139280 1678 1698 -139280 1669 1754 -139300 1563 1592 -139300 1599 1791 -139300 1628 1684 -139300 1707 1764 -139300 1749 1462 -139300 1731 1768 -139300 1538 1501 -139300 1628 1761 -139300 1825 1525 -139300 1915 1473 -139300 1688 1854 -139300 1857 1441 -139300 1549 1525 -139300 1678 1698 -139300 1669 1754 -139320 1825 1519 -139320 1731 1768 -139320 1924 1478 -139320 1538 1501 -139320 1550 1527 -139320 1628 1761 -139320 1749 1757 -139320 1825 1525 -139320 1915 1473 -139320 1688 1854 -139320 1857 1441 -139320 1643 1704 -139320 1549 1525 -139320 1678 1698 -139320 1669 1754 -139340 1563 1592 -139340 1731 1768 -139340 1924 1478 -139340 1538 1501 -139340 1550 1527 -139340 1628 1761 -139340 1749 1757 -139340 1825 1525 -139340 1915 1473 -139340 1688 1854 -139340 1857 1441 -139340 1643 1704 -139340 1549 1525 -139340 1707 1764 -139340 1678 1698 -139340 1669 1754 -139360 1538 1501 -139360 1550 1527 -139360 1628 1761 -139360 1749 1757 -139360 1825 1525 -139360 1915 1473 -139360 1688 1854 -139360 1825 1519 -139360 1857 1441 -139360 1643 1704 -139360 1549 1525 -139360 1707 1764 -139360 1678 1698 -139360 1669 1754 -139380 1628 1684 -139380 1684 1761 -139380 1688 1854 -139380 1825 1519 -139380 1708 1760 -139380 1519 1525 -139380 1857 1441 -139380 1643 1704 -139380 1549 1525 -139380 1707 1764 -139380 1678 1698 -139380 1669 1754 -139400 1570 1731 -139400 1630 1438 -139400 1708 1760 -139400 1519 1525 -139400 1857 1441 -139400 1789 1803 -139400 1501 1524 -139400 1643 1704 -139400 1915 1473 -139400 1549 1525 -139400 1707 1764 -139400 1538 1501 -139400 1550 1527 -139400 1678 1698 -139400 1669 1754 -139420 1600 1519 -139420 1845 1433 -139420 1857 1441 -139420 1789 1803 -139420 1921 1462 -139420 1501 1524 -139420 1643 1704 -139420 1915 1473 -139420 1549 1525 -139420 1707 1764 -139420 1538 1501 -139420 1550 1527 -139420 1678 1698 -139420 1669 1754 -139440 1628 1684 -139440 1684 1761 -139440 1789 1803 -139440 1921 1462 -139440 1501 1524 -139440 1825 1525 -139440 1549 1825 -139440 1643 1704 -139440 1915 1473 -139440 1549 1525 -139440 1707 1764 -139440 1538 1501 -139440 1550 1527 -139440 1678 1698 -139440 1669 1754 -139460 1549 1600 -139460 1825 1525 -139460 1599 1791 -139460 1549 1825 -139460 1600 1825 -139460 1600 1525 -139460 1600 1519 -139460 1563 1592 -139460 1628 1761 -139460 1643 1704 -139460 1915 1473 -139460 1549 1525 -139460 1707 1764 -139460 1538 1501 -139460 1550 1527 -139460 1678 1698 -139460 1669 1754 -139480 1599 1791 -139480 1684 1761 -139480 1731 1789 -139480 1549 1825 -139480 1600 1825 -139480 1600 1525 -139480 1600 1519 -139480 1563 1592 -139480 1628 1761 -139480 1643 1704 -139480 1915 1473 -139480 1549 1525 -139480 1707 1764 -139480 1538 1501 -139480 1550 1527 -139480 1678 1698 -139480 1669 1754 -139500 1549 1825 -139500 1600 1825 -139500 1600 1525 -139500 1600 1519 -139500 1761 1441 -139500 1790 1501 -139500 1921 1462 -139500 1563 1592 -139500 1628 1761 -139500 1688 1854 -139500 1519 1525 -139500 1643 1704 -139500 1915 1473 -139500 1549 1525 -139500 1707 1764 -139500 1538 1501 -139500 1550 1527 -139500 1678 1698 -139500 1669 1754 -139520 1549 1600 -139520 1563 1592 -139520 1628 1761 -139520 1688 1854 -139520 1718 1889 -139520 1519 1525 -139520 1643 1704 -139520 1915 1473 -139520 1549 1525 -139520 1707 1764 -139520 1538 1501 -139520 1550 1527 -139520 1678 1698 -139520 1669 1754 -139540 1549 1825 -139540 1643 1704 -139540 1708 1760 -139540 1564 1768 -139540 1599 1791 -139540 1790 1501 -139540 1684 1883 -139540 1915 1473 -139540 1549 1525 -139540 1707 1764 -139540 1538 1501 -139540 1550 1527 -139540 1678 1698 -139540 1669 1754 -139560 1564 1768 -139560 1599 1791 -139560 1628 1883 -139560 1628 1684 -139560 1630 1438 -139560 1680 1772 -139560 1684 1761 -139560 1761 1883 -139560 1790 1501 -139560 1642 1704 -139560 1648 1696 -139560 1731 1443 -139560 1921 1462 -139560 1684 1883 -139560 1688 1854 -139560 1915 1473 -139560 1549 1525 -139560 1707 1764 -139560 1538 1501 -139560 1550 1527 -139560 1678 1698 -139560 1669 1754 -139580 1577 1791 -139580 1617 1857 -139580 1642 1704 -139580 1648 1696 -139580 1731 1443 -139580 1761 1441 -139580 1825 1519 -139580 1921 1462 -139580 1684 1883 -139580 1643 1704 -139580 1519 1525 -139580 1825 1525 -139580 1688 1854 -139580 1915 1473 -139580 1549 1525 -139580 1707 1764 -139580 1538 1501 -139580 1550 1527 -139580 1678 1698 -139580 1669 1754 -139600 1564 1768 -139600 1600 1825 -139600 1684 1883 -139600 1708 1760 -139600 1501 1524 -139600 1643 1704 -139600 1519 1525 -139600 1600 1525 -139600 1825 1525 -139600 1688 1854 -139600 1915 1473 -139600 1549 1525 -139600 1707 1764 -139600 1538 1501 -139600 1550 1527 -139600 1678 1698 -139600 1669 1754 -139620 1549 1600 -139620 1550 1857 -139620 1628 1882 -139620 1630 1438 -139620 1643 1704 -139620 1683 1836 -139620 1924 1478 -139620 1519 1525 -139620 1600 1525 -139620 1825 1525 -139620 1688 1854 -139620 1921 1462 -139620 1915 1473 -139620 1549 1525 -139620 1707 1764 -139620 1538 1501 -139620 1550 1527 -139620 1678 1698 -139620 1669 1754 -139640 1563 1592 -139640 1598 1527 -139640 1707 1761 -139640 1731 1443 -139640 1761 1764 -139640 1600 1825 -139640 1600 1525 -139640 1825 1525 -139640 1688 1854 -139640 1921 1462 -139640 1915 1473 -139640 1549 1525 -139640 1707 1764 -139640 1538 1501 -139640 1550 1527 -139640 1708 1847 -139640 1678 1698 -139640 1708 1760 -139640 1669 1754 -139660 1549 1825 -139660 1599 1791 -139660 1789 1490 -139660 1600 1825 -139660 1600 1525 -139660 1630 1438 -139660 1683 1836 -139660 1825 1525 -139660 1688 1854 -139660 1787 1847 -139660 1921 1462 -139660 1915 1473 -139660 1549 1525 -139660 1707 1764 -139660 1538 1501 -139660 1550 1527 -139660 1708 1847 -139660 1678 1698 -139660 1708 1760 -139660 1760 1847 -139660 1669 1754 -139680 1600 1825 -139680 1600 1525 -139680 1600 1519 -139680 1630 1438 -139680 1683 1836 -139680 1789 1803 -139680 1825 1525 -139680 1825 1519 -139680 1519 1525 -139680 1688 1854 -139680 1787 1847 -139680 1921 1462 -139680 1915 1473 -139680 1549 1525 -139680 1707 1764 -139680 1538 1501 -139680 1550 1527 -139680 1708 1847 -139680 1678 1698 -139680 1708 1760 -139680 1760 1847 -139680 1680 1772 -139680 1669 1754 -139700 1598 1527 -139700 1688 1854 -139700 1787 1847 -139700 1887 1440 -139700 1921 1462 -139700 1915 1473 -139700 1549 1525 -139700 1707 1764 -139700 1538 1501 -139700 1550 1527 -139700 1708 1847 -139700 1678 1698 -139700 1708 1760 -139700 1760 1847 -139700 1680 1772 -139700 1669 1754 -139720 1546 1678 -139720 1549 1825 -139720 1688 1527 -139720 1921 1462 -139720 1915 1473 -139720 1549 1525 -139720 1761 1825 -139720 1707 1764 -139720 1538 1501 -139720 1550 1527 -139720 1708 1847 -139720 1678 1698 -139720 1708 1760 -139720 1760 1847 -139720 1680 1772 -139720 1669 1754 -139740 1598 1527 -139740 1630 1643 -139740 1642 1921 -139740 1643 1921 -139740 1688 1854 -139740 1915 1473 -139740 1519 1525 -139740 1549 1600 -139740 1549 1525 -139740 1642 1643 -139740 1718 1889 -139740 1761 1825 -139740 1707 1764 -139740 1538 1501 -139740 1550 1527 -139740 1708 1847 -139740 1678 1698 -139740 1708 1760 -139740 1760 1847 -139740 1680 1772 -139740 1669 1754 -139760 1549 1600 -139760 1549 1525 -139760 1600 1525 -139760 1642 1643 -139760 1761 1525 -139760 1921 1462 -139760 1546 1459 -139760 1718 1889 -139760 1761 1825 -139760 1600 1519 -139760 1707 1764 -139760 1825 1525 -139760 1538 1501 -139760 1550 1527 -139760 1708 1847 -139760 1678 1698 -139760 1708 1760 -139760 1760 1847 -139760 1680 1772 -139760 1669 1754 -139780 1546 1459 -139780 1678 1728 -139780 1684 1728 -139780 1718 1889 -139780 1761 1825 -139780 1600 1519 -139780 1643 1704 -139780 1707 1764 -139780 1825 1525 -139780 1599 1791 -139780 1538 1501 -139780 1550 1527 -139780 1688 1854 -139780 1708 1847 -139780 1678 1698 -139780 1708 1760 -139780 1760 1847 -139780 1680 1772 -139780 1669 1754 -139800 1549 1600 -139800 1600 1519 -139800 1642 1643 -139800 1643 1704 -139800 1696 1920 -139800 1707 1764 -139800 1825 1525 -139800 1600 1525 -139800 1857 1441 -139800 1921 1462 -139800 1599 1791 -139800 1623 1532 -139800 1642 1704 -139800 1538 1501 -139800 1550 1527 -139800 1688 1854 -139800 1708 1847 -139800 1678 1698 -139800 1708 1760 -139800 1760 1847 -139800 1680 1772 -139800 1549 1525 -139800 1669 1754 -139820 1546 1459 -139820 1549 1825 -139820 1600 1525 -139820 1857 1441 -139820 1921 1462 -139820 1501 1524 -139820 1599 1791 -139820 1623 1532 -139820 1642 1704 -139820 1825 1519 -139820 1538 1501 -139820 1550 1527 -139820 1688 1854 -139820 1708 1847 -139820 1678 1698 -139820 1708 1760 -139820 1760 1847 -139820 1680 1772 -139820 1549 1525 -139820 1669 1754 -139840 1599 1791 -139840 1606 1532 -139840 1623 1532 -139840 1642 1704 -139840 1825 1525 -139840 1825 1519 -139840 1538 1501 -139840 1550 1527 -139840 1688 1854 -139840 1708 1847 -139840 1678 1698 -139840 1708 1760 -139840 1760 1847 -139840 1680 1772 -139840 1549 1525 -139840 1669 1754 -139860 1606 1532 -139860 1623 1532 -139860 1718 1889 -139860 1501 1524 -139860 1642 1704 -139860 1825 1525 -139860 1825 1519 -139860 1538 1501 -139860 1550 1527 -139860 1688 1854 -139860 1708 1847 -139860 1678 1698 -139860 1708 1760 -139860 1760 1847 -139860 1707 1764 -139860 1680 1772 -139860 1549 1525 -139860 1669 1754 -139880 1600 1525 -139880 1642 1704 -139880 1825 1525 -139880 1825 1519 -139880 1538 1501 -139880 1550 1527 -139880 1688 1854 -139880 1708 1847 -139880 1678 1698 -139880 1708 1760 -139880 1760 1847 -139880 1707 1764 -139880 1680 1772 -139880 1549 1525 -139880 1669 1754 -139900 1546 1606 -139900 1623 1503 -139900 1857 1441 -139900 1600 1519 -139900 1642 1704 -139900 1712 1894 -139900 1825 1525 -139900 1825 1519 -139900 1538 1501 -139900 1550 1527 -139900 1688 1854 -139900 1708 1847 -139900 1678 1698 -139900 1708 1760 -139900 1760 1847 -139900 1707 1764 -139900 1680 1772 -139900 1599 1791 -139900 1549 1525 -139900 1669 1754 -139920 1549 1600 -139920 1600 1525 -139920 1600 1519 -139920 1642 1704 -139920 1712 1894 -139920 1825 1525 -139920 1825 1519 -139920 1887 1516 -139920 1538 1501 -139920 1550 1527 -139920 1825 1831 -139920 1440 1477 -139920 1688 1854 -139920 1708 1847 -139920 1598 1684 -139920 1678 1698 -139920 1708 1760 -139920 1760 1847 -139920 1707 1764 -139920 1680 1772 -139920 1599 1791 -139920 1549 1525 -139920 1669 1754 -139940 1538 1501 -139940 1550 1527 -139940 1617 1532 -139940 1643 1704 -139940 1734 1894 -139940 1792 1885 -139940 1825 1831 -139940 1898 1440 -139940 1440 1477 -139940 1623 1532 -139940 1519 1525 -139940 1688 1854 -139940 1708 1847 -139940 1598 1684 -139940 1678 1698 -139940 1708 1760 -139940 1760 1847 -139940 1707 1764 -139940 1680 1772 -139940 1599 1791 -139940 1549 1525 -139940 1669 1754 -139960 1546 1606 -139960 1591 1858 -139960 1623 1532 -139960 1702 1901 -139960 1898 1477 -139960 1519 1525 -139960 1688 1854 -139960 1708 1847 -139960 1598 1684 -139960 1678 1698 -139960 1708 1760 -139960 1760 1847 -139960 1707 1764 -139960 1680 1772 -139960 1599 1791 -139960 1549 1525 -139960 1669 1754 -139980 1546 1459 -139980 1558 1468 -139980 1825 1831 -139980 1688 1854 -139980 1915 1473 -139980 1600 1525 -139980 1708 1847 -139980 1598 1684 -139980 1678 1698 -139980 1708 1760 -139980 1760 1847 -139980 1707 1764 -139980 1680 1772 -139980 1599 1791 -139980 1549 1525 -139980 1669 1754 -140000 1600 1519 -140000 1688 1854 -140000 1915 1473 -140000 1546 1606 -140000 1549 1600 -140000 1600 1525 -140000 1609 1883 -140000 1708 1847 -140000 1598 1684 -140000 1678 1698 -140000 1708 1760 -140000 1760 1847 -140000 1707 1764 -140000 1680 1772 -140000 1599 1791 -140000 1549 1525 -140000 1669 1754 -140020 1538 1524 -140020 1546 1606 -140020 1549 1600 -140020 1600 1525 -140020 1609 1883 -140020 1642 1704 -140020 1708 1787 -140020 1708 1847 -140020 1598 1684 -140020 1678 1698 -140020 1708 1760 -140020 1789 1519 -140020 1831 1519 -140020 1760 1787 -140020 1760 1847 -140020 1803 1519 -140020 1803 1831 -140020 1707 1764 -140020 1538 1501 -140020 1680 1772 -140020 1599 1791 -140020 1549 1525 -140020 1669 1754 -140040 1598 1684 -140040 1606 1459 -140040 1678 1698 -140040 1708 1760 -140040 1757 1493 -140040 1789 1519 -140040 1831 1519 -140040 1760 1787 -140040 1760 1847 -140040 1803 1519 -140040 1803 1831 -140040 1857 1441 -140040 1707 1764 -140040 1538 1501 -140040 1680 1772 -140040 1599 1791 -140040 1549 1525 -140040 1924 1532 -140040 1669 1754 -140060 1549 1600 -140060 1555 1592 -140060 1600 1831 -140060 1708 1787 -140060 1749 1757 -140060 1760 1787 -140060 1760 1847 -140060 1787 1847 -140060 1803 1519 -140060 1803 1525 -140060 1803 1831 -140060 1857 1441 -140060 1609 1767 -140060 1546 1606 -140060 1707 1764 -140060 1538 1501 -140060 1519 1525 -140060 1680 1772 -140060 1599 1791 -140060 1549 1525 -140060 1617 1441 -140060 1924 1532 -140060 1669 1754 -140080 1550 1527 -140080 1609 1767 -140080 1630 1438 -140080 1546 1606 -140080 1678 1698 -140080 1707 1764 -140080 1538 1501 -140080 1519 1525 -140080 1680 1772 -140080 1599 1791 -140080 1549 1525 -140080 1623 1532 -140080 1617 1441 -140080 1924 1532 -140080 1669 1754 -140100 1546 1606 -140100 1549 1519 -140100 1552 1582 -140100 1592 1717 -140100 1678 1698 -140100 1688 1854 -140100 1707 1764 -140100 1538 1501 -140100 1519 1525 -140100 1680 1772 -140100 1599 1791 -140100 1549 1525 -140100 1623 1924 -140100 1623 1532 -140100 1617 1441 -140100 1924 1532 -140100 1669 1754 -140120 1538 1501 -140120 1549 1757 -140120 1642 1704 -140120 1519 1525 -140120 1680 1772 -140120 1757 1825 -140120 1825 1519 -140120 1599 1791 -140120 1549 1525 -140120 1550 1527 -140120 1623 1924 -140120 1623 1532 -140120 1617 1441 -140120 1924 1532 -140120 1669 1754 -140140 1680 1772 -140140 1707 1764 -140140 1749 1825 -140140 1757 1825 -140140 1757 1519 -140140 1825 1519 -140140 1599 1791 -140140 1549 1525 -140140 1550 1527 -140140 1623 1924 -140140 1623 1532 -140140 1617 1441 -140140 1924 1532 -140140 1669 1754 -140160 1549 1600 -140160 1606 1924 -140160 1857 1441 -140160 1898 1477 -140160 1599 1791 -140160 1549 1525 -140160 1550 1527 -140160 1623 1924 -140160 1623 1532 -140160 1698 1707 -140160 1617 1441 -140160 1924 1532 -140160 1698 1764 -140160 1669 1754 -140180 1599 1791 -140180 1825 1512 -140180 1549 1525 -140180 1549 1519 -140180 1550 1527 -140180 1623 1924 -140180 1623 1532 -140180 1698 1707 -140180 1546 1685 -140180 1617 1441 -140180 1924 1532 -140180 1698 1764 -140180 1519 1525 -140180 1669 1754 -140200 1549 1525 -140200 1549 1519 -140200 1630 1438 -140200 1550 1527 -140200 1582 1524 -140200 1623 1924 -140200 1623 1532 -140200 1698 1707 -140200 1546 1685 -140200 1617 1441 -140200 1924 1532 -140200 1924 1478 -140200 1698 1764 -140200 1600 1525 -140200 1680 1772 -140200 1519 1525 -140200 1582 1501 -140200 1669 1754 -140220 1550 1527 -140220 1582 1524 -140220 1599 1791 -140220 1606 1459 -140220 1606 1532 -140220 1617 1857 -140220 1623 1924 -140220 1623 1532 -140220 1634 1734 -140220 1698 1707 -140220 1734 1491 -140220 1825 1512 -140220 1546 1685 -140220 1606 1924 -140220 1617 1441 -140220 1924 1532 -140220 1924 1478 -140220 1698 1764 -140220 1600 1525 -140220 1680 1772 -140220 1519 1525 -140220 1582 1501 -140220 1669 1754 -140240 1546 1685 -140240 1600 1519 -140240 1606 1924 -140240 1617 1441 -140240 1789 1532 -140240 1898 1477 -140240 1924 1532 -140240 1924 1478 -140240 1478 1532 -140240 1698 1764 -140240 1600 1525 -140240 1688 1854 -140240 1680 1772 -140240 1519 1525 -140240 1582 1501 -140240 1669 1754 -140260 1582 1524 -140260 1698 1707 -140260 1702 1901 -140260 1734 1491 -140260 1924 1532 -140260 1924 1478 -140260 1478 1532 -140260 1592 1717 -140260 1634 1734 -140260 1698 1764 -140260 1600 1525 -140260 1684 1898 -140260 1688 1854 -140260 1599 1791 -140260 1680 1772 -140260 1519 1525 -140260 1582 1501 -140260 1825 1525 -140260 1669 1754 -140280 1541 1734 -140280 1563 1592 -140280 1563 1717 -140280 1592 1717 -140280 1617 1857 -140280 1630 1485 -140280 1634 1734 -140280 1698 1764 -140280 1600 1525 -140280 1684 1898 -140280 1688 1854 -140280 1599 1791 -140280 1680 1772 -140280 1519 1525 -140280 1582 1501 -140280 1606 1924 -140280 1825 1525 -140280 1669 1754 -140300 1563 1598 -140300 1582 1524 -140300 1600 1525 -140300 1617 1441 -140300 1684 1898 -140300 1688 1854 -140300 1707 1764 -140300 1825 1519 -140300 1924 1478 -140300 1599 1791 -140300 1680 1772 -140300 1789 1924 -140300 1642 1704 -140300 1519 1525 -140300 1582 1501 -140300 1606 1924 -140300 1825 1525 -140300 1698 1707 -140300 1669 1754 -140320 1592 1717 -140320 1599 1791 -140320 1606 1532 -140320 1680 1772 -140320 1789 1924 -140320 1642 1704 -140320 1789 1532 -140320 1924 1532 -140320 1684 1477 -140320 1519 1525 -140320 1582 1501 -140320 1606 1924 -140320 1825 1525 -140320 1698 1707 -140320 1669 1754 -140340 1582 1524 -140340 1600 1519 -140340 1606 1789 -140340 1642 1704 -140340 1789 1532 -140340 1825 1519 -140340 1924 1532 -140340 1924 1478 -140340 1684 1477 -140340 1519 1525 -140340 1582 1501 -140340 1606 1924 -140340 1825 1525 -140340 1707 1764 -140340 1698 1707 -140340 1669 1754 -140360 1684 1477 -140360 1734 1887 -140360 1643 1704 -140360 1519 1525 -140360 1582 1501 -140360 1617 1441 -140360 1680 1772 -140360 1606 1924 -140360 1688 1854 -140360 1825 1525 -140360 1707 1764 -140360 1698 1707 -140360 1669 1754 -140380 1582 1524 -140380 1600 1519 -140380 1643 1704 -140380 1519 1525 -140380 1582 1501 -140380 1599 1791 -140380 1600 1825 -140380 1617 1441 -140380 1680 1772 -140380 1550 1527 -140380 1648 1696 -140380 1648 1465 -140380 1648 1735 -140380 1696 1465 -140380 1735 1465 -140380 1606 1924 -140380 1688 1854 -140380 1825 1525 -140380 1707 1764 -140380 1825 1519 -140380 1698 1707 -140380 1669 1754 -140400 1582 1501 -140400 1599 1791 -140400 1600 1825 -140400 1617 1441 -140400 1680 1772 -140400 1702 1901 -140400 1550 1527 -140400 1648 1696 -140400 1648 1465 -140400 1648 1735 -140400 1696 1465 -140400 1696 1735 -140400 1735 1465 -140400 1501 1524 -140400 1606 1924 -140400 1688 1854 -140400 1825 1525 -140400 1707 1764 -140400 1825 1519 -140400 1698 1707 -140400 1669 1754 -140420 1550 1527 -140420 1617 1857 -140420 1648 1696 -140420 1648 1465 -140420 1648 1735 -140420 1696 1465 -140420 1696 1735 -140420 1698 1764 -140420 1735 1465 -140420 1898 1477 -140420 1924 1478 -140420 1519 1525 -140420 1706 1775 -140420 1501 1524 -140420 1606 1924 -140420 1688 1854 -140420 1825 1525 -140420 1707 1764 -140420 1825 1519 -140420 1698 1707 -140420 1669 1754 -140440 1592 1717 -140440 1683 1731 -140440 1706 1775 -140440 1775 1882 -140440 1915 1473 -140440 1501 1524 -140440 1606 1924 -140440 1688 1854 -140440 1825 1525 -140440 1707 1764 -140440 1825 1519 -140440 1698 1707 -140440 1669 1754 -140460 1617 1857 -140460 1698 1764 -140460 1599 1791 -140460 1731 1459 -140460 1606 1924 -140460 1688 1854 -140460 1825 1525 -140460 1707 1764 -140460 1825 1519 -140460 1698 1707 -140460 1669 1754 -140480 1599 1791 -140480 1687 1734 -140480 1731 1459 -140480 1841 1901 -140480 1854 1459 -140480 1600 1825 -140480 1606 1924 -140480 1688 1854 -140480 1731 1854 -140480 1825 1525 -140480 1707 1764 -140480 1825 1519 -140480 1857 1441 -140480 1698 1707 -140480 1669 1754 -140500 1600 1825 -140500 1606 1924 -140500 1688 1731 -140500 1688 1854 -140500 1702 1841 -140500 1731 1854 -140500 1825 1525 -140500 1698 1764 -140500 1702 1901 -140500 1707 1764 -140500 1825 1519 -140500 1857 1441 -140500 1698 1707 -140500 1669 1754 -140520 1599 1791 -140520 1680 1772 -140520 1687 1901 -140520 1687 1702 -140520 1698 1764 -140520 1702 1901 -140520 1707 1764 -140520 1712 1866 -140520 1825 1519 -140520 1857 1441 -140520 1698 1707 -140520 1841 1901 -140520 1669 1754 -140540 1698 1707 -140540 1712 1435 -140540 1825 1525 -140540 1441 1459 -140540 1606 1924 -140540 1841 1901 -140540 1688 1854 -140540 1669 1754 -140560 1556 1452 -140560 1563 1698 -140560 1606 1924 -140560 1617 1857 -140560 1687 1841 -140560 1694 1707 -140560 1702 1841 -140560 1835 1452 -140560 1841 1901 -140560 1440 1448 -140560 1688 1854 -140560 1857 1441 -140560 1617 1441 -140560 1669 1754 -140580 1591 1858 -140580 1687 1702 -140580 1688 1854 -140580 1707 1764 -140580 1712 1448 -140580 1718 1492 -140580 1857 1441 -140580 1880 1464 -140580 1617 1441 -140580 1698 1764 -140580 1451 1529 -140580 1600 1525 -140580 1669 1754 -140600 1551 1835 -140600 1556 1448 -140600 1556 1915 -140600 1563 1694 -140600 1592 1694 -140600 1606 1924 -140600 1617 1441 -140600 1698 1764 -140600 1702 1448 -140600 1451 1529 -140600 1541 1555 -140600 1698 1707 -140600 1552 1768 -140600 1600 1525 -140600 1563 1592 -140600 1669 1754 -140620 1541 1555 -140620 1551 1792 -140620 1551 1427 -140620 1551 1452 -140620 1698 1707 -140620 1707 1764 -140620 1792 1452 -140620 1792 1885 -140620 1841 1901 -140620 1924 1478 -140620 1468 1516 -140620 1552 1768 -140620 1600 1525 -140620 1617 1857 -140620 1857 1441 -140620 1563 1592 -140620 1669 1754 -140640 1552 1768 -140640 1556 1448 -140640 1563 1618 -140640 1591 1440 -140640 1600 1525 -140640 1606 1924 -140640 1921 1462 -140640 1556 1587 -140640 1580 1501 -140640 1617 1857 -140640 1617 1441 -140640 1591 1858 -140640 1857 1441 -140640 1563 1592 -140640 1669 1754 -140660 1551 1663 -140660 1556 1587 -140660 1580 1680 -140660 1580 1501 -140660 1617 1857 -140660 1617 1441 -140660 1858 1440 -140660 1427 1485 -140660 1541 1555 -140660 1591 1858 -140660 1857 1441 -140660 1563 1592 -140660 1669 1754 -140680 1541 1555 -140680 1558 1516 -140680 1580 1772 -140680 1591 1872 -140680 1591 1858 -140680 1680 1772 -140680 1687 1901 -140680 1269 1452 -140680 1468 1516 -140680 1501 1503 -140680 1551 1440 -140680 1825 1888 -140680 1525 1519 -140680 1698 1764 -140680 1857 1441 -140680 1563 1592 -140680 1698 1707 -140680 1707 1764 -140680 1669 1754 -140700 1551 1440 -140700 1501 1659 -140700 1501 1598 -140700 1473 1485 -140700 1825 1888 -140700 1525 1519 -140700 1563 1717 -140700 1698 1764 -140700 1717 1592 -140700 1600 1519 -140700 1857 1441 -140700 1836 1563 -140700 1563 1592 -140700 1698 1707 -140700 1707 1764 -140700 1669 1754 -140720 1525 1519 -140720 1563 1717 -140720 1564 1825 -140720 1541 1555 -140720 1698 1764 -140720 1617 1441 -140720 1717 1592 -140720 1600 1519 -140720 1857 1441 -140720 1836 1563 -140720 1563 1592 -140720 1580 1772 -140720 1698 1707 -140720 1845 1857 -140720 1707 1764 -140720 1669 1754 -140740 1836 1563 -140740 1698 1845 -140740 1591 1872 -140740 1591 1858 -140740 1825 1888 -140740 1563 1592 -140740 1580 1772 -140740 1698 1707 -140740 1698 1617 -140740 1845 1857 -140740 1707 1857 -140740 1707 1764 -140740 1707 1617 -140740 1857 1617 -140740 1669 1754 -140760 1580 1680 -140760 1591 1858 -140760 1825 1888 -140760 1764 1845 -140760 1841 1901 -140760 1541 1555 -140760 1680 1772 -140760 1702 1901 -140760 1519 1525 -140760 1563 1592 -140760 1580 1772 -140760 1698 1764 -140760 1698 1707 -140760 1698 1617 -140760 1845 1857 -140760 1845 1617 -140760 1698 1857 -140760 1707 1857 -140760 1707 1764 -140760 1707 1617 -140760 1857 1764 -140760 1857 1617 -140760 1617 1764 -140760 1669 1754 -140780 1707 1845 -140780 1841 1901 -140780 1541 1555 -140780 1680 1772 -140780 1702 1901 -140780 1825 1519 -140780 1924 1501 -140780 1519 1525 -140780 1825 1525 -140780 1451 1529 -140780 1563 1592 -140780 1580 1772 -140780 1698 1764 -140780 1698 1707 -140780 1698 1617 -140780 1845 1857 -140780 1845 1617 -140780 1698 1857 -140780 1707 1857 -140780 1707 1764 -140780 1707 1617 -140780 1857 1764 -140780 1857 1617 -140780 1617 1764 -140780 1669 1754 -140800 1541 1555 -140800 1680 1772 -140800 1702 1901 -140800 1825 1519 -140800 1924 1501 -140800 1441 1457 -140800 1468 1516 -140800 1519 1525 -140800 1825 1525 -140800 1460 1499 -140800 1451 1529 -140800 1563 1592 -140800 1580 1772 -140800 1698 1764 -140800 1698 1707 -140800 1698 1617 -140800 1845 1857 -140800 1845 1617 -140800 1698 1857 -140800 1707 1857 -140800 1707 1764 -140800 1707 1617 -140800 1857 1764 -140800 1857 1617 -140800 1617 1764 -140800 1669 1754 -140820 1825 1525 -140820 1460 1499 -140820 1451 1529 -140820 1764 1845 -140820 1792 1885 -140820 1924 1478 -140820 1563 1592 -140820 1580 1772 -140820 1698 1764 -140820 1698 1707 -140820 1698 1617 -140820 1845 1857 -140820 1845 1617 -140820 1698 1857 -140820 1707 1857 -140820 1707 1764 -140820 1707 1617 -140820 1857 1764 -140820 1857 1617 -140820 1617 1764 -140820 1669 1754 -140840 1699 1888 -140840 1764 1845 -140840 1792 1501 -140840 1898 1477 -140840 1924 1501 -140840 1478 1501 -140840 1792 1885 -140840 1924 1478 -140840 1563 1592 -140840 1580 1772 -140840 1698 1764 -140840 1698 1707 -140840 1698 1617 -140840 1845 1857 -140840 1845 1617 -140840 1698 1857 -140840 1707 1857 -140840 1707 1764 -140840 1707 1617 -140840 1857 1764 -140840 1857 1617 -140840 1617 1764 -140840 1669 1754 -140860 1792 1885 -140860 1924 1478 -140860 1440 1269 -140860 1448 1507 -140860 1835 1606 -140860 1680 1580 -140860 1680 1772 -140860 1818 1663 -140860 1519 1525 -140860 1563 1592 -140860 1580 1772 -140860 1698 1764 -140860 1698 1707 -140860 1698 1617 -140860 1845 1857 -140860 1845 1617 -140860 1698 1857 -140860 1707 1857 -140860 1707 1764 -140860 1707 1617 -140860 1857 1764 -140860 1857 1617 -140860 1617 1764 -140860 1669 1754 -140880 1835 1606 -140880 1924 1501 -140880 1680 1580 -140880 1680 1772 -140880 1818 1663 -140880 1791 1577 -140880 1845 1764 -140880 1555 1541 -140880 1460 1499 -140880 1519 1525 -140880 1563 1592 -140880 1580 1772 -140880 1477 1898 -140880 1698 1764 -140880 1698 1707 -140880 1698 1617 -140880 1845 1857 -140880 1845 1617 -140880 1698 1857 -140880 1707 1857 -140880 1707 1764 -140880 1707 1617 -140880 1857 1764 -140880 1857 1617 -140880 1617 1764 -140880 1669 1754 -140900 1555 1541 -140900 1460 1499 -140900 1519 1525 -140900 1563 1592 -140900 1882 1512 -140900 1580 1772 -140900 1477 1898 -140900 1698 1764 -140900 1698 1707 -140900 1698 1617 -140900 1845 1857 -140900 1845 1617 -140900 1698 1857 -140900 1707 1857 -140900 1707 1764 -140900 1707 1617 -140900 1857 1764 -140900 1857 1617 -140900 1617 1764 -140900 1669 1754 -140920 1924 1478 -140920 1563 1839 -140920 1600 1825 -140920 1563 1592 -140920 1882 1512 -140920 1680 1580 -140920 1694 1888 -140920 1580 1772 -140920 1503 1659 -140920 1845 1764 -140920 1477 1898 -140920 1698 1764 -140920 1698 1707 -140920 1698 1617 -140920 1845 1857 -140920 1845 1617 -140920 1698 1857 -140920 1707 1857 -140920 1707 1764 -140920 1707 1617 -140920 1857 1764 -140920 1857 1617 -140920 1617 1764 -140920 1669 1754 -140940 1563 1592 -140940 1882 1512 -140940 1712 1661 -140940 1718 1889 -140940 1680 1580 -140940 1694 1888 -140940 1580 1772 -140940 1503 1659 -140940 1845 1764 -140940 1710 1898 -140940 1477 1898 -140940 1710 1477 -140940 1698 1764 -140940 1698 1707 -140940 1698 1617 -140940 1845 1857 -140940 1845 1617 -140940 1698 1857 -140940 1707 1857 -140940 1707 1764 -140940 1707 1617 -140940 1857 1764 -140940 1857 1617 -140940 1617 1764 -140940 1669 1754 -140960 1551 1269 -140960 1680 1580 -140960 1694 1888 -140960 1702 1901 -140960 1580 1772 -140960 1503 1659 -140960 1845 1764 -140960 1710 1898 -140960 1477 1898 -140960 1710 1477 -140960 1698 1764 -140960 1698 1707 -140960 1698 1617 -140960 1845 1857 -140960 1845 1617 -140960 1698 1857 -140960 1707 1857 -140960 1707 1764 -140960 1707 1617 -140960 1857 1764 -140960 1857 1617 -140960 1617 1764 -140960 1669 1754 -140980 1580 1503 -140980 1845 1764 -140980 1710 1898 -140980 1477 1898 -140980 1710 1477 -140980 1698 1764 -140980 1698 1707 -140980 1698 1617 -140980 1845 1857 -140980 1845 1617 -140980 1698 1857 -140980 1707 1857 -140980 1707 1764 -140980 1707 1617 -140980 1857 1764 -140980 1857 1617 -140980 1617 1764 -140980 1669 1754 -141000 1794 1699 -141000 1707 1845 -141000 1845 1764 -141000 1600 1598 -141000 1598 1525 -141000 1551 1440 -141000 1563 1592 -141000 1710 1898 -141000 1477 1898 -141000 1710 1477 -141000 1698 1764 -141000 1698 1707 -141000 1698 1617 -141000 1845 1857 -141000 1845 1617 -141000 1698 1857 -141000 1707 1857 -141000 1707 1764 -141000 1707 1617 -141000 1857 1764 -141000 1857 1617 -141000 1617 1764 -141000 1669 1754 -141020 1551 1440 -141020 1551 1269 -141020 1563 1592 -141020 1564 1898 -141020 1600 1825 -141020 1694 1888 -141020 1710 1898 -141020 1477 1898 -141020 1564 1477 -141020 1564 1710 -141020 1710 1477 -141020 1698 1764 -141020 1698 1707 -141020 1698 1617 -141020 1845 1857 -141020 1845 1617 -141020 1698 1857 -141020 1707 1857 -141020 1707 1764 -141020 1707 1617 -141020 1857 1764 -141020 1857 1617 -141020 1617 1764 -141020 1718 1889 -141020 1669 1754 -141040 1920 1659 -141040 1707 1845 -141040 1503 1659 -141040 1600 1825 -141040 1598 1525 -141040 1694 1888 -141040 1710 1898 -141040 1477 1898 -141040 1564 1477 -141040 1564 1710 -141040 1710 1477 -141040 1718 1492 -141040 1492 1889 -141040 1698 1764 -141040 1698 1707 -141040 1698 1617 -141040 1845 1857 -141040 1845 1617 -141040 1698 1857 -141040 1707 1857 -141040 1707 1764 -141040 1707 1617 -141040 1857 1764 -141040 1857 1617 -141040 1617 1764 -141040 1718 1889 -141040 1669 1754 -141060 1841 1901 -141060 1600 1825 -141060 1702 1901 -141060 1598 1525 -141060 1551 1269 -141060 1694 1888 -141060 1710 1898 -141060 1845 1764 -141060 1477 1898 -141060 1564 1477 -141060 1564 1710 -141060 1710 1477 -141060 1519 1525 -141060 1718 1492 -141060 1492 1889 -141060 1698 1764 -141060 1698 1707 -141060 1698 1617 -141060 1845 1857 -141060 1845 1617 -141060 1698 1857 -141060 1707 1857 -141060 1707 1764 -141060 1707 1617 -141060 1857 1764 -141060 1857 1617 -141060 1617 1764 -141060 1718 1889 -141060 1598 1519 -141060 1669 1754 -141080 1702 1841 -141080 1702 1901 -141080 1707 1845 -141080 1598 1525 -141080 1551 1269 -141080 1694 1888 -141080 1710 1898 -141080 1845 1764 -141080 1477 1898 -141080 1564 1477 -141080 1564 1710 -141080 1710 1477 -141080 1519 1525 -141080 1718 1492 -141080 1492 1889 -141080 1698 1764 -141080 1698 1707 -141080 1698 1617 -141080 1845 1857 -141080 1845 1617 -141080 1698 1857 -141080 1707 1857 -141080 1707 1764 -141080 1707 1617 -141080 1857 1764 -141080 1857 1617 -141080 1617 1764 -141080 1718 1889 -141080 1598 1519 -141080 1669 1754 -141100 1551 1269 -141100 1694 1888 -141100 1710 1898 -141100 1845 1764 -141100 1477 1898 -141100 1564 1477 -141100 1564 1710 -141100 1710 1477 -141100 1519 1525 -141100 1718 1492 -141100 1492 1889 -141100 1698 1764 -141100 1698 1707 -141100 1698 1617 -141100 1845 1857 -141100 1845 1617 -141100 1698 1857 -141100 1707 1857 -141100 1707 1764 -141100 1707 1617 -141100 1857 1764 -141100 1857 1617 -141100 1617 1764 -141100 1718 1889 -141100 1598 1519 -141100 1669 1754 -141120 1707 1845 -141120 1580 1503 -141120 1564 1898 -141120 1710 1898 -141120 1845 1764 -141120 1477 1898 -141120 1882 1898 -141120 1564 1477 -141120 1564 1710 -141120 1710 1477 -141120 1519 1525 -141120 1825 1525 -141120 1718 1492 -141120 1598 1525 -141120 1492 1889 -141120 1698 1764 -141120 1698 1707 -141120 1698 1617 -141120 1845 1857 -141120 1845 1617 -141120 1698 1857 -141120 1707 1857 -141120 1707 1764 -141120 1707 1617 -141120 1857 1764 -141120 1857 1617 -141120 1617 1764 -141120 1718 1889 -141120 1598 1519 -141120 1669 1754 -141140 1564 1477 -141140 1564 1710 -141140 1441 1501 -141140 1710 1477 -141140 1519 1525 -141140 1825 1525 -141140 1718 1492 -141140 1598 1525 -141140 1492 1889 -141140 1452 1512 -141140 1698 1764 -141140 1698 1707 -141140 1698 1617 -141140 1845 1857 -141140 1845 1617 -141140 1698 1857 -141140 1707 1857 -141140 1707 1764 -141140 1707 1617 -141140 1857 1764 -141140 1857 1617 -141140 1617 1764 -141140 1718 1889 -141140 1598 1519 -141140 1669 1754 -141160 1555 1541 -141160 1825 1525 -141160 1718 1492 -141160 1598 1525 -141160 1492 1889 -141160 1452 1512 -141160 1845 1764 -141160 1698 1764 -141160 1698 1707 -141160 1698 1617 -141160 1845 1857 -141160 1845 1617 -141160 1698 1857 -141160 1707 1857 -141160 1707 1764 -141160 1707 1617 -141160 1857 1764 -141160 1857 1617 -141160 1617 1764 -141160 1792 1885 -141160 1718 1889 -141160 1598 1519 -141160 1669 1754 -141180 1452 1512 -141180 1845 1764 -141180 1698 1764 -141180 1698 1707 -141180 1698 1617 -141180 1845 1857 -141180 1845 1617 -141180 1698 1857 -141180 1707 1857 -141180 1707 1764 -141180 1707 1617 -141180 1857 1764 -141180 1857 1617 -141180 1617 1764 -141180 1792 1885 -141180 1718 1889 -141180 1598 1519 -141180 1669 1754 -141200 1579 1717 -141200 1712 1661 -141200 1845 1764 -141200 1598 1525 -141200 1698 1764 -141200 1698 1707 -141200 1698 1617 -141200 1845 1857 -141200 1845 1617 -141200 1698 1857 -141200 1707 1857 -141200 1707 1764 -141200 1707 1617 -141200 1857 1764 -141200 1857 1617 -141200 1617 1764 -141200 1792 1885 -141200 1718 1889 -141200 1598 1519 -141200 1669 1754 -141220 1551 1269 -141220 1531 1599 -141220 1598 1525 -141220 1604 1663 -141220 1519 1525 -141220 1698 1764 -141220 1698 1707 -141220 1698 1617 -141220 1845 1857 -141220 1845 1617 -141220 1698 1857 -141220 1707 1857 -141220 1707 1764 -141220 1707 1617 -141220 1857 1764 -141220 1857 1617 -141220 1617 1764 -141220 1792 1885 -141220 1718 1889 -141220 1598 1519 -141220 1669 1754 -141240 1924 1478 -141240 1501 1694 -141240 1845 1764 -141240 1698 1764 -141240 1698 1707 -141240 1698 1617 -141240 1845 1857 -141240 1845 1617 -141240 1698 1857 -141240 1707 1857 -141240 1707 1764 -141240 1707 1617 -141240 1857 1764 -141240 1857 1617 -141240 1617 1764 -141240 1792 1885 -141240 1718 1889 -141240 1598 1519 -141240 1669 1754 -141260 1707 1845 -141260 1683 1503 -141260 1541 1555 -141260 1825 1600 -141260 1825 1598 -141260 1845 1764 -141260 1841 1901 -141260 1698 1764 -141260 1698 1707 -141260 1698 1617 -141260 1845 1857 -141260 1845 1617 -141260 1698 1857 -141260 1707 1857 -141260 1707 1764 -141260 1707 1617 -141260 1857 1764 -141260 1857 1617 -141260 1617 1764 -141260 1792 1885 -141260 1718 1889 -141260 1598 1519 -141260 1669 1754 -141280 1551 1269 -141280 1841 1901 -141280 1924 1478 -141280 1437 1845 -141280 1598 1600 -141280 1600 1519 -141280 1698 1764 -141280 1698 1707 -141280 1698 1617 -141280 1702 1841 -141280 1845 1857 -141280 1845 1617 -141280 1437 1764 -141280 1437 1617 -141280 1698 1857 -141280 1698 1599 -141280 1707 1857 -141280 1707 1764 -141280 1707 1617 -141280 1857 1764 -141280 1857 1617 -141280 1617 1764 -141280 1792 1885 -141280 1718 1889 -141280 1598 1519 -141280 1669 1754 -141300 1707 1599 -141300 1924 1478 -141300 1669 1531 -141300 1684 1501 -141300 1437 1845 -141300 1457 1599 -141300 1598 1600 -141300 1600 1519 -141300 1698 1764 -141300 1698 1707 -141300 1698 1617 -141300 1698 1845 -141300 1702 1841 -141300 1845 1857 -141300 1845 1764 -141300 1845 1707 -141300 1845 1617 -141300 1437 1857 -141300 1437 1698 -141300 1437 1764 -141300 1437 1707 -141300 1437 1617 -141300 1437 1599 -141300 1698 1857 -141300 1698 1599 -141300 1707 1857 -141300 1707 1764 -141300 1707 1617 -141300 1599 1857 -141300 1599 1617 -141300 1857 1764 -141300 1857 1617 -141300 1617 1764 -141300 1792 1885 -141300 1541 1555 -141300 1599 1764 -141300 1580 1531 -141300 1718 1889 -141300 1598 1519 -141300 1669 1754 -141320 1825 1598 -141320 1698 1764 -141320 1698 1707 -141320 1698 1617 -141320 1698 1845 -141320 1702 1841 -141320 1845 1857 -141320 1845 1764 -141320 1845 1707 -141320 1845 1617 -141320 1845 1599 -141320 1437 1857 -141320 1437 1698 -141320 1437 1764 -141320 1437 1707 -141320 1437 1617 -141320 1437 1599 -141320 1698 1857 -141320 1698 1599 -141320 1707 1857 -141320 1707 1764 -141320 1707 1617 -141320 1599 1857 -141320 1599 1617 -141320 1857 1764 -141320 1857 1617 -141320 1617 1764 -141320 1792 1885 -141320 1551 1269 -141320 1541 1555 -141320 1599 1764 -141320 1580 1531 -141320 1718 1889 -141320 1598 1519 -141320 1669 1754 -141340 1687 1901 -141340 1437 1857 -141340 1437 1698 -141340 1437 1764 -141340 1437 1707 -141340 1437 1617 -141340 1437 1599 -141340 1698 1857 -141340 1698 1599 -141340 1707 1857 -141340 1707 1764 -141340 1707 1617 -141340 1707 1599 -141340 1599 1857 -141340 1599 1617 -141340 1857 1764 -141340 1857 1617 -141340 1617 1764 -141340 1889 1579 -141340 1792 1885 -141340 1551 1269 -141340 1541 1555 -141340 1599 1764 -141340 1580 1531 -141340 1718 1889 -141340 1598 1519 -141340 1669 1754 -141360 1792 1885 -141360 1551 1269 -141360 1541 1555 -141360 1599 1764 -141360 1702 1841 -141360 1580 1531 -141360 1794 1825 -141360 1718 1889 -141360 1598 1600 -141360 1598 1519 -141360 1669 1754 -141380 1702 1841 -141380 1580 1531 -141380 1600 1519 -141380 1794 1825 -141380 1718 1889 -141380 1598 1600 -141380 1598 1519 -141380 1669 1754 -141400 1794 1825 -141400 1718 1889 -141400 1598 1600 -141400 1598 1519 -141400 1600 1525 -141400 1924 1478 -141400 1551 1269 -141400 1541 1659 -141400 1525 1519 -141400 1712 1661 -141400 1669 1754 -141420 1924 1478 -141420 1551 1269 -141420 1555 1541 -141420 1541 1659 -141420 1702 1901 -141420 1525 1519 -141420 1712 1661 -141420 1702 1841 -141420 1555 1659 -141420 1669 1754 -141440 1882 1599 -141440 1712 1661 -141440 1684 1598 -141440 1702 1841 -141440 1580 1463 -141440 1841 1901 -141440 1718 1889 -141440 1555 1659 -141440 1669 1754 -141460 1678 1889 -141460 1678 1718 -141460 1684 1598 -141460 1687 1901 -141460 1541 1659 -141460 1702 1841 -141460 1702 1901 -141460 1580 1463 -141460 1718 1503 -141460 1555 1541 -141460 1841 1901 -141460 1718 1889 -141460 1555 1659 -141460 1669 1754 -141480 1555 1541 -141480 1841 1901 -141480 1718 1889 -141480 1555 1659 -141480 1669 1754 -141500 1825 1525 -141500 1702 1841 -141500 1841 1901 -141500 1718 1889 -141500 1555 1659 -141500 1541 1659 -141500 1702 1901 -141500 1678 1888 -141500 1669 1754 -141520 1541 1555 -141520 1680 1740 -141520 1694 1525 -141520 1718 1889 -141520 1555 1659 -141520 1541 1659 -141520 1702 1901 -141520 1678 1888 -141520 1551 1269 -141520 1669 1754 -141540 1752 1766 -141540 1718 1889 -141540 1555 1659 -141540 1541 1659 -141540 1702 1901 -141540 1678 1888 -141540 1551 1269 -141540 1669 1754 -141560 1555 1659 -141560 1694 1525 -141560 1541 1659 -141560 1702 1901 -141560 1752 1683 -141560 1678 1888 -141560 1551 1269 -141560 1489 1767 -141560 1669 1754 -141580 1541 1555 -141580 1678 1888 -141580 1699 1772 -141580 1551 1269 -141580 1718 1889 -141580 1441 1489 -141580 1441 1767 -141580 1489 1767 -141580 1669 1754 -141600 1541 1659 -141600 1580 1463 -141600 1894 1766 -141600 1699 1772 -141600 1555 1659 -141600 1551 1269 -141600 1464 1683 -141600 1718 1889 -141600 1441 1489 -141600 1441 1767 -141600 1489 1767 -141600 1669 1754 -141620 1924 1478 -141620 1699 1772 -141620 1457 1918 -141620 1704 1643 -141620 1591 1889 -141620 1555 1659 -141620 1594 1475 -141620 1551 1269 -141620 1541 1555 -141620 1718 1591 -141620 1464 1683 -141620 1718 1889 -141620 1752 1712 -141620 1712 1767 -141620 1441 1489 -141620 1441 1767 -141620 1489 1767 -141620 1752 1767 -141620 1441 1712 -141620 1441 1752 -141620 1712 1489 -141620 1489 1752 -141620 1669 1754 -141640 1551 1440 -141640 1680 1684 -141640 1594 1475 -141640 1551 1269 -141640 1541 1555 -141640 1718 1591 -141640 1464 1683 -141640 1718 1889 -141640 1752 1712 -141640 1712 1767 -141640 1441 1489 -141640 1441 1767 -141640 1489 1767 -141640 1752 1767 -141640 1441 1712 -141640 1441 1752 -141640 1712 1489 -141640 1489 1752 -141640 1669 1754 -141660 1551 1269 -141660 1541 1555 -141660 1699 1772 -141660 1718 1591 -141660 1464 1683 -141660 1718 1889 -141660 1752 1712 -141660 1712 1767 -141660 1441 1489 -141660 1441 1767 -141660 1489 1767 -141660 1752 1767 -141660 1441 1712 -141660 1441 1752 -141660 1712 1489 -141660 1489 1752 -141660 1489 1766 -141660 1766 1767 -141660 1669 1754 -141680 1694 1835 -141680 1825 1600 -141680 1464 1683 -141680 1718 1889 -141680 1752 1712 -141680 1712 1767 -141680 1441 1489 -141680 1441 1767 -141680 1489 1767 -141680 1752 1767 -141680 1441 1712 -141680 1441 1766 -141680 1441 1752 -141680 1712 1766 -141680 1712 1489 -141680 1489 1752 -141680 1489 1766 -141680 1752 1766 -141680 1766 1767 -141680 1669 1754 -141700 1825 1531 -141700 1551 1269 -141700 1718 1889 -141700 1752 1712 -141700 1712 1767 -141700 1441 1489 -141700 1441 1767 -141700 1489 1767 -141700 1752 1767 -141700 1441 1712 -141700 1441 1766 -141700 1441 1752 -141700 1712 1766 -141700 1712 1489 -141700 1489 1752 -141700 1489 1766 -141700 1752 1766 -141700 1766 1767 -141700 1669 1754 -141720 1551 1269 -141720 1718 1889 -141720 1591 1889 -141720 1600 1531 -141720 1702 1901 -141720 1752 1712 -141720 1712 1767 -141720 1441 1489 -141720 1441 1767 -141720 1489 1767 -141720 1752 1767 -141720 1441 1712 -141720 1441 1766 -141720 1441 1752 -141720 1712 1766 -141720 1712 1489 -141720 1489 1752 -141720 1489 1766 -141720 1752 1766 -141720 1766 1767 -141720 1669 1754 -141740 1555 1541 -141740 1687 1841 -141740 1702 1901 -141740 1752 1712 -141740 1712 1767 -141740 1441 1489 -141740 1441 1767 -141740 1489 1767 -141740 1752 1767 -141740 1441 1712 -141740 1441 1766 -141740 1441 1752 -141740 1712 1766 -141740 1712 1489 -141740 1489 1752 -141740 1489 1766 -141740 1752 1766 -141740 1766 1767 -141740 1669 1754 -141760 1551 1269 -141760 1694 1599 -141760 1835 1531 -141760 1752 1712 -141760 1712 1767 -141760 1441 1489 -141760 1441 1767 -141760 1489 1767 -141760 1752 1767 -141760 1441 1712 -141760 1441 1766 -141760 1441 1752 -141760 1712 1766 -141760 1712 1489 -141760 1489 1752 -141760 1489 1766 -141760 1752 1766 -141760 1766 1767 -141760 1718 1889 -141760 1669 1754 -141780 1702 1835 -141780 1835 1531 -141780 1835 1901 -141780 1591 1889 -141780 1600 1531 -141780 1752 1712 -141780 1712 1767 -141780 1440 1269 -141780 1441 1489 -141780 1441 1767 -141780 1489 1767 -141780 1752 1767 -141780 1551 1440 -141780 1441 1712 -141780 1441 1766 -141780 1441 1752 -141780 1712 1766 -141780 1712 1489 -141780 1489 1752 -141780 1489 1766 -141780 1752 1766 -141780 1766 1767 -141780 1718 1889 -141780 1669 1754 -141800 1684 1901 -141800 1702 1901 -141800 1752 1712 -141800 1712 1767 -141800 1680 1767 -141800 1440 1269 -141800 1441 1489 -141800 1441 1767 -141800 1489 1767 -141800 1752 1767 -141800 1551 1440 -141800 1680 1441 -141800 1680 1766 -141800 1680 1712 -141800 1680 1489 -141800 1680 1752 -141800 1441 1712 -141800 1441 1766 -141800 1441 1752 -141800 1712 1766 -141800 1712 1489 -141800 1489 1752 -141800 1489 1766 -141800 1752 1766 -141800 1766 1767 -141800 1718 1889 -141800 1669 1754 -141820 1551 1269 -141820 1752 1712 -141820 1712 1767 -141820 1680 1767 -141820 1440 1269 -141820 1441 1489 -141820 1441 1767 -141820 1489 1767 -141820 1752 1767 -141820 1551 1440 -141820 1680 1441 -141820 1680 1766 -141820 1680 1712 -141820 1680 1489 -141820 1680 1752 -141820 1441 1712 -141820 1441 1766 -141820 1441 1752 -141820 1712 1766 -141820 1712 1489 -141820 1489 1752 -141820 1489 1766 -141820 1752 1766 -141820 1766 1767 -141820 1718 1889 -141820 1669 1754 -141840 1752 1712 -141840 1712 1767 -141840 1767 1882 -141840 1680 1767 -141840 1440 1269 -141840 1441 1489 -141840 1441 1767 -141840 1585 1767 -141840 1489 1767 -141840 1752 1767 -141840 1551 1440 -141840 1680 1441 -141840 1680 1766 -141840 1680 1585 -141840 1680 1712 -141840 1680 1489 -141840 1680 1752 -141840 1441 1712 -141840 1441 1766 -141840 1441 1585 -141840 1441 1752 -141840 1712 1766 -141840 1712 1585 -141840 1712 1489 -141840 1489 1752 -141840 1489 1766 -141840 1752 1766 -141840 1766 1767 -141840 1664 1821 -141840 1718 1889 -141840 1702 1901 -141840 1669 1754 -141860 1680 1767 -141860 1680 1882 -141860 1440 1269 -141860 1441 1489 -141860 1441 1767 -141860 1585 1767 -141860 1598 1503 -141860 1489 1767 -141860 1752 1767 -141860 1551 1440 -141860 1680 1441 -141860 1680 1766 -141860 1680 1585 -141860 1680 1712 -141860 1680 1489 -141860 1680 1752 -141860 1441 1712 -141860 1441 1766 -141860 1441 1585 -141860 1441 1752 -141860 1441 1882 -141860 1712 1766 -141860 1712 1585 -141860 1712 1489 -141860 1712 1882 -141860 1585 1489 -141860 1585 1752 -141860 1489 1752 -141860 1489 1766 -141860 1752 1766 -141860 1766 1767 -141860 1664 1821 -141860 1684 1591 -141860 1718 1889 -141860 1702 1901 -141860 1669 1754 -141880 1551 1440 -141880 1680 1441 -141880 1680 1766 -141880 1680 1585 -141880 1680 1712 -141880 1680 1489 -141880 1680 1752 -141880 1680 1599 -141880 1441 1712 -141880 1441 1766 -141880 1441 1585 -141880 1441 1752 -141880 1441 1882 -141880 1829 1835 -141880 1712 1766 -141880 1712 1585 -141880 1712 1489 -141880 1712 1752 -141880 1712 1882 -141880 1585 1766 -141880 1585 1489 -141880 1585 1752 -141880 1489 1752 -141880 1489 1766 -141880 1752 1766 -141880 1752 1882 -141880 1766 1767 -141880 1766 1882 -141880 1767 1882 -141880 1664 1821 -141880 1684 1591 -141880 1835 1486 -141880 1718 1889 -141880 1702 1901 -141880 1669 1754 -141900 1664 1821 -141900 1924 1478 -141900 1541 1555 -141900 1684 1591 -141900 1835 1486 -141900 1718 1889 -141900 1702 1901 -141900 1669 1754 -141920 1555 1466 -141920 1829 1486 -141920 1718 1889 -141920 1702 1901 -141920 1669 1754 -141940 1664 1821 -141940 1835 1531 -141940 1718 1599 -141940 1599 1889 -141940 1486 1531 -141940 1835 1486 -141940 1718 1889 -141940 1702 1901 -141940 1669 1754 -141960 1551 1440 -141960 1551 1269 -141960 1440 1269 -141960 1825 1463 -141960 1835 1512 -141960 1835 1486 -141960 1924 1478 -141960 1718 1889 -141960 1702 1901 -141960 1669 1754 -141980 1580 1463 -141980 1924 1478 -141980 1718 1889 -141980 1702 1901 -141980 1669 1754 -142000 1924 1478 -142000 1718 1889 -142000 1839 1901 -142000 1551 1269 -142000 1551 1598 -142000 1702 1901 -142000 1669 1754 -142020 1924 1580 -142020 1834 1630 -142020 1839 1901 -142020 1460 1499 -142020 1598 1269 -142020 1551 1269 -142020 1551 1598 -142020 1702 1901 -142020 1669 1754 -142040 1598 1269 -142040 1551 1269 -142040 1551 1598 -142040 1702 1901 -142040 1669 1754 -142060 1829 1512 -142060 1551 1269 -142060 1718 1889 -142060 1551 1598 -142060 1702 1901 -142060 1669 1754 -142080 1924 1478 -142080 1551 1269 -142080 1718 1889 -142080 1551 1598 -142080 1702 1901 -142080 1669 1754 -142100 1551 1269 -142100 1718 1889 -142100 1551 1598 -142100 1702 1901 -142100 1669 1754 -142120 1551 1269 -142120 1598 1269 -142120 1718 1889 -142120 1551 1598 -142120 1702 1901 -142120 1669 1754 -142140 1551 1269 -142140 1687 1841 -142140 1598 1269 -142140 1718 1889 -142140 1551 1598 -142140 1702 1901 -142140 1669 1754 -142160 1555 1880 -142160 1829 1599 -142160 1702 1839 -142160 1598 1269 -142160 1599 1512 -142160 1718 1889 -142160 1551 1598 -142160 1702 1901 -142160 1669 1754 -142180 1678 1718 -142180 1440 1889 -142180 1440 1718 -142180 1599 1512 -142180 1718 1889 -142180 1551 1598 -142180 1702 1901 -142180 1669 1754 -142200 1516 1468 -142200 1599 1512 -142200 1702 1839 -142200 1718 1889 -142200 1551 1598 -142200 1702 1901 -142200 1669 1754 -142220 1551 1269 -142220 1825 1789 -142220 1829 1512 -142220 1702 1839 -142220 1718 1889 -142220 1674 1819 -142220 1551 1598 -142220 1702 1901 -142220 1669 1754 -142240 1674 1819 -142240 1551 1598 -142240 1598 1269 -142240 1702 1901 -142240 1669 1754 -142260 1674 1819 -142260 1551 1269 -142260 1551 1598 -142260 1702 1839 -142260 1718 1889 -142260 1598 1269 -142260 1924 1478 -142260 1702 1901 -142260 1669 1754 -142280 1924 1478 -142280 1598 1463 -142280 1702 1901 -142280 1669 1754 -142300 1702 1839 -142300 1702 1901 -142300 1669 1754 -142320 1664 1821 -142320 1702 1901 -142320 1669 1754 -142340 1664 1821 -142340 1551 1269 -142340 1839 1901 -142340 1702 1901 -142340 1669 1754 -142360 1924 1478 -142360 1825 1880 -142360 1702 1901 -142360 1591 1807 -142360 1674 1819 -142360 1807 1624 -142360 1669 1754 -142380 1674 1819 -142380 1807 1624 -142380 1669 1754 -142400 1664 1821 -142400 1924 1551 -142400 1702 1839 -142400 1839 1901 -142400 1551 1269 -142400 1924 1478 -142400 1702 1901 -142400 1674 1819 -142400 1807 1624 -142400 1669 1754 -142420 1924 1478 -142420 1675 1855 -142420 1702 1901 -142420 1674 1819 -142420 1807 1624 -142420 1669 1754 -142440 1687 1841 -142440 1674 1819 -142440 1807 1624 -142440 1669 1754 -142460 1687 1841 -142460 1702 1901 -142460 1674 1819 -142460 1807 1624 -142460 1669 1754 -142480 1674 1819 -142480 1807 1624 -142480 1669 1754 -142500 1839 1901 -142500 1674 1819 -142500 1702 1901 -142500 1807 1624 -142500 1669 1754 -142520 1924 1478 -142520 1687 1841 -142520 1551 1269 -142520 1674 1819 -142520 1702 1901 -142520 1807 1624 -142520 1669 1754 -142540 1473 1630 -142540 1674 1819 -142540 1551 1880 -142540 1702 1901 -142540 1807 1624 -142540 1834 1624 -142540 1834 1807 -142540 1669 1754 -142560 1674 1819 -142560 1606 1516 -142560 1551 1880 -142560 1702 1901 -142560 1807 1624 -142560 1834 1624 -142560 1834 1807 -142560 1669 1754 -142580 1551 1880 -142580 1460 1499 -142580 1550 1630 -142580 1874 1630 -142580 1702 1901 -142580 1858 1872 -142580 1807 1624 -142580 1834 1624 -142580 1834 1807 -142580 1669 1754 -142600 1674 1819 -142600 1551 1269 -142600 1702 1901 -142600 1858 1872 -142600 1807 1624 -142600 1834 1624 -142600 1834 1807 -142600 1669 1754 -142620 1924 1478 -142620 1694 1880 -142620 1594 1475 -142620 1606 1516 -142620 1555 1882 -142620 1858 1872 -142620 1807 1624 -142620 1834 1624 -142620 1834 1807 -142620 1669 1754 -142640 1666 1462 -142640 1550 1630 -142640 1555 1882 -142640 1460 1499 -142640 1858 1872 -142640 1674 1819 -142640 1807 1624 -142640 1834 1624 -142640 1834 1807 -142640 1669 1754 -142660 1880 1699 -142660 1555 1872 -142660 1555 1858 -142660 1555 1882 -142660 1555 1558 -142660 1558 1872 -142660 1558 1858 -142660 1558 1468 -142660 1882 1872 -142660 1460 1499 -142660 1858 1872 -142660 1674 1819 -142660 1807 1624 -142660 1834 1624 -142660 1834 1807 -142660 1669 1754 -142680 1674 1819 -142680 1606 1516 -142680 1616 1518 -142680 1924 1478 -142680 1807 1624 -142680 1834 1624 -142680 1834 1807 -142680 1669 1754 -142700 1924 1478 -142700 1558 1858 -142700 1482 1642 -142700 1550 1630 -142700 1807 1624 -142700 1834 1624 -142700 1834 1807 -142700 1669 1754 -142720 1492 1754 -142720 1606 1516 -142720 1807 1624 -142720 1834 1624 -142720 1834 1807 -142720 1669 1754 -142740 1734 1634 -142740 1520 1918 -142740 1580 1463 -142740 1606 1516 -142740 1674 1819 -142740 1807 1624 -142740 1834 1624 -142740 1834 1807 -142740 1669 1754 -142760 1796 1721 -142760 1550 1630 -142760 1551 1269 -142760 1580 1463 -142760 1471 1606 -142760 1606 1516 -142760 1471 1516 -142760 1674 1819 -142760 1807 1624 -142760 1834 1624 -142760 1834 1807 -142760 1669 1754 -142780 1538 1524 -142780 1580 1924 -142780 1734 1491 -142780 1756 1645 -142780 1580 1463 -142780 1471 1606 -142780 1606 1516 -142780 1471 1516 -142780 1674 1819 -142780 1807 1624 -142780 1834 1624 -142780 1834 1807 -142780 1669 1754 -142800 1687 1841 -142800 1839 1841 -142800 1841 1901 -142800 1580 1463 -142800 1551 1269 -142800 1471 1606 -142800 1606 1516 -142800 1471 1516 -142800 1674 1819 -142800 1807 1624 -142800 1834 1624 -142800 1834 1807 -142800 1669 1754 -142820 1580 1463 -142820 1594 1475 -142820 1734 1491 -142820 1551 1269 -142820 1471 1606 -142820 1606 1516 -142820 1471 1516 -142820 1674 1819 -142820 1807 1624 -142820 1834 1624 -142820 1834 1807 -142820 1669 1754 -142840 1734 1491 -142840 1609 1524 -142840 1551 1269 -142840 1687 1841 -142840 1924 1478 -142840 1471 1606 -142840 1606 1516 -142840 1471 1516 -142840 1674 1819 -142840 1807 1624 -142840 1834 1624 -142840 1834 1807 -142840 1669 1754 -142860 1538 1609 -142860 1538 1524 -142860 1568 1463 -142860 1734 1491 -142860 1609 1524 -142860 1551 1269 -142860 1687 1841 -142860 1924 1478 -142860 1471 1606 -142860 1606 1516 -142860 1471 1516 -142860 1674 1819 -142860 1807 1624 -142860 1834 1624 -142860 1834 1807 -142860 1901 1841 -142860 1669 1754 -142880 1551 1269 -142880 1593 1471 -142880 1901 1687 -142880 1687 1841 -142880 1924 1478 -142880 1471 1606 -142880 1606 1516 -142880 1471 1516 -142880 1674 1819 -142880 1807 1624 -142880 1834 1624 -142880 1834 1807 -142880 1901 1841 -142880 1669 1754 -142900 1901 1687 -142900 1687 1841 -142900 1924 1478 -142900 1471 1606 -142900 1606 1516 -142900 1471 1516 -142900 1674 1819 -142900 1807 1624 -142900 1834 1624 -142900 1834 1807 -142900 1901 1841 -142900 1669 1754 -142920 1580 1503 -142920 1550 1630 -142920 1471 1606 -142920 1606 1516 -142920 1471 1516 -142920 1609 1524 -142920 1538 1524 -142920 1674 1819 -142920 1580 1463 -142920 1734 1491 -142920 1807 1624 -142920 1834 1624 -142920 1834 1807 -142920 1901 1841 -142920 1669 1754 -142940 1734 1482 -142940 1471 1606 -142940 1606 1882 -142940 1538 1609 -142940 1606 1516 -142940 1471 1516 -142940 1609 1524 -142940 1616 1518 -142940 1538 1524 -142940 1684 1874 -142940 1674 1819 -142940 1580 1463 -142940 1734 1491 -142940 1807 1624 -142940 1834 1624 -142940 1834 1807 -142940 1901 1841 -142940 1669 1754 -142960 1924 1478 -142960 1674 1609 -142960 1538 1609 -142960 1819 1609 -142960 1606 1516 -142960 1471 1516 -142960 1609 1524 -142960 1616 1518 -142960 1734 1666 -142960 1674 1538 -142960 1674 1524 -142960 1538 1524 -142960 1684 1874 -142960 1674 1819 -142960 1580 1463 -142960 1734 1491 -142960 1807 1624 -142960 1834 1624 -142960 1451 1498 -142960 1451 1591 -142960 1591 1498 -142960 1834 1807 -142960 1901 1841 -142960 1669 1754 -142980 1674 1538 -142980 1674 1524 -142980 1538 1524 -142980 1684 1874 -142980 1580 1598 -142980 1674 1819 -142980 1463 1598 -142980 1580 1463 -142980 1734 1491 -142980 1807 1624 -142980 1834 1624 -142980 1451 1498 -142980 1451 1591 -142980 1591 1498 -142980 1834 1807 -142980 1901 1841 -142980 1669 1754 -143000 1674 1819 -143000 1734 1874 -143000 1463 1598 -143000 1498 1807 -143000 1551 1269 -143000 1580 1463 -143000 1734 1491 -143000 1616 1873 -143000 1807 1624 -143000 1834 1624 -143000 1451 1498 -143000 1451 1591 -143000 1591 1498 -143000 1834 1807 -143000 1901 1841 -143000 1669 1754 -143020 1880 1568 -143020 1591 1624 -143020 1440 1914 -143020 1440 1491 -143020 1834 1591 -143020 1551 1269 -143020 1834 1498 -143020 1580 1463 -143020 1734 1491 -143020 1616 1873 -143020 1807 1624 -143020 1834 1624 -143020 1451 1498 -143020 1451 1591 -143020 1591 1498 -143020 1834 1807 -143020 1901 1841 -143020 1669 1754 -143040 1699 1616 -143040 1699 1503 -143040 1834 1591 -143040 1491 1520 -143040 1734 1520 -143040 1551 1269 -143040 1834 1498 -143040 1580 1463 -143040 1734 1491 -143040 1616 1873 -143040 1807 1624 -143040 1834 1624 -143040 1451 1498 -143040 1451 1591 -143040 1591 1498 -143040 1834 1807 -143040 1901 1841 -143040 1669 1754 -143060 1440 1914 -143060 1440 1874 -143060 1551 1269 -143060 1834 1498 -143060 1580 1598 -143060 1580 1463 -143060 1734 1491 -143060 1616 1873 -143060 1537 1825 -143060 1807 1624 -143060 1834 1624 -143060 1451 1498 -143060 1451 1591 -143060 1591 1498 -143060 1834 1807 -143060 1901 1841 -143060 1669 1754 -143080 1924 1478 -143080 1839 1901 -143080 1834 1498 -143080 1580 1598 -143080 1580 1463 -143080 1734 1491 -143080 1616 1873 -143080 1537 1825 -143080 1807 1624 -143080 1834 1624 -143080 1451 1498 -143080 1451 1591 -143080 1591 1498 -143080 1834 1807 -143080 1901 1841 -143080 1669 1754 -143100 1834 1498 -143100 1580 1598 -143100 1580 1463 -143100 1734 1491 -143100 1616 1873 -143100 1537 1825 -143100 1451 1593 -143100 1593 1498 -143100 1591 1593 -143100 1598 1463 -143100 1807 1624 -143100 1834 1624 -143100 1451 1498 -143100 1451 1591 -143100 1591 1498 -143100 1834 1807 -143100 1901 1841 -143100 1669 1754 -143120 1537 1825 -143120 1684 1520 -143120 1451 1593 -143120 1593 1624 -143120 1593 1498 -143120 1689 1527 -143120 1591 1593 -143120 1598 1463 -143120 1807 1624 -143120 1834 1624 -143120 1834 1591 -143120 1451 1498 -143120 1451 1591 -143120 1591 1498 -143120 1834 1807 -143120 1901 1841 -143120 1669 1754 -143140 1689 1527 -143140 1591 1593 -143140 1616 1518 -143140 1498 1834 -143140 1598 1463 -143140 1807 1624 -143140 1834 1624 -143140 1834 1591 -143140 1451 1498 -143140 1451 1591 -143140 1591 1498 -143140 1834 1807 -143140 1901 1841 -143140 1669 1754 -143160 1684 1520 -143160 1689 1863 -143160 1498 1834 -143160 1498 1699 -143160 1699 1591 -143160 1598 1463 -143160 1440 1914 -143160 1863 1527 -143160 1537 1825 -143160 1807 1624 -143160 1699 1624 -143160 1834 1624 -143160 1834 1591 -143160 1451 1498 -143160 1451 1591 -143160 1591 1498 -143160 1825 1651 -143160 1834 1807 -143160 1901 1841 -143160 1540 1542 -143160 1669 1754 -143180 1537 1825 -143180 1807 1624 -143180 1807 1451 -143180 1807 1498 -143180 1699 1624 -143180 1834 1624 -143180 1834 1591 -143180 1834 1451 -143180 1451 1624 -143180 1451 1498 -143180 1451 1591 -143180 1591 1624 -143180 1591 1498 -143180 1624 1498 -143180 1689 1527 -143180 1825 1651 -143180 1834 1807 -143180 1901 1841 -143180 1540 1542 -143180 1669 1754 -143200 1689 1527 -143200 1825 1651 -143200 1834 1807 -143200 1551 1463 -143200 1901 1841 -143200 1440 1914 -143200 1540 1542 -143200 1669 1754 -143220 1463 1269 -143220 1463 1478 -143220 1551 1598 -143220 1551 1463 -143220 1901 1841 -143220 1440 1914 -143220 1540 1542 -143220 1669 1754 -143240 1551 1269 -143240 1551 1598 -143240 1463 1598 -143240 1551 1463 -143240 1901 1841 -143240 1440 1914 -143240 1540 1542 -143240 1669 1754 -143260 1551 1463 -143260 1687 1841 -143260 1687 1901 -143260 1901 1841 -143260 1440 1914 -143260 1540 1542 -143260 1669 1754 -143280 1687 1841 -143280 1687 1901 -143280 1689 1874 -143280 1463 1598 -143280 1901 1841 -143280 1440 1914 -143280 1540 1542 -143280 1669 1754 -143300 1924 1478 -143300 1551 1269 -143300 1463 1598 -143300 1901 1841 -143300 1440 1914 -143300 1540 1542 -143300 1669 1754 -143320 1901 1841 -143320 1689 1874 -143320 1440 1914 -143320 1540 1542 -143320 1669 1754 -143340 1568 1520 -143340 1540 1542 -143340 1463 1598 -143340 1669 1754 -143360 1540 1542 -143360 1568 1825 -143360 1689 1874 -143360 1463 1598 -143360 1669 1754 -143380 1924 1463 -143380 1689 1874 -143380 1440 1914 -143380 1551 1269 -143380 1687 1841 -143380 1463 1598 -143380 1669 1754 -143400 1551 1269 -143400 1687 1841 -143400 1463 1598 -143400 1669 1754 -143420 1924 1478 -143420 1463 1598 -143420 1669 1754 -143440 1922 1901 -143440 1463 1598 -143440 1669 1754 -143460 1684 1520 -143460 1463 1598 -143460 1669 1754 -143480 1666 1269 -143480 1463 1598 -143480 1669 1754 -143500 1678 1520 -143500 1678 1503 -143500 1684 1901 -143500 1924 1478 -143500 1463 1598 -143500 1669 1754 -143520 1678 1503 -143520 1684 1901 -143520 1924 1478 -143520 1593 1521 -143520 1463 1598 -143520 1669 1754 -143540 1551 1269 -143540 1825 1598 -143540 1924 1478 -143540 1924 1463 -143540 1593 1521 -143540 1463 1598 -143540 1669 1754 -143560 1924 1478 -143560 1924 1463 -143560 1684 1901 -143560 1593 1521 -143560 1678 1503 -143560 1463 1598 -143560 1669 1754 -143580 1678 1503 -143580 1551 1269 -143580 1702 1874 -143580 1540 1542 -143580 1641 1520 -143580 1463 1598 -143580 1669 1754 -143600 1702 1874 -143600 1540 1542 -143600 1666 1520 -143600 1666 1641 -143600 1641 1520 -143600 1463 1598 -143600 1669 1754 -143620 1540 1542 -143620 1593 1521 -143620 1666 1520 -143620 1666 1641 -143620 1641 1520 -143620 1463 1598 -143620 1669 1754 -143640 1666 1520 -143640 1666 1641 -143640 1641 1520 -143640 1463 1598 -143640 1669 1754 -143660 1666 1520 -143660 1666 1641 -143660 1641 1520 -143660 1542 1540 -143660 1463 1598 -143660 1669 1754 -143680 1666 1520 -143680 1551 1269 -143680 1666 1641 -143680 1702 1901 -143680 1641 1520 -143680 1542 1540 -143680 1463 1598 -143680 1669 1754 -143700 1593 1874 -143700 1666 1520 -143700 1551 1269 -143700 1666 1641 -143700 1702 1901 -143700 1924 1478 -143700 1641 1520 -143700 1542 1540 -143700 1463 1598 -143700 1669 1754 -143720 1666 1520 -143720 1551 1269 -143720 1666 1641 -143720 1702 1901 -143720 1924 1478 -143720 1641 1520 -143720 1542 1540 -143720 1463 1598 -143720 1669 1754 -143740 1666 1641 -143740 1702 1901 -143740 1924 1478 -143740 1641 1520 -143740 1542 1540 -143740 1463 1598 -143740 1669 1754 -143760 1551 1269 -143760 1542 1540 -143760 1463 1598 -143760 1669 1754 -143780 1825 1924 -143780 1702 1901 -143780 1841 1901 -143780 1463 1526 -143780 1551 1514 -143780 1542 1540 -143780 1463 1598 -143780 1669 1754 -143800 1551 1269 -143800 1841 1875 -143800 1551 1514 -143800 1542 1540 -143800 1463 1598 -143800 1669 1754 -143820 1551 1514 -143820 1542 1540 -143820 1463 1598 -143820 1669 1754 -143840 1551 1514 -143840 1542 1540 -143840 1924 1478 -143840 1463 1598 -143840 1669 1754 -143860 1542 1540 -143860 1924 1478 -143860 1463 1598 -143860 1669 1754 -143880 1924 1478 -143880 1702 1901 -143880 1841 1901 -143880 1463 1598 -143880 1669 1754 -143900 1540 1542 -143900 1463 1598 -143900 1669 1754 -143920 1540 1542 -143920 1463 1598 -143920 1669 1754 -143940 1921 1462 -143940 1463 1598 -143940 1669 1754 -143960 1921 1462 -143960 1463 1598 -143960 1669 1754 -143980 1678 1503 -143980 1463 1598 -143980 1669 1754 -144000 1921 1678 -144000 1678 1462 -144000 1921 1462 -144000 1463 1598 -144000 1669 1754 -144020 1540 1542 -144020 1921 1825 -144020 1921 1462 -144020 1463 1598 -144020 1669 1754 -144040 1924 1478 -144040 1825 1462 -144040 1921 1825 -144040 1921 1462 -144040 1463 1598 -144040 1669 1754 -144060 1540 1542 -144060 1825 1462 -144060 1921 1825 -144060 1921 1462 -144060 1463 1598 -144060 1669 1754 -144080 1825 1462 -144080 1921 1825 -144080 1921 1462 -144080 1463 1598 -144080 1669 1754 -144100 1921 1825 -144100 1678 1503 -144100 1463 1924 -144100 1921 1462 -144100 1463 1598 -144100 1669 1754 -144120 1540 1542 -144120 1678 1503 -144120 1463 1924 -144120 1921 1462 -144120 1463 1598 -144120 1669 1754 -144140 1921 1462 -144140 1463 1598 -144140 1669 1754 -144160 1540 1542 -144160 1921 1462 -144160 1463 1598 -144160 1669 1754 -144180 1924 1478 -144180 1921 1462 -144180 1463 1598 -144180 1669 1754 -144200 1924 1463 -144200 1921 1462 -144200 1463 1598 -144200 1669 1754 -144220 1921 1462 -144220 1463 1598 -144220 1669 1754 -144240 1540 1875 -144240 1542 1875 -144240 1921 1462 -144240 1463 1598 -144240 1669 1754 -144260 1676 1526 -144260 1921 1462 -144260 1463 1598 -144260 1669 1754 -144280 1540 1542 -144280 1463 1924 -144280 1921 1462 -144280 1463 1598 -144280 1669 1754 -144300 1921 1462 -144300 1463 1598 -144300 1669 1754 -144320 1921 1462 -144320 1463 1598 -144320 1669 1754 -144340 1921 1462 -144340 1463 1598 -144340 1669 1754 -144360 1921 1462 -144360 1463 1598 -144360 1669 1754 -144380 1463 1598 -144380 1669 1754 -144400 1542 1875 -144400 1924 1463 -144400 1463 1598 -144400 1669 1754 -144420 1924 1463 -144420 1463 1598 -144420 1669 1754 -144440 1463 1598 -144440 1669 1754 -144460 1543 1504 -144460 1540 1542 -144460 1463 1598 -144460 1669 1754 -144480 1463 1478 -144480 1924 1478 -144480 1540 1542 -144480 1463 1598 -144480 1669 1754 -144500 1798 1913 -144500 1924 1478 -144500 1540 1542 -144500 1463 1598 -144500 1669 1754 -144520 1540 1875 -144520 1542 1875 -144520 1676 1694 -144520 1463 1924 -144520 1540 1542 -144520 1463 1598 -144520 1669 1754 -144540 1676 1528 -144540 1540 1542 -144540 1924 1478 -144540 1463 1598 -144540 1669 1754 -144560 1540 1542 -144560 1463 1924 -144560 1924 1478 -144560 1463 1598 -144560 1669 1754 -144580 1924 1598 -144580 1540 1542 -144580 1463 1924 -144580 1463 1478 -144580 1924 1478 -144580 1463 1598 -144580 1669 1754 -144600 1540 1875 -144600 1540 1542 -144600 1542 1875 -144600 1463 1924 -144600 1463 1478 -144600 1924 1478 -144600 1463 1598 -144600 1669 1754 -144620 1924 1598 -144620 1924 1478 -144620 1463 1598 -144620 1669 1754 -144640 1924 1478 -144640 1540 1542 -144640 1463 1598 -144640 1669 1754 -144660 1924 1478 -144660 1540 1542 -144660 1542 1875 -144660 1829 1655 -144660 1463 1598 -144660 1669 1754 -144680 1540 1542 -144680 1542 1875 -144680 1540 1875 -144680 1829 1655 -144680 1463 1598 -144680 1669 1754 -144700 1540 1875 -144700 1924 1463 -144700 1829 1655 -144700 1463 1598 -144700 1669 1754 -144720 1463 1598 -144720 1669 1754 -144740 1463 1598 -144740 1669 1754 -144760 1463 1598 -144760 1669 1754 -144780 1924 1463 -144780 1478 1463 -144780 1463 1598 -144780 1669 1754 -144800 1793 1526 -144800 1463 1598 -144800 1669 1754 -144820 1924 1478 -144820 1793 1526 -144820 1463 1598 -144820 1669 1754 -144840 1793 1526 -144840 1463 1598 -144840 1669 1754 -144860 1793 1526 -144860 1463 1598 -144860 1669 1754 -144880 1793 1526 -144880 1463 1598 -144880 1669 1754 -144900 1793 1526 -144900 1463 1598 -144900 1669 1754 -144920 1793 1526 -144920 1463 1598 -144920 1669 1754 -144940 1793 1526 -144940 1463 1598 -144940 1669 1754 -144960 1793 1526 -144960 1463 1598 -144960 1669 1754 -144980 1793 1526 -144980 1463 1598 -144980 1669 1754 -145000 1455 1442 -145000 1793 1526 -145000 1463 1598 -145000 1669 1754 -145020 1924 1478 -145020 1793 1526 -145020 1463 1598 -145020 1669 1754 -145040 1924 1478 -145040 1793 1526 -145040 1463 1598 -145040 1669 1754 -145060 1793 1526 -145060 1463 1598 -145060 1669 1754 -145080 1793 1526 -145080 1463 1598 -145080 1669 1754 -145100 1924 1478 -145100 1793 1526 -145100 1463 1598 -145100 1669 1754 -145120 1924 1478 -145120 1924 1463 -145120 1793 1526 -145120 1463 1598 -145120 1669 1754 -145140 1924 1463 -145140 1793 1526 -145140 1463 1598 -145140 1669 1754 -145160 1793 1526 -145160 1463 1598 -145160 1669 1754 -145180 1793 1526 -145180 1463 1598 -145180 1669 1754 -145200 1924 1478 -145200 1793 1526 -145200 1463 1598 -145200 1669 1754 -145220 1924 1598 -145220 1924 1463 -145220 1793 1526 -145220 1463 1598 -145220 1669 1754 -145240 1793 1526 -145240 1463 1598 -145240 1669 1754 -145260 1924 1478 -145260 1793 1526 -145260 1463 1598 -145260 1669 1754 -145280 1924 1478 -145280 1825 1463 -145280 1825 1526 -145280 1793 1526 -145280 1924 1463 -145280 1463 1598 -145280 1669 1754 -145300 1825 1526 -145300 1793 1526 -145300 1924 1463 -145300 1463 1598 -145300 1669 1754 -145320 1793 1526 -145320 1924 1463 -145320 1463 1598 -145320 1669 1754 -145340 1793 1526 -145340 1924 1478 -145340 1924 1463 -145340 1825 1526 -145340 1463 1598 -145340 1669 1754 -145360 1825 1526 -145360 1463 1598 -145360 1669 1754 -145380 1825 1526 -145380 1463 1598 -145380 1669 1754 -145400 1825 1526 -145400 1463 1598 -145400 1669 1754 -145420 1825 1526 -145420 1924 1478 -145420 1463 1598 -145420 1669 1754 -145440 1924 1478 -145440 1676 1528 -145440 1463 1598 -145440 1669 1754 -145460 1924 1478 -145460 1676 1528 -145460 1463 1598 -145460 1669 1754 -145480 1676 1528 -145480 1463 1598 -145480 1669 1754 -145500 1463 1598 -145500 1669 1754 -145520 1924 1478 -145520 1463 1598 -145520 1669 1754 -145540 1825 1526 -145540 1463 1598 -145540 1669 1754 -145560 1463 1598 -145560 1669 1754 -145580 1463 1598 -145580 1669 1754 -145600 1825 1526 -145600 1924 1478 -145600 1924 1598 -145600 1924 1463 -145600 1669 1463 -145600 1463 1598 -145600 1669 1754 -145620 1825 1655 -145620 1526 1655 -145620 1463 1598 -145620 1669 1754 -145640 1825 1655 -145640 1526 1655 -145640 1655 1598 -145640 1655 1463 -145640 1463 1598 -145640 1669 1754 -145660 1463 1526 -145660 1526 1598 -145660 1526 1655 -145660 1655 1598 -145660 1655 1463 -145660 1463 1598 -145660 1669 1754 -145680 1463 1526 -145680 1526 1598 -145680 1526 1655 -145680 1655 1598 -145680 1655 1463 -145680 1463 1598 -145680 1669 1754 -145700 1655 1598 -145700 1655 1463 -145700 1463 1598 -145700 1669 1754 -145720 1655 1598 -145720 1655 1463 -145720 1526 1598 -145720 1463 1598 -145720 1463 1526 -145720 1526 1655 -145720 1669 1754 -145740 1463 1598 -145740 1463 1526 -145740 1526 1655 -145740 1669 1754 -145760 1669 1754 -145780 1669 1754 -145800 1669 1754 -145820 1669 1754 -145840 1669 1754 -145860 1513 1655 -145860 1669 1754 -145880 1669 1754 -145900 1669 1754 -145920 1669 1754 -145940 1669 1754 -145960 1669 1754 -145980 1669 1754 -146000 1924 1478 -146000 1669 1754 -146020 1924 1478 -146020 1669 1754 -146040 1669 1754 -146060 1669 1754 -146080 1669 1754 -146100 1669 1754 -146120 1754 1694 -146120 1669 1754 -146140 1563 1839 -146140 1669 1754 -146160 1669 1754 -146180 1669 1754 -146200 1475 1594 -146200 1669 1754 -146220 1669 1754 -146240 1669 1754 -146260 1669 1754 -146280 1669 1754 -146300 1669 1754 -146320 1669 1754 -146340 1669 1754 -146360 1669 1754 -146380 1655 1694 -146380 1669 1754 -146400 1669 1754 -146420 1669 1754 -146440 1813 1655 -146440 1669 1754 -146460 1669 1754 -146480 1669 1754 -146500 1669 1754 -146520 1669 1754 -146540 1669 1754 -146560 1669 1754 -146580 1669 1754 -146600 1669 1754 -146620 1669 1754 -146640 1655 1882 -146640 1655 1599 -146640 1669 1754 -146660 1655 1599 -146660 1669 1754 -146680 1669 1754 -146700 1669 1754 -146720 1655 1599 -146720 1669 1754 -146740 1512 1599 -146740 1669 1754 -146760 1512 1599 -146760 1669 1754 -146760 1518 1616 -146780 1669 1754 -146780 1518 1616 -146800 1577 1655 -146800 1616 1655 -146800 1669 1754 -146800 1577 1616 -146800 1577 1518 -146800 1518 1616 -146800 1518 1655 -146820 1669 1754 -146820 1577 1616 -146820 1577 1518 -146820 1518 1616 -146820 1518 1655 diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index fe95373978a1..80065b41685c 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -13,7 +13,6 @@ mod examples; #[derive(Copy, Clone, Debug, clap::ValueEnum, strum_macros::EnumIter)] enum Example { Simple, - Social, Disjoint, Lattice, } @@ -22,7 +21,6 @@ impl Example { fn run(&self, args: &Args) -> anyhow::Result<()> { match self { Example::Simple => examples::simple::run(args), - Example::Social => examples::social::run(args), Example::Disjoint => examples::disjoint::run(args, 20), Example::Lattice => examples::lattice::run(args, 10), } From adb3ec9168821e87478e0d644cf4ed3d7c208f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 24 Oct 2024 16:47:16 +0200 Subject: [PATCH 104/159] WIP: remove broken examples --- .../node_link_graph/src/examples/disjoint.rs | 14 ----- .../rust/node_link_graph/src/examples/mod.rs | 2 - .../node_link_graph/src/examples/simple.rs | 55 ------------------- examples/rust/node_link_graph/src/main.rs | 4 -- 4 files changed, 75 deletions(-) delete mode 100644 examples/rust/node_link_graph/src/examples/disjoint.rs delete mode 100644 examples/rust/node_link_graph/src/examples/simple.rs diff --git a/examples/rust/node_link_graph/src/examples/disjoint.rs b/examples/rust/node_link_graph/src/examples/disjoint.rs deleted file mode 100644 index 28ccb2bf76a7..000000000000 --- a/examples/rust/node_link_graph/src/examples/disjoint.rs +++ /dev/null @@ -1,14 +0,0 @@ -use rerun::GraphNodes; - -use crate::Args; - -pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { - let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_disjoint")?; - - let nodes = (0..num_nodes) - .map(|i| format!("node{}", i)) - .collect::>(); - - rec.log_static("/nodes", &GraphNodes::new(nodes))?; - Ok(()) -} diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs index 6f464054f3e5..5e3a7371904c 100644 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ b/examples/rust/node_link_graph/src/examples/mod.rs @@ -1,3 +1 @@ -pub mod disjoint; pub mod lattice; -pub mod simple; diff --git a/examples/rust/node_link_graph/src/examples/simple.rs b/examples/rust/node_link_graph/src/examples/simple.rs deleted file mode 100644 index c342c7c6ef69..000000000000 --- a/examples/rust/node_link_graph/src/examples/simple.rs +++ /dev/null @@ -1,55 +0,0 @@ -use rerun::{datatypes::GraphType, Color, GraphEdges, GraphNodes}; - -use crate::Args; - -pub fn run(args: &Args) -> anyhow::Result<()> { - let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_simple")?; - - rec.set_time_sequence("frame", 0); - rec.log( - "kitchen/objects", - &GraphNodes::new(["sink", "fridge"]) - .with_labels(["Sink", "Fridge"]) - .with_colors([Color::from_rgb(255, 0, 0), Color::from_rgb(255, 255, 0)]), - )?; - - rec.log("kitchen/areas", &GraphNodes::new(["area0", "area1"]))?; - rec.log("kitchen/areas", &GraphEdges::new([("area0", "area1")]))?; - - rec.set_time_sequence("frame", 1); - rec.log("hallway/nodes", &GraphNodes::new(["area0"]))?; - - rec.set_time_sequence("frame", 2); - rec.log( - "living/objects", - &GraphNodes::new(["table"]).with_labels(["Table"]), - )?; - - rec.log( - "living/areas", - &GraphNodes::new(["area0", "area1", "area2"]), - )?; - rec.log( - "living/areas", - &GraphEdges::new([("area0", "area1"), ("area0", "area2"), ("area1", "area2")]), - )?; - - rec.log( - "doors/edges", - &GraphEdges::new([ - (("kitchen/nodes#area0"), ("hallway/nodes#area0")), - (("hallway/nodes#area0"), ("living/nodes#area2")), - ]), - )?; - - rec.log( - "edges", - &GraphEdges::new([ - (("kitchen/nodes#area0"), ("kitchen/objects#sink")), - (("kitchen/nodes#area1"), ("kitchen/objects#fridge")), - (("living/nodes#area1"), ("living/objects#table")), - ]) - .with_graph_type([GraphType::Directed]), - )?; - Ok(()) -} diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link_graph/src/main.rs index 80065b41685c..f2345b8ef038 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link_graph/src/main.rs @@ -12,16 +12,12 @@ mod examples; #[derive(Copy, Clone, Debug, clap::ValueEnum, strum_macros::EnumIter)] enum Example { - Simple, - Disjoint, Lattice, } impl Example { fn run(&self, args: &Args) -> anyhow::Result<()> { match self { - Example::Simple => examples::simple::run(args), - Example::Disjoint => examples::disjoint::run(args, 20), Example::Lattice => examples::lattice::run(args, 10), } } From b694ac35a6c651e9133c09d400de9c8073e411d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 08:18:35 +0200 Subject: [PATCH 105/159] WIP: Remove experimental feature flag --- crates/viewer/re_viewer/src/app.rs | 30 ++++--------------- crates/viewer/re_viewer/src/ui/rerun_menu.rs | 29 ++++-------------- .../re_viewer_context/src/app_options.rs | 5 ---- .../re_viewer_context/src/command_sender.rs | 3 -- .../re_viewer_context/src/test_context.rs | 3 +- 5 files changed, 12 insertions(+), 58 deletions(-) diff --git a/crates/viewer/re_viewer/src/app.rs b/crates/viewer/re_viewer/src/app.rs index 60f5544d6926..272b3343ddf7 100644 --- a/crates/viewer/re_viewer/src/app.rs +++ b/crates/viewer/re_viewer/src/app.rs @@ -257,10 +257,9 @@ impl App { } let mut space_view_class_registry = SpaceViewClassRegistry::default(); - if let Err(err) = populate_space_view_class_registry_with_builtin( - &mut space_view_class_registry, - state.app_options(), - ) { + if let Err(err) = + populate_space_view_class_registry_with_builtin(&mut space_view_class_registry) + { re_log::error!( "Failed to populate the view type registry with built-in space views: {}", err @@ -535,23 +534,6 @@ impl App { self.app_options_mut().inspect_blueprint_timeline = show; } - SystemCommand::EnableExperimentalGraphSpaceView(enabled) => { - let result = if enabled { - self.space_view_class_registry - .add_class::() - } else { - self.space_view_class_registry - .remove_class::() - }; - - if let Err(err) = result { - re_log::warn_once!( - "Failed to {} experimental graph space view: {err}", - if enabled { "enable" } else { "disable" } - ); - } - } - SystemCommand::SetSelection(item) => { self.state.selection_state.set_selection(item); } @@ -1728,7 +1710,6 @@ impl eframe::App for App { /// Add built-in space views to the registry. fn populate_space_view_class_registry_with_builtin( space_view_class_registry: &mut SpaceViewClassRegistry, - app_options: &AppOptions, ) -> Result<(), SpaceViewClassRegistryError> { re_tracing::profile_function!(); space_view_class_registry.add_class::()?; @@ -1740,9 +1721,8 @@ fn populate_space_view_class_registry_with_builtin( space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; - if app_options.experimental_graph_space_view { - space_view_class_registry.add_class::()?; - } + // The following are experimental views. + space_view_class_registry.add_class::()?; Ok(()) } diff --git a/crates/viewer/re_viewer/src/ui/rerun_menu.rs b/crates/viewer/re_viewer/src/ui/rerun_menu.rs index 3c58fa9aa9e7..5d75274b4a49 100644 --- a/crates/viewer/re_viewer/src/ui/rerun_menu.rs +++ b/crates/viewer/re_viewer/src/ui/rerun_menu.rs @@ -4,7 +4,7 @@ use egui::NumExt as _; use re_log_types::TimeZone; use re_ui::{UICommand, UiExt as _}; -use re_viewer_context::{StoreContext, SystemCommand, SystemCommandSender}; +use re_viewer_context::StoreContext; use crate::App; @@ -295,7 +295,7 @@ fn render_state_ui(ui: &mut egui::Ui, render_state: &egui_wgpu::RenderState) { } fn options_menu_ui( - command_sender: &re_viewer_context::CommandSender, + _command_sender: &re_viewer_context::CommandSender, ui: &mut egui::Ui, frame: &eframe::Frame, app_options: &mut re_viewer_context::AppOptions, @@ -358,7 +358,7 @@ fn options_menu_ui( { ui.add_space(SPACING); ui.label("Experimental features:"); - experimental_feature_ui(command_sender, ui, app_options); + experimental_feature_ui(ui, app_options); } if let Some(_backend) = frame @@ -371,9 +371,9 @@ fn options_menu_ui( { ui.add_space(SPACING); if _backend == wgpu::Backend::BrowserWebGpu { - UICommand::RestartWithWebGl.menu_button_ui(ui, command_sender); + UICommand::RestartWithWebGl.menu_button_ui(ui, _command_sender); } else { - UICommand::RestartWithWebGpu.menu_button_ui(ui, command_sender); + UICommand::RestartWithWebGpu.menu_button_ui(ui, _command_sender); } } } @@ -383,27 +383,10 @@ fn options_menu_ui( // compilation directive to `space_view_screenshot` and remove the one above the call size of this // function!! #[cfg(not(target_arch = "wasm32"))] -fn experimental_feature_ui( - command_sender: &re_viewer_context::CommandSender, - ui: &mut egui::Ui, - app_options: &mut re_viewer_context::AppOptions, -) { +fn experimental_feature_ui(ui: &mut egui::Ui, app_options: &mut re_viewer_context::AppOptions) { ui .re_checkbox(&mut app_options.experimental_space_view_screenshots, "Space view screenshots") .on_hover_text("Allow taking screenshots of 2D and 3D space views via their context menu. Does not contain labels."); - - if ui - .re_checkbox( - &mut app_options.experimental_graph_space_view, - "Graph space view", - ) - .on_hover_text("Enable the experimental graph space view.") - .clicked() - { - command_sender.send_system(SystemCommand::EnableExperimentalGraphSpaceView( - app_options.experimental_graph_space_view, - )); - } } #[cfg(debug_assertions)] diff --git a/crates/viewer/re_viewer_context/src/app_options.rs b/crates/viewer/re_viewer_context/src/app_options.rs index 06bfb57d3eda..0c7cd154edbc 100644 --- a/crates/viewer/re_viewer_context/src/app_options.rs +++ b/crates/viewer/re_viewer_context/src/app_options.rs @@ -17,9 +17,6 @@ pub struct AppOptions { #[cfg(not(target_arch = "wasm32"))] pub experimental_space_view_screenshots: bool, - /// Enable experimental graph space views. - pub experimental_graph_space_view: bool, - /// Displays an overlay for debugging picking. pub show_picking_debug_overlay: bool, @@ -50,8 +47,6 @@ impl Default for AppOptions { #[cfg(not(target_arch = "wasm32"))] experimental_space_view_screenshots: false, - experimental_graph_space_view: false, - show_picking_debug_overlay: false, inspect_blueprint_timeline: false, diff --git a/crates/viewer/re_viewer_context/src/command_sender.rs b/crates/viewer/re_viewer_context/src/command_sender.rs index a5675706d16f..0219a5d31230 100644 --- a/crates/viewer/re_viewer_context/src/command_sender.rs +++ b/crates/viewer/re_viewer_context/src/command_sender.rs @@ -62,9 +62,6 @@ pub enum SystemCommand { #[cfg(debug_assertions)] EnableInspectBlueprintTimeline(bool), - /// Enable or disable the experimental graph space views. - EnableExperimentalGraphSpaceView(bool), - /// Set the item selection. SetSelection(crate::Item), diff --git a/crates/viewer/re_viewer_context/src/test_context.rs b/crates/viewer/re_viewer_context/src/test_context.rs index d612cc7e9027..361adcb50f50 100644 --- a/crates/viewer/re_viewer_context/src/test_context.rs +++ b/crates/viewer/re_viewer_context/src/test_context.rs @@ -166,8 +166,7 @@ impl TestContext { | SystemCommand::ClearAndGenerateBlueprint | SystemCommand::ActivateRecording(_) | SystemCommand::CloseStore(_) - | SystemCommand::CloseAllRecordings - | SystemCommand::EnableExperimentalGraphSpaceView(_) => handled = false, + | SystemCommand::CloseAllRecordings => handled = false, #[cfg(debug_assertions)] SystemCommand::EnableInspectBlueprintTimeline(_) => handled = false, From eb4ae2529517e7152c381df59e39c528e2213831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 08:22:20 +0200 Subject: [PATCH 106/159] WIP: Add archetypes to `gen_common_index.py` --- rerun_py/docs/gen_common_index.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rerun_py/docs/gen_common_index.py b/rerun_py/docs/gen_common_index.py index 2056f52e673c..52cc04cbe7e9 100755 --- a/rerun_py/docs/gen_common_index.py +++ b/rerun_py/docs/gen_common_index.py @@ -207,6 +207,14 @@ class Section: ], gen_page=False, ), + Section( + title="Graphs", + class_list=[ + "archetypes.GraphNodes", + "archetypes.GraphEdges", + ], + gen_page=False, + ), Section( title="Tensors", class_list=["archetypes.Tensor"], From c36e0110b0f47f8087c1e5fae46a51215fff4aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 09:41:05 +0200 Subject: [PATCH 107/159] WIP: fix codegen and start working on Python example --- .../rerun/archetypes/graph_edges.fbs | 2 +- .../rerun/components/graph_type.fbs | 16 +- .../re_types/definitions/rerun/datatypes.fbs | 1 - .../rerun/datatypes/graph_type.fbs | 19 --- .../re_types/src/archetypes/graph_edges.rs | 26 ++- .../re_types/src/components/graph_type.rs | 128 +++++++++------ .../re_types/src/datatypes/.gitattributes | 1 - .../re_types/src/datatypes/graph_type.rs | 153 ------------------ crates/store/re_types/src/datatypes/mod.rs | 2 - .../viewer/re_space_view_graph/src/types.rs | 4 +- crates/viewer/re_space_view_graph/src/view.rs | 6 +- .../src/visualizers/edges.rs | 6 +- .../reference/types/components/graph_type.md | 9 +- docs/content/reference/types/datatypes.md | 1 - .../reference/types/datatypes/.gitattributes | 1 - .../reference/types/datatypes/graph_type.md | 21 --- examples/python/node_link_graphs/README.md | 0 .../node_link_graphs/node_link_graphs.py | 6 + .../python/node_link_graphs/pyproject.toml | 12 ++ .../node_link_graph/src/examples/lattice.rs | 4 +- .../src/rerun/archetypes/graph_edges.hpp | 4 +- rerun_cpp/src/rerun/components/.gitattributes | 1 + .../{datatypes => components}/graph_type.cpp | 14 +- rerun_cpp/src/rerun/components/graph_type.hpp | 60 +++---- rerun_cpp/src/rerun/datatypes.hpp | 1 - rerun_cpp/src/rerun/datatypes/.gitattributes | 2 - rerun_cpp/src/rerun/datatypes/graph_type.hpp | 56 ------- .../rerun_sdk/rerun/archetypes/graph_edges.py | 4 +- .../rerun_sdk/rerun/components/__init__.py | 4 +- .../rerun_sdk/rerun/components/graph_type.py | 63 ++++++-- .../rerun_sdk/rerun/datatypes/.gitattributes | 1 - .../rerun_sdk/rerun/datatypes/__init__.py | 6 - .../rerun_sdk/rerun/datatypes/graph_type.py | 74 --------- 33 files changed, 229 insertions(+), 479 deletions(-) delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs delete mode 100644 crates/store/re_types/src/datatypes/graph_type.rs delete mode 100644 docs/content/reference/types/datatypes/graph_type.md create mode 100644 examples/python/node_link_graphs/README.md create mode 100644 examples/python/node_link_graphs/node_link_graphs.py create mode 100644 examples/python/node_link_graphs/pyproject.toml rename rerun_cpp/src/rerun/{datatypes => components}/graph_type.cpp (72%) delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_type.hpp delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_type.py diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index aa44cd76be31..d7d2286d3d3e 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -19,6 +19,6 @@ table GraphEdges ( // --- Recommended --- /// Specifies if the graph is directed or undirected. - graph_type: [rerun.components.GraphType] ("attr.rerun.component_recommended", nullable, order: 2000); + graph_type: rerun.components.GraphType ("attr.rerun.component_recommended", nullable, order: 2000); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs index 08798ca8be4d..0742d79c3758 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_type.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_type.fbs @@ -1,11 +1,19 @@ namespace rerun.components; +// -- + /// Specifies if a graph has directed or undirected edges. -struct GraphType ( +enum GraphType: ubyte ( "attr.rust.derive": "Default, PartialEq, Eq", - "attr.rust.repr": "transparent", "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - graph_type: rerun.datatypes.GraphType (order: 100); + /// Invalid value. Won't show up in generated types. + Invalid = 0, + + /// The graph has undirected edges. + Undirected (default), + + /// The graph has directed edges. + Directed, } diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 8786552bc468..41ad91c02491 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -14,7 +14,6 @@ include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; include "./datatypes/graph_edge.fbs"; include "./datatypes/graph_node.fbs"; -include "./datatypes/graph_type.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs deleted file mode 100644 index c18487f97e82..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs +++ /dev/null @@ -1,19 +0,0 @@ -namespace rerun.datatypes; - -// -- - -/// Specifies if a graph has directed or undirected edges. -enum GraphType: ubyte ( - "attr.rust.derive": "Default, PartialEq, Eq", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - /// Invalid value. Won't show up in generated types. - Invalid = 0, - - /// The graph has undirected edges. - Undirected (default), - - /// The graph has directed edges. - Directed, -} diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs index 42ca163cb12a..348b2f486fd3 100644 --- a/crates/store/re_types/src/archetypes/graph_edges.rs +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -27,7 +27,7 @@ pub struct GraphEdges { pub edges: Vec, /// Specifies if the graph is directed or undirected. - pub graph_type: Option>, + pub graph_type: Option, } impl ::re_types_core::SizeBytes for GraphEdges { @@ -39,7 +39,7 @@ impl ::re_types_core::SizeBytes for GraphEdges { #[inline] fn is_pod() -> bool { >::is_pod() - && >>::is_pod() + && >::is_pod() } } @@ -136,14 +136,11 @@ impl ::re_types_core::Archetype for GraphEdges { .with_context("rerun.archetypes.GraphEdges#edges")? }; let graph_type = if let Some(array) = arrays_by_name.get("rerun.components.GraphType") { - Some({ - ::from_arrow_opt(&**array) - .with_context("rerun.archetypes.GraphEdges#graph_type")? - .into_iter() - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .collect::>>() - .with_context("rerun.archetypes.GraphEdges#graph_type")? - }) + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.GraphEdges#graph_type")? + .into_iter() + .next() + .flatten() } else { None }; @@ -160,7 +157,7 @@ impl ::re_types_core::AsComponents for GraphEdges { Some((&self.edges as &dyn ComponentBatch).into()), self.graph_type .as_ref() - .map(|comp_batch| (comp_batch as &dyn ComponentBatch).into()), + .map(|comp| (comp as &dyn ComponentBatch).into()), ] .into_iter() .flatten() @@ -182,11 +179,8 @@ impl GraphEdges { /// Specifies if the graph is directed or undirected. #[inline] - pub fn with_graph_type( - mut self, - graph_type: impl IntoIterator>, - ) -> Self { - self.graph_type = Some(graph_type.into_iter().map(Into::into).collect()); + pub fn with_graph_type(mut self, graph_type: impl Into) -> Self { + self.graph_type = Some(graph_type.into()); self } } diff --git a/crates/store/re_types/src/components/graph_type.rs b/crates/store/re_types/src/components/graph_type.rs index c15dbb31592c..5e1c19b69bcd 100644 --- a/crates/store/re_types/src/components/graph_type.rs +++ b/crates/store/re_types/src/components/graph_type.rs @@ -11,6 +11,7 @@ #![allow(clippy::redundant_closure)] #![allow(clippy::too_many_arguments)] #![allow(clippy::too_many_lines)] +#![allow(non_camel_case_types)] use ::re_types_core::external::arrow2; use ::re_types_core::ComponentName; @@ -19,49 +20,51 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: Specifies if a graph has directed or undirected edges. -#[derive(Clone, Debug, Default, PartialEq, Eq)] -#[repr(transparent)] +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphType(pub crate::datatypes::GraphType); +#[repr(u8)] +pub enum GraphType { + /// The graph has undirected edges. + #[default] + Undirected = 1, + + /// The graph has directed edges. + Directed = 2, +} -impl ::re_types_core::SizeBytes for GraphType { +impl ::re_types_core::reflection::Enum for GraphType { #[inline] - fn heap_size_bytes(&self) -> u64 { - self.0.heap_size_bytes() + fn variants() -> &'static [Self] { + &[Self::Undirected, Self::Directed] } #[inline] - fn is_pod() -> bool { - ::is_pod() + fn docstring_md(self) -> &'static str { + match self { + Self::Undirected => "The graph has undirected edges.", + Self::Directed => "The graph has directed edges.", + } } } -impl> From for GraphType { - fn from(v: T) -> Self { - Self(v.into()) - } -} - -impl std::borrow::Borrow for GraphType { +impl ::re_types_core::SizeBytes for GraphType { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphType { - &self.0 + fn heap_size_bytes(&self) -> u64 { + 0 } -} - -impl std::ops::Deref for GraphType { - type Target = crate::datatypes::GraphType; #[inline] - fn deref(&self) -> &crate::datatypes::GraphType { - &self.0 + fn is_pod() -> bool { + true } } -impl std::ops::DerefMut for GraphType { - #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphType { - &mut self.0 +impl std::fmt::Display for GraphType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Undirected => write!(f, "Undirected"), + Self::Directed => write!(f, "Directed"), + } } } @@ -77,7 +80,9 @@ impl ::re_types_core::Loggable for GraphType { #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphType::arrow_datatype() + #![allow(clippy::wildcard_imports)] + use arrow2::datatypes::*; + DataType::UInt8 } fn to_arrow_opt<'a>( @@ -86,12 +91,30 @@ impl ::re_types_core::Loggable for GraphType { where Self: Clone + 'a, { - crate::datatypes::GraphType::to_arrow_opt(data.into_iter().map(|datum| { - datum.map(|datum| match datum.into() { - ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), - ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), - }) - })) + #![allow(clippy::wildcard_imports)] + #![allow(clippy::manual_is_variant_and)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, datatypes::*}; + Ok({ + let (somes, data0): (Vec<_>, Vec<_>) = data + .into_iter() + .map(|datum| { + let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); + let datum = datum.map(|datum| *datum as u8); + (datum.is_some(), datum) + }) + .unzip(); + let data0_bitmap: Option = { + let any_nones = somes.iter().any(|some| !*some); + any_nones.then(|| somes.into()) + }; + PrimitiveArray::new( + Self::arrow_datatype(), + data0.into_iter().map(|v| v.unwrap_or_default()).collect(), + data0_bitmap, + ) + .boxed() + }) } fn from_arrow_opt( @@ -100,16 +123,31 @@ impl ::re_types_core::Loggable for GraphType { where Self: Sized, { - crate::datatypes::GraphType::from_arrow_opt(arrow_data) - .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) - } - - #[inline] - fn from_arrow(arrow_data: &dyn arrow2::array::Array) -> DeserializationResult> - where - Self: Sized, - { - crate::datatypes::GraphType::from_arrow(arrow_data) - .map(|v| v.into_iter().map(Self).collect()) + #![allow(clippy::wildcard_imports)] + use ::re_types_core::{Loggable as _, ResultExt as _}; + use arrow2::{array::*, buffer::*, datatypes::*}; + Ok(arrow_data + .as_any() + .downcast_ref::() + .ok_or_else(|| { + let expected = Self::arrow_datatype(); + let actual = arrow_data.data_type().clone(); + DeserializationError::datatype_mismatch(expected, actual) + }) + .with_context("rerun.components.GraphType#enum")? + .into_iter() + .map(|opt| opt.copied()) + .map(|typ| match typ { + Some(1) => Ok(Some(Self::Undirected)), + Some(2) => Ok(Some(Self::Directed)), + None => Ok(None), + Some(invalid) => Err(DeserializationError::missing_union_arm( + Self::arrow_datatype(), + "", + invalid as _, + )), + }) + .collect::>>>() + .with_context("rerun.components.GraphType")?) } } diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index 16f4597c2ff7..a469e4c3048e 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -11,7 +11,6 @@ class_id.rs linguist-generated=true color_model.rs linguist-generated=true graph_edge.rs linguist-generated=true graph_node.rs linguist-generated=true -graph_type.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_type.rs b/crates/store/re_types/src/datatypes/graph_type.rs deleted file mode 100644 index 401ecb99a002..000000000000 --- a/crates/store/re_types/src/datatypes/graph_type.rs +++ /dev/null @@ -1,153 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] -#![allow(non_camel_case_types)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Datatype**: Specifies if a graph has directed or undirected edges. -#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[repr(u8)] -pub enum GraphType { - /// The graph has undirected edges. - #[default] - Undirected = 1, - - /// The graph has directed edges. - Directed = 2, -} - -impl ::re_types_core::reflection::Enum for GraphType { - #[inline] - fn variants() -> &'static [Self] { - &[Self::Undirected, Self::Directed] - } - - #[inline] - fn docstring_md(self) -> &'static str { - match self { - Self::Undirected => "The graph has undirected edges.", - Self::Directed => "The graph has directed edges.", - } - } -} - -impl ::re_types_core::SizeBytes for GraphType { - #[inline] - fn heap_size_bytes(&self) -> u64 { - 0 - } - - #[inline] - fn is_pod() -> bool { - true - } -} - -impl std::fmt::Display for GraphType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Undirected => write!(f, "Undirected"), - Self::Directed => write!(f, "Directed"), - } - } -} - -::re_types_core::macros::impl_into_cow!(GraphType); - -impl ::re_types_core::Loggable for GraphType { - type Name = ::re_types_core::DatatypeName; - - #[inline] - fn name() -> Self::Name { - "rerun.datatypes.GraphType".into() - } - - #[inline] - fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::UInt8 - } - - fn to_arrow_opt<'a>( - data: impl IntoIterator>>>, - ) -> SerializationResult> - where - Self: Clone + 'a, - { - #![allow(clippy::wildcard_imports)] - #![allow(clippy::manual_is_variant_and)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data0): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - let datum = datum.map(|datum| *datum as u8); - (datum.is_some(), datum) - }) - .unzip(); - let data0_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - PrimitiveArray::new( - Self::arrow_datatype(), - data0.into_iter().map(|v| v.unwrap_or_default()).collect(), - data0_bitmap, - ) - .boxed() - }) - } - - fn from_arrow_opt( - arrow_data: &dyn arrow2::array::Array, - ) -> DeserializationResult>> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok(arrow_data - .as_any() - .downcast_ref::() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphType#enum")? - .into_iter() - .map(|opt| opt.copied()) - .map(|typ| match typ { - Some(1) => Ok(Some(Self::Undirected)), - Some(2) => Ok(Some(Self::Directed)), - None => Ok(None), - Some(invalid) => Err(DeserializationError::missing_union_arm( - Self::arrow_datatype(), - "", - invalid as _, - )), - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphType")?) - } -} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 0c3e74d77c28..8a32b6d30630 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -20,7 +20,6 @@ mod graph_edge; mod graph_edge_ext; mod graph_node; mod graph_node_ext; -mod graph_type; mod image_format; mod image_format_ext; mod keypoint_id; @@ -81,7 +80,6 @@ pub use self::class_id::ClassId; pub use self::color_model::ColorModel; pub use self::graph_edge::GraphEdge; pub use self::graph_node::GraphNode; -pub use self::graph_type::GraphType; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 19aedad21690..ce851427e5cd 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,5 +1,5 @@ use re_log_types::{EntityPath, Instance}; -use re_types::{datatypes, ArrowString}; +use re_types::{components, datatypes, ArrowString}; use crate::graph::NodeIndex; @@ -42,7 +42,7 @@ pub struct EdgeInstance<'a> { pub target: &'a datatypes::GraphNode, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, - pub edge_type: datatypes::GraphType, + pub edge_type: components::GraphType, } impl<'a> EdgeInstance<'a> { diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index fdc519045c2c..6471d6ab088b 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -3,7 +3,7 @@ use std::collections::HashSet; use egui::{self, Rect}; use re_log_types::EntityPath; -use re_types::{datatypes, SpaceViewClassIdentifier}; +use re_types::{components, datatypes, SpaceViewClassIdentifier}; use re_ui::{self, UiExt}; use re_viewer_context::{ external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, @@ -150,7 +150,7 @@ impl SpaceViewClass for GraphSpaceView { // } // We keep track of the nodes in the data to clean up the layout. - // TODO: once we settle on a design, it might make sense to create a + // TODO(grtlr): once we settle on a design, it might make sense to create a // `Layout` struct that keeps track of the layout and the nodes that // get added and removed and cleans up automatically (guard pattern). let mut seen: HashSet = HashSet::new(); @@ -217,7 +217,7 @@ impl SpaceViewClass for GraphSpaceView { source_pos, target_pos, ent_highlight.index_highlight(edge.instance), - edge.edge_type == datatypes::GraphType::Directed, + edge.edge_type == components::GraphType::Directed, ) }); } diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs index b6cb9929af89..594e337c186d 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -2,7 +2,7 @@ use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; use re_log_types::Instance; use re_query::{clamped_zip_2x1, range_zip_1x1}; use re_space_view::{DataResultQuery, RangeResultsExt}; -use re_types::{self, archetypes, components, datatypes, Loggable as _}; +use re_types::{self, archetypes, components, Loggable as _}; use re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, @@ -17,7 +17,7 @@ pub struct EdgesVisualizer { pub struct EdgeData { pub entity_path: re_log_types::EntityPath, - pub graph_type: datatypes::GraphType, + pub graph_type: components::GraphType, edges: ChunkComponentIterItem, } @@ -82,7 +82,7 @@ impl VisualizerSystem for EdgesVisualizer { graph_type: graph_type .unwrap_or_default() .first() - .map(|x| x.0) + .copied() .unwrap_or_default(), }); } diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md index 4f766b10364a..922acbb6a71a 100644 --- a/docs/content/reference/types/components/graph_type.md +++ b/docs/content/reference/types/components/graph_type.md @@ -5,14 +5,15 @@ title: "GraphType" Specifies if a graph has directed or undirected edges. -## Fields +## Variants -* graph_type: [`GraphType`](../datatypes/graph_type.md) +* Undirected +* Directed ## API reference links - * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphType.html) + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1components.html) * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphType) - * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/struct.GraphType.html) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/enum.GraphType.html) ## Used by diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index 6d28d552d1c4..5584a1200e7d 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -21,7 +21,6 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. * [`GraphEdge`](datatypes/graph_edge.md): An edge in a graph connecting two nodes. * [`GraphNode`](datatypes/graph_node.md): A string-based ID representing a node in a graph. -* [`GraphType`](datatypes/graph_type.md): Specifies if a graph has directed or undirected edges. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index 09255112d119..a2de869ac5a1 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -15,7 +15,6 @@ float32.md linguist-generated=true float64.md linguist-generated=true graph_edge.md linguist-generated=true graph_node.md linguist-generated=true -graph_type.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/graph_type.md b/docs/content/reference/types/datatypes/graph_type.md deleted file mode 100644 index ec44318856dd..000000000000 --- a/docs/content/reference/types/datatypes/graph_type.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphType" ---- - - -Specifies if a graph has directed or undirected edges. - -## Variants - -* Undirected -* Directed - -## API reference links - * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1datatypes.html) - * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphType) - * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/datatypes/enum.GraphType.html) - - -## Used by - -* [`GraphType`](../components/graph_type.md) diff --git a/examples/python/node_link_graphs/README.md b/examples/python/node_link_graphs/README.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/examples/python/node_link_graphs/node_link_graphs.py b/examples/python/node_link_graphs/node_link_graphs.py new file mode 100644 index 000000000000..2d1ccc77eeba --- /dev/null +++ b/examples/python/node_link_graphs/node_link_graphs.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +"""Examples of logging graph data to Rerun.""" + + +def main() -> None: + print("Hello, world!") diff --git a/examples/python/node_link_graphs/pyproject.toml b/examples/python/node_link_graphs/pyproject.toml new file mode 100644 index 000000000000..0e960cf3ce0b --- /dev/null +++ b/examples/python/node_link_graphs/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "node-link" +version = "0.1.0" +# requires-python = "<3.12" +dependencies = ["rerun-sdk"] + +[project.scripts] +node_link_graphs = "node_link_graphs:main" + +# [build-system] +# requires = ["hatchling"] +# build-backend = "hatchling.build" diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link_graph/src/examples/lattice.rs index 77fa0e06a105..e945975fa9ba 100644 --- a/examples/rust/node_link_graph/src/examples/lattice.rs +++ b/examples/rust/node_link_graph/src/examples/lattice.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use rerun::{datatypes, Color, GraphEdges, GraphNodes}; +use rerun::{components, Color, GraphEdges, GraphNodes}; use crate::Args; @@ -47,7 +47,7 @@ pub fn run(args: &Args, num_nodes: usize) -> anyhow::Result<()> { rec.log_static( "/lattice", - &GraphEdges::new(edges).with_graph_type([datatypes::GraphType::Directed]), + &GraphEdges::new(edges).with_graph_type(components::GraphType::Directed), )?; Ok(()) } diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp index d4384c68dc14..8cf8ed2b5ba6 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp @@ -25,7 +25,7 @@ namespace rerun::archetypes { Collection edges; /// Specifies if the graph is directed or undirected. - std::optional> graph_type; + std::optional graph_type; public: static constexpr const char IndicatorComponentName[] = @@ -42,7 +42,7 @@ namespace rerun::archetypes { : edges(std::move(_edges)) {} /// Specifies if the graph is directed or undirected. - GraphEdges with_graph_type(Collection _graph_type) && { + GraphEdges with_graph_type(rerun::components::GraphType _graph_type) && { graph_type = std::move(_graph_type); // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) diff --git a/rerun_cpp/src/rerun/components/.gitattributes b/rerun_cpp/src/rerun/components/.gitattributes index 6c5adccb600e..c49e4606a49d 100644 --- a/rerun_cpp/src/rerun/components/.gitattributes +++ b/rerun_cpp/src/rerun/components/.gitattributes @@ -23,6 +23,7 @@ fill_ratio.hpp linguist-generated=true gamma_correction.hpp linguist-generated=true graph_edge.hpp linguist-generated=true graph_node.hpp linguist-generated=true +graph_type.cpp linguist-generated=true graph_type.hpp linguist-generated=true half_size2d.hpp linguist-generated=true half_size3d.hpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.cpp b/rerun_cpp/src/rerun/components/graph_type.cpp similarity index 72% rename from rerun_cpp/src/rerun/datatypes/graph_type.cpp rename to rerun_cpp/src/rerun/components/graph_type.cpp index 678579db8df6..e7d3390016f5 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_type.cpp +++ b/rerun_cpp/src/rerun/components/graph_type.cpp @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". +// Based on "crates/store/re_types/definitions/rerun/components/graph_type.fbs". #include "graph_type.hpp" @@ -7,13 +7,13 @@ #include namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { + const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::uint8(); return datatype; } - Result> Loggable::to_arrow( - const datatypes::GraphType* instances, size_t num_instances + Result> Loggable::to_arrow( + const components::GraphType* instances, size_t num_instances ) { // TODO(andreas): Allow configuring the memory pool. arrow::MemoryPool* pool = arrow::default_memory_pool(); @@ -21,7 +21,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( static_cast(builder.get()), instances, num_instances @@ -32,8 +32,8 @@ namespace rerun { return array; } - rerun::Error Loggable::fill_arrow_array_builder( - arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements + rerun::Error Loggable::fill_arrow_array_builder( + arrow::UInt8Builder* builder, const components::GraphType* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); diff --git a/rerun_cpp/src/rerun/components/graph_type.hpp b/rerun_cpp/src/rerun/components/graph_type.hpp index 860b6945b78e..6a1b7a09312e 100644 --- a/rerun_cpp/src/rerun/components/graph_type.hpp +++ b/rerun_cpp/src/rerun/components/graph_type.hpp @@ -3,36 +3,37 @@ #pragma once -#include "../datatypes/graph_type.hpp" #include "../result.hpp" #include #include -namespace rerun::components { - /// **Component**: Specifies if a graph has directed or undirected edges. - struct GraphType { - rerun::datatypes::GraphType graph_type; +namespace arrow { + /// \private + template + class NumericBuilder; - public: - GraphType() = default; + class Array; + class DataType; + class UInt8Type; + using UInt8Builder = NumericBuilder; +} // namespace arrow - GraphType(rerun::datatypes::GraphType graph_type_) : graph_type(graph_type_) {} +namespace rerun::components { + /// **Component**: Specifies if a graph has directed or undirected edges. + enum class GraphType : uint8_t { - GraphType& operator=(rerun::datatypes::GraphType graph_type_) { - graph_type = graph_type_; - return *this; - } + /// The graph has undirected edges. + Undirected = 1, - /// Cast to the underlying GraphType datatype - operator rerun::datatypes::GraphType() const { - return graph_type; - } + /// The graph has directed edges. + Directed = 2, }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphType) == sizeof(components::GraphType)); + template + struct Loggable; /// \private template <> @@ -40,27 +41,16 @@ namespace rerun { static constexpr const char Name[] = "rerun.components.GraphType"; /// Returns the arrow data type this type corresponds to. - static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); - } + static const std::shared_ptr& arrow_datatype(); /// Serializes an array of `rerun::components::GraphType` into an arrow array. static Result> to_arrow( const components::GraphType* instances, size_t num_instances - ) { - if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); - } else if (instances == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Passed array instances is null when num_elements> 0." - ); - } else { - return Loggable::to_arrow( - &instances->graph_type, - num_instances - ); - } - } + ); + + /// Fills an arrow array builder with an array of this type. + static rerun::Error fill_arrow_array_builder( + arrow::UInt8Builder* builder, const components::GraphType* elements, size_t num_elements + ); }; } // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index 4be967809c3a..a544a27f3836 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -16,7 +16,6 @@ #include "datatypes/float64.hpp" #include "datatypes/graph_edge.hpp" #include "datatypes/graph_node.hpp" -#include "datatypes/graph_type.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 3b6db9b9e234..54664fbd114a 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -29,8 +29,6 @@ graph_edge.cpp linguist-generated=true graph_edge.hpp linguist-generated=true graph_node.cpp linguist-generated=true graph_node.hpp linguist-generated=true -graph_type.cpp linguist-generated=true -graph_type.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_type.hpp b/rerun_cpp/src/rerun/datatypes/graph_type.hpp deleted file mode 100644 index bd9293bb27ac..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_type.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -#pragma once - -#include "../result.hpp" - -#include -#include - -namespace arrow { - /// \private - template - class NumericBuilder; - - class Array; - class DataType; - class UInt8Type; - using UInt8Builder = NumericBuilder; -} // namespace arrow - -namespace rerun::datatypes { - /// **Datatype**: Specifies if a graph has directed or undirected edges. - enum class GraphType : uint8_t { - - /// The graph has undirected edges. - Undirected = 1, - - /// The graph has directed edges. - Directed = 2, - }; -} // namespace rerun::datatypes - -namespace rerun { - template - struct Loggable; - - /// \private - template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphType"; - - /// Returns the arrow data type this type corresponds to. - static const std::shared_ptr& arrow_datatype(); - - /// Serializes an array of `rerun::datatypes::GraphType` into an arrow array. - static Result> to_arrow( - const datatypes::GraphType* instances, size_t num_instances - ); - - /// Fills an arrow array builder with an array of this type. - static rerun::Error fill_arrow_array_builder( - arrow::UInt8Builder* builder, const datatypes::GraphType* elements, size_t num_elements - ); - }; -} // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py index cd7d06673108..992e431ddf2f 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -26,9 +26,7 @@ class GraphEdges(Archetype): By default, edges are undirected. """ - def __init__( - self: Any, edges: datatypes.GraphEdgeArrayLike, *, graph_type: datatypes.GraphTypeArrayLike | None = None - ): + def __init__(self: Any, edges: datatypes.GraphEdgeArrayLike, *, graph_type: components.GraphTypeLike | None = None): """ Create a new instance of the GraphEdges archetype. diff --git a/rerun_py/rerun_sdk/rerun/components/__init__.py b/rerun_py/rerun_sdk/rerun/components/__init__.py index 4c07d684c17f..c9755c3398fb 100644 --- a/rerun_py/rerun_sdk/rerun/components/__init__.py +++ b/rerun_py/rerun_sdk/rerun/components/__init__.py @@ -32,7 +32,7 @@ from .gamma_correction import GammaCorrection, GammaCorrectionBatch, GammaCorrectionType from .graph_edge import GraphEdge, GraphEdgeBatch, GraphEdgeType from .graph_node import GraphNode, GraphNodeBatch, GraphNodeType -from .graph_type import GraphType, GraphTypeBatch, GraphTypeType +from .graph_type import GraphType, GraphTypeArrayLike, GraphTypeBatch, GraphTypeLike, GraphTypeType from .half_size2d import HalfSize2D, HalfSize2DBatch, HalfSize2DType from .half_size3d import HalfSize3D, HalfSize3DBatch, HalfSize3DType from .image_buffer import ImageBuffer, ImageBufferBatch, ImageBufferType @@ -161,7 +161,9 @@ "GraphNodeBatch", "GraphNodeType", "GraphType", + "GraphTypeArrayLike", "GraphTypeBatch", + "GraphTypeLike", "GraphTypeType", "HalfSize2D", "HalfSize2DBatch", diff --git a/rerun_py/rerun_sdk/rerun/components/graph_type.py b/rerun_py/rerun_sdk/rerun/components/graph_type.py index b832efe7886a..fd425da04a78 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_type.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_type.py @@ -5,32 +5,71 @@ from __future__ import annotations -from .. import datatypes +from typing import Literal, Sequence, Union + +import pyarrow as pa + from .._baseclasses import ( + BaseBatch, + BaseExtensionType, ComponentBatchMixin, - ComponentMixin, ) -__all__ = ["GraphType", "GraphTypeBatch", "GraphTypeType"] +__all__ = ["GraphType", "GraphTypeArrayLike", "GraphTypeBatch", "GraphTypeLike", "GraphTypeType"] + +from enum import Enum -class GraphType(datatypes.GraphType, ComponentMixin): + +class GraphType(Enum): """**Component**: Specifies if a graph has directed or undirected edges.""" - _BATCH_TYPE = None - # You can define your own __init__ function as a member of GraphTypeExt in graph_type_ext.py + Undirected = 1 + """The graph has undirected edges.""" + + Directed = 2 + """The graph has directed edges.""" - # Note: there are no fields here because GraphType delegates to datatypes.GraphType - pass + @classmethod + def auto(cls, val: str | int | GraphType) -> GraphType: + """Best-effort converter, including a case-insensitive string matcher.""" + if isinstance(val, GraphType): + return val + if isinstance(val, int): + return cls(val) + try: + return cls[val] + except KeyError: + val_lower = val.lower() + for variant in cls: + if variant.name.lower() == val_lower: + return variant + raise ValueError(f"Cannot convert {val} to {cls.__name__}") + def __str__(self) -> str: + """Returns the variant name.""" + return self.name -class GraphTypeType(datatypes.GraphTypeType): + +GraphTypeLike = Union[GraphType, Literal["Directed", "Undirected", "directed", "undirected"], int] +GraphTypeArrayLike = Union[GraphTypeLike, Sequence[GraphTypeLike]] + + +class GraphTypeType(BaseExtensionType): _TYPE_NAME: str = "rerun.components.GraphType" + def __init__(self) -> None: + pa.ExtensionType.__init__(self, pa.uint8(), self._TYPE_NAME) -class GraphTypeBatch(datatypes.GraphTypeBatch, ComponentBatchMixin): + +class GraphTypeBatch(BaseBatch[GraphTypeArrayLike], ComponentBatchMixin): _ARROW_TYPE = GraphTypeType() + @staticmethod + def _native_to_pa_array(data: GraphTypeArrayLike, data_type: pa.DataType) -> pa.Array: + if isinstance(data, (GraphType, int, str)): + data = [data] + + pa_data = [GraphType.auto(v).value if v is not None else None for v in data] # type: ignore[redundant-expr] -# This is patched in late to avoid circular dependencies. -GraphType._BATCH_TYPE = GraphTypeBatch # type: ignore[assignment] + return pa.array(pa_data, type=data_type) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index 95631c93b9f7..585d0be6e2a8 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -16,7 +16,6 @@ float32.py linguist-generated=true float64.py linguist-generated=true graph_edge.py linguist-generated=true graph_node.py linguist-generated=true -graph_type.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index 91e7977ca4fa..a8eb70dc69bd 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -40,7 +40,6 @@ from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType from .graph_node import GraphNode, GraphNodeArrayLike, GraphNodeBatch, GraphNodeLike, GraphNodeType -from .graph_type import GraphType, GraphTypeArrayLike, GraphTypeBatch, GraphTypeLike, GraphTypeType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -194,11 +193,6 @@ "GraphNodeBatch", "GraphNodeLike", "GraphNodeType", - "GraphType", - "GraphTypeArrayLike", - "GraphTypeBatch", - "GraphTypeLike", - "GraphTypeType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py deleted file mode 100644 index 4f59e2cd3996..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_type.py +++ /dev/null @@ -1,74 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_type.fbs". - -# You can extend this class by creating a "GraphTypeExt" class in "graph_type_ext.py". - -from __future__ import annotations - -from typing import Literal, Sequence, Union - -import pyarrow as pa - -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphType", "GraphTypeArrayLike", "GraphTypeBatch", "GraphTypeLike", "GraphTypeType"] - - -from enum import Enum - - -class GraphType(Enum): - """**Datatype**: Specifies if a graph has directed or undirected edges.""" - - Undirected = 1 - """The graph has undirected edges.""" - - Directed = 2 - """The graph has directed edges.""" - - @classmethod - def auto(cls, val: str | int | GraphType) -> GraphType: - """Best-effort converter, including a case-insensitive string matcher.""" - if isinstance(val, GraphType): - return val - if isinstance(val, int): - return cls(val) - try: - return cls[val] - except KeyError: - val_lower = val.lower() - for variant in cls: - if variant.name.lower() == val_lower: - return variant - raise ValueError(f"Cannot convert {val} to {cls.__name__}") - - def __str__(self) -> str: - """Returns the variant name.""" - return self.name - - -GraphTypeLike = Union[GraphType, Literal["Directed", "Undirected", "directed", "undirected"], int] -GraphTypeArrayLike = Union[GraphTypeLike, Sequence[GraphTypeLike]] - - -class GraphTypeType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphType" - - def __init__(self) -> None: - pa.ExtensionType.__init__(self, pa.uint8(), self._TYPE_NAME) - - -class GraphTypeBatch(BaseBatch[GraphTypeArrayLike]): - _ARROW_TYPE = GraphTypeType() - - @staticmethod - def _native_to_pa_array(data: GraphTypeArrayLike, data_type: pa.DataType) -> pa.Array: - if isinstance(data, (GraphType, int, str)): - data = [data] - - pa_data = [GraphType.auto(v).value if v is not None else None for v in data] # type: ignore[redundant-expr] - - return pa.array(pa_data, type=data_type) From b1ae62ab87735e4497230ad07d0cd242f785f765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 09:43:58 +0200 Subject: [PATCH 108/159] WIP: missing Python import --- examples/python/node_link_graphs/node_link_graphs.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/python/node_link_graphs/node_link_graphs.py b/examples/python/node_link_graphs/node_link_graphs.py index 2d1ccc77eeba..ed3a441def6a 100644 --- a/examples/python/node_link_graphs/node_link_graphs.py +++ b/examples/python/node_link_graphs/node_link_graphs.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 """Examples of logging graph data to Rerun.""" +from __future__ import annotations + def main() -> None: print("Hello, world!") From d5245162a6398d8144dea7ffd9b95a09f0c73e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 09:55:20 +0200 Subject: [PATCH 109/159] WIP: try to get example to run --- .../python/{node_link_graphs => node_link}/README.md | 0 .../node_link_graphs.py => node_link/node_link.py} | 4 ++++ examples/python/node_link/pyproject.toml | 12 ++++++++++++ examples/python/node_link_graphs/pyproject.toml | 12 ------------ 4 files changed, 16 insertions(+), 12 deletions(-) rename examples/python/{node_link_graphs => node_link}/README.md (100%) rename examples/python/{node_link_graphs/node_link_graphs.py => node_link/node_link.py} (79%) create mode 100644 examples/python/node_link/pyproject.toml delete mode 100644 examples/python/node_link_graphs/pyproject.toml diff --git a/examples/python/node_link_graphs/README.md b/examples/python/node_link/README.md similarity index 100% rename from examples/python/node_link_graphs/README.md rename to examples/python/node_link/README.md diff --git a/examples/python/node_link_graphs/node_link_graphs.py b/examples/python/node_link/node_link.py similarity index 79% rename from examples/python/node_link_graphs/node_link_graphs.py rename to examples/python/node_link/node_link.py index ed3a441def6a..ed95c426ac48 100644 --- a/examples/python/node_link_graphs/node_link_graphs.py +++ b/examples/python/node_link/node_link.py @@ -6,3 +6,7 @@ def main() -> None: print("Hello, world!") + + +if __name__ == "__main__": + main() diff --git a/examples/python/node_link/pyproject.toml b/examples/python/node_link/pyproject.toml new file mode 100644 index 000000000000..7d52bb0eb6be --- /dev/null +++ b/examples/python/node_link/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "node_link" +version = "0.1.0" +readme = "README.md" +dependencies = ["rerun-sdk"] + +[project.scripts] +node_link = "node_link:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/examples/python/node_link_graphs/pyproject.toml b/examples/python/node_link_graphs/pyproject.toml deleted file mode 100644 index 0e960cf3ce0b..000000000000 --- a/examples/python/node_link_graphs/pyproject.toml +++ /dev/null @@ -1,12 +0,0 @@ -[project] -name = "node-link" -version = "0.1.0" -# requires-python = "<3.12" -dependencies = ["rerun-sdk"] - -[project.scripts] -node_link_graphs = "node_link_graphs:main" - -# [build-system] -# requires = ["hatchling"] -# build-backend = "hatchling.build" From 558b98b3673eca8d478a2b219bb4f776968854ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 09:58:20 +0200 Subject: [PATCH 110/159] WIP: import rerun --- examples/python/node_link/node_link.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index ed95c426ac48..3fcb86540534 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -3,10 +3,13 @@ from __future__ import annotations +import rerun as rr + def main() -> None: print("Hello, world!") + rr.init("rerun_example_py_node_link", spawn=True) if __name__ == "__main__": main() From f1d9f21f59e0fd9d6101010b91d6eaf698f5b4c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 10:05:12 +0200 Subject: [PATCH 111/159] WIP: lints --- examples/python/node_link/node_link.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index 3fcb86540534..2dbeff2d64f5 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -11,5 +11,6 @@ def main() -> None: rr.init("rerun_example_py_node_link", spawn=True) + if __name__ == "__main__": main() From 2bf70793567888e316531ff4600d18467e272400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 10:51:33 +0200 Subject: [PATCH 112/159] WIP: add view icon (looking great by the way! :star-struck:) --- crates/viewer/re_space_view_graph/src/view.rs | 2 +- .../viewer/re_ui/data/icons/spaceview_graph.png | Bin 0 -> 462 bytes crates/viewer/re_ui/src/icons.rs | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 crates/viewer/re_ui/data/icons/spaceview_graph.png diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 6471d6ab088b..9fafd157d555 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -34,7 +34,7 @@ impl SpaceViewClass for GraphSpaceView { } fn icon(&self) -> &'static re_ui::Icon { - &re_ui::icons::SPACE_VIEW_GENERIC + &re_ui::icons::SPACE_VIEW_GRAPH } fn help_markdown(&self, _egui_ctx: &egui::Context) -> String { diff --git a/crates/viewer/re_ui/data/icons/spaceview_graph.png b/crates/viewer/re_ui/data/icons/spaceview_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9b709e7c508f58c76db69bded8d8ccbf536614dd GIT binary patch literal 462 zcmV;<0WtoGP)fm%qnC$U@YkFtX2_Yq;Dk7DRGG#uar-od*~0bqhjNau22>d12R{3kA9$zXcxL zQP0#XrqL#$&oHB&xW$F+icn%SdQTcd zX6KQ^vH#s4*i?n#?<7rZMOq`C0udEyjG-in^~`68s7PZBUnu#eRhV%cdVY){S8(F+ zkitwD6~pVJBDilV!)(I}}p8x;=07*qoM6N<$ Ef{A3kWB>pF literal 0 HcmV?d00001 diff --git a/crates/viewer/re_ui/src/icons.rs b/crates/viewer/re_ui/src/icons.rs index e43e374b7310..2a3bee7de0e0 100644 --- a/crates/viewer/re_ui/src/icons.rs +++ b/crates/viewer/re_ui/src/icons.rs @@ -90,6 +90,7 @@ pub const CONTAINER_VERTICAL: Icon = icon_from_path!("../data/icons/container_ve pub const SPACE_VIEW_2D: Icon = icon_from_path!("../data/icons/spaceview_2d.png"); pub const SPACE_VIEW_3D: Icon = icon_from_path!("../data/icons/spaceview_3d.png"); pub const SPACE_VIEW_DATAFRAME: Icon = icon_from_path!("../data/icons/spaceview_dataframe.png"); +pub const SPACE_VIEW_GRAPH: Icon = icon_from_path!("../data/icons/spaceview_graph.png"); pub const SPACE_VIEW_GENERIC: Icon = icon_from_path!("../data/icons/spaceview_generic.png"); pub const SPACE_VIEW_HISTOGRAM: Icon = icon_from_path!("../data/icons/spaceview_histogram.png"); pub const SPACE_VIEW_LOG: Icon = icon_from_path!("../data/icons/spaceview_log.png"); From 59acc6b4787c96dd52efe26ab49f4077b9d445f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 11:02:41 +0200 Subject: [PATCH 113/159] WIP: include example --- .../rerun/components/graph_edge.fbs | 2 + examples/python/README.md | 2 + examples/python/node_link/node_link.py | 4 +- pixi.lock | 1459 +++++++++-------- pixi.toml | 1 + 5 files changed, 754 insertions(+), 714 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index e1d671eeac6e..959c3980c05a 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -4,6 +4,8 @@ namespace rerun.components; /// An edge in a graph connecting two nodes. table GraphEdge ( + "attr.python.aliases": "Sequence[str], Tuple[str, str]", + "attr.python.array_aliases": "Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/examples/python/README.md b/examples/python/README.md index bd24e5da5d11..2f2389c6d2ca 100644 --- a/examples/python/README.md +++ b/examples/python/README.md @@ -75,4 +75,6 @@ Some examples will download a small datasets before they run. They will do so th ## Contributions welcome Feel free to open a PR to add a new example! +If you add an example, please make sure to add the corresponding entry to the top-level `pixi.toml` file as well, otherwise it will not be picked up. + See [`CONTRIBUTING.md`](../../CONTRIBUTING.md) for details on how to contribute. diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index 2dbeff2d64f5..8ec9e44dc083 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -7,10 +7,10 @@ def main() -> None: - print("Hello, world!") - rr.init("rerun_example_py_node_link", spawn=True) + rr.log("binary_tree", rr.GraphNodes(["a", "b", "c"])) + if __name__ == "__main__": main() diff --git a/pixi.lock b/pixi.lock index 027ae6c48e4e..124a87b56845 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2554,6 +2554,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -2948,6 +2949,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -3322,6 +3324,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -3697,6 +3700,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -4075,6 +4079,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -4495,6 +4500,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -4840,6 +4846,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -5169,6 +5176,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -5499,6 +5507,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -5829,6 +5838,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -9063,6 +9073,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -9551,6 +9562,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -10018,6 +10030,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -10486,6 +10499,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -10937,6 +10951,7 @@ environments: - pypi: examples/python/minimal_options - pypi: examples/python/multiprocess_logging - pypi: examples/python/multithreading + - pypi: examples/python/node_link - pypi: examples/python/nuscenes_dataset - pypi: examples/python/nv12 - pypi: examples/python/objectron @@ -12850,8 +12865,8 @@ packages: requires_dist: - idna>=2.8 - sniffio>=1.1 - - exceptiongroup>=1.0.2 ; python_version < '3.11' - - typing-extensions>=4.1 ; python_version < '3.11' + - exceptiongroup>=1.0.2 ; python_full_version < '3.11' + - typing-extensions>=4.1 ; python_full_version < '3.11' - packaging ; extra == 'doc' - sphinx~=7.4 ; extra == 'doc' - sphinx-rtd-theme ; extra == 'doc' @@ -12864,8 +12879,8 @@ packages: - pytest>=7.0 ; extra == 'test' - pytest-mock>=3.6.1 ; extra == 'test' - trustme ; extra == 'test' - - uvloop>=0.21.0b1 ; (platform_python_implementation == 'CPython' and platform_system != 'Windows') and extra == 'test' - - truststore>=0.9.1 ; python_version >= '3.10' and extra == 'test' + - uvloop>=0.21.0b1 ; platform_python_implementation == 'CPython' and platform_system != 'Windows' and extra == 'test' + - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test' - trio>=0.26.1 ; extra == 'trio' requires_python: '>=3.9' - kind: pypi @@ -12874,15 +12889,15 @@ packages: url: https://files.pythonhosted.org/packages/1a/5a/7b024920cca385eb9b56bc63edf0a647de208346bfac5b339b544733d53a/anywidget-0.9.13-py3-none-any.whl sha256: 43d1658f1043b8c95cd350b2f5deccb123fd37810a36f656d6163aefe8163705 requires_dist: - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - ipywidgets>=7.6.0 - psygnal>=0.8.1 - typing-extensions>=4.2.0 - comm>=0.1.0 ; extra == 'dev' - watchfiles>=0.18.0 ; extra == 'dev' - - ipython<8.13 ; python_version < '3.9' and extra == 'test' - - msgspec ; python_version > '3.7' and extra == 'test' - - mypy==1.10.0 ; python_version > '3.7' and extra == 'test' + - ipython<8.13 ; python_full_version < '3.9' and extra == 'test' + - msgspec ; python_full_version >= '3.8' and extra == 'test' + - mypy==1.10.0 ; python_full_version >= '3.8' and extra == 'test' - pydantic ; extra == 'test' - pytest ; extra == 'test' - pytest-cov ; extra == 'test' @@ -12982,7 +12997,7 @@ packages: sha256: c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea requires_dist: - argon2-cffi-bindings - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' - argon2-cffi[tests,typing] ; extra == 'dev' - tox>4 ; extra == 'dev' - furo ; extra == 'docs' @@ -12997,8 +13012,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl - sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 + url: https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl + sha256: b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -13010,8 +13025,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae + url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl + sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -13036,8 +13051,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl - sha256: b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f + url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -13094,19 +13109,19 @@ packages: sha256: 051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 requires_dist: - six>=1.12.0 - - typing ; python_version < '3.5' - - astroid<2,>=1 ; python_version < '3' and extra == 'astroid' - - astroid<4,>=2 ; python_version >= '3' and extra == 'astroid' + - typing ; python_full_version < '3.5' + - astroid<2,>=1 ; python_full_version < '3' and extra == 'astroid' + - astroid<4,>=2 ; python_full_version >= '3' and extra == 'astroid' - pytest ; extra == 'test' - - astroid<2,>=1 ; python_version < '3' and extra == 'test' - - astroid<4,>=2 ; python_version >= '3' and extra == 'test' + - astroid<2,>=1 ; python_full_version < '3' and extra == 'test' + - astroid<4,>=2 ; python_full_version >= '3' and extra == 'test' - kind: pypi name: async-lru version: 2.0.4 url: https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl sha256: ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224 requires_dist: - - typing-extensions>=4.0.0 ; python_version < '3.11' + - typing-extensions>=4.0.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: attrs @@ -13114,29 +13129,29 @@ packages: url: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl sha256: 81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 requires_dist: - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' - hypothesis ; extra == 'benchmark' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'benchmark' - pympler ; extra == 'benchmark' - pytest-codspeed ; extra == 'benchmark' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'benchmark' - pytest-xdist[psutil] ; extra == 'benchmark' - pytest>=4.3.0 ; extra == 'benchmark' - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' - coverage[toml]>=5.3 ; extra == 'cov' - hypothesis ; extra == 'cov' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'cov' - pympler ; extra == 'cov' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'cov' - pytest-xdist[psutil] ; extra == 'cov' - pytest>=4.3.0 ; extra == 'cov' - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' - hypothesis ; extra == 'dev' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'dev' - pre-commit ; extra == 'dev' - pympler ; extra == 'dev' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'dev' - pytest-xdist[psutil] ; extra == 'dev' - pytest>=4.3.0 ; extra == 'dev' - cogapp ; extra == 'docs' @@ -13148,13 +13163,13 @@ packages: - towncrier<24.7 ; extra == 'docs' - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' - hypothesis ; extra == 'tests' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests' - pympler ; extra == 'tests' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests' - pytest-xdist[psutil] ; extra == 'tests' - pytest>=4.3.0 ; extra == 'tests' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' requires_python: '>=3.7' - kind: conda name: attrs @@ -14457,7 +14472,7 @@ packages: url: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl sha256: 368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b requires_dist: - - pytz>=2015.7 ; python_version < '3.9' + - pytz>=2015.7 ; python_full_version < '3.9' - pytest>=6.0 ; extra == 'dev' - pytest-cov ; extra == 'dev' - freezegun~=1.0 ; extra == 'dev' @@ -14501,8 +14516,8 @@ packages: requires_dist: - grpclib - stringcase - - dataclasses ; python_version < '3.7' - - backports-datetime-fromisoformat ; python_version < '3.7' + - dataclasses ; python_full_version < '3.7' + - backports-datetime-fromisoformat ; python_full_version < '3.7' - black ; extra == 'compiler' - jinja2 ; extra == 'compiler' - protobuf ; extra == 'compiler' @@ -14687,16 +14702,16 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad + url: https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - aiohttp>=3.10 ; extra == 'd' - ipython>=7.8.0 ; extra == 'jupyter' @@ -14706,16 +14721,16 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl - sha256: 4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392 + url: https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl + sha256: 3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - aiohttp>=3.10 ; extra == 'd' - ipython>=7.8.0 ; extra == 'jupyter' @@ -14725,16 +14740,16 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl - sha256: 3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d + url: https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl + sha256: 394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - aiohttp>=3.10 ; extra == 'd' - ipython>=7.8.0 ; extra == 'jupyter' @@ -14744,16 +14759,16 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl - sha256: 394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175 + url: https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - aiohttp>=3.10 ; extra == 'd' - ipython>=7.8.0 ; extra == 'jupyter' @@ -14763,16 +14778,16 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50 + url: https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + sha256: 4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - aiohttp>=3.10 ; extra == 'd' - ipython>=7.8.0 ; extra == 'jupyter' @@ -15339,8 +15354,8 @@ packages: - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d + url: https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 requires_dist: - pycparser requires_python: '>=3.8' @@ -15355,56 +15370,56 @@ packages: - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: 30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf + url: https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 + url: https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: 30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 + url: https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc + url: https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl + sha256: cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl - sha256: cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 + url: https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee + url: https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c + url: https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 + url: https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc requires_python: '>=3.7.0' - kind: conda name: clang @@ -16096,7 +16111,7 @@ packages: sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 requires_dist: - colorama ; platform_system == 'Windows' - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: clock @@ -16339,8 +16354,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad + url: https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16364,8 +16379,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d + url: https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49 requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16389,8 +16404,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66 + url: https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl + sha256: 6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67 requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16414,8 +16429,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl - sha256: 6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67 + url: https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16439,8 +16454,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49 + url: https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66 requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16468,13 +16483,13 @@ packages: sha256: 8ae055c0b8b0dd7757e4e666f6163172859044d4090830aecbec3460cdb318ee requires_dist: - accelerate - - opencv-python - - pillow - diffusers==0.27.2 - numpy + - opencv-python + - pillow + - rerun-sdk - torch==2.2.2 - transformers - - rerun-sdk requires_python: '>=3.10' editable: true - kind: pypi @@ -16508,8 +16523,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl - sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d + url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl + sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -16592,8 +16607,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl - sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb + url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl + sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -16824,14 +16839,14 @@ packages: - kind: pypi name: debugpy version: 1.8.7 - url: https://files.pythonhosted.org/packages/51/b1/a0866521c71a6ae3d3ca320e74835163a4671b1367ba360a55a0a51e5a91/debugpy-1.8.7-py2.py3-none-any.whl - sha256: 57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae + url: https://files.pythonhosted.org/packages/46/6f/2bb0bba20b8b74b7c341379dd99275cf6aa7722c1948fa99728716aad1b9/debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0 requires_python: '>=3.8' - kind: pypi name: debugpy version: 1.8.7 - url: https://files.pythonhosted.org/packages/46/6f/2bb0bba20b8b74b7c341379dd99275cf6aa7722c1948fa99728716aad1b9/debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0 + url: https://files.pythonhosted.org/packages/51/b1/a0866521c71a6ae3d3ca320e74835163a4671b1367ba360a55a0a51e5a91/debugpy-1.8.7-py2.py3-none-any.whl + sha256: 57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae requires_python: '>=3.8' - kind: pypi name: debugpy @@ -16880,7 +16895,7 @@ packages: - numpy - opencv-contrib-python>4.6 - pillow - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - timm==0.9.11 - torch==2.2.2 @@ -16895,9 +16910,9 @@ packages: - dicom-numpy==0.6.2 - numpy - pydicom==2.3.0 - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - - types-requests>=2.31,<3 + - types-requests<3,>=2.31 editable: true - kind: pypi name: dicom-numpy @@ -17167,7 +17182,7 @@ packages: - coverage ; extra == 'tests' - coverage-enable-subprocess ; extra == 'tests' - littleutils ; extra == 'tests' - - rich ; python_version >= '3.11' and extra == 'tests' + - rich ; python_full_version >= '3.11' and extra == 'tests' requires_python: '>=3.8' - kind: conda name: expat @@ -17626,7 +17641,7 @@ packages: - pytest-timeout>=2.3.1 ; extra == 'testing' - pytest>=8.3.3 ; extra == 'testing' - virtualenv>=20.26.4 ; extra == 'testing' - - typing-extensions>=4.12.2 ; python_version < '3.11' and extra == 'typing' + - typing-extensions>=4.12.2 ; python_full_version < '3.11' and extra == 'typing' requires_python: '>=3.8' - kind: pypi name: fire @@ -17907,8 +17922,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/aa/2c/8b5d82fe2d9c7f260fb73121418f5e07d4e38c329ea3886a5b0e55586113/fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: 5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20 + url: https://files.pythonhosted.org/packages/37/2e/f94118b92f7b6a9ec93840101b64bfdd09f295b266133857e8e852a5c35c/fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: 301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -17923,7 +17938,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -17936,7 +17951,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -17944,8 +17959,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/96/13/748b7f7239893ff0796de11074b0ad8aa4c3da2d9f4d79a128b0b16147f3/fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07 + url: https://files.pythonhosted.org/packages/45/4b/8a32f56a13e78256192f77d6b65583c43538c7955f5420887bb574b91ddf/fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -17960,7 +17975,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -17973,7 +17988,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -17981,8 +17996,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/45/4b/8a32f56a13e78256192f77d6b65583c43538c7955f5420887bb574b91ddf/fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7 + url: https://files.pythonhosted.org/packages/63/f1/3a081cd047d83b5966cb0d7ef3fea929ee6eddeb94d8fbfdb2a19bd60cc7/fonttools-4.54.1-cp311-cp311-win_amd64.whl + sha256: 07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -17997,7 +18012,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18010,7 +18025,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18018,8 +18033,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/63/f1/3a081cd047d83b5966cb0d7ef3fea929ee6eddeb94d8fbfdb2a19bd60cc7/fonttools-4.54.1-cp311-cp311-win_amd64.whl - sha256: 07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6 + url: https://files.pythonhosted.org/packages/96/13/748b7f7239893ff0796de11074b0ad8aa4c3da2d9f4d79a128b0b16147f3/fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18034,7 +18049,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18047,7 +18062,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18055,8 +18070,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/37/2e/f94118b92f7b6a9ec93840101b64bfdd09f295b266133857e8e852a5c35c/fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: 301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2 + url: https://files.pythonhosted.org/packages/aa/2c/8b5d82fe2d9c7f260fb73121418f5e07d4e38c329ea3886a5b0e55586113/fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: 5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18071,7 +18086,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18084,7 +18099,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18095,7 +18110,7 @@ packages: url: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl sha256: 3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 requires_dist: - - cached-property>=1.3.0 ; python_version < '3.8' + - cached-property>=1.3.0 ; python_full_version < '3.8' requires_python: '>=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,<4' - kind: conda name: freeglut @@ -18255,8 +18270,8 @@ packages: - kind: pypi name: freetype-py version: 2.5.1 - url: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - sha256: 289b443547e03a4f85302e3ac91376838e0d11636050166662a4f75e3087ed0b + url: https://files.pythonhosted.org/packages/93/6e/bd7fbfacca077bc6f34f1a1109800a2c41ab50f4704d3a0507ba41009915/freetype_py-2.5.1-py3-none-win_amd64.whl + sha256: 0b7f8e0342779f65ca13ef8bc103938366fecade23e6bb37cb671c2b8ad7f124 requires_python: '>=3.7' - kind: pypi name: freetype-py @@ -18267,8 +18282,8 @@ packages: - kind: pypi name: freetype-py version: 2.5.1 - url: https://files.pythonhosted.org/packages/93/6e/bd7fbfacca077bc6f34f1a1109800a2c41ab50f4704d3a0507ba41009915/freetype_py-2.5.1-py3-none-win_amd64.whl - sha256: 0b7f8e0342779f65ca13ef8bc103938366fecade23e6bb37cb671c2b8ad7f124 + url: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl + sha256: 289b443547e03a4f85302e3ac91376838e0d11636050166662a4f75e3087ed0b requires_python: '>=3.7' - kind: conda name: fribidi @@ -18659,7 +18674,7 @@ packages: - mediapipe==0.10.9 ; sys_platform == 'darwin' - numpy - opencv-python>4.9 - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - tqdm requires_python: <3.12 @@ -18944,8 +18959,8 @@ packages: - google-auth[aiohttp]<3.0.dev0,>=2.35.0 ; extra == 'async-rest' - grpcio<2.0.dev0,>=1.33.2 ; extra == 'grpc' - grpcio-status<2.0.dev0,>=1.33.2 ; extra == 'grpc' - - grpcio<2.0.dev0,>=1.49.1 ; python_version >= '3.11' and extra == 'grpc' - - grpcio-status<2.0.dev0,>=1.49.1 ; python_version >= '3.11' and extra == 'grpc' + - grpcio<2.0.dev0,>=1.49.1 ; python_full_version >= '3.11' and extra == 'grpc' + - grpcio-status<2.0.dev0,>=1.49.1 ; python_full_version >= '3.11' and extra == 'grpc' - grpcio-gcp<1.0.dev0,>=0.2.2 ; extra == 'grpcgcp' - grpcio-gcp<1.0.dev0,>=0.2.2 ; extra == 'grpcio-gcp' requires_python: '>=3.7' @@ -18975,7 +18990,7 @@ packages: requires_dist: - google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0.dev0,>=1.31.6 - google-auth<3.0.dev0,>=1.25.0 - - importlib-metadata>1.0.0 ; python_version < '3.8' + - importlib-metadata>1.0.0 ; python_full_version < '3.8' - grpcio<2.0.dev0,>=1.38.0 ; extra == 'grpc' - grpcio-status<2.0.dev0,>=1.38.0 ; extra == 'grpc' requires_python: '>=3.7' @@ -18995,46 +19010,46 @@ packages: - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/67/1e/4870896fc81ec77b1b5ebae7fdd680d5a4d40e19a4b6d724032f996ca77a/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f + url: https://files.pythonhosted.org/packages/00/9c/f5f5af3ddaa7a639d915f8f58b09bbb8d1db90ecd0459b62cd430eb9a4b6/google_crc32c-1.6.0-cp311-cp311-win_amd64.whl + sha256: bb8b3c75bd157010459b15222c3fd30577042a7060e29d42dabce449c087f2b3 requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/00/9c/f5f5af3ddaa7a639d915f8f58b09bbb8d1db90ecd0459b62cd430eb9a4b6/google_crc32c-1.6.0-cp311-cp311-win_amd64.whl - sha256: bb8b3c75bd157010459b15222c3fd30577042a7060e29d42dabce449c087f2b3 + url: https://files.pythonhosted.org/packages/3e/6d/33ca50cbdeec09c31bb5dac277c90994edee975662a4c890bda7ffac90ef/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/67/72/c3298da1a3773102359c5a78f20dae8925f5ea876e37354415f68594a6fb/google_crc32c-1.6.0.tar.gz - sha256: 6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc + url: https://files.pythonhosted.org/packages/54/7d/738cb0d25ee55629e7d07da686decf03864a366e5e863091a97b7bd2b8aa/google_crc32c-1.6.0-cp311-cp311-macosx_12_0_x86_64.whl + sha256: 40b05ab32a5067525670880eb5d169529089a26fe35dce8891127aeddc1950e8 requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/3e/6d/33ca50cbdeec09c31bb5dac277c90994edee975662a4c890bda7ffac90ef/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d + url: https://files.pythonhosted.org/packages/67/1e/4870896fc81ec77b1b5ebae7fdd680d5a4d40e19a4b6d724032f996ca77a/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/54/7d/738cb0d25ee55629e7d07da686decf03864a366e5e863091a97b7bd2b8aa/google_crc32c-1.6.0-cp311-cp311-macosx_12_0_x86_64.whl - sha256: 40b05ab32a5067525670880eb5d169529089a26fe35dce8891127aeddc1950e8 + url: https://files.pythonhosted.org/packages/67/72/c3298da1a3773102359c5a78f20dae8925f5ea876e37354415f68594a6fb/google_crc32c-1.6.0.tar.gz + sha256: 6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi @@ -19043,7 +19058,7 @@ packages: url: https://files.pythonhosted.org/packages/7d/14/ab47972ac79b6e7b03c8be3a7ef44b530a60e69555668dbbf08fc5692a98/google_crc32c-1.6.0-cp311-cp311-macosx_12_0_arm64.whl sha256: f7a1fc29803712f80879b0806cb83ab24ce62fc8daf0569f2204a0cfd7f68ed4 requires_dist: - - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' + - importlib-resources>=1.3 ; python_full_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' requires_python: '>=3.9' - kind: pypi @@ -19156,7 +19171,7 @@ packages: url: https://files.pythonhosted.org/packages/eb/fc/570a1e503e19be24c5642ea8b93f23e3eef1dfa930e761cab72dedc2c2db/griffe-1.4.1-py3-none-any.whl sha256: 84295ee0b27743bd880aea75632830ef02ded65d16124025e4c263bb826ab645 requires_dist: - - astunparse>=1.6 ; python_version < '3.9' + - astunparse>=1.6 ; python_full_version < '3.9' - colorama>=0.4 requires_python: '>=3.9' - kind: pypi @@ -19285,7 +19300,7 @@ packages: url: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl sha256: e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: h2 @@ -19440,7 +19455,7 @@ packages: - packaging>=23.2 - pathspec>=0.10.1 - pluggy>=1.0.0 - - tomli>=1.2.2 ; python_version < '3.11' + - tomli>=1.2.2 ; python_full_version < '3.11' - trove-classifiers requires_python: '>=3.8' - kind: conda @@ -19734,7 +19749,7 @@ packages: - mediapipe==0.10.9 ; sys_platform == 'darwin' - numpy - opencv-python>4.6 - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk requires_python: <3.12 editable: true @@ -19761,7 +19776,7 @@ packages: sha256: e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4 requires_dist: - idna>=2.5 - - typing ; python_version < '3.5' + - typing ; python_full_version < '3.5' requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' - kind: conda name: icu @@ -20030,7 +20045,7 @@ packages: sha256: 45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b requires_dist: - zipp>=3.20 - - typing-extensions>=3.6.4 ; python_version < '3.8' + - typing-extensions>=3.6.4 ; python_full_version < '3.8' - pytest-checkdocs>=2.4 ; extra == 'check' - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - pytest-cov ; extra == 'cover' @@ -20048,7 +20063,7 @@ packages: - flufl-flake8 ; extra == 'test' - pytest-perf>=0.9.2 ; extra == 'test' - jaraco-test>=5.4 ; extra == 'test' - - importlib-resources>=1.3 ; python_version < '3.9' and extra == 'test' + - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test' - pytest-mypy ; extra == 'type' requires_python: '>=3.8' - kind: pypi @@ -20145,9 +20160,9 @@ packages: - pygments>=2.4.0 - stack-data - traitlets>=5.13.0 - - exceptiongroup ; python_version < '3.11' - - typing-extensions>=4.6 ; python_version < '3.12' - - pexpect>4.3 ; sys_platform != 'win32' and sys_platform != 'emscripten' + - exceptiongroup ; python_full_version < '3.11' + - typing-extensions>=4.6 ; python_full_version < '3.12' + - pexpect>4.3 ; sys_platform != 'emscripten' and sys_platform != 'win32' - colorama ; sys_platform == 'win32' - ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole] ; extra == 'all' - ipython[test,test-extra] ; extra == 'all' @@ -20163,7 +20178,7 @@ packages: - sphinx>=1.3 ; extra == 'doc' - sphinxcontrib-jquery ; extra == 'doc' - typing-extensions ; extra == 'doc' - - tomli ; python_version < '3.11' and extra == 'doc' + - tomli ; python_full_version < '3.11' and extra == 'doc' - ipykernel ; extra == 'kernel' - matplotlib ; extra == 'matplotlib' - nbconvert ; extra == 'nbconvert' @@ -20236,7 +20251,7 @@ packages: url: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl sha256: f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 requires_dist: - - backports-tarfile ; python_version < '3.12' + - backports-tarfile ; python_full_version < '3.12' - sphinx>=3.5 ; extra == 'doc' - jaraco-packaging>=9.3 ; extra == 'doc' - rst-linker>=1.9 ; extra == 'doc' @@ -20365,8 +20380,8 @@ packages: - numpy>=1.24 - opt-einsum - scipy>=1.10 - - numpy>=1.26.0 ; python_version >= '3.12' - - scipy>=1.11.1 ; python_version >= '3.12' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' - jaxlib==0.4.33 ; extra == 'ci' - jaxlib==0.4.34 ; extra == 'cuda' - jax-cuda12-plugin[with-cuda]<=0.4.34,>=0.4.34 ; extra == 'cuda' @@ -20385,24 +20400,24 @@ packages: - kind: pypi name: jaxlib version: 0.4.34 - url: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl - sha256: 3bcfa639ca3cfaf86c8ceebd5fc0d47300fd98a078014a1d0cc03133e1523d5f + url: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl + sha256: 133070d4fec5525ffea4dc72956398c1cf647a04dcb37f8a935ee82af78d9965 requires_dist: - scipy>=1.10 - numpy>=1.24 - ml-dtypes>=0.2.0 - - scipy>=1.11.1 ; python_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.10' - kind: pypi name: jaxlib version: 0.4.34 - url: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl - sha256: 133070d4fec5525ffea4dc72956398c1cf647a04dcb37f8a935ee82af78d9965 + url: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl + sha256: 3bcfa639ca3cfaf86c8ceebd5fc0d47300fd98a078014a1d0cc03133e1523d5f requires_dist: - scipy>=1.10 - numpy>=1.24 - ml-dtypes>=0.2.0 - - scipy>=1.11.1 ; python_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.10' - kind: pypi name: jedi @@ -20458,7 +20473,7 @@ packages: - trio ; extra == 'test' - async-timeout ; extra == 'test' - trio ; extra == 'trio' - - async-generator ; extra == 'trio' and python_version == '3.6' + - async-generator ; python_full_version == '3.6.*' and extra == 'trio' requires_python: '>=3.7' - kind: pypi name: jinja2 @@ -20512,9 +20527,9 @@ packages: sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 requires_dist: - attrs>=22.2.0 - - importlib-resources>=1.4.0 ; python_version < '3.9' + - importlib-resources>=1.4.0 ; python_full_version < '3.9' - jsonschema-specifications>=2023.3.6 - - pkgutil-resolve-name>=1.3.10 ; python_version < '3.9' + - pkgutil-resolve-name>=1.3.10 ; python_full_version < '3.9' - referencing>=0.28.4 - rpds-py>=0.7.1 - fqdn ; extra == 'format' @@ -20560,7 +20575,7 @@ packages: url: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl sha256: e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f requires_dist: - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - jupyter-core!=5.0.*,>=4.12 - python-dateutil>=2.8.2 - pyzmq>=23.0 @@ -20608,7 +20623,7 @@ packages: sha256: 4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 requires_dist: - platformdirs>=2.5 - - pywin32>=300 ; sys_platform == 'win32' and platform_python_implementation != 'PyPy' + - pywin32>=300 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' - traitlets>=5.3 - myst-parser ; extra == 'docs' - pydata-sphinx-theme ; extra == 'docs' @@ -20655,7 +20670,7 @@ packages: sha256: 45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da requires_dist: - jupyter-server>=1.1.2 - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' requires_python: '>=3.8' - kind: pypi name: jupyter-server @@ -20752,8 +20767,8 @@ packages: requires_dist: - async-lru>=1.0.0 - httpx>=0.25.0 - - importlib-metadata>=4.8.3 ; python_version < '3.10' - - importlib-resources>=1.4 ; python_version < '3.9' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' + - importlib-resources>=1.4 ; python_full_version < '3.9' - ipykernel>=6.5.0 - jinja2>=3.0.3 - jupyter-core @@ -20763,7 +20778,7 @@ packages: - notebook-shim>=0.2 - packaging - setuptools>=40.1.0 - - tomli>=1.2.2 ; python_version < '3.11' + - tomli>=1.2.2 ; python_full_version < '3.11' - tornado>=6.2.0 - traitlets - build ; extra == 'dev' @@ -20821,7 +20836,7 @@ packages: sha256: e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 requires_dist: - babel>=2.10 - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - jinja2>=3.0.3 - json5>=0.9.0 - jsonschema>=4.18.0 @@ -20902,8 +20917,8 @@ packages: - jaraco-classes - jaraco-functools - jaraco-context - - importlib-metadata>=4.11.4 ; python_version < '3.12' - - importlib-resources ; python_version < '3.9' + - importlib-metadata>=4.11.4 ; python_full_version < '3.12' + - importlib-resources ; python_full_version < '3.9' - secretstorage>=3.2 ; sys_platform == 'linux' - jeepney>=0.4.2 ; sys_platform == 'linux' - pywin32-ctypes>=0.2.0 ; sys_platform == 'win32' @@ -20973,8 +20988,8 @@ packages: - kind: pypi name: kiwisolver version: 1.4.7 - url: https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 + url: https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl + sha256: 929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b requires_python: '>=3.8' - kind: pypi name: kiwisolver @@ -20991,8 +21006,8 @@ packages: - kind: pypi name: kiwisolver version: 1.4.7 - url: https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl - sha256: 929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b + url: https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 requires_python: '>=3.8' - kind: pypi name: kiwisolver @@ -21187,7 +21202,7 @@ packages: sha256: 342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc requires_dist: - packaging - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - changelist==0.5 ; extra == 'dev' - pre-commit==3.7.0 ; extra == 'lint' - pytest>=7.4 ; extra == 'test' @@ -29009,26 +29024,26 @@ packages: - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 + url: https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl + sha256: d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91 requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 + url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 + url: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl - sha256: d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91 + url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 requires_python: '>=3.9' - kind: pypi name: llvmlite @@ -29047,8 +29062,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18 + url: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29059,8 +29074,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654 + url: https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl + sha256: 74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29071,8 +29086,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: 69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16 + url: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29095,8 +29110,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl - sha256: 74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b + url: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: 69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29271,7 +29286,7 @@ packages: url: https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl sha256: 7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 requires_dist: - - importlib-metadata>=4.4 ; python_version < '3.10' + - importlib-metadata>=4.4 ; python_full_version < '3.10' - mkdocs>=1.5 ; extra == 'docs' - mkdocs-nature>=0.6 ; extra == 'docs' - mdx-gh-links>=0.2 ; extra == 'docs' @@ -29317,8 +29332,8 @@ packages: - kind: pypi name: markupsafe version: 3.0.1 - url: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: 26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad + url: https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7 requires_python: '>=3.9' - kind: pypi name: markupsafe @@ -29335,8 +29350,8 @@ packages: - kind: pypi name: markupsafe version: 3.0.1 - url: https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7 + url: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: 26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad requires_python: '>=3.9' - kind: pypi name: markupsafe @@ -29471,6 +29486,50 @@ packages: - pytest ; extra == 'tests' - simplejson ; extra == 'tests' requires_python: '>=3.9' +- kind: pypi + name: matplotlib + version: 3.9.2 + url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=2.3.1 + - python-dateutil>=2.7 + - importlib-resources>=3.2.0 ; python_full_version < '3.10' + - meson-python>=0.13.1 ; extra == 'dev' + - numpy>=1.25 ; extra == 'dev' + - pybind11>=2.6 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.9' +- kind: pypi + name: matplotlib + version: 3.9.2 + url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=2.3.1 + - python-dateutil>=2.7 + - importlib-resources>=3.2.0 ; python_full_version < '3.10' + - meson-python>=0.13.1 ; extra == 'dev' + - numpy>=1.25 ; extra == 'dev' + - pybind11>=2.6 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.9' - kind: pypi name: matplotlib version: 3.9.2 @@ -29486,7 +29545,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -29496,8 +29555,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 + url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl + sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -29508,7 +29567,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -29530,51 +29589,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' - - meson-python>=0.13.1 ; extra == 'dev' - - numpy>=1.25 ; extra == 'dev' - - pybind11>=2.6 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.9' -- kind: pypi - name: matplotlib - version: 3.9.2 - url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl - sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=2.3.1 - - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' - - meson-python>=0.13.1 ; extra == 'dev' - - numpy>=1.25 ; extra == 'dev' - - pybind11>=2.6 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.9' -- kind: pypi - name: matplotlib - version: 3.9.2 - url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=2.3.1 - - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -29701,8 +29716,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl - sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e + url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl + sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 requires_dist: - absl-py - attrs>=19.1.0 @@ -29715,8 +29730,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl - sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 + url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl + sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e requires_dist: - absl-py - attrs>=19.1.0 @@ -29729,32 +29744,32 @@ packages: - kind: pypi name: mediapipe version: 0.10.11 - url: https://files.pythonhosted.org/packages/c9/e4/3e645a8f87577553194a2a15383a60d61b8381cf864e903e43e4c6eb58e0/mediapipe-0.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: ea751e043909ba7bbe27e7afdbcdafd79723d50ef4165afcaae431ab428eea13 + url: https://files.pythonhosted.org/packages/67/4c/569cbb27c6b1e09c7c088ca1e7ce88573dfb9769cfc79ebeacdab0f6903d/mediapipe-0.10.11-cp311-cp311-win_amd64.whl + sha256: 36231eaf23cd795a923a8b015d36bd6e410a8e997c36dd9432db0157b822b181 requires_dist: - absl-py - attrs>=19.1.0 - flatbuffers>=2.0 - jax - - jaxlib - matplotlib - numpy - - torch - opencv-contrib-python - protobuf<4,>=3.11 - sounddevice>=0.4.4 - kind: pypi name: mediapipe version: 0.10.11 - url: https://files.pythonhosted.org/packages/67/4c/569cbb27c6b1e09c7c088ca1e7ce88573dfb9769cfc79ebeacdab0f6903d/mediapipe-0.10.11-cp311-cp311-win_amd64.whl - sha256: 36231eaf23cd795a923a8b015d36bd6e410a8e997c36dd9432db0157b822b181 + url: https://files.pythonhosted.org/packages/c9/e4/3e645a8f87577553194a2a15383a60d61b8381cf864e903e43e4c6eb58e0/mediapipe-0.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: ea751e043909ba7bbe27e7afdbcdafd79723d50ef4165afcaae431ab428eea13 requires_dist: - absl-py - attrs>=19.1.0 - flatbuffers>=2.0 - jax + - jaxlib - matplotlib - numpy + - torch - opencv-contrib-python - protobuf<4,>=3.11 - sounddevice>=0.4.4 @@ -29851,7 +29866,7 @@ packages: - click>=7.0 - colorama>=0.4 ; platform_system == 'Windows' - ghp-import>=1.0 - - importlib-metadata>=4.4 ; python_version < '3.10' + - importlib-metadata>=4.4 ; python_full_version < '3.10' - jinja2>=2.11.1 - markdown>=3.3.6 - markupsafe>=2.0.1 @@ -29867,7 +29882,7 @@ packages: - click==7.0 ; extra == 'min-versions' - colorama==0.4 ; platform_system == 'Windows' and extra == 'min-versions' - ghp-import==1.0 ; extra == 'min-versions' - - importlib-metadata==4.4 ; python_version < '3.10' and extra == 'min-versions' + - importlib-metadata==4.4 ; python_full_version < '3.10' and extra == 'min-versions' - jinja2==2.11.1 ; extra == 'min-versions' - markdown==3.3.6 ; extra == 'min-versions' - markupsafe==2.0.1 ; extra == 'min-versions' @@ -29903,7 +29918,7 @@ packages: url: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl sha256: 2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134 requires_dist: - - importlib-metadata>=4.3 ; python_version < '3.10' + - importlib-metadata>=4.3 ; python_full_version < '3.10' - mergedeep>=1.3.4 - platformdirs>=2.2.0 - pyyaml>=5.1 @@ -29978,8 +29993,8 @@ packages: - mkdocs-autorefs>=1.2 - platformdirs>=2.2 - pymdown-extensions>=6.3 - - importlib-metadata>=4.6 ; python_version < '3.10' - - typing-extensions>=4.1 ; python_version < '3.10' + - importlib-metadata>=4.6 ; python_full_version < '3.10' + - typing-extensions>=4.1 ; python_full_version < '3.10' - mkdocstrings-crystal>=0.3.4 ; extra == 'crystal' - mkdocstrings-python-legacy>=0.2.1 ; extra == 'python-legacy' - mkdocstrings-python>=0.5.2 ; extra == 'python' @@ -30018,10 +30033,10 @@ packages: sha256: 2e7534392682c3098bc7341648c650864207169c654aed83143d7a19c67ae06f requires_dist: - numpy>=1.21 - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.23.3 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=2.1.0 ; python_version >= '3.13' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.23.3 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=2.1.0 ; python_full_version >= '3.13' - absl-py ; extra == 'dev' - pytest ; extra == 'dev' - pytest-xdist ; extra == 'dev' @@ -30035,10 +30050,10 @@ packages: sha256: dc74fd9995513d33eac63d64e436240f5494ec74d522a9f0920194942fc3d2d7 requires_dist: - numpy>=1.21 - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.23.3 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=2.1.0 ; python_version >= '3.13' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.23.3 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=2.1.0 ; python_full_version >= '3.13' - absl-py ; extra == 'dev' - pytest ; extra == 'dev' - pytest-xdist ; extra == 'dev' @@ -30080,18 +30095,18 @@ packages: - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156 + url: https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb requires_dist: - - typing-extensions>=4.1.0 ; python_version < '3.11' + - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb + url: https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl + sha256: 82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926 requires_dist: - - typing-extensions>=4.1.0 ; python_version < '3.11' + - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict @@ -30099,7 +30114,7 @@ packages: url: https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351 requires_dist: - - typing-extensions>=4.1.0 ; python_version < '3.11' + - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict @@ -30107,15 +30122,15 @@ packages: url: https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl sha256: 0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b requires_dist: - - typing-extensions>=4.1.0 ; python_version < '3.11' + - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl - sha256: 82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926 + url: https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156 requires_dist: - - typing-extensions>=4.1.0 ; python_version < '3.11' + - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: conda name: multidict @@ -30532,7 +30547,7 @@ packages: - beautifulsoup4 - bleach!=5.0.0 - defusedxml - - importlib-metadata>=3.6 ; python_version < '3.10' + - importlib-metadata>=3.6 ; python_full_version < '3.10' - jinja2>=3.0 - jupyter-core>=4.7 - jupyterlab-pygments @@ -30776,6 +30791,14 @@ packages: purls: [] size: 107047 timestamp: 1676837935565 +- kind: pypi + name: node-link + version: 0.1.0 + path: examples/python/node_link + sha256: df35fef8f84a2357b97253df002d9ac6aaecf21aeb5a1027be149bfef785579b + requires_dist: + - rerun-sdk + editable: true - kind: conda name: nodejs version: 20.17.0 @@ -30992,7 +31015,7 @@ packages: - sphinx>=1.3.6 ; extra == 'docs' - sphinxcontrib-github-alt ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' - - importlib-resources>=5.0 ; python_version < '3.10' and extra == 'test' + - importlib-resources>=5.0 ; python_full_version < '3.10' and extra == 'test' - ipykernel ; extra == 'test' - jupyter-server[test]<3,>=2.4.0 ; extra == 'test' - jupyterlab-server[test]<3,>=2.27.1 ; extra == 'test' @@ -31018,8 +31041,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 + url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31027,8 +31050,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 + url: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl + sha256: cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31036,8 +31059,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 + url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31045,8 +31068,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl - sha256: cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2 + url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31054,8 +31077,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b + url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31220,9 +31243,9 @@ packages: path: examples/python/nv12 sha256: c8ca97c5d8c04037cd5eb9a65be7b1e7d667c11d4dba3ee9aad5956ccf926dc4 requires_dist: - - rerun-sdk>=0.10 - - opencv-python - numpy + - opencv-python + - rerun-sdk>=0.10 editable: true - kind: pypi name: nvidia-cublas-cu12 @@ -31313,7 +31336,7 @@ packages: - betterproto[compiler] - numpy - opencv-python>4.6 - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - scipy editable: true @@ -31448,84 +31471,84 @@ packages: url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef + url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl + sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b + url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl + sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl - sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 + url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl - sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c + url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: conda name: openexr @@ -31939,7 +31962,7 @@ packages: url: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl sha256: c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 requires_dist: - - typing ; python_version < '3.5' + - typing ; python_full_version < '3.5' requires_python: '>=3.6' - kind: pypi name: packaging @@ -31976,12 +31999,12 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 + url: https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -32068,12 +32091,12 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc + url: https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl + sha256: 7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -32160,12 +32183,12 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 + url: https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -32252,12 +32275,12 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl - sha256: 3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5 + url: https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -32344,12 +32367,12 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl - sha256: 7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd + url: https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl + sha256: 3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -32629,8 +32652,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f + url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32653,8 +32676,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd + url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32677,8 +32700,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 + url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32701,8 +32724,8 @@ packages: - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/f0/eb/f7e21b113dd48a9c97d364e0915b3988c6a0b6207652f5a92372871b7aa4/pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc + url: https://files.pythonhosted.org/packages/25/b3/2b54a1d541accebe6bd8b1358b34ceb2c509f51cb7dcda8687362490da5b/pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32722,14 +32745,14 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.9' - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/25/b3/2b54a1d541accebe6bd8b1358b34ceb2c509f51cb7dcda8687362490da5b/pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a + url: https://files.pythonhosted.org/packages/39/63/b3fc299528d7df1f678b0666002b37affe6b8751225c3d9c12cf530e73ed/pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32749,14 +32772,14 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.9' - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/39/63/b3fc299528d7df1f678b0666002b37affe6b8751225c3d9c12cf530e73ed/pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa + url: https://files.pythonhosted.org/packages/dc/83/1470c220a4ff06cd75fc609068f6605e567ea51df70557555c2ab6516b2c/pillow-11.0.0-cp311-cp311-win_amd64.whl + sha256: 52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32776,14 +32799,14 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.9' - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/fc/e4/130c5fab4a54d3991129800dd2801feeb4b118d7630148cd67f0e6269d4c/pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: 5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b + url: https://files.pythonhosted.org/packages/f0/eb/f7e21b113dd48a9c97d364e0915b3988c6a0b6207652f5a92372871b7aa4/pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32803,14 +32826,14 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.9' - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/dc/83/1470c220a4ff06cd75fc609068f6605e567ea51df70557555c2ab6516b2c/pillow-11.0.0-cp311-cp311-win_amd64.whl - sha256: 52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291 + url: https://files.pythonhosted.org/packages/fc/e4/130c5fab4a54d3991129800dd2801feeb4b118d7630148cd67f0e6269d4c/pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: 5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32830,7 +32853,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.9' - kind: conda @@ -33191,14 +33214,14 @@ packages: - kind: pypi name: protobuf version: 5.28.2 - url: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - sha256: 2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132 + url: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl + sha256: a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7 requires_python: '>=3.8' - kind: pypi name: protobuf version: 5.28.2 - url: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - sha256: a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7 + url: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl + sha256: 2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132 requires_python: '>=3.8' - kind: pypi name: protobuf @@ -33212,57 +33235,57 @@ packages: url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 + url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd + url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl + sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 + url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 + url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -33369,8 +33392,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec + url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl + sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -33406,8 +33429,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 + url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl + sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -33443,8 +33466,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 + url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -33738,8 +33761,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3 + url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl + sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33751,8 +33774,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 + url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33764,8 +33787,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl - sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 + url: https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33777,8 +33800,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl - sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 + url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33790,8 +33813,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 + url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl + sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33986,8 +34009,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl - sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd + url: https://files.pythonhosted.org/packages/2e/f5/dfa78dc72e47dfe1ada7b37fedcb338454750470358a6dfcfdfda35fa337/pycocotools-2.0.8-cp311-cp311-win_amd64.whl + sha256: e680e27e58b840c105fa09a3bb1d91706038c5c8d7b7bf09c2e5ecbd1b05ad7f requires_dist: - matplotlib>=2.1.0 - numpy @@ -33995,8 +34018,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae + url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl + sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd requires_dist: - matplotlib>=2.1.0 - numpy @@ -34004,8 +34027,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc + url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae requires_dist: - matplotlib>=2.1.0 - numpy @@ -34013,8 +34036,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/2e/f5/dfa78dc72e47dfe1ada7b37fedcb338454750470358a6dfcfdfda35fa337/pycocotools-2.0.8-cp311-cp311-win_amd64.whl - sha256: e680e27e58b840c105fa09a3bb1d91706038c5c8d7b7bf09c2e5ecbd1b05ad7f + url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc requires_dist: - matplotlib>=2.1.0 - numpy @@ -34066,7 +34089,7 @@ packages: requires_dist: - dataclasses-json>=0.0.25 - deprecated - - dataclasses ; python_version >= '3.6' and python_version < '3.7' + - dataclasses ; python_full_version == '3.6.*' requires_python: '>=3.6' - kind: pypi name: pygments @@ -34109,8 +34132,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d + url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl + sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -34145,8 +34168,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 + url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl + sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -34165,7 +34188,7 @@ packages: - numba>=0.51.2 - llvmlite>=0.30 - joblib>=0.11 - - importlib-metadata>=4.8.1 ; python_version < '3.8' + - importlib-metadata>=4.8.1 ; python_full_version < '3.8' - kind: pypi name: pyopengl version: 3.1.0 @@ -34552,14 +34575,14 @@ packages: - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee + url: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 + url: https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee requires_python: '>=3.8' - kind: pypi name: pyyaml @@ -34570,14 +34593,14 @@ packages: - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 + url: https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl + sha256: e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl - sha256: e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 + url: https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 requires_python: '>=3.8' - kind: pypi name: pyyaml-env-tag @@ -34598,24 +34621,24 @@ packages: - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e + url: https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl + sha256: 5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5 requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef + url: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl - sha256: 5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5 + url: https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' @@ -34729,7 +34752,7 @@ packages: sha256: 9006b1b7ca8bd9c90ba0bf0d7a00641b7dd13a6de76a2828f79ec5b853a4ef98 requires_dist: - numpy - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - trimesh==3.15.2 editable: true @@ -34926,14 +34949,14 @@ packages: - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl - sha256: 64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad + url: https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50 + url: https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl + sha256: 64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad requires_python: '>=3.8' - kind: pypi name: regex @@ -34944,14 +34967,14 @@ packages: - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268 + url: https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl + sha256: 313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl - sha256: 313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf + url: https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50 requires_python: '>=3.8' - kind: pypi name: requests @@ -34989,11 +35012,23 @@ packages: - jupyterlab ; extra == 'dev' - hatch ; extra == 'dev' editable: true +- kind: pypi + name: rerun-notebook + version: 0.20.0a1+dev + path: rerun_notebook + sha256: f20def987d6c97a658313841861dd7ce129fde8a658647756571844989b1451e + requires_dist: + - anywidget + - jupyter-ui-poll + - hatch ; extra == 'dev' + - jupyterlab ; extra == 'dev' + - watchfiles ; extra == 'dev' + editable: true - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 + url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl + sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35020,8 +35055,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 + url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl + sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35034,8 +35069,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 + url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35048,8 +35083,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb + url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl + sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35096,7 +35131,7 @@ packages: requires_dist: - numpy - opencv-python>4.6 - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - tqdm editable: true @@ -35170,7 +35205,7 @@ packages: - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - markdown-it-py>=2.2.0 - pygments>=2.13.0,<3.0.0 - - typing-extensions>=4.0.0,<5.0 ; python_version < '3.11' + - typing-extensions>=4.0.0,<5.0 ; python_full_version < '3.11' requires_python: '>=3.8.0' - kind: pypi name: rpds-py @@ -35184,12 +35219,6 @@ packages: url: https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 requires_python: '>=3.8' -- kind: pypi - name: rpds-py - version: 0.20.0 - url: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db - requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.20.0 @@ -35202,6 +35231,12 @@ packages: url: https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl sha256: c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c requires_python: '>=3.8' +- kind: pypi + name: rpds-py + version: 0.20.0 + url: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db + requires_python: '>=3.8' - kind: pypi name: rrt-star version: 0.1.0 @@ -35355,8 +35390,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/9a/a5/25bcf75e373412daf1fd88045ab3aa8140a0d804ef0e70712c4f2c5b94d8/safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c + url: https://files.pythonhosted.org/packages/08/8c/ece3bf8756506a890bd980eca02f47f9d98dfbf5ce16eda1368f53560f67/safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: bb07000b19d41e35eecef9a454f31a8b4718a185293f0d0b1c4b61d6e4487971 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35395,8 +35430,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/e6/ee/69e498a892f208bd1da4104d4b9be887f8611bf4942144718b6738482250/safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090 + url: https://files.pythonhosted.org/packages/39/83/c4a7ce01d626e46ea2b45887f2e59b16441408031e2ce2f9fe01860c6946/safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35435,8 +35470,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/39/83/c4a7ce01d626e46ea2b45887f2e59b16441408031e2ce2f9fe01860c6946/safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42 + url: https://files.pythonhosted.org/packages/6d/41/948c96c8a7e9fef57c2e051f1871c108a6dbbc6d285598bdb1d89b98617c/safetensors-0.4.5-cp311-none-win_amd64.whl + sha256: cbd39cae1ad3e3ef6f63a6f07296b080c951f24cec60188378e43d3713000c04 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35475,8 +35510,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/6d/41/948c96c8a7e9fef57c2e051f1871c108a6dbbc6d285598bdb1d89b98617c/safetensors-0.4.5-cp311-none-win_amd64.whl - sha256: cbd39cae1ad3e3ef6f63a6f07296b080c951f24cec60188378e43d3713000c04 + url: https://files.pythonhosted.org/packages/9a/a5/25bcf75e373412daf1fd88045ab3aa8140a0d804ef0e70712c4f2c5b94d8/safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35515,8 +35550,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/08/8c/ece3bf8756506a890bd980eca02f47f9d98dfbf5ce16eda1368f53560f67/safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: bb07000b19d41e35eecef9a454f31a8b4718a185293f0d0b1c4b61d6e4487971 + url: https://files.pythonhosted.org/packages/e6/ee/69e498a892f208bd1da4104d4b9be887f8611bf4942144718b6738482250/safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35555,8 +35590,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 + url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl + sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35579,7 +35614,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -35622,8 +35657,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c + url: https://files.pythonhosted.org/packages/50/b2/d5e97115733e2dc657e99868ae0237705b79d0c81f6ced21b8f0799a30d1/scikit_image-0.24.0-cp311-cp311-win_amd64.whl + sha256: dacf591ac0c272a111181afad4b788a27fe70d213cfddd631d151cbc34f8ca2c requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35646,7 +35681,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -35689,8 +35724,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 + url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35713,7 +35748,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -35756,8 +35791,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/50/b2/d5e97115733e2dc657e99868ae0237705b79d0c81f6ced21b8f0799a30d1/scikit_image-0.24.0-cp311-cp311-win_amd64.whl - sha256: dacf591ac0c272a111181afad4b788a27fe70d213cfddd631d151cbc34f8ca2c + url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35780,7 +35815,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -35823,8 +35858,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl - sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 + url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35847,7 +35882,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -35890,8 +35925,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/ff/91/609961972f694cb9520c4c3d201e377a26583e1eb83bc5a334c893729214/scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445 + url: https://files.pythonhosted.org/packages/17/1c/ccdd103cfcc9435a18819856fbbe0c20b8fa60bfc3343580de4be13f0668/scikit_learn-1.5.2-cp311-cp311-win_amd64.whl + sha256: 6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -36076,8 +36111,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/17/1c/ccdd103cfcc9435a18819856fbbe0c20b8fa60bfc3343580de4be13f0668/scikit_learn-1.5.2-cp311-cp311-win_amd64.whl - sha256: 6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6 + url: https://files.pythonhosted.org/packages/cd/7a/19fe32c810c5ceddafcfda16276d98df299c8649e24e84d4f00df4a91e01/scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl + sha256: 1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -36138,8 +36173,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/cd/7a/19fe32c810c5ceddafcfda16276d98df299c8649e24e84d4f00df4a91e01/scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl - sha256: 1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de + url: https://files.pythonhosted.org/packages/ff/91/609961972f694cb9520c4c3d201e377a26583e1eb83bc5a334c893729214/scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -36200,8 +36235,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675 + url: https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36242,8 +36277,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 + url: https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl + sha256: c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36284,8 +36319,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37 + url: https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36326,8 +36361,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl - sha256: 716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94 + url: https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36368,8 +36403,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl - sha256: c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2 + url: https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl + sha256: 716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36436,11 +36471,11 @@ packages: path: examples/python/segment_anything_model sha256: 85bc241bedf212c63a39d0251a9dcc0fb3a435087a024d4eafd7f49342a75926 requires_dist: - - segment-anything @ git+https://github.com/facebookresearch/segment-anything.git - numpy - opencv-python - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk + - segment-anything @ git+https://github.com/facebookresearch/segment-anything.git - torch==2.2.2 - torchvision - tqdm @@ -36491,9 +36526,9 @@ packages: - jaraco-functools ; extra == 'core' - packaging ; extra == 'core' - more-itertools ; extra == 'core' - - importlib-metadata>=6 ; python_version < '3.10' and extra == 'core' - - tomli>=2.0.1 ; python_version < '3.11' and extra == 'core' - - importlib-resources>=5.10.2 ; python_version < '3.9' and extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - importlib-resources>=5.10.2 ; python_full_version < '3.9' and extra == 'core' - pytest-cov ; extra == 'cover' - sphinx>=3.5 ; extra == 'doc' - jaraco-packaging>=9.3 ; extra == 'doc' @@ -36527,11 +36562,11 @@ packages: - pytest-subprocess ; extra == 'test' - pyproject-hooks!=1.1 ; extra == 'test' - jaraco-test ; extra == 'test' - - jaraco-develop>=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' - pytest-mypy ; extra == 'type' - mypy==1.11.* ; extra == 'type' - - importlib-metadata>=7.0.2 ; python_version < '3.10' and extra == 'type' + - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' requires_python: '>=3.8' - kind: conda @@ -36554,8 +36589,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/37/15/269d8e1f7f658a37e61f7028683c546f520e4e7cedba1e32c77ff9d3a3c7/shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e + url: https://files.pythonhosted.org/packages/25/aa/53f145e5a610a49af9ac49f2f1be1ec8659ebd5c393d66ac94e57c83b00e/shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36569,8 +36604,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/25/aa/53f145e5a610a49af9ac49f2f1be1ec8659ebd5c393d66ac94e57c83b00e/shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0 + url: https://files.pythonhosted.org/packages/37/15/269d8e1f7f658a37e61f7028683c546f520e4e7cedba1e32c77ff9d3a3c7/shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36584,8 +36619,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/6e/5a/d019f69449329dcd517355444fdb9ddd58bec5e080b8bdba007e8e4c546d/shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855 + url: https://files.pythonhosted.org/packages/37/63/e182e43081fffa0a2d970c480f2ef91647a6ab94098f61748c23c2a485f2/shapely-2.0.6-cp311-cp311-macosx_11_0_arm64.whl + sha256: 9a7a78b0d51257a367ee115f4d41ca4d46edbd0dd280f697a8092dd3989867b2 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36599,8 +36634,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/b1/5a/6a67d929c467a1973b6bb9f0b00159cc343b02bf9a8d26db1abd2f87aa23/shapely-2.0.6-cp311-cp311-win_amd64.whl - sha256: c02eb6bf4cfb9fe6568502e85bb2647921ee49171bcd2d4116c7b3109724ef9b + url: https://files.pythonhosted.org/packages/6e/5a/d019f69449329dcd517355444fdb9ddd58bec5e080b8bdba007e8e4c546d/shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36614,8 +36649,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/37/63/e182e43081fffa0a2d970c480f2ef91647a6ab94098f61748c23c2a485f2/shapely-2.0.6-cp311-cp311-macosx_11_0_arm64.whl - sha256: 9a7a78b0d51257a367ee115f4d41ca4d46edbd0dd280f697a8092dd3989867b2 + url: https://files.pythonhosted.org/packages/b1/5a/6a67d929c467a1973b6bb9f0b00159cc343b02bf9a8d26db1abd2f87aa23/shapely-2.0.6-cp311-cp311-win_amd64.whl + sha256: c02eb6bf4cfb9fe6568502e85bb2647921ee49171bcd2d4116c7b3109724ef9b requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36648,7 +36683,7 @@ packages: requires_dist: - mesh-to-sdf @ git+https://github.com/marian42/mesh_to_sdf.git - numpy - - requests>=2.31,<3 + - requests<3,>=2.31 - rerun-sdk - scikit-learn>=1.1.3 - trimesh==3.15.2 @@ -36686,26 +36721,26 @@ packages: - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/ac/ae/a06523928af3a6783e2638cd4f6035c3e32de1c1063d563d9060c8d2f1ad/simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c + url: https://files.pythonhosted.org/packages/65/be/d8ab9717f471be3c114f16abd8be21d9a6a0a09b9b49177d93d64d3717d9/simplejson-3.19.3-cp311-cp311-win_amd64.whl + sha256: c9bedebdc5fdad48af8783022bae307746d54006b783007d1d3c38e10872a2c6 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/b7/d4/850948bcbcfe0b4a6c69dfde10e245d3a1ea45252f16a1e2308a3b06b1da/simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c + url: https://files.pythonhosted.org/packages/ab/4d/15718f20cb0e3875b8af9597d6bb3bfbcf1383834b82b6385ee9ac0b72a9/simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/ab/4d/15718f20cb0e3875b8af9597d6bb3bfbcf1383834b82b6385ee9ac0b72a9/simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8 + url: https://files.pythonhosted.org/packages/ac/ae/a06523928af3a6783e2638cd4f6035c3e32de1c1063d563d9060c8d2f1ad/simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/65/be/d8ab9717f471be3c114f16abd8be21d9a6a0a09b9b49177d93d64d3717d9/simplejson-3.19.3-cp311-cp311-win_amd64.whl - sha256: c9bedebdc5fdad48af8783022bae307746d54006b783007d1d3c38e10872a2c6 + url: https://files.pythonhosted.org/packages/b7/d4/850948bcbcfe0b4a6c69dfde10e245d3a1ea45252f16a1e2308a3b06b1da/simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson @@ -36826,8 +36861,8 @@ packages: - kind: pypi name: sounddevice version: 0.5.1 - url: https://files.pythonhosted.org/packages/6f/f6/6703fe7cf3d7b7279040c792aeec6334e7305956aba4a80f23e62c8fdc44/sounddevice-0.5.1-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl - sha256: d16cb23d92322526a86a9490c427bf8d49e273d9ccc0bd096feecd229cde6031 + url: https://files.pythonhosted.org/packages/06/d1/464b5fca3decdd0cfec8c47f7b4161a0b12972453201c1bf03811f367c5e/sounddevice-0.5.1-py3-none-any.whl + sha256: e2017f182888c3f3c280d9fbac92e5dbddac024a7e3442f6e6116bd79dab8a9c requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -36835,8 +36870,8 @@ packages: - kind: pypi name: sounddevice version: 0.5.1 - url: https://files.pythonhosted.org/packages/06/d1/464b5fca3decdd0cfec8c47f7b4161a0b12972453201c1bf03811f367c5e/sounddevice-0.5.1-py3-none-any.whl - sha256: e2017f182888c3f3c280d9fbac92e5dbddac024a7e3442f6e6116bd79dab8a9c + url: https://files.pythonhosted.org/packages/6f/f6/6703fe7cf3d7b7279040c792aeec6334e7305956aba4a80f23e62c8fdc44/sounddevice-0.5.1-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl + sha256: d16cb23d92322526a86a9490c427bf8d49e273d9ccc0bd096feecd229cde6031 requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -36899,9 +36934,9 @@ packages: path: examples/python/structure_from_motion sha256: b20b79aa7bb2b4225b37d3cb28872a70dc7e9ab2ca9ab138b90d60fc8d7b4c15 requires_dist: - - opencv-python>4.6 - numpy - - requests>=2.31,<3 + - opencv-python>4.6 + - requests<3,>=2.31 - rerun-sdk - tqdm editable: true @@ -37414,8 +37449,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15 + url: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37432,8 +37467,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4 + url: https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: 3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37468,8 +37503,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl - sha256: 899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39 + url: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37486,8 +37521,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: 3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832 + url: https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl + sha256: 899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37544,8 +37579,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb + url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37553,18 +37588,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -37580,26 +37615,26 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf + url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl + sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37607,26 +37642,26 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c + url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl + sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37634,26 +37669,26 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 + url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl + sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37661,26 +37696,26 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 + url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d requires_dist: - numpy - torch==2.2.2 @@ -37690,8 +37725,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 + url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 requires_dist: - numpy - torch==2.2.2 @@ -37712,8 +37747,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 + url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl + sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 requires_dist: - numpy - torch==2.2.2 @@ -37723,8 +37758,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d + url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl + sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 requires_dist: - numpy - torch==2.2.2 @@ -37734,32 +37769,32 @@ packages: - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 + url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl + sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 + url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 + url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 + url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl + sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 + url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl + sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 requires_python: '>=3.8' - kind: pypi name: tqdm @@ -38289,7 +38324,7 @@ packages: requires_dist: - mypy-extensions>=0.3.0 - typing-extensions>=3.7.4 - - typing>=3.7.4 ; python_version < '3.5' + - typing>=3.7.4 ; python_full_version < '3.5' - kind: conda name: typing_extensions version: 4.12.2 @@ -38541,12 +38576,6 @@ packages: requires_dist: - click requires_python: '>=3.7' -- kind: pypi - name: uv - version: 0.4.23 - url: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 23269724349a1831881319e5f2854a5b8260f444ecb2528ac44ffe039a091ac4 - requires_python: '>=3.8' - kind: pypi name: uv version: 0.4.23 @@ -38562,14 +38591,20 @@ packages: - kind: pypi name: uv version: 0.4.23 - url: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl - sha256: cbb9754f18d0796337a1756e628f0faa74c215ffb139a35bf490ab07fa626ca8 + url: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + sha256: 1663219972c92cdd2a24ab0437284c4fcaac483814e3399e1cafa231c47b0c46 requires_python: '>=3.8' - kind: pypi name: uv version: 0.4.23 - url: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl - sha256: 1663219972c92cdd2a24ab0437284c4fcaac483814e3399e1cafa231c47b0c46 + url: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 23269724349a1831881319e5f2854a5b8260f444ecb2528ac44ffe039a091ac4 + requires_python: '>=3.8' +- kind: pypi + name: uv + version: 0.4.23 + url: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + sha256: cbb9754f18d0796337a1756e628f0faa74c215ffb139a35bf490ab07fa626ca8 requires_python: '>=3.8' - kind: conda name: vc @@ -38626,7 +38661,7 @@ packages: requires_dist: - distlib<1,>=0.3.7 - filelock<4,>=3.12.2 - - importlib-metadata>=6.6 ; python_version < '3.8' + - importlib-metadata>=6.6 ; python_full_version < '3.8' - platformdirs<5,>=3.9.1 - furo>=2023.7.26 ; extra == 'docs' - proselint>=0.13 ; extra == 'docs' @@ -38640,7 +38675,7 @@ packages: - flaky>=3.7 ; extra == 'test' - packaging>=23.1 ; extra == 'test' - pytest-env>=0.8.2 ; extra == 'test' - - pytest-freezer>=0.4.8 ; (platform_python_implementation == 'PyPy' or (platform_python_implementation == 'CPython' and sys_platform == 'win32' and python_version >= '3.13')) and extra == 'test' + - pytest-freezer>=0.4.8 ; (python_full_version >= '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'win32' and extra == 'test') or (platform_python_implementation == 'PyPy' and extra == 'test') - pytest-mock>=3.11.1 ; extra == 'test' - pytest-randomly>=3.12 ; extra == 'test' - pytest-timeout>=2.1 ; extra == 'test' @@ -38700,40 +38735,40 @@ packages: - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl - sha256: d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e + url: https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl + sha256: dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl - sha256: 0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7 + url: https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl + sha256: f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl - sha256: dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91 + url: https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490 + url: https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl + sha256: 0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl - sha256: f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9 + url: https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl + sha256: d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' @@ -38778,7 +38813,7 @@ packages: url: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 requires_dist: - - backports-functools-lru-cache>=1.2.1 ; python_version < '3.2' + - backports-functools-lru-cache>=1.2.1 ; python_full_version < '3.2' - kind: pypi name: webcolors version: 24.8.0 @@ -38837,26 +38872,26 @@ packages: - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 + url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 + url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d + url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 + url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl + sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 requires_python: '>=3.6' - kind: pypi name: wrapt @@ -39855,7 +39890,7 @@ packages: - big-o ; extra == 'test' - pytest-ignore-flaky ; extra == 'test' - jaraco-test ; extra == 'test' - - importlib-resources ; python_version < '3.9' and extra == 'test' + - importlib-resources ; python_full_version < '3.9' and extra == 'test' - pytest-mypy ; extra == 'type' requires_python: '>=3.8' - kind: conda @@ -39949,8 +39984,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca + url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39958,8 +39993,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl - sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 + url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39967,8 +40002,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 + url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39976,8 +40011,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a + url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl + sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39985,8 +40020,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e + url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' diff --git a/pixi.toml b/pixi.toml index 82b42fa3db58..b20406d2c297 100644 --- a/pixi.toml +++ b/pixi.toml @@ -621,6 +621,7 @@ minimal = { path = "examples/python/minimal", editable = true } minimal_options = { path = "examples/python/minimal_options", editable = true } multiprocess_logging = { path = "examples/python/multiprocess_logging", editable = true } multithreading = { path = "examples/python/multithreading", editable = true } +node_link = { path = "examples/python/node_link", editable = true } nuscenes_dataset = { path = "examples/python/nuscenes_dataset", editable = true } nv12 = { path = "examples/python/nv12", editable = true } objectron = { path = "examples/python/objectron", editable = true } From 10cf7f061e3facaae63bf99ad7066c91545588d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 12:01:32 +0200 Subject: [PATCH 114/159] WIP: initial Python example --- .../rerun/components/graph_edge.fbs | 2 - examples/python/node_link/node_link.py | 39 ++++++++++++++++++- rerun_py/rerun_sdk/rerun/__init__.py | 4 ++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 959c3980c05a..e1d671eeac6e 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -4,8 +4,6 @@ namespace rerun.components; /// An edge in a graph connecting two nodes. table GraphEdge ( - "attr.python.aliases": "Sequence[str], Tuple[str, str]", - "attr.python.array_aliases": "Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index 8ec9e44dc083..c96a974b2ab6 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -9,7 +9,44 @@ def main() -> None: rr.init("rerun_example_py_node_link", spawn=True) - rr.log("binary_tree", rr.GraphNodes(["a", "b", "c"])) + s = 3 # scaling factor for the positions + + # Potentially unbalanced and not sorted :nerd_face:. + # :warning: The nodes have to be unique, which is why we use `5_0`... + rr.log( + "binary_tree", + rr.GraphNodes( + ["1", "7", "2", "6", "5_0", "11", "9_0", "9_1", "5_1"], + labels=["1", "7", "2", "6", "5", "11", "9", "9", "5"], + positions=[ + (0 * s, 0 * s), # 1 + (-20 * s, 30 * s), # 7 + (-30 * s, 60 * s), # 2 + (-10 * s, 60 * s), # 6 + (-20 * s, 90 * s), # 5_0 + (0 * s, 90 * s), # 11 + (20 * s, 30 * s), # 9_0 + (30 * s, 60 * s), # 9_1 + (20 * s, 90 * s), # 5_1 + ], + ), + ) + rr.log( + "binary_tree", + rr.GraphEdges( + [ + rr.components.GraphEdge(source="1", target="7"), + rr.components.GraphEdge(source="7", target="2"), + rr.components.GraphEdge(source="7", target="6"), + rr.components.GraphEdge(source="6", target="5_0"), + rr.components.GraphEdge(source="6", target="11"), + rr.components.GraphEdge(source="1", target="9_0"), + rr.components.GraphEdge(source="9_0", target="9_1"), + rr.components.GraphEdge(source="9_1", target="5_1"), + ], + graph_type="directed", + ), + ) if __name__ == "__main__": diff --git a/rerun_py/rerun_sdk/rerun/__init__.py b/rerun_py/rerun_sdk/rerun/__init__.py index 42df3f2fc339..e2e43805fefa 100644 --- a/rerun_py/rerun_sdk/rerun/__init__.py +++ b/rerun_py/rerun_sdk/rerun/__init__.py @@ -64,6 +64,8 @@ DisconnectedSpace as DisconnectedSpace, Ellipsoids3D as Ellipsoids3D, EncodedImage as EncodedImage, + GraphEdges as GraphEdges, + GraphNodes as GraphNodes, Image as Image, InstancePoses3D as InstancePoses3D, LineStrips2D as LineStrips2D, @@ -91,6 +93,8 @@ ) from .components import ( AlbedoFactor as AlbedoFactor, + GraphEdge as GraphEdge, + GraphType as GraphType, MediaType as MediaType, Radius as Radius, Scale3D as Scale3D, From 5613a070efce1f64a701085b1417a359ac916b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 12:47:39 +0200 Subject: [PATCH 115/159] WIP: finish first Python example --- examples/python/node_link/node_link.py | 100 ++++++++++++++++--------- 1 file changed, 63 insertions(+), 37 deletions(-) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index c96a974b2ab6..a16885ea334e 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -5,48 +5,74 @@ import rerun as rr +s = 3 # scaling factor for the positions + +nodes = { + "1": {"label": "1", "pos": (0 * s, 0 * s)}, + "7": {"label": "7", "pos": (-20 * s, 30 * s)}, + "2": {"label": "2", "pos": (-30 * s, 60 * s)}, + "6": {"label": "6", "pos": (-10 * s, 60 * s)}, + "5_0": {"label": "5", "pos": (-20 * s, 90 * s)}, + "11": {"label": "11", "pos": (0 * s, 90 * s)}, + "9_0": {"label": "9", "pos": (20 * s, 30 * s)}, + "9_1": {"label": "9", "pos": (30 * s, 60 * s)}, + "5_1": {"label": "5", "pos": (20 * s, 90 * s)}, +} + +levels = [ + {"nodes": ["1"], "edges": []}, + {"nodes": ["1", "7", "9_0"], "edges": [("1", "7"), ("1", "9_0")]}, + { + "nodes": ["1", "7", "9_0", "2", "6", "9_1"], + "edges": [("1", "7"), ("1", "9_0"), ("7", "2"), ("7", "6"), ("9_0", "9_1")], + }, + { + "nodes": ["1", "7", "9_0", "2", "6", "9_1", "5_0", "11", "5_1"], + "edges": [ + ("1", "7"), + ("1", "9_0"), + ("7", "2"), + ("7", "6"), + ("9_0", "9_1"), + ("6", "5_0"), + ("6", "11"), + ("9_1", "5_1"), + ], + }, +] + + +def to_edge(e: tuple[str, str]) -> rr.components.GraphEdge: + return rr.components.GraphEdge(source=e[0], target=e[1]) + def main() -> None: rr.init("rerun_example_py_node_link", spawn=True) - s = 3 # scaling factor for the positions - # Potentially unbalanced and not sorted :nerd_face:. - # :warning: The nodes have to be unique, which is why we use `5_0`... - rr.log( - "binary_tree", - rr.GraphNodes( - ["1", "7", "2", "6", "5_0", "11", "9_0", "9_1", "5_1"], - labels=["1", "7", "2", "6", "5", "11", "9", "9", "5"], - positions=[ - (0 * s, 0 * s), # 1 - (-20 * s, 30 * s), # 7 - (-30 * s, 60 * s), # 2 - (-10 * s, 60 * s), # 6 - (-20 * s, 90 * s), # 5_0 - (0 * s, 90 * s), # 11 - (20 * s, 30 * s), # 9_0 - (30 * s, 60 * s), # 9_1 - (20 * s, 90 * s), # 5_1 - ], - ), - ) - rr.log( - "binary_tree", - rr.GraphEdges( - [ - rr.components.GraphEdge(source="1", target="7"), - rr.components.GraphEdge(source="7", target="2"), - rr.components.GraphEdge(source="7", target="6"), - rr.components.GraphEdge(source="6", target="5_0"), - rr.components.GraphEdge(source="6", target="11"), - rr.components.GraphEdge(source="1", target="9_0"), - rr.components.GraphEdge(source="9_0", target="9_1"), - rr.components.GraphEdge(source="9_1", target="5_1"), - ], - graph_type="directed", - ), - ) + # :warning: The nodes have to be unique, which is why we use `5_0`… + + t = 0 + for level in levels: + if len(level["nodes"]) > 0: + t = t + 1 + rr.set_time_seconds("stable_time", t) + rr.log( + "binary_tree", + rr.GraphNodes( + level["nodes"], + labels=list(map(lambda n: nodes[n]["label"], level["nodes"])), + positions=list(map(lambda n: nodes[n]["pos"], level["nodes"])), + ), + ) + + if len(level["edges"]) > 0: + t = t + 1 + rr.set_time_seconds("stable_time", t) + rr.log( + "binary_tree", + rr.GraphEdges(list(map(to_edge, level["edges"]))), + ) if __name__ == "__main__": From d9d4a027b9bb23b6acef494682207748d9981869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 12:50:40 +0200 Subject: [PATCH 116/159] WIP: doc --- examples/python/node_link/node_link.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index a16885ea334e..b5413e1f0270 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -7,6 +7,9 @@ s = 3 # scaling factor for the positions +# Potentially unbalanced and not sorted binary tree. :nerd_face:. +# :warning: The nodes have to be unique, which is why we use `5_0`… + nodes = { "1": {"label": "1", "pos": (0 * s, 0 * s)}, "7": {"label": "7", "pos": (-20 * s, 30 * s)}, @@ -49,9 +52,6 @@ def to_edge(e: tuple[str, str]) -> rr.components.GraphEdge: def main() -> None: rr.init("rerun_example_py_node_link", spawn=True) - # Potentially unbalanced and not sorted :nerd_face:. - # :warning: The nodes have to be unique, which is why we use `5_0`… - t = 0 for level in levels: if len(level["nodes"]) > 0: From 729682c5ef83172a5430a33ea9bc2017491ef30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 13:11:26 +0200 Subject: [PATCH 117/159] WIP: remove dead code --- .../re_space_view_graph/src/graph/mod.rs | 59 ++---------------- .../viewer/re_space_view_graph/src/ui/mod.rs | 35 +---------- crates/viewer/re_space_view_graph/src/view.rs | 60 +------------------ 3 files changed, 7 insertions(+), 147 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index b66b89756b3a..dbe31d926f91 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -2,7 +2,7 @@ use re_log_types::EntityPath; use re_types::datatypes; use crate::{ - types::{EdgeInstance, NodeInstance, UnknownNodeInstance}, + types::UnknownNodeInstance, visualizers::{EdgeData, NodeData}, }; @@ -11,40 +11,14 @@ pub(crate) use hash::GraphNodeHash; mod index; pub(crate) use index::NodeIndex; -pub(crate) enum Node<'a> { - Regular(NodeInstance<'a>), - Unknown(UnknownNodeInstance<'a>), -} - -impl<'a> From<&Node<'a>> for NodeIndex { - fn from(node: &Node<'a>) -> Self { - match node { - Node::Regular(node) => node.into(), - Node::Unknown(node) => node.into(), - } - } -} - -impl<'a> From> for NodeIndex { - fn from(node: Node<'a>) -> Self { - match node { - Node::Regular(node) => node.into(), - Node::Unknown(node) => node.into(), - } - } -} - -// TODO(grtlr): This struct is not used much currently. It might be worth considering to remove -// it, if we don't require it for the layout algorithms nor the user interactions. +// TODO(grtlr): This struct should act as an abstraction over the graph in the future. pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list unknown: ahash::HashSet<(&'a EntityPath, datatypes::GraphNode)>, - nodes: &'a [NodeData], - edges: &'a [EdgeData], } impl<'a> Graph<'a> { - pub fn from_nodes_edges(nodes: &'a Vec, edges: &'a Vec) -> Self { + pub fn from_nodes_edges(nodes: &'a [NodeData], edges: &'a [EdgeData]) -> Self { let seen = nodes .iter() .flat_map(|entity| entity.nodes()) @@ -63,32 +37,7 @@ impl<'a> Graph<'a> { } } - Self { - unknown, - nodes, - edges, - } - } - - pub fn nodes_by_entity(&self) -> impl Iterator { - self.nodes.iter() - } - - pub fn all_nodes(&'a self) -> impl Iterator> { - let nodes = self - .nodes - .iter() - .flat_map(|entity| entity.nodes().map(Node::Regular)); - let unknowns = self.unknown_nodes().map(Node::Unknown); - nodes.chain(unknowns) - } - - pub fn edges_by_entity(&self) -> impl Iterator { - self.edges.iter() - } - - pub fn all_edges(&self) -> impl Iterator> { - self.edges.iter().flat_map(|entity| entity.edges()) + Self { unknown } } pub fn unknown_nodes(&'a self) -> impl Iterator> { diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 6fbbad6a9ca4..92113637ed9c 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -1,7 +1,5 @@ -use std::collections::HashMap; - use re_log_types::EntityPath; -use re_viewer_context::{InteractionHighlight, SpaceViewHighlights}; +use re_viewer_context::SpaceViewHighlights; mod edge; pub(crate) use edge::draw_edge; @@ -12,10 +10,7 @@ pub(crate) use state::GraphSpaceViewState; pub(crate) mod scene; -use crate::{ - graph::{Node, NodeIndex}, - types::UnknownNodeInstance, -}; +use crate::types::UnknownNodeInstance; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance<'_>) -> egui::Response { let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) @@ -59,32 +54,6 @@ pub fn draw_entity( response } -// TODO(grtlr): We might need to come back to this for implementing layouts. -#[allow(unused)] -pub fn measure_node_sizes<'a>( - ui: &mut egui::Ui, - nodes: impl Iterator>, -) -> HashMap { - let mut sizes = HashMap::new(); - let ctx = ui.ctx(); - ctx.request_discard("measuring node sizes"); - ui.horizontal(|ui| { - for node in nodes { - match node { - Node::Regular(instance) => { - let r = draw_node(ui, &instance, InteractionHighlight::default()); - sizes.insert((&instance).into(), r.rect.size()); - } - Node::Unknown(instance) => { - let r = draw_dummy(ui, &instance); - sizes.insert((&instance).into(), r.rect.size()); - } - }; - } - }); - sizes -} - pub fn bounding_rect_from_iter<'a>( rectangles: impl Iterator, ) -> Option { diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 9fafd157d555..5524b351cab0 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -3,7 +3,7 @@ use std::collections::HashSet; use egui::{self, Rect}; use re_log_types::EntityPath; -use re_types::{components, datatypes, SpaceViewClassIdentifier}; +use re_types::{components, SpaceViewClassIdentifier}; use re_ui::{self, UiExt}; use re_viewer_context::{ external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, @@ -116,39 +116,6 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; - // let Some(layout) = &mut state.layout else { - // let node_sizes = ui::measure_node_sizes(ui, graph.all_nodes()); - - // let undirected = undirected_system - // .data - // .iter() - // .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - - // let directed = directed_system - // .data - // .iter() - // .flat_map(|d| d.edges().map(|e| (e.source.into(), e.target.into()))); - - // let layout = - // state - // .layout_provider - // .compute(node_sizes.into_iter(), undirected, directed)?; - - // state.layout = Some(layout); - - // state.should_fit_to_screen = true; - - // return Ok(()); - // }; - - // if graph - // .all_nodes() - // .any(|n| !layout.contains_key(&NodeIndex::from(&n))) - // { - // state.layout = None; - // return Ok(()); - // } - // We keep track of the nodes in the data to clean up the layout. // TODO(grtlr): once we settle on a design, it might make sense to create a // `Layout` struct that keeps track of the layout and the nodes that @@ -234,31 +201,6 @@ impl SpaceViewClass for GraphSpaceView { // Clean up the layout for nodes that are no longer present. state.layout.retain(|k, _| seen.contains(k)); - // let pos = state.layout.iter().map(|(&k, v)| (k, v.center())); - // let links = graph - // .all_edges() - // .map(|e| (e.source.into(), e.target.into())) - // .collect(); - - // let simulation = state.simulation.get_or_insert_with(|| { - // re_force::SimulationBuilder::default() - // .build(pos) - // // .add_force_collide("collide".to_string(), Default::default()) - // // .add_force_x("x".to_string(), Default::default()) - // // .add_force_y("y".to_string(), Default::default()) - // .add_force_link("link".to_string(), LinkBuilder::new(links)) - // .add_force_many_body("many_body".to_string(), Default::default()) - // }); - - // if state.should_tick { - // simulation.tick(1); - // state.should_tick = false; - - // for (ix, pos) in simulation.positions() { - // state.layout.get_mut(ix).unwrap().set_center(pos.into()) - // } - // } - // TODO(grtlr): come up with a good heuristic of when to do this. if state.should_fit_to_screen { state.viewer.fit_to_screen(); From e04b6e5a629cb1c6758b68cb688dcd40aa14f1ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 14:21:02 +0200 Subject: [PATCH 118/159] WIP: fit to screen --- crates/viewer/re_space_view_graph/src/view.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 5524b351cab0..92ccb8e01dd9 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -122,6 +122,8 @@ impl SpaceViewClass for GraphSpaceView { // get added and removed and cleans up automatically (guard pattern). let mut seen: HashSet = HashSet::new(); + let layout_was_empty = state.layout.is_empty(); + state.viewer.scene(ui, |mut scene| { for data in &node_system.data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); @@ -192,19 +194,11 @@ impl SpaceViewClass for GraphSpaceView { } }); - // TODO(grtlr): consider improving this! - if state.should_fit_to_screen { - state.viewer.fit_to_screen(); - state.should_fit_to_screen = false; - } - // Clean up the layout for nodes that are no longer present. state.layout.retain(|k, _| seen.contains(k)); - // TODO(grtlr): come up with a good heuristic of when to do this. - if state.should_fit_to_screen { + if layout_was_empty { state.viewer.fit_to_screen(); - state.should_fit_to_screen = false; } Ok(()) From 007e8d109ccbb693028ac8e43ae0198d12dbc44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 25 Oct 2024 14:57:50 +0200 Subject: [PATCH 119/159] WIP: fix `pixi.lock` --- pixi.lock | 9666 ++++++++++++++++++++++------------------------------- 1 file changed, 4000 insertions(+), 5666 deletions(-) diff --git a/pixi.lock b/pixi.lock index 361485a68aa9..3e19e3d5b534 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,22 +12,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.6.0-hd590300_0.conda @@ -44,10 +44,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fd-find-10.2.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.3.25-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.4.0-hb2e57f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -55,30 +55,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h613a52c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -97,19 +97,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.30.0-h0121fbd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.4.0-h46f95d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.4.0-ha4f9413_101.conda @@ -117,12 +117,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda @@ -139,9 +139,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -155,18 +155,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/semver-2.13.0-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/taplo-0.9.1-h1ff36dd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -208,8 +208,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -220,20 +220,20 @@ environments: - pypi: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -242,22 +242,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.9.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.6.0-h31becfc_0.conda @@ -274,10 +274,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fd-find-10.2.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flatbuffers-24.3.25-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-12.4.0-hfb8d6db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -285,30 +285,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-12.4.0-h3c1ec91_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -327,19 +327,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.30.0-hb9b2b65_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.65.5-ha633eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-12.4.0-h469570c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-12.4.0-h7b3af7c_101.conda @@ -347,12 +347,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -367,9 +367,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -383,18 +383,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/semver-2.13.0-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-h1088aeb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/taplo-0.9.1-hb8f9562_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -436,8 +436,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -448,20 +448,20 @@ environments: - pypi: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -469,19 +469,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.9.5-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.6.0-h282daa2_0.conda @@ -507,7 +507,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fd-find-10.2.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.3.25-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -521,20 +521,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-ha02d983_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h3516399_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -550,26 +550,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -584,9 +584,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -606,10 +606,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -650,8 +650,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -662,19 +662,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -682,19 +682,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.9.5-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.6.0-h6aa9301_0.conda @@ -720,7 +720,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fd-find-10.2.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.3.25-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -734,20 +734,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-951.9-h634c8be_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-h0605c9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -763,26 +763,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda @@ -798,9 +798,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -820,10 +820,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -864,8 +864,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -876,19 +876,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl @@ -896,19 +896,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.9.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda @@ -920,7 +920,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fd-find-10.2.0-h8b8d39b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/flatbuffers-24.3.25-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -930,19 +930,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda @@ -953,15 +953,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.1-default_h8125262_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.9.4-hcfcfb64_0.conda @@ -970,8 +970,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -986,10 +986,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -1006,7 +1006,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda @@ -1015,7 +1015,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.37.32822-h0123c8e_17.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vswhere-3.1.7-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl @@ -1055,8 +1055,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -1068,19 +1068,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl @@ -1096,19 +1096,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binaryen-117-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda @@ -1122,7 +1122,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fd-find-10.2.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.3.25-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -1134,22 +1134,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -1167,30 +1167,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.30.0-h0121fbd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.5.1-py311h63ff55d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda @@ -1209,9 +1209,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -1232,12 +1232,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -1278,8 +1278,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -1289,19 +1289,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -1310,19 +1310,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.9.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binaryen-117-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda @@ -1336,7 +1336,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fd-find-10.2.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flatbuffers-24.3.25-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -1348,22 +1348,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -1381,30 +1381,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.30.0-hb9b2b65_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.65.5-ha633eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/maturin-1.5.1-py311h06e5ef9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda @@ -1421,9 +1421,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -1444,12 +1444,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -1490,8 +1490,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -1501,19 +1501,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -1521,19 +1521,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.9.5-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/binaryen-117-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda @@ -1547,7 +1547,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fd-find-10.2.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.3.25-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -1559,20 +1559,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -1587,25 +1587,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.5.1-py311h24bb903_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda @@ -1622,9 +1622,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -1643,11 +1643,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -1687,8 +1687,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -1698,18 +1698,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -1717,19 +1717,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.9.5-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/binaryen-117-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda @@ -1743,7 +1743,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fd-find-10.2.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.3.25-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -1755,20 +1755,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -1783,25 +1783,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.5.1-py311h71175c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda @@ -1819,9 +1819,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -1840,11 +1840,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -1884,8 +1884,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -1895,18 +1895,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl @@ -1914,19 +1914,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.9.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binaryen-117-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda @@ -1939,7 +1939,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fd-find-10.2.0-h8b8d39b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/flatbuffers-24.3.25-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -1949,19 +1949,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda @@ -1972,15 +1972,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.1-default_h8125262_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.9.4-hcfcfb64_0.conda @@ -1989,9 +1989,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.5.1-py311h9a9e57f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -2007,10 +2007,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -2028,7 +2028,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda @@ -2036,7 +2036,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl @@ -2075,8 +2075,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -2087,18 +2087,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl @@ -2113,19 +2113,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binaryen-117-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda @@ -2159,26 +2159,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda @@ -2197,7 +2197,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda @@ -2208,15 +2208,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h2538932_609.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_1.conda @@ -2232,13 +2232,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h9718a47_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda @@ -2246,7 +2246,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda @@ -2258,14 +2258,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.5.1-py311h63ff55d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311haa8c16d_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda @@ -2278,7 +2278,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hcf60958_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.3-h6e8976b_1.conda @@ -2367,7 +2367,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -2375,18 +2375,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/a6/1abe8d682d46cf2989f9c4928866ae80c30a54d607221a262cff8a5d9366/jaxlib-0.4.35-cp311-cp311-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl @@ -2412,7 +2412,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -2428,7 +2428,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -2459,7 +2459,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/4d/8245e6f76a93c98aab285a43ea71ff1b171bcd90c9d238bf81f7021fb233/psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2505,14 +2505,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/ac/3974caaa459bf2c3a244a84be8d17561f631f7d42af370fc311defeca2fb/triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl @@ -2529,7 +2529,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -2573,19 +2573,19 @@ environments: linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binaryen-117-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda @@ -2616,24 +2616,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.22.5-h87f4aca_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.3-hcc173ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda @@ -2648,7 +2648,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglu-9.0.0-h5eeb66e_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.30.0-hd2ff9d8_0.conda @@ -2657,13 +2657,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.11.1-default_h3030c0e_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311haf0b4d5_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_1.conda @@ -2677,11 +2677,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-h7d3acce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda @@ -2689,7 +2689,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.14.1-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda @@ -2702,7 +2702,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.9.0-h8374285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h765a288_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.4.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.2-h4ebe456_1.conda @@ -2713,7 +2713,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.14-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311hf01b33f_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-54.0-h1d056c8_0.conda @@ -2784,7 +2784,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/93/280ad06dc944e40789b0a641492321a2792db82edda485369cbc59d14366/freetype_py-2.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -2792,14 +2792,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -2827,7 +2827,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -2841,7 +2841,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl @@ -2858,8 +2858,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/27/c2/d034856ac47e3b3cdfa9720d0e113902e615f4190d5d1bdb8df4b2015fb2/psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2904,14 +2904,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -2927,7 +2927,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -2967,19 +2967,19 @@ environments: - pypi: rerun_py osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/binaryen-117-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda @@ -3011,20 +3011,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libass-0.17.3-h5386a9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -3037,7 +3037,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.30.0-hade041e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda @@ -3045,11 +3045,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311h10cdb9d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h7bc525e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h904f6e8_1.conda @@ -3063,16 +3063,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-hd55e6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h4398f7a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libvpx-1.14.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda @@ -3084,7 +3084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-22.9.0-hd71786a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311hb641ee9_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.4.1-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.0.2-h52ea4d3_1.conda @@ -3094,7 +3094,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pugixml-1.14-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311h08a0c97_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-h2fb0a26_1.conda @@ -3154,7 +3154,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -3162,14 +3162,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -3197,7 +3197,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -3212,7 +3212,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -3230,7 +3230,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/01/9e/8be43078a171381953cfee33c07c0d628594b5dbfc5157847b85022c2c1b/psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -3276,14 +3276,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -3299,7 +3299,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -3342,19 +3342,19 @@ environments: - pypi: rerun_py osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/binaryen-117-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda @@ -3386,20 +3386,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.3-hf20b609_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -3412,7 +3412,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.30.0-h2e6cea1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda @@ -3420,11 +3420,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311h2f8bce3_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-h49f535f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-h49f535f_1.conda @@ -3438,16 +3438,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h0b17760_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.14.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda @@ -3460,7 +3460,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311he215df6_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.4.1-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.2-h4a9587e_1.conda @@ -3470,7 +3470,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pugixml-1.14-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311hdc0ac0a_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-hcd0e937_1.conda @@ -3530,7 +3530,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -3538,14 +3538,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -3573,7 +3573,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/e1/38deed89ced4cf378c61e232265cfe933ccde56ae83c901aa68b477d14b1/llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/43/fd588ef5d192308c5e05974bac659bf6ae29c202b7ea2c4194bcf01eacee/MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -3588,7 +3588,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl @@ -3606,7 +3606,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1d/cb/313e80644ea407f04f6602a9e23096540d9dc1878755f3952ea8d3d104be/psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -3652,14 +3652,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -3675,7 +3675,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -3718,19 +3718,19 @@ environments: - pypi: rerun_py win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binaryen-117-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda @@ -3761,20 +3761,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.3-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -3782,7 +3782,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.30.0-ha00044d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.30.0-he5eb982_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda @@ -3790,8 +3790,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hcc16f27_609.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_1.conda @@ -3806,11 +3806,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-hf4e5e90_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.3.1-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda @@ -3825,12 +3825,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.5.1-py311h9a9e57f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h1e0bd2a_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openh264-2.4.1-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.0.2-h1c5a4bf_1.conda @@ -3841,7 +3841,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pugixml-1.14-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hd635bfb_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.7.3-hfb098fa_1.conda @@ -3905,7 +3905,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/6e/bd7fbfacca077bc6f34f1a1109800a2c41ab50f4704d3a0507ba41009915/freetype_py-2.5.1-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -3913,18 +3913,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/7c/73a4c4a34f2bbfce63e8baefee11753b0d58a71e0d2c33f210e00edba3cb/jaxlib-0.4.35-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl @@ -3950,7 +3950,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -3966,7 +3966,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl @@ -3984,7 +3984,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/91/87fa6f060e649b1e1a7b19a4f5869709fbf750b7c8c262ee776ec32f3028/psutil-6.1.0-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/dfa78dc72e47dfe1ada7b37fedcb338454750470358a6dfcfdfda35fa337/pycocotools-2.0.8-cp311-cp311-win_amd64.whl @@ -4031,14 +4031,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -4054,7 +4054,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -4136,16 +4136,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda @@ -4162,7 +4162,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda @@ -4170,33 +4170,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h9c5307e_610.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-h5c8f2c3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-h5c8f2c3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h6481b9d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h2538932_609.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-he882d9a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-he882d9a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h9718a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda @@ -4211,13 +4211,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311h3b854cf_610.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311haa8c16d_609.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda @@ -4226,7 +4226,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hb16a24f_610.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hcf60958_609.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.3-h6e8976b_1.conda @@ -4308,7 +4308,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -4316,18 +4316,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/a6/1abe8d682d46cf2989f9c4928866ae80c30a54d607221a262cff8a5d9366/jaxlib-0.4.35-cp311-cp311-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl @@ -4353,7 +4353,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -4369,7 +4369,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -4401,7 +4401,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/4d/8245e6f76a93c98aab285a43ea71ff1b171bcd90c9d238bf81f7021fb233/psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -4451,14 +4451,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/ac/3974caaa459bf2c3a244a84be8d17561f631f7d42af370fc311defeca2fb/triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl @@ -4475,7 +4475,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -4544,14 +4544,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.3-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.22.5-h87f4aca_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.3-hcc173ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -4564,33 +4564,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglu-9.0.0-h5eeb66e_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.11.1-default_h3030c0e_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311he432950_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2024.4.0-hf15766e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2024.4.0-hf15766e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2024.4.0-h6ef32b0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2024.4.0-h6ef32b0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2024.4.0-haa99d6a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2024.4.0-haa99d6a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2024.4.0-h5ad3122_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-he24a241_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311haf0b4d5_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2024.4.0-hf15766e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2024.4.0-hf15766e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2024.4.0-h6ef32b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2024.4.0-h6ef32b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2024.4.0-he59a552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2024.4.0-he59a552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2024.4.0-h5ad3122_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-h7d3acce_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.2-h029595c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda @@ -4604,15 +4604,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h702c529_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h765a288_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.4.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.43.4-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.14-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311ha6054f4_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311hf01b33f_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda @@ -4676,7 +4676,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/93/280ad06dc944e40789b0a641492321a2792db82edda485369cbc59d14366/freetype_py-2.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -4684,14 +4684,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -4719,7 +4719,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -4733,7 +4733,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl @@ -4751,8 +4751,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/27/c2/d034856ac47e3b3cdfa9720d0e113902e615f4190d5d1bdb8df4b2015fb2/psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -4801,14 +4801,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -4824,7 +4824,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -4892,8 +4892,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libass-0.17.3-h5386a9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda @@ -4904,31 +4904,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.1-default_h456cccd_1000.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311hab275b9_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h84cb933_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h92dab7a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-plugin-2024.4.0-h92dab7a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-hetero-plugin-2024.4.0-h14156cc_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-intel-cpu-plugin-2024.4.0-h84cb933_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-ir-frontend-2024.4.0-h14156cc_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-onnx-frontend-2024.4.0-he28f95a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-paddle-frontend-2024.4.0-he28f95a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-pytorch-frontend-2024.4.0-hc3d39de_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-h488aad4_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-hc3d39de_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311h10cdb9d_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h7bc525e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h904f6e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-plugin-2024.4.0-h904f6e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-hetero-plugin-2024.4.0-h364e3e2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-intel-cpu-plugin-2024.4.0-h7bc525e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-ir-frontend-2024.4.0-h364e3e2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-onnx-frontend-2024.4.0-h9381666_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-paddle-frontend-2024.4.0-h9381666_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-pytorch-frontend-2024.4.0-h4398f7a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-hd55e6c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h4398f7a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.2-h8b30cf6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libvpx-1.14.1-hf036a51_0.conda @@ -4938,14 +4938,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311h8df38f0_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311hb641ee9_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.4.1-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.44-h7634a1b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pugixml-1.14-he965462_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311hc1ddf2c_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311h08a0c97_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda @@ -5001,7 +5001,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -5009,14 +5009,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -5044,7 +5044,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -5059,7 +5059,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -5078,7 +5078,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/01/9e/8be43078a171381953cfee33c07c0d628594b5dbfc5157847b85022c2c1b/psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -5128,14 +5128,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -5151,7 +5151,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -5222,8 +5222,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.3-hf20b609_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda @@ -5234,31 +5234,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.11.1-default_h7685b71_1000.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311hc436ff1_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-hbfeda7a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-hbfeda7a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2024.4.0-hf276634_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2024.4.0-hf276634_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2024.4.0-h03892cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2024.4.0-h03892cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2024.4.0-h7f5a098_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2024.4.0-h7f5a098_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2024.4.0-h5833ebf_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h9d544f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5833ebf_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311h2f8bce3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-h49f535f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-h49f535f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2024.4.0-h8a2fcec_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2024.4.0-h8a2fcec_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2024.4.0-h868cbb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2024.4.0-h868cbb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2024.4.0-h56b1c3c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2024.4.0-h56b1c3c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2024.4.0-hf9b8971_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h0b17760_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.2-h8f0b736_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.14.1-h7bae524_0.conda @@ -5269,14 +5269,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311hc0d1824_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311he215df6_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.4.1-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pugixml-1.14-h13dd4ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311he1e16fa_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311hdc0ac0a_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda @@ -5332,7 +5332,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -5340,14 +5340,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl @@ -5375,7 +5375,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/e1/38deed89ced4cf378c61e232265cfe933ccde56ae83c901aa68b477d14b1/llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/43/fd588ef5d192308c5e05974bac659bf6ae29c202b7ea2c4194bcf01eacee/MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -5390,7 +5390,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl @@ -5409,7 +5409,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1d/cb/313e80644ea407f04f6602a9e23096540d9dc1878755f3952ea8d3d104be/psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -5459,14 +5459,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -5482,7 +5482,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -5552,54 +5552,54 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.3-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.1-default_h8125262_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hc6c75a9_610.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-plugin-2024.4.0-h04f32e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-hetero-plugin-2024.4.0-h372dad0_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-cpu-plugin-2024.4.0-hfe1841e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-gpu-plugin-2024.4.0-hfe1841e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-ir-frontend-2024.4.0-h372dad0_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-onnx-frontend-2024.4.0-h7d5e7ba_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-paddle-frontend-2024.4.0-h7d5e7ba_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-pytorch-frontend-2024.4.0-he0c23c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-h7d689a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hcc16f27_609.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-plugin-2024.4.0-h04f32e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-hetero-plugin-2024.4.0-h372dad0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-cpu-plugin-2024.4.0-hfe1841e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-gpu-plugin-2024.4.0-hfe1841e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-ir-frontend-2024.4.0-h372dad0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-onnx-frontend-2024.4.0-h5707d70_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-paddle-frontend-2024.4.0-h5707d70_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-pytorch-frontend-2024.4.0-he0c23c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-hf4e5e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.3.1-h8ffe710_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.28.2-hcaed137_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h66d6932_610.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h1e0bd2a_609.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openh264-2.4.1-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pugixml-1.14-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hf00e9c7_610.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hd635bfb_609.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-5_cp311.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.7.3-hfb098fa_1.conda @@ -5659,7 +5659,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/6e/bd7fbfacca077bc6f34f1a1109800a2c41ab50f4704d3a0507ba41009915/freetype_py-2.5.1-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl @@ -5667,18 +5667,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/7c/73a4c4a34f2bbfce63e8baefee11753b0d58a71e0d2c33f210e00edba3cb/jaxlib-0.4.35-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl @@ -5704,7 +5704,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9a/9e/f8f0308b66ff5fcc3b351ffa5fcba19ae725dfeda75d3c673f4427f3fc99/marshmallow-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl @@ -5720,7 +5720,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl @@ -5739,7 +5739,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/91/87fa6f060e649b1e1a7b19a4f5869709fbf750b7c8c262ee776ec32f3028/psutil-6.1.0-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl @@ -5790,14 +5790,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -5813,7 +5813,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: examples/python/arkit_scenes - pypi: examples/python/blueprint @@ -5866,19 +5866,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binaryen-117-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda @@ -5909,7 +5909,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -5928,27 +5928,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda @@ -5967,7 +5967,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda @@ -5978,16 +5978,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h2538932_609.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_1.conda @@ -6003,13 +6003,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h9718a47_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda @@ -6017,7 +6017,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda @@ -6027,14 +6027,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.5.1-py311h63ff55d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -6042,7 +6042,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311haa8c16d_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda @@ -6055,12 +6055,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hcf60958_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -6084,7 +6084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda @@ -6117,7 +6117,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -6136,7 +6136,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/0f/2e2061e3fbcb9d535d5da3f58cc8de4947df1786fe6a1355960feb05a681/google_cloud_core-2.4.1-py2.py3-none-any.whl @@ -6151,7 +6151,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -6166,7 +6166,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl @@ -6185,8 +6185,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -6198,7 +6198,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl @@ -6210,13 +6210,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/ac/3974caaa459bf2c3a244a84be8d17561f631f7d42af370fc311defeca2fb/triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -6230,19 +6230,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binaryen-117-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda @@ -6270,7 +6270,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeglut-3.2.2-h5eeb66e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.10-hb9de7d4_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -6289,26 +6289,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.22.5-h87f4aca_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.3-hcc173ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda @@ -6323,7 +6323,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglu-9.0.0-h5eeb66e_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.30.0-hd2ff9d8_0.conda @@ -6332,15 +6332,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.11.1-default_h3030c0e_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311haf0b4d5_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_1.conda @@ -6354,11 +6354,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-h7d3acce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda @@ -6366,7 +6366,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.14.1-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda @@ -6374,7 +6374,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/maturin-1.5.1-py311h06e5ef9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda @@ -6385,7 +6385,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.17.0-heaf42f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h765a288_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.4.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.2-h4ebe456_1.conda @@ -6396,12 +6396,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.14-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311hf01b33f_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -6424,7 +6424,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 @@ -6442,7 +6442,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h57736b2_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xorgproto-2024.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -6461,7 +6461,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/0f/2e2061e3fbcb9d535d5da3f58cc8de4947df1786fe6a1355960feb05a681/google_cloud_core-2.4.1-py2.py3-none-any.whl @@ -6476,7 +6476,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -6491,15 +6491,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -6511,7 +6511,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl @@ -6522,13 +6522,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -6541,19 +6541,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/binaryen-117-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda @@ -6580,7 +6580,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -6601,22 +6601,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libass-0.17.3-h5386a9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -6629,7 +6629,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.30.0-hade041e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda @@ -6637,13 +6637,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311h10cdb9d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h7bc525e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h904f6e8_1.conda @@ -6657,23 +6657,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-hd55e6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h4398f7a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libvpx-1.14.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.5.1-py311h24bb903_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda @@ -6684,7 +6684,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.17.0-hd71786a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311hb641ee9_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.4.1-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.0.2-h52ea4d3_1.conda @@ -6695,11 +6695,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pugixml-1.14-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311h08a0c97_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -6720,13 +6720,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -6745,7 +6745,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/0f/2e2061e3fbcb9d535d5da3f58cc8de4947df1786fe6a1355960feb05a681/google_cloud_core-2.4.1-py2.py3-none-any.whl @@ -6760,7 +6760,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -6774,15 +6774,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -6794,7 +6794,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -6804,13 +6804,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -6823,19 +6823,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/binaryen-117-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda @@ -6862,7 +6862,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -6883,22 +6883,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.3-hf20b609_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -6911,7 +6911,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.30.0-h2e6cea1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda @@ -6919,13 +6919,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311h2f8bce3_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-h49f535f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-h49f535f_1.conda @@ -6939,23 +6939,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h0b17760_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.14.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.5.1-py311h71175c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda @@ -6967,7 +6967,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.17.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311he215df6_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.4.1-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.2-h4a9587e_1.conda @@ -6978,11 +6978,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pugixml-1.14-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311hdc0ac0a_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -7003,13 +7003,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -7028,7 +7028,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/0f/2e2061e3fbcb9d535d5da3f58cc8de4947df1786fe6a1355960feb05a681/google_cloud_core-2.4.1-py2.py3-none-any.whl @@ -7043,7 +7043,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -7057,15 +7057,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -7077,7 +7077,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -7087,13 +7087,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl @@ -7106,19 +7106,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binaryen-117-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda @@ -7145,7 +7145,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -7164,20 +7164,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.3-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -7185,7 +7185,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.30.0-ha00044d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.30.0-he5eb982_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda @@ -7193,8 +7193,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hcc16f27_609.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_1.conda @@ -7209,16 +7209,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-hf4e5e90_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.3.1-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda @@ -7228,9 +7228,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.5.1-py311h9a9e57f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -7240,7 +7240,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.17.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h1e0bd2a_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openh264-2.4.1-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.0.2-h1c5a4bf_1.conda @@ -7251,12 +7251,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pugixml-1.14-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hd635bfb_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -7276,7 +7276,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda @@ -7286,7 +7286,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -7305,7 +7305,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/0f/2e2061e3fbcb9d535d5da3f58cc8de4947df1786fe6a1355960feb05a681/google_cloud_core-2.4.1-py2.py3-none-any.whl @@ -7320,7 +7320,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -7334,15 +7334,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -7355,7 +7355,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -7365,13 +7365,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl @@ -7391,19 +7391,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda @@ -7416,7 +7416,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fd-find-10.2.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.3.25-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -7428,22 +7428,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -7461,30 +7461,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.30.0-h0121fbd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda @@ -7501,9 +7501,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -7523,11 +7523,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -7587,8 +7587,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -7604,7 +7604,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl @@ -7614,14 +7614,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/d2/4642eb80e3c5a9a00bf8a2ae5cb9390aadfd2a491f161d26a014afa63c4a/sphobjinv-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl @@ -7631,19 +7631,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.9.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda @@ -7656,7 +7656,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fd-find-10.2.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flatbuffers-24.3.25-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -7668,22 +7668,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -7701,30 +7701,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.30.0-hb9b2b65_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.65.5-ha633eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -7739,9 +7739,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -7761,11 +7761,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -7825,8 +7825,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -7842,7 +7842,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl @@ -7852,14 +7852,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/d2/4642eb80e3c5a9a00bf8a2ae5cb9390aadfd2a491f161d26a014afa63c4a/sphobjinv-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl @@ -7868,19 +7868,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.9.5-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda @@ -7893,7 +7893,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fd-find-10.2.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.3.25-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -7905,20 +7905,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -7933,25 +7933,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -7966,9 +7966,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -7986,10 +7986,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -8048,8 +8048,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -8065,7 +8065,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/2d/90165d51ecd38f9a02c6832198c13a4e48652485e2ccf863ebb942c531b6/setuptools-75.2.0-py3-none-any.whl @@ -8074,14 +8074,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/d2/4642eb80e3c5a9a00bf8a2ae5cb9390aadfd2a491f161d26a014afa63c4a/sphobjinv-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl @@ -8090,19 +8090,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.9.5-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda @@ -8115,7 +8115,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fd-find-10.2.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.3.25-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -8127,20 +8127,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -8155,25 +8155,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda @@ -8189,9 +8189,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -8209,10 +8209,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -8271,8 +8271,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -8288,7 +8288,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/2d/90165d51ecd38f9a02c6832198c13a4e48652485e2ccf863ebb942c531b6/setuptools-75.2.0-py3-none-any.whl @@ -8297,14 +8297,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/d2/4642eb80e3c5a9a00bf8a2ae5cb9390aadfd2a491f161d26a014afa63c4a/sphobjinv-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl @@ -8313,19 +8313,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.9.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda @@ -8337,7 +8337,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fd-find-10.2.0-h8b8d39b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/flatbuffers-24.3.25-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -8347,19 +8347,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda @@ -8370,15 +8370,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.1-default_h8125262_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.9.4-hcfcfb64_0.conda @@ -8387,8 +8387,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -8403,10 +8403,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -8423,14 +8423,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl @@ -8488,8 +8488,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl @@ -8506,7 +8506,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/2d/90165d51ecd38f9a02c6832198c13a4e48652485e2ccf863ebb942c531b6/setuptools-75.2.0-py3-none-any.whl @@ -8515,14 +8515,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/d2/4642eb80e3c5a9a00bf8a2ae5cb9390aadfd2a491f161d26a014afa63c4a/sphobjinv-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl @@ -8541,23 +8541,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binaryen-117-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.6.0-hd590300_0.conda @@ -8591,10 +8591,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.4.0-hb2e57f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -8604,7 +8604,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h613a52c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda @@ -8613,31 +8613,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda @@ -8657,7 +8657,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda @@ -8668,16 +8668,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h2538932_609.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_1.conda @@ -8693,14 +8693,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h9718a47_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.4.0-h46f95d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.4.0-ha4f9413_101.conda @@ -8709,7 +8709,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda @@ -8719,14 +8719,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.5.1-py311h63ff55d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -8734,7 +8734,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311haa8c16d_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda @@ -8747,12 +8747,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hcf60958_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -8769,7 +8769,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/taplo-0.9.1-h1ff36dd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -8777,7 +8777,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda @@ -8810,7 +8810,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl @@ -8855,7 +8855,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -8873,21 +8873,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/a6/1abe8d682d46cf2989f9c4928866ae80c30a54d607221a262cff8a5d9366/jaxlib-0.4.35-cp311-cp311-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl @@ -8930,7 +8930,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -8960,7 +8960,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -8994,7 +8994,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/ee/69e498a892f208bd1da4104d4b9be887f8611bf4942144718b6738482250/safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -9019,17 +9019,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/ac/3974caaa459bf2c3a244a84be8d17561f631f7d42af370fc311defeca2fb/triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -9039,15 +9039,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: examples/python/arkit_scenes @@ -9093,23 +9093,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binaryen-117-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.6.0-h31becfc_0.conda @@ -9140,10 +9140,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeglut-3.2.2-h5eeb66e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.10-hb9de7d4_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-12.4.0-hfb8d6db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -9153,7 +9153,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-12.4.0-h3c1ec91_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-9.0.0-hbf49d6b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.4-nompi_h13f6c1a_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda @@ -9162,30 +9162,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.4-ha25e7e8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.22.5-h87f4aca_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.3-hcc173ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda @@ -9201,7 +9201,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglu-9.0.0-h5eeb66e_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.30.0-hd2ff9d8_0.conda @@ -9210,15 +9210,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.11.1-default_h3030c0e_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311haf0b4d5_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_1.conda @@ -9232,12 +9232,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-h7d3acce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-12.4.0-h469570c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-12.4.0-h7b3af7c_101.conda @@ -9246,7 +9246,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.14.1-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda @@ -9254,7 +9254,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/maturin-1.5.1-py311h06e5ef9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda @@ -9265,7 +9265,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.17.0-heaf42f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h765a288_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.4.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.2-h4ebe456_1.conda @@ -9276,12 +9276,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.14-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311hf01b33f_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -9297,7 +9297,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-h1088aeb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-2.2.1-h5ad3122_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/taplo-0.9.1-hb8f9562_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tbb-2021.13.0-h17cf362_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda @@ -9305,7 +9305,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 @@ -9323,7 +9323,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h57736b2_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xorgproto-2024.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/2c/92/48aec3736ca778ffe5fa68e19e3c18917cba4de43fa46fe6176cccafe267/accelerate-1.0.1-py3-none-any.whl @@ -9366,7 +9366,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/93/280ad06dc944e40789b0a641492321a2792db82edda485369cbc59d14366/freetype_py-2.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -9384,14 +9384,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl @@ -9437,7 +9437,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl @@ -9454,8 +9454,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -9488,7 +9488,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/83/c4a7ce01d626e46ea2b45887f2e59b16441408031e2ce2f9fe01860c6946/safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -9512,16 +9512,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -9531,15 +9531,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: examples/python/arkit_scenes @@ -9581,19 +9581,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/binaryen-117-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda @@ -9633,7 +9633,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -9656,22 +9656,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libass-0.17.3-h5386a9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -9685,7 +9685,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.30.0-hade041e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda @@ -9693,13 +9693,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311h10cdb9d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h7bc525e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h904f6e8_1.conda @@ -9713,16 +9713,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-hd55e6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h4398f7a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libvpx-1.14.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda @@ -9730,7 +9730,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.5.1-py311h24bb903_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda @@ -9741,7 +9741,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.17.0-hd71786a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311hb641ee9_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.4.1-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.0.2-h52ea4d3_1.conda @@ -9752,11 +9752,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pugixml-1.14-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311h08a0c97_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -9779,13 +9779,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl @@ -9831,7 +9831,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -9849,14 +9849,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl @@ -9902,7 +9902,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -9919,7 +9919,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -9953,7 +9953,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/a5/25bcf75e373412daf1fd88045ab3aa8140a0d804ef0e70712c4f2c5b94d8/safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl @@ -9977,16 +9977,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -9996,15 +9996,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: examples/python/arkit_scenes @@ -10049,19 +10049,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/binaryen-117-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda @@ -10101,7 +10101,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -10124,22 +10124,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.3-hf20b609_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -10153,7 +10153,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.30.0-h2e6cea1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda @@ -10161,13 +10161,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311h2f8bce3_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-h49f535f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-h49f535f_1.conda @@ -10181,16 +10181,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h0b17760_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.14.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda @@ -10198,7 +10198,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.5.1-py311h71175c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda @@ -10210,7 +10210,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.17.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311he215df6_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.4.1-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.2-h4a9587e_1.conda @@ -10221,11 +10221,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pugixml-1.14-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311hdc0ac0a_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -10248,13 +10248,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl @@ -10300,7 +10300,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -10318,14 +10318,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl @@ -10371,7 +10371,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl @@ -10388,7 +10388,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -10422,7 +10422,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/8c/ece3bf8756506a890bd980eca02f47f9d98dfbf5ce16eda1368f53560f67/safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl @@ -10446,16 +10446,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -10465,15 +10465,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: examples/python/arkit_scenes @@ -10518,19 +10518,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binaryen-117-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda @@ -10557,7 +10557,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -10576,20 +10576,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.3-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -10597,7 +10597,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.30.0-ha00044d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.30.0-he5eb982_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda @@ -10605,8 +10605,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hcc16f27_609.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_1.conda @@ -10621,16 +10621,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-hf4e5e90_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.3.1-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda @@ -10640,9 +10640,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.5.1-py311h9a9e57f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -10652,7 +10652,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.17.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h1e0bd2a_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openh264-2.4.1-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.0.2-h1c5a4bf_1.conda @@ -10663,12 +10663,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pugixml-1.14-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hd635bfb_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -10688,7 +10688,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda @@ -10700,7 +10700,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl @@ -10745,7 +10745,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/6e/bd7fbfacca077bc6f34f1a1109800a2c41ab50f4704d3a0507ba41009915/freetype_py-2.5.1-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -10763,21 +10763,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/75/4bc3e242ad13f2e6c12e0b0401ab2c5e5c6f0d7da37ec69bc808e24e0ccb/humanize-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/e7/26045404a30c8a200e960fb54fbaf4b73d12e58cd28e03b306b084253f4f/imageio-2.36.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/7c/73a4c4a34f2bbfce63e8baefee11753b0d58a71e0d2c33f210e00edba3cb/jaxlib-0.4.35-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/3c/4f8791ee53ab9eeb0b022205aa79387119a74cc9429582ce04098e6fc540/json5-0.9.25-py3-none-any.whl @@ -10819,7 +10819,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/77/53732fbf48196af9e51c2a61833471021c1d77d335d57b96ee3588c0c53d/notebook-7.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl @@ -10837,7 +10837,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/2d/46ed6436849c2c88228c3111865f44311cff784b4aabcdef4ea2545dbc3d/prometheus_client-0.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/14/619e24a4c70df2901e1f4dbc50a6291eb63a759172558df326347dce1f0d/protobuf-3.20.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl @@ -10874,7 +10874,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/41/948c96c8a7e9fef57c2e051f1871c108a6dbbc6d285598bdb1d89b98617c/safetensors-0.4.5-cp311-none-win_amd64.whl @@ -10898,16 +10898,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/0a/435d5d7ec64d1c8b422ac9ebe42d2f3b2ac0b3f8a56f5c04dd0f3b7ba83c/tifffile-2024.9.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/aa/4b54f6047c442883243f68f6f9e3a0ab77aaae4b3e6e51a98b371e73dd77/timm-0.9.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/40/c93b1215980d6d31119f742a5702a569b3abce363d68c731d69f312f292c/trimesh-3.15.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl @@ -10917,15 +10917,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl - pypi: examples/python/arkit_scenes @@ -10979,23 +10979,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binaryen-117-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.6.0-hd590300_0.conda @@ -11029,10 +11029,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.4.0-hb2e57f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -11042,7 +11042,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-12.4.0-h236703b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h613a52c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda @@ -11051,31 +11051,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp16-16.0.6-default_hb5137d0_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda @@ -11095,7 +11095,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda @@ -11106,16 +11106,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-hc9dba70_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h2538932_609.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_1.conda @@ -11131,14 +11131,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h9718a47_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.4.0-h46f95d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.4.0-ha4f9413_101.conda @@ -11147,7 +11147,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda @@ -11157,14 +11157,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.5.1-py311h63ff55d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/meilisearch-1.5.1-he8a937b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -11172,7 +11172,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311haa8c16d_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda @@ -11185,12 +11185,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prettier-3.2.5-h31abb78_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hcf60958_609.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda @@ -11207,7 +11207,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/taplo-0.9.1-h1ff36dd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -11215,7 +11215,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h05e919c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda @@ -11248,7 +11248,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -11267,7 +11267,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -11283,7 +11283,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -11298,7 +11298,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl @@ -11317,8 +11317,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -11333,7 +11333,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/8c/067fd1f2f5887465297ba844912bf3c7066c07174d3d6e08ee462e23f965/rerun_notebook-0.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl @@ -11345,13 +11345,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/ac/3974caaa459bf2c3a244a84be8d17561f631f7d42af370fc311defeca2fb/triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -11363,23 +11363,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binaryen-117-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.2-ha64f414_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.6.0-h31becfc_0.conda @@ -11410,10 +11410,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeglut-3.2.2-h5eeb66e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.10-hb9de7d4_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-12.4.0-hfb8d6db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -11423,7 +11423,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-12.4.0-h7e62973_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-12.4.0-h3c1ec91_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-9.0.0-hbf49d6b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.4-nompi_h13f6c1a_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda @@ -11432,30 +11432,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.4-ha25e7e8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.22.5-h87f4aca_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.3-hcc173ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp16-16.0.6-default_he324ac1_13.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.10.1-h3ec0cbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda @@ -11471,7 +11471,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglu-9.0.0-h5eeb66e_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.30.0-hd2ff9d8_0.conda @@ -11480,15 +11480,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.11.1-default_h3030c0e_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm16-16.0.6-h0b931ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm17-17.0.6-h36f4c5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm19-19.1.2-h2edbd07_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.10.0-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311haf0b4d5_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_1.conda @@ -11502,12 +11502,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-h7d3acce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.27.5-h029595c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-12.4.0-h469570c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-12.4.0-h7b3af7c_101.conda @@ -11516,7 +11516,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.8.0-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.14.1-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda @@ -11524,7 +11524,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.9.4-hd600fc2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/maturin-1.5.1-py311h06e5ef9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda @@ -11535,7 +11535,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.17.0-heaf42f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h765a288_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.4.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.2-h4ebe456_1.conda @@ -11546,12 +11546,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prettier-3.2.5-h4e45a9e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.0-py311ha879c10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.14-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311hf01b33f_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.10-h5d932e8_3_cpython.conda @@ -11567,7 +11567,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-h1088aeb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-2.2.1-h5ad3122_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_17.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/taplo-0.9.1-hb8f9562_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tbb-2021.13.0-h17cf362_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda @@ -11575,7 +11575,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.17.0-h587c540_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 @@ -11593,7 +11593,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h57736b2_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xorgproto-2024.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -11612,7 +11612,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -11628,7 +11628,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -11643,15 +11643,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -11666,7 +11666,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/8c/067fd1f2f5887465297ba844912bf3c7066c07174d3d6e08ee462e23f965/rerun_notebook-0.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl @@ -11677,13 +11677,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -11694,19 +11694,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/binaryen-117-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.2-h32b1619_0.conda @@ -11746,7 +11746,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -11769,22 +11769,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_hac325c4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libass-0.17.3-h5386a9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h0c94c6a_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.10.1-h58e7537_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.2-hf95d169_0.conda @@ -11798,7 +11798,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.30.0-hade041e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.30.0-h8126ed0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.65.5-hb88832f_0.conda @@ -11806,13 +11806,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.2-h1e63acb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311h10cdb9d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h7bc525e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h904f6e8_1.conda @@ -11826,16 +11826,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-hd55e6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h4398f7a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.27.5-h62b0dff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-hd530cb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libvpx-1.14.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda @@ -11843,7 +11843,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.2-hf78d878_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.5.1-py311h24bb903_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.1.0-py311h1cc1194_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda @@ -11854,7 +11854,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.17.0-hd71786a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311hb641ee9_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.4.1-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.0.2-h52ea4d3_1.conda @@ -11865,11 +11865,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prettier-3.2.5-hbd11d21_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/propcache-0.2.0-py311h3336109_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pugixml-1.14-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311h08a0c97_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.10-ha513fb2_3_cpython.conda @@ -11892,13 +11892,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -11917,7 +11917,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -11933,7 +11933,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -11947,15 +11947,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -11970,7 +11970,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/8c/067fd1f2f5887465297ba844912bf3c7066c07174d3d6e08ee462e23f965/rerun_notebook-0.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -11980,13 +11980,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl @@ -11997,19 +11997,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/binaryen-117-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.2-h7ab814d_0.conda @@ -12049,7 +12049,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda @@ -12072,22 +12072,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.3-hf20b609_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp16-16.0.6-default_h5c12605_13.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.10.1-h13a7ad3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -12101,7 +12101,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.30.0-h2e6cea1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.30.0-h90fd6fa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.65.5-h3d9cf25_0.conda @@ -12109,13 +12109,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm16-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm17-17.0.6-h5090b49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.2-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311h2f8bce3_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-h49f535f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-h49f535f_1.conda @@ -12129,16 +12129,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h0b17760_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-hf9b8971_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.27.5-h53f8970_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h2348fd5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.8.0-h1a8c8d9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.14.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda @@ -12146,7 +12146,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.2-hb52a8e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.5.1-py311h71175c2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/meilisearch-1.5.1-h5ef7bb8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda @@ -12158,7 +12158,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.17.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311he215df6_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.4.1-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.2-h4a9587e_1.conda @@ -12169,11 +12169,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prettier-3.2.5-hb67532b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.0-py311h460d6c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pugixml-1.14-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311hdc0ac0a_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.10-hc51fdd5_3_cpython.conda @@ -12196,13 +12196,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -12221,7 +12221,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -12237,7 +12237,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -12251,15 +12251,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -12274,7 +12274,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/8c/067fd1f2f5887465297ba844912bf3c7066c07174d3d6e08ee462e23f965/rerun_notebook-0.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -12284,13 +12284,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl @@ -12301,19 +12301,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binaryen-117-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.2-h2466b09_0.conda @@ -12340,7 +12340,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitignore-parser-0.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda @@ -12359,20 +12359,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20240722.0-cxx17_he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.3-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.10.1-h1ee3ff0_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -12380,7 +12380,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.30.0-ha00044d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.30.0-he5eb982_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.65.5-ha20e22e_0.conda @@ -12388,8 +12388,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hcc16f27_609.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_1.conda @@ -12404,16 +12404,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-hf4e5e90_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.3.1-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.27.5-hcaed137_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.21.0-hbe90ef8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.8.0-h82a8f57_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda @@ -12423,9 +12423,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.5.1-py311h9a9e57f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.1.0-py311h5082efb_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda @@ -12435,7 +12435,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.17.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h1e0bd2a_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openh264-2.4.1-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.0.2-h1c5a4bf_1.conda @@ -12446,12 +12446,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/prettier-3.2.5-h98b3114_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.2.0-py311he736701_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pugixml-1.14-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hd635bfb_609.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.10-hce54a09_3_cpython.conda @@ -12471,7 +12471,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda @@ -12483,7 +12483,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl @@ -12502,7 +12502,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/ef/79fa8388c95edbd8fe36c763259dade36e5cb562dcf3e85c0e32070dc9b0/google_api_core-2.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl @@ -12518,7 +12518,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl @@ -12532,15 +12532,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -12556,7 +12556,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/8c/067fd1f2f5887465297ba844912bf3c7066c07174d3d6e08ee462e23f965/rerun_notebook-0.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl @@ -12566,13 +12566,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/c4/ac/ce90573ba446a9bbe65838ded066a805234d159b4446ae9f8ec5bbd36cbd/tomli_w-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/3a/4950e3701e27f2157814f7ddb41553513ebd9f4864cca78f47e2a68c897c/types_Deprecated-1.2.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl @@ -13191,1292 +13191,1272 @@ packages: - kind: conda name: aws-c-auth version: 0.7.31 - build: h459cf4e_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-h459cf4e_5.conda - sha256: e01e956eff5ee64eff2ec27d64a59edd63e319c70685d76314da4690b71b4c75 - md5: c1dde5a630076bb14fb2f17eab884be6 + build: h57bd9a3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-h57bd9a3_0.conda + sha256: 7706d49b8011da81d5dc54e9bad06f67d43edb1ff2aa1dcc3dbc737d53d2a4ef + md5: 83be3b5e072d88b76841cc02c6dd458e depends: + - __glibc >=2.17,<3.0.a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 102345 - timestamp: 1729645407261 + size: 107753 + timestamp: 1726544311370 - kind: conda name: aws-c-auth version: 0.7.31 - build: h821ce02_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-h821ce02_5.conda - sha256: ce4d6dae798170834d3b743fa46e06d79ae8beecb0a4480075af48b9968462e6 - md5: c8555decbca067af3cc25252c565bff3 + build: h92f6102_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-h92f6102_0.conda + sha256: 381a8fab6f74c9bdf6c55ed88134ad9ca24be1ccf3ac91b539fd8f046fe91b4e + md5: d47a1298488849aa9635cfcb4d9cc455 depends: - - __osx >=10.13 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 94475 - timestamp: 1729645345979 + size: 111978 + timestamp: 1726544334156 - kind: conda name: aws-c-auth version: 0.7.31 - build: hcdce11a_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.31-hcdce11a_5.conda - sha256: f2a0f4ea442315232166ea9b7b85be36d10066507029a7ffd9bdee7c4da4ea1c - md5: 5e8936e89bae15461d8a0d2b8920f181 + build: hb28a666_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.31-hb28a666_0.conda + sha256: 51bf3047115f21c89e96999ec7a0c46a7684334ffe5a3584547a2e1f9e14ba2a + md5: d14e2cb987740374e14e871456356b76 depends: - - __glibc >=2.17,<3.0.a0 + - __osx >=10.13 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 107177 - timestamp: 1729645226835 + size: 94230 + timestamp: 1726544392579 - kind: conda name: aws-c-auth version: 0.7.31 - build: hd675c95_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.31-hd675c95_5.conda - sha256: b84fcaf7a87346b9a9d46cf1bbf4c39eb9a6417b1e962ae6c1a7421004e4b8e2 - md5: 89046ad1c1e8c2e87ff06237c5698f30 + build: hc27b277_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hc27b277_0.conda + sha256: 5a512985e65a0b9b60e54c5aa01bb8b3c4573663b32753d3e63da43eccf638f3 + md5: f22f3582756570df9b0025b2b373b118 depends: + - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 112028 - timestamp: 1729645278509 + size: 92974 + timestamp: 1726544484188 - kind: conda name: aws-c-auth version: 0.7.31 - build: hee1f4ab_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.31-hee1f4ab_5.conda - sha256: c4a5583292972810a24ac062ec8ff5ea16d2c9d4300daa7c895757da3dff1a2d - md5: 262580840e8d3007fd6a55340a518fa8 + build: hce3b56f_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.7.31-hce3b56f_0.conda + sha256: b154854dc8b0c66bf7282da5668352a93f8d36e44936f8adb5bdabe519596e69 + md5: 49f9d09893f4356733ea584c1ef088ce depends: - - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 92423 - timestamp: 1729645339177 + size: 102819 + timestamp: 1726544858712 - kind: conda name: aws-c-cal version: 0.7.4 - build: h0da4a7a_4 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-h0da4a7a_4.conda - sha256: df14cfcb748456dfcea23ecade1569d4729090d09eefcb4b52833ea7ea060cc0 - md5: 676448c1ca47b402b5fde84f112c8c7d + build: h41dd001_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41dd001_1.conda + sha256: 2167b44bc879fb9cb7aaf2ca8418c2f8764c82c8732a41c08616e3f70fc92224 + md5: 3f2c1743ed973b58fd187b0c31861dd8 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - openssl >=3.3.1,<4.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 46763 - timestamp: 1729595742181 + size: 39881 + timestamp: 1725829996108 - kind: conda name: aws-c-cal version: 0.7.4 - build: hb16d14f_4 - build_number: 4 + build: h51bfcdd_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-hb16d14f_4.conda - sha256: 9f68d66212110db1bc3f2060fa671962763b24b3719f7229a99768569f48fa93 - md5: 0995dc44b4408bb853b0996a9f057d7e + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h51bfcdd_1.conda + sha256: b4c536245ceb696cd282b50156580464b88efb45c5ed1a41dfe95d12d1782585 + md5: 51af481aa48d64523b9ce6837238d8d8 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 - openssl >=3.3.1,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 49707 - timestamp: 1729595680442 + size: 50041 + timestamp: 1725830048945 - kind: conda name: aws-c-cal version: 0.7.4 - build: hcd44f14_4 - build_number: 4 + build: h8128ea2_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-hcd44f14_4.conda - sha256: 66d1081225e06f6f6002724a773d6e2eb33bc02bc4f2748383b63f3cf0693a2d - md5: 3b0089fb0ba2f2a89c2cedb83a043124 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.7.4-h8128ea2_1.conda + sha256: 6ffa143181fa40bbbe1b5dfad149b68e4c3fcb6e5d38a4f5a4490c8c3b4402df + md5: 195ef3e2d7dadb02a4b1f874a1e5e1e6 depends: - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - openssl >=3.3.1,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 39407 - timestamp: 1729595686085 + size: 39204 + timestamp: 1725829973 - kind: conda name: aws-c-cal version: 0.7.4 - build: hd3f4568_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hd3f4568_4.conda - sha256: ea8910baaeecdb05f86ee41cf6ea679745677fe320626d347047fce6c04dec02 - md5: 933b666a736387d5a618ae2173364635 + build: hf1fc857_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.7.4-hf1fc857_1.conda + sha256: f7ea9d52f759775dde2a39e1a2325e4659bfb2859f7a45798323c7cb00ed2770 + md5: 7c01760e07f867666662a4d91e998308 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - libgcc >=13 + - aws-c-common >=0.9.28,<0.9.29.0a0 - openssl >=3.3.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 47689 - timestamp: 1729595594849 + size: 46848 + timestamp: 1725830274457 - kind: conda name: aws-c-cal version: 0.7.4 - build: hfd083d3_4 - build_number: 4 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-hfd083d3_4.conda - sha256: 29f767fd1e7f47b3cedddd04ff3f190ab3ee9c96255dde7234e2b04485595af9 - md5: 335d26e89405e0078c5b43b04c08993c + build: hfd43aa1_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda + sha256: 8c8100499b7fced0c6a5eea156e85994d3bb0702b30eecedd949d555ca11f6a8 + md5: f301eb944d297fc879c441fffe461d8a depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - libgcc >=13 - openssl >=3.3.1,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 39866 - timestamp: 1729595783840 + size: 47532 + timestamp: 1725829965837 - kind: conda name: aws-c-common - version: 0.9.31 - build: h2466b09_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.31-h2466b09_0.conda - sha256: 52e4b04ff909c9e4d5ab5f7892f5eff358417dbb500eca539415732975823567 - md5: 4bf2a26d63fd34e1ad42b73918e452df + version: 0.9.28 + build: h00291cd_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.28-h00291cd_0.conda + sha256: 9af8c4514526829de390bc5f5c103487dff1cd025463ea90b7f8dbb8f1d0ff16 + md5: ffe8898e6d97ecb791df1350ce273508 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=10.13 license: Apache-2.0 license_family: Apache purls: [] - size: 234317 - timestamp: 1729562021989 + size: 225877 + timestamp: 1725670122224 - kind: conda name: aws-c-common - version: 0.9.31 - build: h7ab814d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.31-h7ab814d_0.conda - sha256: b79d2bccd06dec9a54243d617fb6e2436a930707666ba186bbbe047c46b84064 - md5: 37eded160015046030d7a68cb44fb3d2 + version: 0.9.28 + build: h2466b09_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.9.28-h2466b09_0.conda + sha256: 102e955695d4b996753773552820b18b6d0c1f8d77ac0412041341bece100815 + md5: 3ffb0664a913a557bf89ed1834d0c12c depends: - - __osx >=11.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 219971 - timestamp: 1729561861114 + size: 233724 + timestamp: 1725670503118 - kind: conda name: aws-c-common - version: 0.9.31 + version: 0.9.28 build: h86ecc28_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.31-h86ecc28_0.conda - sha256: 6e4c727c5b92d0c768dbad8ba8092273487b0261169b11c689f3f07f6e088202 - md5: b5764edf53106024a1e3394369124a36 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.28-h86ecc28_0.conda + sha256: eec3832674e8eae438e4a7a83f991044077a6c94cd1d1fbac777dd2cf9e42d0a + md5: aa93eed77c5da6c30f8fc7b2c91f057a depends: - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 257007 - timestamp: 1729561903108 + size: 257424 + timestamp: 1725670120223 - kind: conda name: aws-c-common - version: 0.9.31 - build: ha44c9a9_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.31-ha44c9a9_0.conda - sha256: 773699cc3a723833c8ce86469f3db904623731fa105e66dc7c09027ce3573a18 - md5: 63943199ef7f9d267732ea065ce6bb3d + version: 0.9.28 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda + sha256: febe894ae2f5bfc4d65c51bd058433e9061d994ff06b30d5eca18919639c5083 + md5: 1b53af320b24547ce0fb8196d2604542 depends: - - __osx >=10.13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 225367 - timestamp: 1729561777213 + size: 236451 + timestamp: 1725670076853 - kind: conda name: aws-c-common - version: 0.9.31 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.31-hb9d3cd8_0.conda - sha256: 31057d023a4ab78996f15dfefa9b2576da3282953623eeba28934c93baf132bc - md5: 75f7776e1c9af78287f055ca34797517 + version: 0.9.28 + build: hd74edd7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.28-hd74edd7_0.conda + sha256: 4081ada22148dc500765aac106ed224829810fd5e5d6f942a842b0a40f53783e + md5: 8dc8711c903ab57ead8ce99b65625a95 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - __osx >=11.0 license: Apache-2.0 license_family: Apache purls: [] - size: 235865 - timestamp: 1729561746720 + size: 220787 + timestamp: 1725670124570 - kind: conda name: aws-c-compression version: 0.2.19 - build: h0da4a7a_4 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-h0da4a7a_4.conda - sha256: 3b7d4ac62a78abd82158702230222e1d4434e78ca6725dd02f1faed03495e7d1 - md5: 21a94ad526aa67b47caf9f63e4bab665 + build: h41dd001_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41dd001_1.conda + sha256: d0a4362beb22aa4da126aab5ddadcb4bbde5032f407d7e4b03969a3d7e5f9cb2 + md5: 98e9d9c62300fd87bee44d2a63792ee5 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 22347 - timestamp: 1729596103202 + size: 17974 + timestamp: 1725830013702 - kind: conda name: aws-c-compression version: 0.2.19 - build: h873bf23_4 - build_number: 4 + build: h57e602e_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h873bf23_4.conda - sha256: 92d00c61c1411355774043366a7d6535a82f2268eb79e1afb51eb1fa46a859e2 - md5: 2d94b8a8db0e9a4f8a7c441399c5a83f + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h57e602e_1.conda + sha256: e53d808421884cf348cadfbf309ef141e96de75a22de98eb11a414a5b47b7519 + md5: bdb086e28843e715ed1963aca21c0e65 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 19651 - timestamp: 1729595706730 + size: 19723 + timestamp: 1725830026095 - kind: conda name: aws-c-compression version: 0.2.19 - build: hcd44f14_4 - build_number: 4 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-hcd44f14_4.conda - sha256: ed376e2ea460e7693049fcaa400b56a872951a1795fca6f99c542683928b6566 - md5: 89ed23aa4824dfb5a13a6ea0738fb90e + build: h756ea98_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda + sha256: 0e7fd40a9f8aa235e78202af75a421a7f6ea589e30c5cbe1787ceaccf36a3ce9 + md5: 5e08c385a1b8a79b52012b74653bbb99 depends: - - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 18024 - timestamp: 1729595669621 + size: 19116 + timestamp: 1725829968483 - kind: conda name: aws-c-compression version: 0.2.19 - build: hf20e7d7_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-hf20e7d7_4.conda - sha256: 48076dd2faa3e7baef0a4e532555ec46c64a0db897d30b1ee505a2c63e70e5e6 - md5: 7035bf89ef7848fbdd1a0df681651dbd + build: h8128ea2_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.19-h8128ea2_1.conda + sha256: f60f8bec5eddd1974367aac03a646996374d8f290bb4463dfbf1e7620462e7be + md5: 43be0637437461d48ff524c04459ee46 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - libgcc >=13 + - __osx >=10.13 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 19070 - timestamp: 1729595656962 + size: 17936 + timestamp: 1725829971987 - kind: conda name: aws-c-compression version: 0.2.19 - build: hfd083d3_4 - build_number: 4 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-hfd083d3_4.conda - sha256: 46635284267648e2b291b73feaac316a9ab2621cfb1ea37190daabb2226f77e9 - md5: 1fbd6d35286563704d3d121be73cc3b2 + build: hf1fc857_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.2.19-hf1fc857_1.conda + sha256: 0e5913b72e730644a9ea8b5ed8d8fbc32d288d202882a9ec089b64a18612dc31 + md5: 289e8943be0dce6b1abf60652bc1492e depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 18190 - timestamp: 1729595822426 + size: 22447 + timestamp: 1725830398597 - kind: conda name: aws-c-event-stream - version: 0.5.0 - build: h33c80d7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h33c80d7_0.conda - sha256: c5318cdaa132e524e59bda10058b97d804758494ba5617a289b1e3dd1c5f434f - md5: fe41af1ea3a037d48c250f6cbdead72b + version: 0.4.3 + build: h29ce20c_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h29ce20c_2.conda + sha256: ac5e04779811b29fc47e06d6bb9ea6436511216ea2871ad6917c3894174c5fa3 + md5: d533baa7e43239591d5cc0233849c475 depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - libcxx >=17 + - libgcc >=13 + - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 47002 - timestamp: 1729717479380 + size: 54116 + timestamp: 1726327201288 - kind: conda name: aws-c-event-stream - version: 0.5.0 - build: h520d0cd_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.0-h520d0cd_0.conda - sha256: e74f305a13a59003e9c15efe727df9b32ce4968315c6d8300ae0fc7b425d3bf2 - md5: 8a93e203b167f82eec27d0f6182cb10c + version: 0.4.3 + build: h40a8fc1_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h40a8fc1_2.conda + sha256: 63c903dc4b708c0054287dbb5411de62067a181886657a515d96c0e6add173c1 + md5: f3d15e195e0b4dc6db749398eb925ffe depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libcxx >=17 license: Apache-2.0 license_family: Apache purls: [] - size: 54570 - timestamp: 1729717519676 + size: 46887 + timestamp: 1726327307175 - kind: conda name: aws-c-event-stream - version: 0.5.0 - build: h72d8268_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h72d8268_0.conda - sha256: 2b7515d53020bde5a8fcd76c0f0b8cbba396f8482fa879f96c8e6ce914b7aa3a - md5: a2d73df9aa3ab6eafc1c8dc0642d532f + version: 0.4.3 + build: h7400eea_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h7400eea_2.conda + sha256: 856a3d17c15cfb005bb85fc4a2dc1f192435a616f8b20c43e4d313b86704ae4f + md5: 00807ac2c0089554c9abc49d131152ae depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 53685 - timestamp: 1729717317804 + size: 55127 + timestamp: 1726327268697 - kind: conda name: aws-c-event-stream - version: 0.5.0 - build: hc6a372a_0 + version: 0.4.3 + build: hcd1ed9e_2 + build_number: 2 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-hc6a372a_0.conda - sha256: 024be07944bd95653587f4792983aed091b9049f052b8d3bce59ea2b81de61ca - md5: 346ff61aaf45d01e05c65574acaf4e30 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.3-hcd1ed9e_2.conda + sha256: f717b5d9baa8206d7069f80cd2f5a2cd99747b3f1e3aed4bea7e392846979d9b + md5: 73bde3fabf8b8f6f2be9cc6f152d0606 depends: - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - libcxx >=17 license: Apache-2.0 license_family: Apache purls: [] - size: 46337 - timestamp: 1729717399460 + size: 46699 + timestamp: 1726327279325 - kind: conda name: aws-c-event-stream - version: 0.5.0 - build: hda43438_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hda43438_0.conda - sha256: cb7d73ec60c2150f5454935e63a7a04a2644eb4f82005170116e6c6630d9537a - md5: 858f8a99aa4170852f7a7df3d3ac73c7 + version: 0.4.3 + build: hd0ca3c1_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.4.3-hd0ca3c1_2.conda + sha256: be7815f98f210acc1e6cbac1d9a0cb05d6f91fe53c2dd62cab585c4da66359e3 + md5: 93704218ce07e4d961299e170ed430b6 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - libgcc >=13 - - libstdcxx >=13 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 55176 - timestamp: 1729717374432 + size: 54331 + timestamp: 1726327493766 - kind: conda name: aws-c-http version: 0.8.10 - build: h178a047_5 - build_number: 5 + build: h2f86973_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h178a047_5.conda - sha256: b157d72cf1c2ad12309b5f29687030debf0112a505a5113c073b4bc7f69f8909 - md5: 520952e95a8f521c364c3b905012095e + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.10-h2f86973_0.conda + sha256: dae6a6be9a6fc1c2d6318c62d2b89e20fe75d8df5a4b7766b95be788cfb9516c + md5: 4160f0e92d2f25532ee52b625556e488 depends: - __osx >=10.13 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-compression >=0.2.19,<0.2.20.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 163907 - timestamp: 1729624758788 + size: 164396 + timestamp: 1726469195066 - kind: conda name: aws-c-http version: 0.8.10 - build: h2b94654_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-h2b94654_5.conda - sha256: 15eaf8d3617084cac273e00844a092d2797653ce01e5097b1b588ca6afeed585 - md5: e52b9db099b8689dbdca42865edb1677 + build: h5e77a74_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h5e77a74_0.conda + sha256: 887af55b895502ef7611ad0dd5e19990385b05348262d6c5a8a22330490b14e7 + md5: 947cd303444ea92a382a10e43bad1a3f depends: + - __glibc >=2.17,<3.0.a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-compression >=0.2.19,<0.2.20.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - aws-c-io >=0.14.18,<0.14.19.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 182149 - timestamp: 1729625062064 + size: 197233 + timestamp: 1726469181157 - kind: conda name: aws-c-http version: 0.8.10 - build: h4a91a90_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-h4a91a90_5.conda - sha256: 5a6a382998e3f7f91a909d5c0d5faed19ed2b05a8f7334b6dfabcc1b0f72aaec - md5: 8508d0f9a832dba72601771fb1bff339 + build: hc7031c7_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-hc7031c7_0.conda + sha256: a3d3c1bc042c07a832e8b405f882670a09ae1cb00cc69cea6829a0d5d5d05624 + md5: 0c4d2f3bd8431f41e8fbd80c4ef09a23 depends: - - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-compression >=0.2.19,<0.2.20.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 152140 - timestamp: 1729624809388 + size: 190600 + timestamp: 1726469206238 - kind: conda name: aws-c-http version: 0.8.10 - build: h6bb76cc_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.10-h6bb76cc_5.conda - sha256: 16b2b1c1498c0b1a2143b418e18ec4ccd40e776837f8a176c351aada48b818b5 - md5: 243b3e5ef92b277b04b1490213c21ca7 + build: heca9ddf_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.8.10-heca9ddf_0.conda + sha256: 2d474df981675d8d4bef7b22485c76cbf05df6b65bb2ea3f07363ebc0f6ed34c + md5: efd3dc45770f91dcd4f3a82f50cbea53 depends: - - __glibc >=2.17,<3.0.a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-compression >=0.2.19,<0.2.20.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - libgcc >=13 + - aws-c-io >=0.14.18,<0.14.19.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 197365 - timestamp: 1729624546275 + size: 182262 + timestamp: 1726469702580 - kind: conda name: aws-c-http version: 0.8.10 - build: h7e30ece_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.10-h7e30ece_5.conda - sha256: 4723d89badd84bb4148b02b0e51dd898fec37a8b6a3dd1410bf848ed540a0d91 - md5: 31024d83c9598fae229e3b6a15dbc0bc + build: hf5a2c8c_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.10-hf5a2c8c_0.conda + sha256: dfdec013bf7c2e87c49bc61a4cb8b1e3b8bf21e7f592326e958f0bf224de21b7 + md5: e4ba8aa0fb7dac95b0ea398a3229bf56 depends: + - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-compression >=0.2.19,<0.2.20.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - libgcc >=13 + - aws-c-io >=0.14.18,<0.14.19.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 189698 - timestamp: 1729624619875 + size: 152450 + timestamp: 1726469199710 - kind: conda name: aws-c-io - version: 0.14.20 - build: h389d861_2 - build_number: 2 + version: 0.14.18 + build: h2af50b2_12 + build_number: 12 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.20-h389d861_2.conda - sha256: 1f345fac0112b1a7b34a3c9f7c4952c28080ef793ca188d3a10694091f112c53 - md5: 79adfaf8508472f5fbffe6df841d3d8c + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda + sha256: ca10865b8e5d16ea9f9ebc14833ef49bc30eed194233539794db887def925390 + md5: 700f1883f5a0a28c30fd98c43d4d946f depends: - __glibc >=2.17,<3.0.a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 - s2n >=1.5.5,<1.5.6.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 159514 - timestamp: 1729608940267 + size: 158169 + timestamp: 1728562824182 - kind: conda name: aws-c-io - version: 0.14.20 - build: h5fdde16_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.20-h5fdde16_2.conda - sha256: a7dbeccb720b1afcad782c6f987cb73d3330d0e132f09b0f6b2742d6e80cd68c - md5: 9126fa7621e270452608acd95e21c263 + version: 0.14.18 + build: h3831a8d_12 + build_number: 12 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.18-h3831a8d_12.conda + sha256: 26778c5dd0f4bd4e2cfafbfc7920a1289461ba98608ca4b400f87a05e77e2de8 + md5: 360c63cdf64d7bbd99196eb23d753908 depends: - - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 137534 - timestamp: 1729608966952 + size: 161275 + timestamp: 1728563406574 - kind: conda name: aws-c-io - version: 0.14.20 - build: ha5d48a9_2 - build_number: 2 + version: 0.14.18 + build: ha95386c_12 + build_number: 12 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.20-ha5d48a9_2.conda - sha256: e6af4930e8744bb7cabc935f1e8fac52892f43893994bcb26198e53dff895eb4 - md5: f14d6a243cb0e8ab1b26ae98a77306f1 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-ha95386c_12.conda + sha256: 25217538d892e81be349606ab9b0e78e78834eaa237a8400817231a7723d7f5d + md5: 8f4368fdc4213e3aaa107ede5c3d52bc depends: - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 - s2n >=1.5.5,<1.5.6.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 162744 - timestamp: 1729608956659 + size: 162191 + timestamp: 1728562854595 - kind: conda name: aws-c-io - version: 0.14.20 - build: he6ac336_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.14.20-he6ac336_2.conda - sha256: 0196f3af94e2f8b877bc17a57fcd8e5c5d71b2b0a36d72d4d912b5144d1e096d - md5: 82e070f9e1fa14390ae8697311278e56 + version: 0.14.18 + build: hc3cb426_12 + build_number: 12 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-hc3cb426_12.conda + sha256: 59c510b61aad4da05f17756d84e3b138c51a5f27a8466021587504368818f159 + md5: efdd67503fa663c31d51b399c8f4cc2e depends: + - __osx >=11.0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 160844 - timestamp: 1729609288045 + size: 137133 + timestamp: 1728562901503 - kind: conda name: aws-c-io - version: 0.14.20 - build: hf3ab461_2 - build_number: 2 + version: 0.14.18 + build: hf9a0f1c_12 + build_number: 12 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.20-hf3ab461_2.conda - sha256: 44183b8d13d375576a92c19ce7a6afa9679a1fcd4fd8940b8d64a0c7211971bf - md5: 8e4b86914bdb16e98fa450834d39853e + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.18-hf9a0f1c_12.conda + sha256: 6daa592fdf623633ab4bd94394d45552bfdc9041bca6af0394a7fb9af6213c14 + md5: 19876b415ede498ca2003ddc304fe2b2 depends: - __osx >=10.13 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 138364 - timestamp: 1729609130189 + size: 138604 + timestamp: 1728562840477 - kind: conda name: aws-c-mqtt version: 0.10.7 - build: h0593d42_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-h0593d42_5.conda - sha256: b76fa96452f8e669f71b71f60e46aa6ae913562d1eb79a3a1aa338edf691989d - md5: 86b42bf2862add79eacb1ab0d653e529 + build: h02abb05_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-h02abb05_0.conda + sha256: dfc23a658ee659b0bf86545bd76d14710bfb6fb1457824b85e49a0e99b0aaea9 + md5: b442b985952afe5820da96bb976ee006 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 169281 - timestamp: 1729645558747 -- kind: conda - name: aws-c-mqtt - version: 0.10.7 - build: h5d974fa_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-h5d974fa_5.conda - sha256: 6420fc5152fc9c2391e6a45c955c8b9bc1ce617b2448015b270d43ce535f3e55 - md5: b5067f12aac99f6d25521621d0adbad5 - depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 187007 - timestamp: 1729646194268 + size: 195051 + timestamp: 1728339436377 - kind: conda name: aws-c-mqtt version: 0.10.7 - build: had056f2_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.7-had056f2_5.conda - sha256: d2e6e45502253646f9f78e2ac034ff15bc4fd7ae5898707f24f91c3039c8ceda - md5: 575798408145288d75bf0fd36bed5aa1 + build: h3acc7b9_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-h3acc7b9_0.conda + sha256: ffb9600b4fa37dbee242eb300b22757b092943a82b56b9c0e3940ff3a0358809 + md5: 832123f8f88fc311b0eb86b06890aff4 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - libgcc >=13 + - aws-c-io >=0.14.18,<0.14.19.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 194676 - timestamp: 1729646037940 + size: 135178 + timestamp: 1728339026350 - kind: conda name: aws-c-mqtt version: 0.10.7 - build: hd7707a0_5 - build_number: 5 + build: h9d7d61c_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-hd7707a0_5.conda - sha256: a3a81213008f45180b6d8eaf02c791fec2e502970041b7fdf9f2ef72e55e540f - md5: 35855832822da1f8e79286a7608dfb0f + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.7-h9d7d61c_0.conda + sha256: e17efadc9db5b4397f1a2ce8714bf60a2c5269764dd95000c2a2c97f28e663eb + md5: cfa8c785abedd8caaf6a58703d215c44 depends: - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 164602 - timestamp: 1729646080323 + size: 163926 + timestamp: 1728339489746 - kind: conda name: aws-c-mqtt version: 0.10.7 - build: hd821a15_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.7-hd821a15_5.conda - sha256: a9ba03c5f143d0d792261c9b0c2cc500b49e7b617164e090ddcbf5974a0c617a - md5: 8cd5a4acf5aa0d20d30781faaf74d7ad + build: hd84f86a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.7-hd84f86a_0.conda + sha256: 397207662449a86c56e3d5384a721f55ea335bf0f8ba02808624d7ef437b29fa + md5: 74b3548bf578a004251658acadae463c depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 135540 - timestamp: 1729645603895 + size: 169550 + timestamp: 1728339074997 - kind: conda - name: aws-c-s3 - version: 0.7.0 - build: h6498dec_0 + name: aws-c-mqtt + version: 0.10.7 + build: hf27581b_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.7.0-h6498dec_0.conda - sha256: 180a0b1f1c023e332da9aeff754efa711199e45a8c6671b7a2270cb823e4d82c - md5: 95022b5de4c50e58072d9d4126eca293 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.10.7-hf27581b_0.conda + sha256: 7ba0d682b81f8fdd5b66edf251026a5bfed3b2c51b6d53dbdb5d93985fe451c1 + md5: 7c1bb68151f9b81e1369bbcaa05a574e depends: - - aws-c-auth >=0.7.31,<0.7.32.0a0 - - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 - - aws-checksums >=0.1.20,<0.1.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 108908 - timestamp: 1729717587948 + size: 186759 + timestamp: 1728340065107 - kind: conda name: aws-c-s3 - version: 0.7.0 - build: h797294b_0 + version: 0.6.6 + build: h2c5aa70_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.0-h797294b_0.conda - sha256: d182a4176f0521593a1edd2235c813147fb8f1ae73ba1738f3942ffa9362b1cb - md5: fa0e4a87bbf336a244fc2c1a59445eff + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.6-h2c5aa70_0.conda + sha256: 4fce09204795c6ba2854a0d65d3fdec99db53a8f26eda7d591aba5b8fc7856b4 + md5: 76822baabf944aa5f8997019206a3c29 depends: - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - libgcc >=13 - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 117118 - timestamp: 1729717204122 + size: 116941 + timestamp: 1726722547878 - kind: conda name: aws-c-s3 - version: 0.7.0 - build: hbfd7bd6_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.0-hbfd7bd6_0.conda - sha256: a760c446e2b5e035a8430636d547713b667949f8cb48760c9260f5fd097eb1be - md5: a1c1ee79043f9c3632b9de50f5fd9825 + version: 0.6.6 + build: h56e9fbd_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.6.6-h56e9fbd_0.conda + sha256: 15c45a36c07cdbfbb5ec393e6b6d10d15a87df7d2dd87db9fa594b13a3359987 + md5: 0b301304eebf6697381350eb096bd1a5 depends: - - __osx >=10.13 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 98045 - timestamp: 1729717229908 + size: 108140 + timestamp: 1726722849474 - kind: conda name: aws-c-s3 - version: 0.7.0 - build: hc6bcb7c_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.0-hc6bcb7c_0.conda - sha256: a77487a570970d35b63268808e283ff64e4482b3a2a6c641ba0a11dd2a189093 - md5: 1334e8b8532d5b462eba6bfc1cca59a7 + version: 0.6.6 + build: h834ce55_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.6-h834ce55_0.conda + sha256: b5e921f2bca092eec7355e296292f84a3db6e37802be61c56bf865edc4246532 + md5: dbf33f245023697941d4ff6b996d2b2c depends: - - __osx >=11.0 + - __glibc >=2.17,<3.0.a0 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 96959 - timestamp: 1729717328952 + size: 112595 + timestamp: 1726722460857 - kind: conda name: aws-c-s3 - version: 0.7.0 - build: hc85afc5_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.0-hc85afc5_0.conda - sha256: 4cb865c093e33e5463bccdca1ee0e986d5467507f7e3353076960124e3d19a4c - md5: 7824d1b3e9570ab637f4baf0144cdeaf + version: 0.6.6 + build: hd01826e_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.6.6-hd01826e_0.conda + sha256: 24794cfcaf9d6da28192dda88449dad1e112408a96c51e5a0df6a1925c4e8a57 + md5: 7fa9af757e8376f738eb314518ec282b depends: - - __glibc >=2.17,<3.0.a0 + - __osx >=10.13 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - libgcc >=13 - - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 114367 - timestamp: 1729717110736 + size: 97414 + timestamp: 1726722505830 - kind: conda - name: aws-c-sdkutils - version: 0.1.19 - build: h0da4a7a_6 - build_number: 6 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-h0da4a7a_6.conda - sha256: 57bf5d6bb5222b7ae5ad2e93c907897896e61d7b86d6cd6c50b3a9f6fed78196 - md5: 0f10a7213c60389f950cc629f81b8976 + name: aws-c-s3 + version: 0.6.6 + build: hd16c091_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.6-hd16c091_0.conda + sha256: 0b3e2a1e4189faea5edaeb480d9ddcf6878efdc06f66ba6910dee4b4fb386b43 + md5: a4406babaa217f4d965c6cc52ef6520f depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=11.0 + - aws-c-auth >=0.7.31,<0.7.32.0a0 + - aws-c-cal >=0.7.4,<0.7.5.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-http >=0.8.10,<0.8.11.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 + - aws-checksums >=0.1.20,<0.1.21.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 55034 - timestamp: 1729602627714 + size: 96383 + timestamp: 1726722491079 - kind: conda name: aws-c-sdkutils version: 0.1.19 - build: h873bf23_6 - build_number: 6 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h873bf23_6.conda - sha256: 3ac75da08cbe15623c80e97c8b0ddea58579cdb56027765e8c151d15be850558 - md5: cf6ec389a16a3664765f7fa6f105c44b + build: h41dd001_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h41dd001_3.conda + sha256: b320a08973f22468fd816bb957947369381913ae045d33bd872d03ebabaa355f + md5: 53bd7f3e6723288f531387a892d01635 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - libgcc >=13 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 58547 - timestamp: 1729602522883 + size: 49674 + timestamp: 1725836815498 - kind: conda name: aws-c-sdkutils version: 0.1.19 - build: hcd44f14_6 - build_number: 6 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-hcd44f14_6.conda - sha256: d8ddf6ef50ea2e08647f683822f1e6e7456d08399b77cc22c556cd93f531090a - md5: 7c9a1ae36913e9fd0f2789435a76d1e3 + build: h57e602e_3 + build_number: 3 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-h57e602e_3.conda + sha256: 1a6ed79cbc500349224a460f9aa95e2ffe2668d40e2c49977230c136f6ac38a7 + md5: fafe9243d41fb1269e0eead92b487969 depends: - - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 50844 - timestamp: 1729602671430 + size: 58151 + timestamp: 1725836785874 - kind: conda name: aws-c-sdkutils version: 0.1.19 - build: hf20e7d7_6 - build_number: 6 + build: h756ea98_3 + build_number: 3 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-hf20e7d7_6.conda - sha256: d09020368d88fe8db7c6d7f61c79bc729f3fb0993b1eba9665e9775152c30369 - md5: e5885a040165a8775ea8558058b87555 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda + sha256: 4e6f79f3fee5ebb4fb12b6258d91315ed0f7a2ac16c75611cffdbaa0d54badb2 + md5: bfe6623096906d2502c78ccdbfc3bc7a depends: - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 55815 - timestamp: 1729602473258 + size: 55799 + timestamp: 1725836731034 - kind: conda name: aws-c-sdkutils version: 0.1.19 - build: hfd083d3_6 - build_number: 6 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-hfd083d3_6.conda - sha256: dac95362fca87b19bdfd13c48266a22d39fee2192a759868a0736d6b29e855e5 - md5: b00b00335e3c5ea91acb2619ecc5d9ce + build: h8128ea2_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.19-h8128ea2_3.conda + sha256: 50912641279d00a6ce12b1d72e74ea5d30078e91a0557a48a9e9fe285c2f6b2c + md5: 8d93b3603363214303737f74b6efb5da depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __osx >=10.13 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 49775 - timestamp: 1729602625619 + size: 50686 + timestamp: 1725836776385 - kind: conda - name: aws-checksums - version: 0.1.20 - build: h0da4a7a_3 + name: aws-c-sdkutils + version: 0.1.19 + build: hf1fc857_3 build_number: 3 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-h0da4a7a_3.conda - sha256: 7f432fc5e95bbf8bda6e27beaf114b17e1f1bacf43f1dd4075cdf192f6eaa32b - md5: c0888566951528bbcc1d2180cb9e3341 + url: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.1.19-hf1fc857_3.conda + sha256: 5e42bba0f1ffd1a1cc5b80f5abae03c7118809f4545c688e56c2bb5a0ee3740e + md5: b00e5b1b3985d9dfadde29e8b00f85e4 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 75467 - timestamp: 1729602743839 + size: 55242 + timestamp: 1725837225397 - kind: conda name: aws-checksums version: 0.1.20 - build: h873bf23_3 - build_number: 3 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h873bf23_3.conda - sha256: ab2c0515b7c75f3b43a9a3bcca1a8b82d8f654418132d52024d86f9d6df9096d - md5: d8d67c456a563758a522a1c49baff29b + build: h41dd001_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-h41dd001_0.conda + sha256: 23c99722a3b3fac35d78c70731d333e85332e86a0ffce8bf48a9223478d5ffea + md5: 7ba57aa81224959beb6235f46bd05338 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - libgcc >=13 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 72585 - timestamp: 1729602546174 + size: 69868 + timestamp: 1726282042057 - kind: conda name: aws-checksums version: 0.1.20 - build: hcd44f14_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-hcd44f14_3.conda - sha256: bccec210d6509e4b67957256c16a071ab8136b275977cf493e8d08495a199363 - md5: 0dbb60ca810b3f409bdc50a92dd84af1 + build: h57e602e_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.20-h57e602e_0.conda + sha256: 15c2b71f4c0d6b2c0dde9a3789e17a2d020d9391dbb62d2923d66a085abb0919 + md5: 2e8b832bdd43bf49c77be0794543ec5b depends: - - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 70844 - timestamp: 1729602569230 + size: 72398 + timestamp: 1726281978877 - kind: conda name: aws-checksums version: 0.1.20 - build: hf20e7d7_3 - build_number: 3 + build: h756ea98_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-hf20e7d7_3.conda - sha256: 7bfd6394646231b0e967e6de27f0cb03587883256e512a22b98fa8203915f0d5 - md5: 8b9d7eb23651b31d4db8b50236be9d25 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.20-h756ea98_0.conda + sha256: 4b4543b0ca5528b6ca421f97394d7781a1d7d78b17ac3990d0fbe6a49159a407 + md5: ff7dbb319545f4bd1e5e0f8555cf9e7f depends: - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 72880 - timestamp: 1729602448721 + size: 72784 + timestamp: 1726281973900 - kind: conda name: aws-checksums version: 0.1.20 - build: hfd083d3_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.20-hfd083d3_3.conda - sha256: 776aaf074ca90d0b9b8f73f4c402ce580a6b30261fdc7a143aca7deb3ca474d3 - md5: cd06e766af6df7063db6cb0ad6bb590b + build: h8128ea2_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.20-h8128ea2_0.conda + sha256: 1953103f0ead6ffbcb73ddbcec617ce9195010fea838f63b5e8e93b8d4bf4bcb + md5: 1fbab35b839a3d822f1b39680298fd9f depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 + - __osx >=10.13 + - aws-c-common >=0.9.28,<0.9.29.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 70091 - timestamp: 1729602726939 + size: 70818 + timestamp: 1726281979944 +- kind: conda + name: aws-checksums + version: 0.1.20 + build: hf1fc857_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.1.20-hf1fc857_0.conda + sha256: 446710cc7d12beddfe11bfd50a5d2a8f2418b66fb3a0a92a1a9031e041b101e9 + md5: 1b66a8719c94d85fa6658d8f46600f21 + depends: + - aws-c-common >=0.9.28,<0.9.29.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 75478 + timestamp: 1726282558694 - kind: conda name: aws-crt-cpp - version: 0.28.5 - build: h07ed512_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.5-h07ed512_4.conda - sha256: 7aee5aff5113e9cc39f73db8f5bc3a8ea940fec63118c4d0f5b974e662683199 - md5: 599dfb75e4f1f8d58b26954247dbf2ef + version: 0.28.3 + build: h26f7782_6 + build_number: 6 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.3-h26f7782_6.conda + sha256: d17c6a79a872d622656a8d6b54573d230030ef808fc5da2d3bbe5e60518d1c3c + md5: d59a961de1c3039c98f23e8f7532b31a depends: - - __glibc >=2.17,<3.0.a0 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-mqtt >=0.10.7,<0.10.8.0a0 - - aws-c-s3 >=0.7.0,<0.7.1.0a0 + - aws-c-s3 >=0.6.6,<0.6.7.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - libgcc >=13 - - libstdcxx >=13 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 349173 - timestamp: 1729768063215 + size: 255207 + timestamp: 1728390584945 - kind: conda name: aws-crt-cpp - version: 0.28.5 - build: h1553937_4 - build_number: 4 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.5-h1553937_4.conda - sha256: c3997326e084a816d51a3626eca2cacb7a997db6a10fb0f6f893f0699aa8d5de - md5: f77a39416fb0c447a7bf2190eaf172ca + version: 0.28.3 + build: h3e6eb3e_6 + build_number: 6 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.3-h3e6eb3e_6.conda + sha256: bf85c7ad2875771d29db7f65a346b1937fc6b4c7f44283b159e6f00c2dac7a2c + md5: a12a25457b517277e15228889e568daa depends: + - __glibc >=2.17,<3.0.a0 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-mqtt >=0.10.7,<0.10.8.0a0 - - aws-c-s3 >=0.7.0,<0.7.1.0a0 + - aws-c-s3 >=0.6.6,<0.6.7.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 276126 - timestamp: 1729768141428 + size: 349909 + timestamp: 1728389760881 - kind: conda name: aws-crt-cpp - version: 0.28.5 - build: h45f4ed5_4 - build_number: 4 + version: 0.28.3 + build: h433f80b_6 + build_number: 6 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.5-h45f4ed5_4.conda - sha256: e39272edf4953e144f34d96b13304d9bfa5b11caa1786013be890f4d840a2bf1 - md5: 14dd03d535c0ce2dac4838b0956754d9 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.3-h433f80b_6.conda + sha256: 88f08fae202172df62b0ffc370deb464098d9a4aff63039d71189421750455de + md5: e410ea6979eb3a603eb778cb4ba4ee19 depends: - __osx >=11.0 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-mqtt >=0.10.7,<0.10.8.0a0 - - aws-c-s3 >=0.7.0,<0.7.1.0a0 + - aws-c-s3 >=0.6.6,<0.6.7.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - libcxx >=17 license: Apache-2.0 license_family: Apache purls: [] - size: 230974 - timestamp: 1729768323972 + size: 230317 + timestamp: 1728389837618 - kind: conda name: aws-crt-cpp - version: 0.28.5 - build: ha8842e2_4 - build_number: 4 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.5-ha8842e2_4.conda - sha256: f889442ecce039acbbb2634f756730019adb57f07d5a310d3638c5f57d630139 - md5: 4ec556b3d8c92074eca2a30696ee20d2 + version: 0.28.3 + build: hd6bf246_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.3-hd6bf246_6.conda + sha256: dfd6176cfe2b560fb0c1d6ce7d49bf1098880abad6c945e5f34104126435359c + md5: 16437b2947680b34bb5984dd3bea2798 depends: - - __osx >=10.13 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-mqtt >=0.10.7,<0.10.8.0a0 - - aws-c-s3 >=0.7.0,<0.7.1.0a0 + - aws-c-s3 >=0.6.6,<0.6.7.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - libcxx >=17 + - libgcc >=13 + - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 294594 - timestamp: 1729768295600 + size: 276050 + timestamp: 1728389810592 - kind: conda name: aws-crt-cpp - version: 0.28.5 - build: hb4a7b61_4 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.28.5-hb4a7b61_4.conda - sha256: e292ae91ee6293358b2ebed5764d50e0948cd6a10ad9a97f1b2188e38934d2c3 - md5: 0f6e668c39267fed7f8ccb3233a95f4c + version: 0.28.3 + build: hef75ebe_6 + build_number: 6 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.28.3-hef75ebe_6.conda + sha256: 540af6454373d89636012578c1d35cffb6fcf997ebb242773f975c13cea3d0f8 + md5: 831c884adc08e9cb33671f5ae024da65 depends: + - __osx >=10.13 - aws-c-auth >=0.7.31,<0.7.32.0a0 - aws-c-cal >=0.7.4,<0.7.5.0a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-c-http >=0.8.10,<0.8.11.0a0 - - aws-c-io >=0.14.20,<0.14.21.0a0 + - aws-c-io >=0.14.18,<0.14.19.0a0 - aws-c-mqtt >=0.10.7,<0.10.8.0a0 - - aws-c-s3 >=0.7.0,<0.7.1.0a0 + - aws-c-s3 >=0.6.6,<0.6.7.0a0 - aws-c-sdkutils >=0.1.19,<0.1.20.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libcxx >=17 license: Apache-2.0 license_family: Apache purls: [] - size: 255099 - timestamp: 1729768298860 + size: 294267 + timestamp: 1728389843579 - kind: conda name: aws-sdk-cpp version: 1.11.407 - build: h10bd7ed_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h10bd7ed_5.conda - sha256: 0fecc518b464598f9b4d08d31aab24e4e1aa20fd46166ea35bbff0837b4ecb1d - md5: 64912d3237f2fa6f5ab9c75c0d954442 + build: h0455a66_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h0455a66_0.conda + sha256: a753df57869eb6814113fe4ae71b99965acf4f2fafc9237067ba84bb18b39933 + md5: e189085758424fa0222292c98decb68f depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - __osx >=11.0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 - - libcurl >=8.10.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 + - libcurl >=8.10.0,<9.0a0 + - libcxx >=17 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 2924343 - timestamp: 1729797948037 + size: 2704289 + timestamp: 1726638328407 - kind: conda name: aws-sdk-cpp version: 1.11.407 - build: h20e73ff_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.407-h20e73ff_5.conda - sha256: 0fa55ba495dcc44a58aec2d2c7cb0d2e8d061793103b52e96c52586f9e4040ae - md5: eb63cedff9bbda05b428ec6f22224e3a + build: h21cfba4_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-h21cfba4_0.conda + sha256: 4fd78167257c14d14a8317268ff6ce1918cd7fad762bcef41f3e9d9a04390b8a + md5: e33acabffcda4c2bf7e22b48528e4cec depends: - - __osx >=11.0 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 - - libcurl >=8.10.1,<9.0a0 - - libcxx >=17 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 + - libcurl >=8.10.0,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 2717239 - timestamp: 1729798335994 + size: 2775644 + timestamp: 1726638192741 - kind: conda name: aws-sdk-cpp version: 1.11.407 - build: h34e0e79_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h34e0e79_5.conda - sha256: 833275057cd449db83c4b8a84dce414b786faee37e09572189354af6e6492f3a - md5: 77e2d2f491dd3e9d7fdeeb64b97808ae + build: h25dd3c2_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h25dd3c2_0.conda + sha256: 46337ac3bb24a6f8addeef0b642013989cf7efa2de5c1e12e2d7f62c5137549c + md5: b2d39f93aa57382367d6cacd55ec4f32 depends: - - __osx >=10.13 - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 - - libcurl >=8.10.1,<9.0a0 - - libcxx >=17 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 2776534 - timestamp: 1729798786577 + size: 2805201 + timestamp: 1726639233904 - kind: conda name: aws-sdk-cpp version: 1.11.407 - build: h3ff2763_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.407-h3ff2763_5.conda - sha256: 23e7ac4f8c0c105127a3c74c7218e28bde6b62641928817c31582d8df39fedb6 - md5: 0ebe66a0c39fdb42c5b707216e8c1132 + build: h2e282c2_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.407-h2e282c2_0.conda + sha256: c6a88e7882325c56e1f25252a5529bd24650207ab44cb31e976daa9b5d8b1914 + md5: 16c5992e1c374f160128336cdf64e171 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - __osx >=10.13 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 + - libcurl >=8.10.0,<9.0a0 + - libcxx >=17 - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 2810479 - timestamp: 1729798748369 + size: 2787167 + timestamp: 1726638546148 - kind: conda name: aws-sdk-cpp version: 1.11.407 - build: hebb6289_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.407-hebb6289_5.conda - sha256: 5e50b72c02168e0cefb5c73fba60dd7a116a0c3c6331b52ae9c52d7a217d3fa5 - md5: 8ef74068c45ec33d15cf7fb2ac7e63da + build: h9f1560d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.407-h9f1560d_0.conda + sha256: bc250a3879b88c13e91fc03abdca3867c5a0dd7767da5f364d4460f74d64f286 + md5: 5c3dd49b04db05e0e884de48ff77ae24 depends: - - aws-c-common >=0.9.31,<0.9.32.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.9.28,<0.9.29.0a0 + - aws-c-event-stream >=0.4.3,<0.4.4.0a0 - aws-checksums >=0.1.20,<0.1.21.0a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 - - libcurl >=8.10.1,<9.0a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 + - libcurl >=8.10.0,<9.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 @@ -14484,8 +14464,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 2778209 - timestamp: 1729797947286 + size: 2935773 + timestamp: 1726638167995 - kind: pypi name: babel version: 2.16.0 @@ -14624,101 +14604,101 @@ packages: - kind: conda name: binutils version: '2.43' - build: h4852527_2 - build_number: 2 + build: h4852527_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_2.conda - sha256: 92be0f8ccd501ceeb3c782e2182e6ea04dca46799038176de40a57bca45512c5 - md5: 348619f90eee04901f4a70615efff35b + url: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_1.conda + sha256: 6bfdaf76798bc3e3dec18da1f80c602ad9f87fbf4ed7b6873670e80931819878 + md5: 900e000d42b28bf0ac35b9451ec92bd9 depends: - binutils_impl_linux-64 >=2.43,<2.44.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 33876 - timestamp: 1729655402186 + size: 34178 + timestamp: 1727304728246 - kind: conda name: binutils version: '2.43' - build: hf1166c9_2 - build_number: 2 + build: hf1166c9_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_2.conda - sha256: 50962dd8b4de41c9dcd2d19f37683aff1a7c3fc01e6b1617dd250940f2b83055 - md5: 4afcab775fe2288fce420514cd92ae37 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.43-hf1166c9_1.conda + sha256: 4b009fa25d55944241283013e7a72caff3c5bffd5972b79214130b416464c919 + md5: 0b5c03e92f115f3c18f7dcf2c05bee84 depends: - binutils_impl_linux-aarch64 >=2.43,<2.44.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 33870 - timestamp: 1729655405026 + size: 34134 + timestamp: 1727304731894 - kind: conda name: binutils_impl_linux-64 version: '2.43' - build: h4bf12b8_2 - build_number: 2 + build: h4bf12b8_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - sha256: 267e78990247369b13234bda270f31beb56a600b4851a8244e31dd9ad85b3b17 - md5: cf0c5521ac2a20dfa6c662a4009eeef6 + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda + sha256: 6f945b3b150112c7c6e4783e6c3132410a7b226f2a8965adfd23895318151d46 + md5: 5f354010f194e85dc681dec92405ef9e depends: - - ld_impl_linux-64 2.43 h712a8e2_2 + - ld_impl_linux-64 2.43 h712a8e2_1 - sysroot_linux-64 license: GPL-3.0-only license_family: GPL purls: [] - size: 5682777 - timestamp: 1729655371045 + size: 6233238 + timestamp: 1727304698672 - kind: conda name: binutils_impl_linux-aarch64 version: '2.43' - build: h4c662bb_2 - build_number: 2 + build: h4c662bb_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_2.conda - sha256: 0bb8058bdb662e085f844f803a98e89314268c3e7aa79d495529992a8f41ecf1 - md5: 2eb09e329ee7030a4cab0269eeea97d4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.43-h4c662bb_1.conda + sha256: 5824b8efc40d5e82c2be43ba9c55b0553c4247fed24026347ea8a1cc521e690c + md5: 287e644c5caafa24b8b19e746b6222df depends: - - ld_impl_linux-aarch64 2.43 h80caac9_2 + - ld_impl_linux-aarch64 2.43 h80caac9_1 - sysroot_linux-aarch64 license: GPL-3.0-only license_family: GPL purls: [] - size: 6722685 - timestamp: 1729655379343 + size: 6463551 + timestamp: 1727304702848 - kind: conda name: binutils_linux-64 version: '2.43' - build: h4852527_2 - build_number: 2 + build: h4852527_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda - sha256: df52bd8b8b2a20a0c529d9ad08aaf66093ac318aa8a33d270f18274341a77062 - md5: 18aba879ddf1f8f28145ca6fcb873d8c + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_1.conda + sha256: 16739398bff4d77e151e037f4c2932ad2a3ed57bb92396d50c33d3c395ad8e22 + md5: 8d70caec6e4c8754066ea278f0a282dd depends: - - binutils_impl_linux-64 2.43 h4bf12b8_2 + - binutils_impl_linux-64 2.43 h4bf12b8_1 license: GPL-3.0-only license_family: GPL purls: [] - size: 34945 - timestamp: 1729655404893 + size: 34906 + timestamp: 1727304732860 - kind: conda name: binutils_linux-aarch64 version: '2.43' - build: hf1166c9_2 - build_number: 2 + build: hf1166c9_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_2.conda - sha256: 97fe7c2023fdbef453a2a05d53d81037a7e18c4b3946dd68a7ea122747e7d1fa - md5: 5c308468fe391f32dc3bb57a4b4622aa + url: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.43-hf1166c9_1.conda + sha256: 89b224e61b341cd182b90a83379e3e6dd98bf1ef7c9eed52dbeb04ad35cc3a87 + md5: 7b77397fb65e894dc248733020e0d0a5 depends: - - binutils_impl_linux-aarch64 2.43 h4c662bb_2 + - binutils_impl_linux-aarch64 2.43 h4c662bb_1 license: GPL-3.0-only license_family: GPL purls: [] - size: 34879 - timestamp: 1729655407691 + size: 35030 + timestamp: 1727304736343 - kind: pypi name: black version: 24.10.0 @@ -18365,12 +18345,13 @@ packages: requires_python: '>=3.6' - kind: conda name: frozenlist - version: 1.5.0 - build: py311h1314207_0 + version: 1.4.1 + build: py311h3336109_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.5.0-py311h1314207_0.conda - sha256: 36e430566ea33d33d4b6092e74b75a52d40bc15ea53534f3fad4f3fb971cf021 - md5: 00c859c1395300f2679bc81e055f3dae + url: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py311h3336109_1.conda + sha256: a0e874185da4b85250b5416f0c63d40de72f1a7c4f7ebe864eeb298b691d46a5 + md5: 76713e20ff1f712ab6c6ef122fd4e2d9 depends: - __osx >=10.13 - python >=3.11,<3.12.0a0 @@ -18379,56 +18360,59 @@ packages: license_family: APACHE purls: - pkg:pypi/frozenlist?source=hash-mapping - size: 53479 - timestamp: 1729699615503 + size: 52909 + timestamp: 1725395958538 - kind: conda name: frozenlist - version: 1.5.0 - build: py311h9ecbd09_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda - sha256: 5bde4e41dd1bdf42488f1b86039f38914e87f4a6b46c15224c217651f964de8b - md5: 75424a18fb275a18b288c099b869c3bc + version: 1.4.1 + build: py311h460d6c5_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.4.1-py311h460d6c5_1.conda + sha256: d75a0d3257571e0f22d7b57dc0bf3327041b0933342d199e4a38641db3a98ecb + md5: 61d4488473cbe29a1552310467c22359 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - __osx >=11.0 - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/frozenlist?source=hash-mapping - size: 60988 - timestamp: 1729699558841 + size: 53574 + timestamp: 1725396042461 - kind: conda name: frozenlist - version: 1.5.0 - build: py311ha879c10_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py311ha879c10_0.conda - sha256: 1b31825a689aa35a07ce4a7f1994668f2c2344cfdb7efdb05e820d8fc1ca6949 - md5: ea2f2c07a1173d0b1823fe4471203d6d + version: 1.4.1 + build: py311h9ecbd09_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda + sha256: 8453b61bfd8a7812e59aba9209b9aaf15f84e8d601758c820ecb1131deb9e876 + md5: 4605a44155b0c25da37e8f40318c78a4 depends: + - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/frozenlist?source=hash-mapping - size: 60923 - timestamp: 1729699681174 + size: 60199 + timestamp: 1725395817496 - kind: conda name: frozenlist - version: 1.5.0 - build: py311hae2e1ce_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py311hae2e1ce_0.conda - sha256: 3df51bbf74052c5d29a33cf8c8c57302699937f883e0e4e9e506c7e0b09e45a5 - md5: 7f28e6daf0b4963be1061291cbe10bfb + version: 1.4.1 + build: py311ha879c10_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.4.1-py311ha879c10_1.conda + sha256: 083bae83214ff52adb523543ce124b1c80815b89cf7b86a9cd706f55c92fac40 + md5: ccd6df7dbc5e6830d03ff01e5ecf8b2e depends: - - __osx >=11.0 + - libgcc >=13 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 @@ -18436,16 +18420,17 @@ packages: license_family: APACHE purls: - pkg:pypi/frozenlist?source=hash-mapping - size: 54023 - timestamp: 1729699703032 + size: 60217 + timestamp: 1725395930304 - kind: conda name: frozenlist - version: 1.5.0 - build: py311he736701_0 + version: 1.4.1 + build: py311he736701_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.5.0-py311he736701_0.conda - sha256: 2a3975f8a179d3b58ea1818753a4920ae6e1188c6e8239107f076bde149be569 - md5: 228d16664f7938586d813a1df2637934 + url: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.4.1-py311he736701_1.conda + sha256: d30357c5b00c52a852282c391d857fe47159c074269abda658007898989ec01a + md5: 706943f4171390c7df1f6e37f4ee1bd6 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 @@ -18456,13 +18441,13 @@ packages: license_family: APACHE purls: - pkg:pypi/frozenlist?source=hash-mapping - size: 54934 - timestamp: 1729699828246 + size: 54199 + timestamp: 1725396279788 - kind: pypi name: fsspec - version: 2024.10.0 - url: https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl - sha256: 03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871 + version: 2024.9.0 + url: https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl + sha256: a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b requires_dist: - adlfs ; extra == 'abfs' - adlfs ; extra == 'adl' @@ -18646,12 +18631,12 @@ packages: - kind: conda name: gcc_linux-64 version: 12.4.0 - build: h6b7512a_5 - build_number: 5 + build: h6b7512a_4 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_5.conda - sha256: ad25914fda6286e630fbd7dcbf8450266b0f778532de0f640cbdd568cf87f5cf - md5: c0d7585b6261db0574fc8254cfa0f2d9 + url: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_4.conda + sha256: 1fb0a1a7729840eb172b69a81edf36e720e4ff032faa12c42989bfeb7bd0c9b2 + md5: d1b138010a00c97f914b38678a51f254 depends: - binutils_linux-64 - gcc_impl_linux-64 12.4.0.* @@ -18659,17 +18644,17 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 31891 - timestamp: 1729281921785 + size: 31943 + timestamp: 1727281489360 - kind: conda name: gcc_linux-aarch64 version: 12.4.0 - build: heb3b579_5 - build_number: 5 + build: heb3b579_4 + build_number: 4 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_5.conda - sha256: cd837753812b7ff014b998aa1050b7d26074e852d64edbf522e05059a3851f85 - md5: 8003b3f946e61a6ac8643a804616432f + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-12.4.0-heb3b579_4.conda + sha256: 1c8c2d803f7c059031d243042230df5089f2ede6e83c3555e64fbb23adf5d0f2 + md5: 21d519f3a0059277e77bd7ddf600456f depends: - binutils_linux-aarch64 - gcc_impl_linux-aarch64 12.4.0.* @@ -18677,8 +18662,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 31883 - timestamp: 1729281833379 + size: 31932 + timestamp: 1727281453196 - kind: pypi name: gesture-detection version: 0.1.0 @@ -19274,41 +19259,41 @@ packages: - kind: conda name: gxx_linux-64 version: 12.4.0 - build: h8489865_5 - build_number: 5 + build: h8489865_4 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_5.conda - sha256: ae38fca533c5f576cf1790307bb136d774083e7c659d9c9959af24aa6f54b6db - md5: abf1ebf9ef95086f97cf58feca71c4d0 + url: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_4.conda + sha256: b41e771fcce8ddd752ecc012ffca9c1a219614b3eaf7ee26552c60459a68c670 + md5: bc4b5180384ebc7bcfc417969f1e8af0 depends: - binutils_linux-64 - - gcc_linux-64 12.4.0 h6b7512a_5 + - gcc_linux-64 12.4.0 h6b7512a_4 - gxx_impl_linux-64 12.4.0.* - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 30273 - timestamp: 1729281933718 + size: 30317 + timestamp: 1727281506580 - kind: conda name: gxx_linux-aarch64 version: 12.4.0 - build: h3f57e68_5 - build_number: 5 + build: h3f57e68_4 + build_number: 4 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_5.conda - sha256: 777a79b253be4bc0c73dc8f6b8da7adef615c416f869e410f5b4acf7d765cea6 - md5: 5cdf941ed0d5ae3e40459229a5ee7d28 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-12.4.0-h3f57e68_4.conda + sha256: c797fbbd13b38d93b171d861f4cba6067433d081224ffb1a54356d3be9b59030 + md5: dd46b5efe75aad00f9fa0742490d08db depends: - binutils_linux-aarch64 - - gcc_linux-aarch64 12.4.0 heb3b579_5 + - gcc_linux-aarch64 12.4.0 heb3b579_4 - gxx_impl_linux-aarch64 12.4.0.* - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD purls: [] - size: 30238 - timestamp: 1729281845346 + size: 30270 + timestamp: 1727281472452 - kind: pypi name: h11 version: 0.14.0 @@ -19644,9 +19629,9 @@ packages: requires_python: '>=3.8' - kind: pypi name: huggingface-hub - version: 0.26.1 - url: https://files.pythonhosted.org/packages/d7/4d/017d8d7cff5100092da8ea19139bcb1965bbadcbb5ddd0480e2badc299e8/huggingface_hub-0.26.1-py3-none-any.whl - sha256: 5927a8fc64ae68859cd954b7cc29d1c8390a5e15caba6d3d349c973be8fdacf3 + version: 0.25.2 + url: https://files.pythonhosted.org/packages/64/09/a535946bf2dc88e61341f39dc507530411bb3ea4eac493e5ec833e8f35bd/huggingface_hub-0.25.2-py3-none-any.whl + sha256: 1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25 requires_dist: - filelock - fsspec>=2023.5.0 @@ -19657,6 +19642,7 @@ packages: - typing-extensions>=3.7.4.3 - inquirerpy==0.3.4 ; extra == 'all' - aiohttp ; extra == 'all' + - minijinja>=1.0 ; extra == 'all' - jedi ; extra == 'all' - jinja2 ; extra == 'all' - pytest<8.2.2,>=8.1.1 ; extra == 'all' @@ -19670,12 +19656,11 @@ packages: - urllib3<2.0 ; extra == 'all' - soundfile ; extra == 'all' - pillow ; extra == 'all' - - gradio>=4.0.0 ; extra == 'all' + - gradio ; extra == 'all' - numpy ; extra == 'all' - fastapi ; extra == 'all' - ruff>=0.5.0 ; extra == 'all' - mypy==1.5.1 ; extra == 'all' - - libcst==1.4.0 ; extra == 'all' - typing-extensions>=4.8.0 ; extra == 'all' - types-pyyaml ; extra == 'all' - types-requests ; extra == 'all' @@ -19686,6 +19671,7 @@ packages: - inquirerpy==0.3.4 ; extra == 'cli' - inquirerpy==0.3.4 ; extra == 'dev' - aiohttp ; extra == 'dev' + - minijinja>=1.0 ; extra == 'dev' - jedi ; extra == 'dev' - jinja2 ; extra == 'dev' - pytest<8.2.2,>=8.1.1 ; extra == 'dev' @@ -19699,12 +19685,11 @@ packages: - urllib3<2.0 ; extra == 'dev' - soundfile ; extra == 'dev' - pillow ; extra == 'dev' - - gradio>=4.0.0 ; extra == 'dev' + - gradio ; extra == 'dev' - numpy ; extra == 'dev' - fastapi ; extra == 'dev' - ruff>=0.5.0 ; extra == 'dev' - mypy==1.5.1 ; extra == 'dev' - - libcst==1.4.0 ; extra == 'dev' - typing-extensions>=4.8.0 ; extra == 'dev' - types-pyyaml ; extra == 'dev' - types-requests ; extra == 'dev' @@ -19717,9 +19702,9 @@ packages: - fastcore>=1.3.27 ; extra == 'fastai' - hf-transfer>=0.1.4 ; extra == 'hf-transfer' - aiohttp ; extra == 'inference' + - minijinja>=1.0 ; extra == 'inference' - ruff>=0.5.0 ; extra == 'quality' - mypy==1.5.1 ; extra == 'quality' - - libcst==1.4.0 ; extra == 'quality' - tensorflow ; extra == 'tensorflow' - pydot ; extra == 'tensorflow' - graphviz ; extra == 'tensorflow' @@ -19727,6 +19712,7 @@ packages: - keras<3.0 ; extra == 'tensorflow-testing' - inquirerpy==0.3.4 ; extra == 'testing' - aiohttp ; extra == 'testing' + - minijinja>=1.0 ; extra == 'testing' - jedi ; extra == 'testing' - jinja2 ; extra == 'testing' - pytest<8.2.2,>=8.1.1 ; extra == 'testing' @@ -19740,7 +19726,7 @@ packages: - urllib3<2.0 ; extra == 'testing' - soundfile ; extra == 'testing' - pillow ; extra == 'testing' - - gradio>=4.0.0 ; extra == 'testing' + - gradio ; extra == 'testing' - numpy ; extra == 'testing' - fastapi ; extra == 'testing' - torch ; extra == 'torch' @@ -20163,9 +20149,9 @@ packages: requires_python: '>=3.8' - kind: pypi name: ipython - version: 8.29.0 - url: https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl - sha256: 0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8 + version: 8.28.0 + url: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl + sha256: 530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35 requires_dist: - decorator - jedi>=0.16 @@ -20385,38 +20371,37 @@ packages: timestamp: 1714299052957 - kind: pypi name: jax - version: 0.4.35 - url: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - sha256: fa99e909a31424abfec750019a6dd36f6acc18a6e7d40e2c0086b932cc351325 + version: 0.4.34 + url: https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl + sha256: b957ca1fc91f7343f91a186af9f19c7f342c946f95a8c11c7f1e5cdfe2e58d9e requires_dist: - - jaxlib<=0.4.35,>=0.4.34 - - ml-dtypes>=0.4.0 + - jaxlib<=0.4.34,>=0.4.34 + - ml-dtypes>=0.2.0 - numpy>=1.24 - opt-einsum - scipy>=1.10 - numpy>=1.26.0 ; python_full_version >= '3.12' - scipy>=1.11.1 ; python_full_version >= '3.12' - - jaxlib==0.4.34 ; extra == 'ci' + - jaxlib==0.4.33 ; extra == 'ci' - jaxlib==0.4.34 ; extra == 'cuda' - - jax-cuda12-plugin[with-cuda]<=0.4.35,>=0.4.34 ; extra == 'cuda' + - jax-cuda12-plugin[with-cuda]<=0.4.34,>=0.4.34 ; extra == 'cuda' - jaxlib==0.4.34 ; extra == 'cuda12' - - jax-cuda12-plugin[with-cuda]<=0.4.35,>=0.4.34 ; extra == 'cuda12' + - jax-cuda12-plugin[with-cuda]<=0.4.34,>=0.4.34 ; extra == 'cuda12' - jaxlib==0.4.34 ; extra == 'cuda12-local' - jax-cuda12-plugin==0.4.34 ; extra == 'cuda12-local' - jaxlib==0.4.34 ; extra == 'cuda12-pip' - - jax-cuda12-plugin[with-cuda]<=0.4.35,>=0.4.34 ; extra == 'cuda12-pip' + - jax-cuda12-plugin[with-cuda]<=0.4.34,>=0.4.34 ; extra == 'cuda12-pip' - kubernetes ; extra == 'k8s' - jaxlib==0.4.34 ; extra == 'minimum-jaxlib' - - jaxlib<=0.4.35,>=0.4.34 ; extra == 'tpu' - - libtpu-nightly==0.1.dev20241010+nightly.cleanup ; extra == 'tpu' - - libtpu==0.0.2 ; extra == 'tpu' + - jaxlib<=0.4.34,>=0.4.34 ; extra == 'tpu' + - libtpu-nightly==0.1.dev20241002 ; extra == 'tpu' - requests ; extra == 'tpu' requires_python: '>=3.10' - kind: pypi name: jaxlib - version: 0.4.35 - url: https://files.pythonhosted.org/packages/7d/7c/73a4c4a34f2bbfce63e8baefee11753b0d58a71e0d2c33f210e00edba3cb/jaxlib-0.4.35-cp311-cp311-win_amd64.whl - sha256: 0fd990354d5623d3a34493fcd7213493390dbf5039bea19b62e2aaee1049eda9 + version: 0.4.34 + url: https://files.pythonhosted.org/packages/9d/5d/7e71019af5f6fdebe6c10eab97d01f44b931d94609330da9e142cb155f8c/jaxlib-0.4.34-cp311-cp311-win_amd64.whl + sha256: 133070d4fec5525ffea4dc72956398c1cf647a04dcb37f8a935ee82af78d9965 requires_dist: - scipy>=1.10 - numpy>=1.24 @@ -20425,9 +20410,9 @@ packages: requires_python: '>=3.10' - kind: pypi name: jaxlib - version: 0.4.35 - url: https://files.pythonhosted.org/packages/c8/a6/1abe8d682d46cf2989f9c4928866ae80c30a54d607221a262cff8a5d9366/jaxlib-0.4.35-cp311-cp311-manylinux2014_x86_64.whl - sha256: bc9eafba001ff8569cfa252fe7f04ba553622702b4b473b656dd0866edf6b8d4 + version: 0.4.34 + url: https://files.pythonhosted.org/packages/c7/d0/6bc81c0b1d507f403e6085ce76a429e6d7f94749d742199252e299dd1424/jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl + sha256: 3bcfa639ca3cfaf86c8ceebd5fc0d47300fd98a078014a1d0cc03133e1523d5f requires_dist: - scipy>=1.10 - numpy>=1.24 @@ -20892,37 +20877,37 @@ packages: - kind: conda name: kernel-headers_linux-64 version: 3.10.0 - build: he073ed8_18 - build_number: 18 + build: he073ed8_17 + build_number: 17 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda - sha256: a922841ad80bd7b222502e65c07ecb67e4176c4fa5b03678a005f39fcc98be4b - md5: ad8527bf134a90e1c9ed35fa0b64318c + url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda + sha256: c28d69ca84533f0e2093f17ae6d3e19ee3661dd397618630830b1b9afc3bfb4d + md5: 285931bd28b3b8f176d46dd9fd627a09 constrains: - sysroot_linux-64 ==2.17 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 license_family: GPL purls: [] - size: 943486 - timestamp: 1729794504440 + size: 945088 + timestamp: 1727437651716 - kind: conda name: kernel-headers_linux-aarch64 version: 4.18.0 - build: h05a177a_18 - build_number: 18 + build: h05a177a_17 + build_number: 17 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_18.conda - sha256: 99731884b26d5801c931f6ed4e1d40f0d1b2efc60ab2d1d49e9b3a6508a390df - md5: 40ebaa9844bc99af99fc1beaed90b379 + url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_17.conda + sha256: 08276325afbcd6914db7f2512b239920a68eea140740e015ce14bc566000701b + md5: d73fa6e291678549f7aa185bc6879563 constrains: - sysroot_linux-aarch64 ==2.17 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 license_family: GPL purls: [] - size: 1113306 - timestamp: 1729794501866 + size: 1115887 + timestamp: 1727437626654 - kind: pypi name: keyring version: 25.4.1 @@ -21316,12 +21301,12 @@ packages: - kind: conda name: ld_impl_linux-64 version: '2.43' - build: h712a8e2_2 - build_number: 2 + build: h712a8e2_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe - md5: 048b02e3962f066da18efe3a21b77672 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda + sha256: 0c21387f9a411e3d1f7f2969026bacfece133c8f1e72faea9cde29c0c19e1f3a + md5: 83e1364586ceb8d0739fbc85b5c95837 depends: - __glibc >=2.17,<3.0.a0 constrains: @@ -21329,24 +21314,24 @@ packages: license: GPL-3.0-only license_family: GPL purls: [] - size: 669211 - timestamp: 1729655358674 + size: 669616 + timestamp: 1727304687962 - kind: conda name: ld_impl_linux-aarch64 version: '2.43' - build: h80caac9_2 - build_number: 2 + build: h80caac9_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - sha256: 80ec7e8f006196808fac5bd4b3773a652847f97bbf08044cd87731424ac64f8b - md5: fcbde5ea19d55468953bf588770c0501 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_1.conda + sha256: cc4ad280a52e6815c0b26d785f6c2e205646c72fb01f418883f8df266d3c12f1 + md5: 5019b8e4dd2433395270cc0838ad4065 constrains: - binutils_impl_linux-aarch64 2.43 license: GPL-3.0-only license_family: GPL purls: [] - size: 698245 - timestamp: 1729655345825 + size: 698534 + timestamp: 1727304686383 - kind: conda name: lerc version: 4.0.0 @@ -21609,15 +21594,15 @@ packages: - kind: conda name: libarrow version: 14.0.2 - build: h3fcefee_48_cpu - build_number: 48 + build: h4caaaa1_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h3fcefee_48_cpu.conda - sha256: 0d85c997224c3f755a838c13210b042a6b4dfdbc5cc08574065a2adc59d4e32f - md5: b8182dbc1f3c75fc02dbbf93e10fd6b0 + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-14.0.2-h4caaaa1_47_cpu.conda + sha256: cd26fba14b4381e1af82c0e922811dc88acfb0c6449a7a0609caf1ddeaec75f0 + md5: 7b247e3fa44db0cbc16308bf8ca425c5 depends: - __osx >=10.13 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - aws-sdk-cpp >=1.11.407,<1.11.408.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 @@ -21628,7 +21613,7 @@ packages: - libcxx >=17 - libgoogle-cloud >=2.30.0,<2.31.0a0 - libgoogle-cloud-storage >=2.30.0,<2.31.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.9.3,<1.10.0a0 @@ -21637,37 +21622,39 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: + - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 - - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 5636713 - timestamp: 1729670055937 + size: 5662209 + timestamp: 1728664216656 - kind: conda name: libarrow version: 14.0.2 - build: h528447d_48_cpu - build_number: 48 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-h528447d_48_cpu.conda - sha256: a34efea519b6c3981a966da67500ac33102daaa01dd8b31d11a301a8945af668 - md5: 580a31622ab03c4423b3d2354e9809a6 + build: h5d20d7a_47_cpu + build_number: 47 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h5d20d7a_47_cpu.conda + sha256: aca7b77a997afe46dbc0ea03b161798592fec80c0231f7333f4f3da3f0a618ce + md5: c6a5072fed2948835ed8f38b7f09c8a7 depends: - - __osx >=11.0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - aws-sdk-cpp >=1.11.407,<1.11.408.0a0 - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - - libcxx >=17 + - libgcc >=13 - libgoogle-cloud >=2.30.0,<2.31.0a0 - libgoogle-cloud-storage >=2.30.0,<2.31.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 + - libstdcxx >=13 - libutf8proc >=2.8.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.9.3,<1.10.0a0 @@ -21676,25 +21663,25 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: - - arrow-cpp <0.0a0 - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 5049161 - timestamp: 1729669008599 + size: 8129036 + timestamp: 1728664580171 - kind: conda name: libarrow version: 14.0.2 - build: h607190a_48_cpu - build_number: 48 + build: h7c049e1_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h607190a_48_cpu.conda - sha256: 9ad716c40119ff56243571e8c47d5d33da87c4632a61844cea238d4735a89942 - md5: 4248a8d96e9b3e8f84ffe85ff4e66445 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-14.0.2-h7c049e1_47_cpu.conda + sha256: 050d2b47d82bd2925bd585a8e0f28f46feb80b2b04188b7deee91ccb03eb47f8 + md5: 0b1863676c89004dd3c361e2f7a72fba depends: - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - aws-sdk-cpp >=1.11.407,<1.11.408.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* @@ -21705,7 +21692,7 @@ packages: - libcurl >=8.10.1,<9.0a0 - libgoogle-cloud >=2.30.0,<2.31.0a0 - libgoogle-cloud-storage >=2.30.0,<2.31.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.9.3,<1.10.0a0 @@ -21719,24 +21706,24 @@ packages: - zstd >=1.5.6,<1.6.0a0 constrains: - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 4917231 - timestamp: 1729670736632 + size: 4882572 + timestamp: 1728665781929 - kind: conda name: libarrow version: 14.0.2 - build: h6f9f739_48_cpu - build_number: 48 + build: h987bebd_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h6f9f739_48_cpu.conda - sha256: 52104ad8a69e744f65f1fb588630c55d0b83e9588e822a74da0cb3b6db614ec4 - md5: 34c9db0de2c91d4377f4784c2e2a4f1a + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-14.0.2-h987bebd_47_cpu.conda + sha256: e570429efda2c500367684b8ea6e31b567bcf0a6f34a50514871a5468a51a284 + md5: b24b41d0844d74e42abd01f4ea0406b0 depends: - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - aws-sdk-cpp >=1.11.407,<1.11.408.0a0 - bzip2 >=1.0.8,<2.0a0 - gflags >=2.2.2,<2.3.0a0 @@ -21748,7 +21735,7 @@ packages: - libgcc >=13 - libgoogle-cloud >=2.30.0,<2.31.0a0 - libgoogle-cloud-storage >=2.30.0,<2.31.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 - libstdcxx >=13 - libutf8proc >=2.8.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 @@ -21758,39 +21745,37 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: - - apache-arrow-proc =*=cpu - - parquet-cpp <0.0a0 - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 7496822 - timestamp: 1729668770869 + size: 7510962 + timestamp: 1728664870800 - kind: conda name: libarrow version: 14.0.2 - build: ha84fcd3_48_cpu - build_number: 48 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-ha84fcd3_48_cpu.conda - sha256: 38057837fc6a4ca3839105b1b645c18b7c14dab436da733b00e3279d68da8af6 - md5: fd63df71f110c47dd31cfe23a5aab81b + build: hd88f88e_47_cpu + build_number: 47 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-14.0.2-hd88f88e_47_cpu.conda + sha256: 3d73bedf47dfd3f873938ca510ad0cfaf314d7fa16ef9c6d0c2cc0f298012c27 + md5: f13fc79f654713eeb5e1b5759360ca06 depends: - - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.28.5,<0.28.6.0a0 + - __osx >=11.0 + - aws-crt-cpp >=0.28.3,<0.28.4.0a0 - aws-sdk-cpp >=1.11.407,<1.11.408.0a0 - bzip2 >=1.0.8,<2.0a0 - - gflags >=2.2.2,<2.3.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - - libgcc >=13 + - libcxx >=17 - libgoogle-cloud >=2.30.0,<2.31.0a0 - libgoogle-cloud-storage >=2.30.0,<2.31.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.9.3,<1.10.0a0 @@ -21799,227 +21784,227 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: - - parquet-cpp <0.0a0 - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 8123107 - timestamp: 1729668768791 + size: 5058053 + timestamp: 1728664504406 - kind: conda name: libarrow-acero version: 14.0.2 - build: h5833ebf_48_cpu - build_number: 48 + build: h5833ebf_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_48_cpu.conda - sha256: 856d246bb39d74a4f8262f55007e03a4fff733e12a6c22af711e5504ca98fce4 - md5: 1cb42fde30b2e5d436148d8acca555a1 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-14.0.2-h5833ebf_47_cpu.conda + sha256: 07266bb1aff76031df49fb71b7b92faf7088329c8163f2e195c629c5565e230b + md5: e69ec70bfc373ab49f343cdc3e91ddee depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu - libcxx >=17 license: Apache-2.0 license_family: APACHE purls: [] - size: 472814 - timestamp: 1729669119874 + size: 472244 + timestamp: 1728664615560 - kind: conda name: libarrow-acero version: 14.0.2 - build: h5d0bfc1_48_cpu - build_number: 48 + build: h5d0bfc1_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_48_cpu.conda - sha256: bd866ab5c33d5d0d15a6ef0ef38104bdae78ba50230e893a3ceca81cab6a18d6 - md5: 91528eadfa9abbc1a874f32b4d408891 + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h5d0bfc1_47_cpu.conda + sha256: dbb38dd5df6e68dfccedf9000fc4572839b242e35411b0af98850c1a68b7a339 + md5: 20c16a40ccbda656a496e1d78290e0a7 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 588760 - timestamp: 1729668801518 + size: 589423 + timestamp: 1728664625358 - kind: conda name: libarrow-acero version: 14.0.2 - build: h8b12148_48_cpu - build_number: 48 + build: h8b12148_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_48_cpu.conda - sha256: ea1dbcc83728a7704f27756659ff6057c07034a2560904f47be69f9c01567307 - md5: 5ece6755b7226df60493e7174b249ec4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-14.0.2-h8b12148_47_cpu.conda + sha256: 8db1a1956f1792e405acaa17f165c59c5d77ce31a64550f8851613470f537746 + md5: 314a874e320a6b638277e888929afd2c depends: - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 559227 - timestamp: 1729668800090 + size: 560261 + timestamp: 1728664912346 - kind: conda name: libarrow-acero version: 14.0.2 - build: h97d8b74_48_cpu - build_number: 48 + build: h97d8b74_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_48_cpu.conda - sha256: 63398f8dfbe4013deed9188126261fe1464029effd96a924a3e53b0270a21df9 - md5: 556fa4b2ac56c31e2d2a7b9d3760fe07 + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-14.0.2-h97d8b74_47_cpu.conda + sha256: b0416b32f9dd9f8be379d70160dce857d454c3513910108b6dfb9ece6bacd31e + md5: 6dfb7ae87bc0d27ebbfc72f2bcc2885a depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu - libcxx >=17 license: Apache-2.0 license_family: APACHE purls: [] - size: 510236 - timestamp: 1729670224857 + size: 509583 + timestamp: 1728664327591 - kind: conda name: libarrow-acero version: 14.0.2 - build: hac47afa_48_cpu - build_number: 48 + build: hac47afa_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_48_cpu.conda - sha256: 15329b86e39bd479f7df4531a871a72cc6248875feceb051bc6583d4931857e4 - md5: 5ad1384473d4baa8eb4b757abb31ac60 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-14.0.2-hac47afa_47_cpu.conda + sha256: 77ceaf436a21066d209c34db62b37c5a6c5ec90bbfa558c49ca612cdba972c87 + md5: 3a34c6d0d39539275733e5fd17ad7a08 depends: - - libarrow 14.0.2 h607190a_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.40.33810 license: Apache-2.0 license_family: APACHE purls: [] - size: 435630 - timestamp: 1729670783799 + size: 435631 + timestamp: 1728665839203 - kind: conda name: libarrow-dataset version: 14.0.2 - build: h5833ebf_48_cpu - build_number: 48 + build: h5833ebf_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_48_cpu.conda - sha256: 80d0711db4b9c7eb516376082f5bbffdaeca7874a599c5a243a35f9abda33b6d - md5: 081b1a535c727b3f3c0d6507f22a4bfa + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-14.0.2-h5833ebf_47_cpu.conda + sha256: f13ed4a8fa682e3062d0e1f6a89107d2f27cecdc3a17ff628254f9fad30aa873 + md5: 8d823e95e2c408472bbff84f04680c4c depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu - - libarrow-acero 14.0.2 h5833ebf_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu + - libarrow-acero 14.0.2 h5833ebf_47_cpu - libcxx >=17 - - libparquet 14.0.2 h8aa6169_48_cpu + - libparquet 14.0.2 h8aa6169_47_cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 498821 - timestamp: 1729670217477 + size: 498556 + timestamp: 1728665934350 - kind: conda name: libarrow-dataset version: 14.0.2 - build: h5d0bfc1_48_cpu - build_number: 48 + build: h5d0bfc1_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_48_cpu.conda - sha256: 0a1acacf5fde67f1d9a9a602554bf0767e71de26c0ed270addbd5db343909718 - md5: 4fed3c749851980074d7548d0186f80e + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h5d0bfc1_47_cpu.conda + sha256: 5334be2c12927420120d9a3e47348d523a71cf2457d1b67e16b0a8aea4f8b18c + md5: 3a77e66f5967c58460ae6ef5b4fa2233 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu - - libarrow-acero 14.0.2 h5d0bfc1_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu + - libarrow-acero 14.0.2 h5d0bfc1_47_cpu - libgcc >=13 - - libparquet 14.0.2 hd082c85_48_cpu + - libparquet 14.0.2 hd082c85_47_cpu - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 589399 - timestamp: 1729668863716 + size: 588757 + timestamp: 1728664717195 - kind: conda name: libarrow-dataset version: 14.0.2 - build: h8b12148_48_cpu - build_number: 48 + build: h8b12148_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_48_cpu.conda - sha256: 963d7da0b7b1131b353dd92d517577e837a278d27b9660266bf270e975bc6e9b - md5: 6338263f4ab77bd0f0986a2f148e2450 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-14.0.2-h8b12148_47_cpu.conda + sha256: 7fb37d6a3a3b17bbd14b82496a4070458ef9fbc3e773bce8d4ec039c40f68d08 + md5: 625bc439f4af8c132eaf9be0ce782b34 depends: - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu - - libarrow-acero 14.0.2 h8b12148_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu + - libarrow-acero 14.0.2 h8b12148_47_cpu - libgcc >=13 - - libparquet 14.0.2 h21a6562_48_cpu + - libparquet 14.0.2 h21a6562_47_cpu - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 564600 - timestamp: 1729668864298 + size: 564394 + timestamp: 1728665004345 - kind: conda name: libarrow-dataset version: 14.0.2 - build: h97d8b74_48_cpu - build_number: 48 + build: h97d8b74_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_48_cpu.conda - sha256: 39ae7555f6a766646c326ee005b18dc810fc85b67548869c7dbb9eb246a1de33 - md5: 03afd023139e8e9431973478caae266e + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-14.0.2-h97d8b74_47_cpu.conda + sha256: 277c171c5d5753a24be61ff604b4d4d4710fdcdf664a3ebc850548bbb10b1f77 + md5: 5dd401ce9cf9d3350f7a8b7e01cd4caf depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu - - libarrow-acero 14.0.2 h97d8b74_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu + - libarrow-acero 14.0.2 h97d8b74_47_cpu - libcxx >=17 - - libparquet 14.0.2 h2be9fba_48_cpu + - libparquet 14.0.2 h2be9fba_47_cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 525183 - timestamp: 1729671495565 + size: 523863 + timestamp: 1728665417571 - kind: conda name: libarrow-dataset version: 14.0.2 - build: hac47afa_48_cpu - build_number: 48 + build: hac47afa_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_48_cpu.conda - sha256: a9f582386dde2c34244e52d7588a261c5251c3d3d08645a54f670f90e03b0a0d - md5: 18f951d1ca7992e9299249a9fbc8b0e6 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-14.0.2-hac47afa_47_cpu.conda + sha256: 6479c7d862483c51073456bd894bbfaa454ef52018169d635ae61671b147d9c5 + md5: 44a6e0919b62034a5bbc423007d5e8a1 depends: - - libarrow 14.0.2 h607190a_48_cpu - - libarrow-acero 14.0.2 hac47afa_48_cpu - - libparquet 14.0.2 h59f2d37_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu + - libarrow-acero 14.0.2 hac47afa_47_cpu + - libparquet 14.0.2 h59f2d37_47_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.40.33810 license: Apache-2.0 license_family: APACHE purls: [] - size: 438877 - timestamp: 1729670945356 + size: 439478 + timestamp: 1728666052075 - kind: conda name: libarrow-flight version: 14.0.2 - build: h15553ab_48_cpu - build_number: 48 + build: h15553ab_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_48_cpu.conda - sha256: 3e9e70e752bfb11cd95df359245f3992faca97a20e80db22f52f8d6194afed21 - md5: 0d99be4656443b506b1282fd523c8c33 + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h15553ab_47_cpu.conda + sha256: 13cb4cbc64a769fb50679318dd93e9867355e208124064f900b26c5cdcab0ff6 + md5: 4657b34849e6e3be9f8f49f13274a952 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu - libgcc >=13 - libgrpc >=1.65.5,<1.66.0a0 - libprotobuf >=5.27.5,<5.27.6.0a0 @@ -22028,66 +22013,66 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 513920 - timestamp: 1729668818105 + size: 514073 + timestamp: 1728664650712 - kind: conda name: libarrow-flight version: 14.0.2 - build: h1a98edb_48_cpu - build_number: 48 + build: h1a98edb_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_48_cpu.conda - sha256: bce650b05c47789cffc70b2f76adae70c3ee3a292940992caa520882950422fc - md5: 33f31040b3c5f20a206d9854a4ee854b + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-14.0.2-h1a98edb_47_cpu.conda + sha256: bb2daf48aba2fd2941adb68c7472e57be829de0a335a5db83025210ac33d3a70 + md5: 685a16fd3cb99659b831d4dd4ceb455c depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 h528447d_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu - libcxx >=17 - libgrpc >=1.65.5,<1.66.0a0 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 320278 - timestamp: 1729669355825 + size: 320584 + timestamp: 1728664930381 - kind: conda name: libarrow-flight version: 14.0.2 - build: h2627002_48_cpu - build_number: 48 + build: h2627002_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_48_cpu.conda - sha256: 94ae839d919690ff3828b2641a0b28c7a9d1d91aa0b3a223d6607b617cfbb314 - md5: 3d28e22ad31d3888c1aadef05c0fbb0f + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-14.0.2-h2627002_47_cpu.conda + sha256: d5f0113753ca5a9c7a89c0c43c8a447dbf768379e3236297a0e89abe4f1514fc + md5: 682b4f05811a0caa1c55bfe917cf76b6 depends: - __osx >=10.13 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 h3fcefee_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu - libcxx >=17 - libgrpc >=1.65.5,<1.66.0a0 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 333427 - timestamp: 1729670406242 + size: 333068 + timestamp: 1728664470493 - kind: conda name: libarrow-flight version: 14.0.2 - build: hc9c23c4_48_cpu - build_number: 48 + build: hc9c23c4_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_48_cpu.conda - sha256: b4773bc2951ed71f2177378232453201f5e01e45a5e8b5cc4724f1b7a91419e2 - md5: 2fe74a3b7c41cde6bd8501ca1b59a1da + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-14.0.2-hc9c23c4_47_cpu.conda + sha256: ce7e8091a00220b3414e02127fb92cb797a9c32e30d81fd047751f3448bd01f4 + md5: d5e28317ff774482569435114ea80661 depends: - gflags >=2.2.2,<2.3.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu - libgcc >=13 - libgrpc >=1.65.5,<1.66.0a0 - libprotobuf >=5.27.5,<5.27.6.0a0 @@ -22096,21 +22081,21 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 487342 - timestamp: 1729668819756 + size: 486946 + timestamp: 1728664939682 - kind: conda name: libarrow-flight version: 14.0.2 - build: hf55736b_48_cpu - build_number: 48 + build: hf55736b_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_48_cpu.conda - sha256: bea430aeb52bda56630441cc6998cd993cac85054cf36d0632e760ce734852c5 - md5: cab3482b6815a564637bb2e4af8393ac + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-14.0.2-hf55736b_47_cpu.conda + sha256: a7f096dcd0e010c29352941a83b8bbf2a4ffaf4683615e333de510dd4c881348 + md5: 116dc3a1a2e02c12a332df0fe3c05276 depends: - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 h607190a_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu - libgrpc >=1.65.5,<1.66.0a0 - libprotobuf >=5.27.5,<5.27.6.0a0 - ucrt >=10.0.20348.0 @@ -22119,20 +22104,20 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 293904 - timestamp: 1729670821510 + size: 293585 + timestamp: 1728665897605 - kind: conda name: libarrow-flight-sql version: 14.0.2 - build: h301f888_48_cpu - build_number: 48 + build: h301f888_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_48_cpu.conda - sha256: f74ee0e86a94d2dc8b9b5de489d9b219669ac8fbf39a420f78f58f439db4ac55 - md5: 717f92d14281193c697300bd38502e52 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-flight-sql-14.0.2-h301f888_47_cpu.conda + sha256: c81190cdd222c6cfa36ca0b2b6883ebefb7d22a7997685a349b2b3475baa71c6 + md5: 46c059fe948d5985ce8b69a3cd25e1e4 depends: - - libarrow 14.0.2 h607190a_48_cpu - - libarrow-flight 14.0.2 hf55736b_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu + - libarrow-flight 14.0.2 hf55736b_47_cpu - libprotobuf >=5.27.5,<5.27.6.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -22140,130 +22125,130 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 230232 - timestamp: 1729670979994 + size: 231063 + timestamp: 1728666097574 - kind: conda name: libarrow-flight-sql version: 14.0.2 - build: h54b16e1_48_cpu - build_number: 48 + build: h54b16e1_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_48_cpu.conda - sha256: 01959d85ac026f2f1c23c8182824f980da46a57ae18eb2a328e17de27558d1d8 - md5: 67eb62f607f5e2f05c5cbb5dfeab36a4 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-14.0.2-h54b16e1_47_cpu.conda + sha256: 827af205f86b2697a21c441192abd3c7f24a5b1d30b108c3ffc8476232d520ea + md5: 0ca57e6b9f488aee159cf0b2e5393775 depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu - - libarrow-flight 14.0.2 h1a98edb_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu + - libarrow-flight 14.0.2 h1a98edb_47_cpu - libcxx >=17 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 159406 - timestamp: 1729670281775 + size: 159511 + timestamp: 1728666014269 - kind: conda name: libarrow-flight-sql version: 14.0.2 - build: h5924cc9_48_cpu - build_number: 48 + build: h5924cc9_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_48_cpu.conda - sha256: 027903912f0af0e96aeb8cb5f0ff8a4efb45e69815a68c44c4e059f68001232a - md5: 5cd36c4c4be467d28e570c8cd6dce7d2 + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-14.0.2-h5924cc9_47_cpu.conda + sha256: 548feef243b58ea095d682995e24bbd5fa1f2da017c8780b854e2c47e81137ff + md5: f2b92613dd200135eeeb1db875751600 depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu - - libarrow-flight 14.0.2 h2627002_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu + - libarrow-flight 14.0.2 h2627002_47_cpu - libcxx >=17 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 161230 - timestamp: 1729671575724 + size: 160297 + timestamp: 1728665470448 - kind: conda name: libarrow-flight-sql version: 14.0.2 - build: ha33d14e_48_cpu - build_number: 48 + build: ha33d14e_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_48_cpu.conda - sha256: 70a204544f376f0fe72ab87a43c41f009142a45e805775a9a031a7fba59820ab - md5: 293c28bc8b96cdcddbcc65e5b804f5ed + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-ha33d14e_47_cpu.conda + sha256: 6ba63ad17e35de308e256e2e93fdbeb2a50740cb7d5b0ece06eb6fa07a0fb552 + md5: ff0a2cec264997ce04586db432482757 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu - - libarrow-flight 14.0.2 h15553ab_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu + - libarrow-flight 14.0.2 h15553ab_47_cpu - libgcc >=13 - libprotobuf >=5.27.5,<5.27.6.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 198481 - timestamp: 1729668878258 + size: 198313 + timestamp: 1728664737870 - kind: conda name: libarrow-flight-sql version: 14.0.2 - build: hc52717e_48_cpu - build_number: 48 + build: hc52717e_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_48_cpu.conda - sha256: 0d549280e6338c05c48acae39d4a564c4e555afda7cc246a56ecfab46845325a - md5: 1673525d1dedbcf2b434d398ad3e9659 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-flight-sql-14.0.2-hc52717e_47_cpu.conda + sha256: 6d8cb09a20d26cab4a93540c2ad862c69c8f68093fb23907a69ac52ddfd5c368 + md5: d9324b5a360aad53e0c5c2eb8a331048 depends: - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu - - libarrow-flight 14.0.2 hc9c23c4_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu + - libarrow-flight 14.0.2 hc9c23c4_47_cpu - libgcc >=13 - libprotobuf >=5.27.5,<5.27.6.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 187547 - timestamp: 1729668878776 + size: 188090 + timestamp: 1728665027948 - kind: conda name: libarrow-gandiva version: 14.0.2 - build: h13f1c6c_48_cpu - build_number: 48 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-h13f1c6c_48_cpu.conda - sha256: 6acb528ecad97c0800516a4fb15c1b3960be98eaa3a9cf8b64a19f8fc240a890 - md5: 7f6d776897fe8e5668c873f15ef282a7 + build: h507ade9_47_cpu + build_number: 47 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h507ade9_47_cpu.conda + sha256: d95a4ed034ddfaa0c72171d5b0c7cea6fbf7f66d9904243b4f64d5d994817747 + md5: 7c6daae5bc358c134c70df3bcccdd441 depends: - - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu - - libcxx >=17 - - libllvm17 >=17.0.6,<17.1.0a0 - - libre2-11 >=2024.7.2 + - libarrow 14.0.2 h7c049e1_47_cpu + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 - re2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.40.33810 license: Apache-2.0 license_family: APACHE purls: [] - size: 702888 - timestamp: 1729671277709 + size: 10942428 + timestamp: 1728665945477 - kind: conda name: libarrow-gandiva version: 14.0.2 - build: h18fa613_48_cpu - build_number: 48 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-h18fa613_48_cpu.conda - sha256: b4e926fe1306286b8abfa3942e9c6753f674d9cf3a9f6246d8597e382c0048e6 - md5: 4d00f9e092db76c8721f6339c85df24d + build: hb8d7e52_47_cpu + build_number: 47 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-hb8d7e52_47_cpu.conda + sha256: 7e5d5525ba9c06b2d908f4d3e566d260a5f82c401bdd8ec4e0181c1149b3d886 + md5: ff2d924d67bfeddaa33b28295a7f44f0 depends: - - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu - libgcc >=13 - libllvm17 >=17.0.6,<17.1.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 - libstdcxx >=13 - libutf8proc >=2.8.0,<3.0a0 - openssl >=3.3.2,<4.0a0 @@ -22271,160 +22256,160 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 908261 - timestamp: 1729668834 + size: 868553 + timestamp: 1728664964257 - kind: conda name: libarrow-gandiva version: 14.0.2 - build: h2242f43_48_cpu - build_number: 48 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-gandiva-14.0.2-h2242f43_48_cpu.conda - sha256: 677889839c7fd243f52dabb03b3d9b617dddc82272086d7e0262fa877147ce31 - md5: 057fed42c8f9b9581db34c75ef1aa920 + build: hbd7cc15_47_cpu + build_number: 47 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-14.0.2-hbd7cc15_47_cpu.conda + sha256: b20822bb151fab93b96fb594cb7f7e6d8fb6040532b8c704a63f65fd5d3abcbf + md5: 67bc62fddca7228a6cd2612d2c3966c7 depends: - - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu - - libgcc >=13 + - __osx >=10.13 + - libarrow 14.0.2 h4caaaa1_47_cpu + - libcxx >=17 - libllvm17 >=17.0.6,<17.1.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 - openssl >=3.3.2,<4.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] - size: 869222 - timestamp: 1729668835244 + size: 702783 + timestamp: 1728665254153 - kind: conda name: libarrow-gandiva version: 14.0.2 - build: h56cbd03_48_cpu - build_number: 48 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-gandiva-14.0.2-h56cbd03_48_cpu.conda - sha256: 423296cddf9d7c7c3a0ed642008f6b7066dc3c5c3a716e12a1323c8d146ff4d3 - md5: 6160e37d712af1fd2636f2ab02936c10 + build: hc2e7243_47_cpu + build_number: 47 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-hc2e7243_47_cpu.conda + sha256: b9bbc14507b1a16bac78dc5b403d5ee5d9a4df4da40ca043e13b96fbce8b104d + md5: 54fbb376075337b183a18f3baee7a905 depends: - - libarrow 14.0.2 h607190a_48_cpu - - libre2-11 >=2024.7.2 + - __osx >=11.0 + - libarrow 14.0.2 hd88f88e_47_cpu + - libcxx >=17 + - libllvm17 >=17.0.6,<17.1.0a0 + - libre2-11 >=2023.9.1 - libutf8proc >=2.8.0,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 - re2 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.40.33810 license: Apache-2.0 license_family: APACHE purls: [] - size: 10945527 - timestamp: 1729670855477 + size: 680917 + timestamp: 1728665750644 - kind: conda name: libarrow-gandiva version: 14.0.2 - build: h6d50e30_48_cpu - build_number: 48 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-14.0.2-h6d50e30_48_cpu.conda - sha256: fc83293d22936238542361469e9b71c2aa71fe1a37f9a9111589cdf2f593c72a - md5: aee52fa2029020b4b76d8ccd1a4e5499 + build: hecbfe32_47_cpu + build_number: 47 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hecbfe32_47_cpu.conda + sha256: 60584b763c1d79c8f5afd2d5c4169272dd08cb1476252682ec1912d16e3240a9 + md5: dacc7df2f19f6e79011a2ddae094d0ab depends: - - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu - - libcxx >=17 + - __glibc >=2.17,<3.0.a0 + - gflags >=2.2.2,<2.3.0a0 + - libarrow 14.0.2 h5d20d7a_47_cpu + - libgcc >=13 - libllvm17 >=17.0.6,<17.1.0a0 - - libre2-11 >=2024.7.2 + - libre2-11 >=2023.9.1 + - libstdcxx >=13 - libutf8proc >=2.8.0,<3.0a0 - openssl >=3.3.2,<4.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] - size: 680607 - timestamp: 1729670068386 + size: 907439 + timestamp: 1728664674638 - kind: conda name: libarrow-substrait version: 14.0.2 - build: h5924cc9_48_cpu - build_number: 48 + build: h5924cc9_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_48_cpu.conda - sha256: d83d2fd4d634fb9b5d4fa67641d98b24ce79c61beb7e4467e9565a3a23e1591b - md5: 97ca820135a99e21f6462ed11eca754e + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-14.0.2-h5924cc9_47_cpu.conda + sha256: 654793b98e9b47f99b6c0f2b29dc9ce17ad06916d1e16b2aeda22cfcdf03add7 + md5: 4dcef599a98ad757e5b4d414692fe0b5 depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu - - libarrow-acero 14.0.2 h97d8b74_48_cpu - - libarrow-dataset 14.0.2 h97d8b74_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu + - libarrow-acero 14.0.2 h97d8b74_47_cpu + - libarrow-dataset 14.0.2 h97d8b74_47_cpu - libcxx >=17 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 433726 - timestamp: 1729671697725 + size: 433656 + timestamp: 1728665554045 - kind: conda name: libarrow-substrait version: 14.0.2 - build: h5950f91_48_cpu - build_number: 48 + build: h5950f91_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_48_cpu.conda - sha256: 1bdf254c88f4c24a816c67f1d2a8f282d263be248ac5cbcdbaa0a561a0fef06c - md5: 27014a477831a15f0491efc461e440f1 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-14.0.2-h5950f91_47_cpu.conda + sha256: cd63a3198583cb6391f704ba92d82831b66f3e10e0257ce9ccd3e499fd3e392b + md5: 2a7238ad8dd53dc70b1c9c9c3ebfc29e depends: - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu - - libarrow-acero 14.0.2 h8b12148_48_cpu - - libarrow-dataset 14.0.2 h8b12148_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu + - libarrow-acero 14.0.2 h8b12148_47_cpu + - libarrow-dataset 14.0.2 h8b12148_47_cpu - libgcc >=13 - libprotobuf >=5.27.5,<5.27.6.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 486620 - timestamp: 1729668893706 + size: 486438 + timestamp: 1728665050253 - kind: conda name: libarrow-substrait version: 14.0.2 - build: ha33d14e_48_cpu - build_number: 48 + build: ha33d14e_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_48_cpu.conda - sha256: e294701c1c29a13cc336434bad0e5027ddb1cacdd9bb879e07c3badad0e8da7d - md5: 14c1d7fdc452c854f12f02f6badd1e4b + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-ha33d14e_47_cpu.conda + sha256: b6905ddc8ca9502d6c2567c51d6cbae6d2f847ac69963b756fc792fb1e976e6a + md5: 036c90736b0c9a287cfacab368fbb514 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu - - libarrow-acero 14.0.2 h5d0bfc1_48_cpu - - libarrow-dataset 14.0.2 h5d0bfc1_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu + - libarrow-acero 14.0.2 h5d0bfc1_47_cpu + - libarrow-dataset 14.0.2 h5d0bfc1_47_cpu - libgcc >=13 - libprotobuf >=5.27.5,<5.27.6.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 493989 - timestamp: 1729668890736 + size: 493867 + timestamp: 1728664757047 - kind: conda name: libarrow-substrait version: 14.0.2 - build: ha9530af_48_cpu - build_number: 48 + build: ha9530af_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_48_cpu.conda - sha256: e88307fd32e6d1c2df7d77ff0b14109595889d1dbd5f48e4745cf12a70758e4d - md5: 21a5dec7519c400ce9473f33cf39d0b9 + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-14.0.2-ha9530af_47_cpu.conda + sha256: c1885fbf3cd27b2a56da64dc5a7a6b54da1b8cb1c0584d0804d3c21cdf9b04d3 + md5: a49bc8cc9fd023ef11aa46c3872eacaa depends: - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 14.0.2 h607190a_48_cpu - - libarrow-acero 14.0.2 hac47afa_48_cpu - - libarrow-dataset 14.0.2 hac47afa_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu + - libarrow-acero 14.0.2 hac47afa_47_cpu + - libarrow-dataset 14.0.2 hac47afa_47_cpu - libprotobuf >=5.27.5,<5.27.6.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -22432,29 +22417,29 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 351340 - timestamp: 1729671014624 + size: 352301 + timestamp: 1728666146484 - kind: conda name: libarrow-substrait version: 14.0.2 - build: hec64ae3_48_cpu - build_number: 48 + build: hec64ae3_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_48_cpu.conda - sha256: e5e82810899b6bd8ef05fb21f2660791de1b057d39d53482862ceb45f5ac8938 - md5: 3f1b8e60f35d2569658f74ef7e76bd25 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-14.0.2-hec64ae3_47_cpu.conda + sha256: 4c1cd0d41bc40ede8e90e4be08657a31eb0fe1e4378fe4434453791714855874 + md5: 4f9512306ba9a18246c3ea364597d1fe depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu - - libarrow-acero 14.0.2 h5833ebf_48_cpu - - libarrow-dataset 14.0.2 h5833ebf_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu + - libarrow-acero 14.0.2 h5833ebf_47_cpu + - libarrow-dataset 14.0.2 h5833ebf_47_cpu - libcxx >=17 - libprotobuf >=5.27.5,<5.27.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 420102 - timestamp: 1729670387351 + size: 420313 + timestamp: 1728666094391 - kind: conda name: libasprintf version: 0.22.5 @@ -22625,112 +22610,112 @@ packages: - kind: conda name: libblas version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 - md5: 8ea26d42ca88ec5258802715fe1ee10b + build: 22_osx64_openblas + build_number: 22 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda + sha256: d72060239f904b3a81d2329efcf84dc62c2dfd66dbc4efc8dcae1afdf8f02b59 + md5: b80966a8c8dd0b531f8e65f709d732e8 depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - - liblapack 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas + - libcblas 3.9.0 22_osx64_openblas + - liblapack 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15677 - timestamp: 1729642900350 + size: 14749 + timestamp: 1712542279018 - kind: conda name: libblas version: 3.9.0 - build: 25_linuxaarch64_openblas - build_number: 25 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-25_linuxaarch64_openblas.conda - sha256: 5c08f78312874bb61307f5ea737377df2d0f6e7f7833ded21ca58d8820c794ca - md5: f9b8a4a955ed2d0b68b1f453abcc1c9e + build: 24_linux64_openblas + build_number: 24 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda + sha256: 3097f7913bda527d4fe9f824182b314e130044e582455037fca6f4e97965d83c + md5: 80aea6603a6813b16ec119d00382b772 depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - blas * openblas - - liblapacke 3.9.0 25_linuxaarch64_openblas - - liblapack 3.9.0 25_linuxaarch64_openblas - - libcblas 3.9.0 25_linuxaarch64_openblas + - liblapack 3.9.0 24_linux64_openblas + - libcblas 3.9.0 24_linux64_openblas + - liblapacke 3.9.0 24_linux64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15808 - timestamp: 1729643002627 + size: 14981 + timestamp: 1726668454790 - kind: conda name: libblas version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda - sha256: 1b22b5322a311a775bca637b26317645cf07e35f125cede9278c6c45db6e7105 - md5: da0a6f87958893e1d2e2bbc7e7a6541f + build: 24_linuxaarch64_openblas + build_number: 24 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-24_linuxaarch64_openblas.conda + sha256: a0a86754a6dcdf5917735d3095a34aab7adce56dd3fda5258e8526f0e1cf0164 + md5: f763daad76fe32da91acfdf3e476ec0d depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - - liblapack 3.9.0 25_osx64_openblas - - liblapacke 3.9.0 25_osx64_openblas + - liblapack 3.9.0 24_linuxaarch64_openblas + - liblapacke 3.9.0 24_linuxaarch64_openblas + - libcblas 3.9.0 24_linuxaarch64_openblas - blas * openblas - - libcblas 3.9.0 25_osx64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15952 - timestamp: 1729643159199 + size: 14991 + timestamp: 1726668539439 - kind: conda name: libblas version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 + build: 24_osxarm64_openblas + build_number: 24 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda - sha256: f1fb9a11af0b2878bd8804b4c77d3733c40076218bcbdb35f575b1c0c9fddf11 - md5: f8cf4d920ff36ce471619010eff59cac + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-24_osxarm64_openblas.conda + sha256: 4739f7463efb12e6d71536d8b0285a8de5aaadcc442bfedb9d92d1b4cbc47847 + md5: 35cb711e7bc46ee5f3dd67af99ad1986 depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: + - liblapack 3.9.0 24_osxarm64_openblas - blas * openblas - - liblapack 3.9.0 25_osxarm64_openblas - - liblapacke 3.9.0 25_osxarm64_openblas - - libcblas 3.9.0 25_osxarm64_openblas + - liblapacke 3.9.0 24_osxarm64_openblas + - libcblas 3.9.0 24_osxarm64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15913 - timestamp: 1729643265495 + size: 15144 + timestamp: 1726668802976 - kind: conda name: libblas version: 3.9.0 - build: 25_win64_mkl - build_number: 25 + build: 24_win64_mkl + build_number: 24 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-25_win64_mkl.conda - sha256: 5468bb91c44b41ce060bbd997c797b2f91e2b7ce91a7cbf4ddf7e7b734a8dc98 - md5: 499208e81242efb6e5abc7366c91c816 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-24_win64_mkl.conda + sha256: 8b4cd602ae089d8c5832054ead452d6a1820c8f9c3b190faf3e867f5939810e2 + md5: ea127210707251a33116b437c22b8dad depends: - - mkl 2024.2.2 h66d3029_14 + - mkl 2024.1.0 h66d3029_694 constrains: - blas * mkl - - libcblas 3.9.0 25_win64_mkl - - liblapack 3.9.0 25_win64_mkl - - liblapacke 3.9.0 25_win64_mkl + - liblapack 3.9.0 24_win64_mkl + - libcblas 3.9.0 24_win64_mkl + - liblapacke 3.9.0 24_win64_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 3736641 - timestamp: 1729643534444 + size: 5183540 + timestamp: 1726669397923 - kind: conda name: libbrotlicommon version: 1.1.0 @@ -22993,103 +22978,103 @@ packages: - kind: conda name: libcblas version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd - md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 + build: 22_osx64_openblas + build_number: 22 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda + sha256: 6a2ba9198e2320c3e22fe3d121310cf8a8ac663e94100c5693b34523fcb3cc04 + md5: b9fef82772330f61b2b0201c72d2c29b depends: - - libblas 3.9.0 25_linux64_openblas + - libblas 3.9.0 22_osx64_openblas constrains: - - liblapack 3.9.0 25_linux64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas + - liblapack 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15613 - timestamp: 1729642905619 + size: 14636 + timestamp: 1712542311437 - kind: conda name: libcblas version: 3.9.0 - build: 25_linuxaarch64_openblas - build_number: 25 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-25_linuxaarch64_openblas.conda - sha256: fde797e5528040fed0e9228dd75331be0cf5cbb0bc63641f53c3cca9eb86ec16 - md5: db6af51123c67814572a8c25542cb368 + build: 24_linux64_openblas + build_number: 24 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda + sha256: 2a52bccc5b03cdf014d856d0b85dbd591faa335ab337d620cd6aded121d7153c + md5: f5b8822297c9c790cec0795ca1fc9be6 depends: - - libblas 3.9.0 25_linuxaarch64_openblas + - libblas 3.9.0 24_linux64_openblas constrains: - blas * openblas - - liblapacke 3.9.0 25_linuxaarch64_openblas - - liblapack 3.9.0 25_linuxaarch64_openblas + - liblapack 3.9.0 24_linux64_openblas + - liblapacke 3.9.0 24_linux64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15700 - timestamp: 1729643006729 + size: 14910 + timestamp: 1726668461033 - kind: conda name: libcblas version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda - sha256: b04ae297aa5396df3135514866db72845b111c92524570f923625473f11cfbe2 - md5: ab304b75ea67f850cf7adf9156e3f62f + build: 24_linuxaarch64_openblas + build_number: 24 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-24_linuxaarch64_openblas.conda + sha256: d7e0e459184ea92a4c0ece4ff5b4088bfa14811e3b650d948befc1cdab82fce2 + md5: fe7560187584eaae4f115d471b62c09c depends: - - libblas 3.9.0 25_osx64_openblas + - libblas 3.9.0 24_linuxaarch64_openblas constrains: - - liblapack 3.9.0 25_osx64_openblas - - liblapacke 3.9.0 25_osx64_openblas + - liblapack 3.9.0 24_linuxaarch64_openblas - blas * openblas + - liblapacke 3.9.0 24_linuxaarch64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15842 - timestamp: 1729643166929 + size: 14901 + timestamp: 1726668544814 - kind: conda name: libcblas version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 + build: 24_osxarm64_openblas + build_number: 24 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda - sha256: d9fa5b6b11252132a3383bbf87bd2f1b9d6248bef1b7e113c2a8ae41b0376218 - md5: 4df0fae81f0b5bf47d48c882b086da11 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-24_osxarm64_openblas.conda + sha256: 40dc3f7c44af5cd5a2020386cb30f92943a9d8f7f54321b4d6ae32b2e54af9a4 + md5: c8977086a19233153e454bb2b332a920 depends: - - libblas 3.9.0 25_osxarm64_openblas + - libblas 3.9.0 24_osxarm64_openblas constrains: + - liblapack 3.9.0 24_osxarm64_openblas - blas * openblas - - liblapack 3.9.0 25_osxarm64_openblas - - liblapacke 3.9.0 25_osxarm64_openblas + - liblapacke 3.9.0 24_osxarm64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15837 - timestamp: 1729643270793 + size: 15062 + timestamp: 1726668809379 - kind: conda name: libcblas version: 3.9.0 - build: 25_win64_mkl - build_number: 25 + build: 24_win64_mkl + build_number: 24 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-25_win64_mkl.conda - sha256: 21528cdfe67dafdb2d21925515a167f13963e002c2b6d06d68984767f731850c - md5: 3ed189ba03a9888a8013aaee0d67c49d + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-24_win64_mkl.conda + sha256: 297e858e9a2e6c4d9846fc101607ad31b778d8bde8591f9207e72d728a9f00a7 + md5: a42c7390d3249698c0ffb6040e9396e7 depends: - - libblas 3.9.0 25_win64_mkl + - libblas 3.9.0 24_win64_mkl constrains: - blas * mkl - - liblapack 3.9.0 25_win64_mkl - - liblapacke 3.9.0 25_win64_mkl + - liblapack 3.9.0 24_win64_mkl + - liblapacke 3.9.0 24_win64_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 3732258 - timestamp: 1729643561581 + size: 5174668 + timestamp: 1726669449378 - kind: conda name: libclang-cpp16 version: 16.0.6 @@ -23166,12 +23151,11 @@ packages: - kind: conda name: libclang-cpp19.1 version: 19.1.2 - build: default_hb5137d0_1 - build_number: 1 + build: default_hb5137d0_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda - sha256: 2638abec6f79942a9176b30b2ea70bd47967e873d3d120822cbab38ab4895c14 - md5: 7e574c7499bc41f92537634a23fed79a + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_0.conda + sha256: faa3cbdf9ee65365eb5990b2687d964e84c3b646768d1aa60cf4ffe7b60c3ee9 + md5: acf8651ac09d19641ab4356abfdf9321 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -23180,17 +23164,16 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 20533631 - timestamp: 1729290507675 + size: 20513187 + timestamp: 1729089419754 - kind: conda name: libclang13 version: 19.1.2 - build: default_h0c68bdf_1 - build_number: 1 + build: default_h0c68bdf_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_1.conda - sha256: 069401db5b26480f380a472efc5991ebdc8a6e55ba0b71cfbb1347a7e68215f3 - md5: 2243d33c31db0d6e6fc00e07959e3f38 + url: https://conda.anaconda.org/conda-forge/osx-64/libclang13-19.1.2-default_h0c68bdf_0.conda + sha256: c8707c8ca484cf1b2eb109e984cedb73f36971b725304aea2c65d4e18d5bdcde + md5: 9332087b40171d1fab092cae9acef003 depends: - __osx >=10.13 - libcxx >=19.1.2 @@ -23198,17 +23181,16 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 8605209 - timestamp: 1729287659101 + size: 8609918 + timestamp: 1729088824957 - kind: conda name: libclang13 version: 19.1.2 - build: default_h4390ef5_1 - build_number: 1 + build: default_h4390ef5_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_1.conda - sha256: 68751a926366aedc38943d8250f45339f7aca37cd82826e826647a90322dcfcb - md5: 0aed30adc7dd7e5929596bde6659785d + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-19.1.2-default_h4390ef5_0.conda + sha256: e8a41317df07438ec53e0cde8359e49079e2a323d47939f3a05cd23a8bb7ad8c + md5: e1add3117a4ef441fbce848afbf3e494 depends: - libgcc >=13 - libllvm19 >=19.1.2,<19.2.0a0 @@ -23216,17 +23198,16 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 11604370 - timestamp: 1729292368607 + size: 11635879 + timestamp: 1729092584736 - kind: conda name: libclang13 version: 19.1.2 - build: default_h5f28f6d_1 - build_number: 1 + build: default_h5f28f6d_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_1.conda - sha256: 550b742557e2c18cc05fddce485a88a015d76bb278d704275bf614ed283709bc - md5: 6f9992d748b402ffeefd0ab66ff24dde + url: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.2-default_h5f28f6d_0.conda + sha256: d68aa07619c3940cb44f7de918d88f0aac25c7ba542eecf64f06541ce286405b + md5: 0c0748ad80812ebe74f3dbff3d12b1d5 depends: - __osx >=11.0 - libcxx >=19.1.2 @@ -23234,17 +23215,16 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 8060643 - timestamp: 1729287131146 + size: 8060638 + timestamp: 1729089081454 - kind: conda name: libclang13 version: 19.1.2 - build: default_h9c6a7e4_1 - build_number: 1 + build: default_h9c6a7e4_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda - sha256: 8a38fb764bf65cc18f03006db6aeb345d390102182db2e46fd3f452a1b2dcfcc - md5: cb5c5ff12b37aded00d9aaa7b9a86a78 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_0.conda + sha256: 67da757df0c1ec71a2b2c5305e1c23eebb417109f07f98294a44c2278e99413c + md5: eadd021430638c34527abacac836fa15 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -23253,17 +23233,16 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 11819644 - timestamp: 1729290739883 + size: 11818612 + timestamp: 1729089619201 - kind: conda name: libclang13 version: 19.1.2 - build: default_ha5278ca_1 - build_number: 1 + build: default_ha5278ca_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_1.conda - sha256: 4349ba29e57a7487e3abe243037dc53185a523afe4d7a889c227e05ab3dfd5b9 - md5: c38f43ef7461c7fac0d5010153ae8d42 + url: https://conda.anaconda.org/conda-forge/win-64/libclang13-19.1.2-default_ha5278ca_0.conda + sha256: 7c12a1ba695ba9b141b346098a1d952bcb9e73d95da3520031eb5ec595c8cda1 + md5: 6cd3eb04dae91fb934782bc29689d3be depends: - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -23273,8 +23252,8 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 26750034 - timestamp: 1729293730509 + size: 26749748 + timestamp: 1729132004115 - kind: conda name: libcrc32c version: 1.1.2 @@ -24408,98 +24387,103 @@ packages: timestamp: 1727968620103 - kind: conda name: libglib - version: 2.82.2 - build: h07bd6cf_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda - sha256: 101fb31c509d6a69ac5d612b51d4088ddbc675fca18cf0c3589cfee26cd01ca0 - md5: 890783f64502fa6bfcdc723cfbf581b4 + version: 2.82.1 + build: h2ff4ddf_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.1-h2ff4ddf_1.conda + sha256: 17eaf179e98847dd834aae75c74753e98026ee5ac818550185896b3b7bc6e76f + md5: 23b2601708f7fd71ceb52b4da41cdd66 depends: - - __osx >=11.0 + - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 + - libgcc >=13 - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 constrains: - - glib 2.82.2 *_0 + - glib 2.82.1 *_1 license: LGPL-2.1-or-later purls: [] - size: 3635416 - timestamp: 1729191799117 + size: 3957261 + timestamp: 1728938307811 - kind: conda name: libglib - version: 2.82.2 - build: h2ff4ddf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 - md5: 13e8e54035ddd2b91875ba399f0f7c04 + version: 2.82.1 + build: h4821c08_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.1-h4821c08_1.conda + sha256: 5494aefb97f3e0f7cbc10ab3573e227dcb436c77d104ecd3c29e6d7543c32eb5 + md5: 277cf745965bba2d70dbeec422cbff40 depends: - - __glibc >=2.17,<3.0.a0 + - __osx >=11.0 - libffi >=3.4,<4.0a0 - - libgcc >=13 - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 constrains: - - glib 2.82.2 *_0 + - glib 2.82.1 *_1 license: LGPL-2.1-or-later purls: [] - size: 3931898 - timestamp: 1729191404130 + size: 3665354 + timestamp: 1728938493765 - kind: conda name: libglib - version: 2.82.2 - build: h7025463_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.2-h7025463_0.conda - sha256: 7dfbf492b736f8d379f8c3b32a823f0bf2167ff69963e4c940339b146a04c54a - md5: 3e379c1b908a7101ecbc503def24613f + version: 2.82.1 + build: h63bbcf2_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.1-h63bbcf2_1.conda + sha256: ce05844cbb162e8f3f0f5d1bd1e4a58171849735bf3230434b0af2d19006a21f + md5: 0eb59ca53a48bac4c191f7ca14863467 depends: + - __osx >=10.13 - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 - libintl >=0.22.5,<1.0a0 - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 constrains: - - glib 2.82.2 *_0 + - glib 2.82.1 *_1 license: LGPL-2.1-or-later purls: [] - size: 3810166 - timestamp: 1729192227078 + size: 3716853 + timestamp: 1728938713441 - kind: conda name: libglib - version: 2.82.2 - build: hb6ef654_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda - sha256: d782be2d8d6784f0b8584ca3cfa93357cddc71b0975560a2bcabd174dac60fff - md5: 2e0511f82f1481210f148e1205fe2482 + version: 2.82.1 + build: h7025463_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.82.1-h7025463_1.conda + sha256: a1954af92405bb45c146672c0cd09c0a2bd0bcd29aa3e664974a8b91f39885ca + md5: db829f9771798d96a75bded46cc830af depends: - - __osx >=10.13 - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 - libintl >=0.22.5,<1.0a0 - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - glib 2.82.2 *_0 + - glib 2.82.1 *_1 license: LGPL-2.1-or-later purls: [] - size: 3692367 - timestamp: 1729191628049 + size: 3805191 + timestamp: 1728938690886 - kind: conda name: libglib - version: 2.82.2 - build: hc486b8e_0 + version: 2.82.1 + build: hc486b8e_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda - sha256: 6797d24de7acd298f81a86078c64e4f3fea6d551a3e8892205c9e72a37a7cc3c - md5: 47f6d85fe47b865e56c539f2ba5f4dad + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.1-hc486b8e_1.conda + sha256: 8172feb1dcc7d1f202d75d92c8208a01e5164907bbeb04cb1801e49599460713 + md5: 4fc2dfe05f7c6c1bf1121353a39ec1f7 depends: - libffi >=3.4,<4.0a0 - libgcc >=13 @@ -24507,11 +24491,11 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 constrains: - - glib 2.82.2 *_0 + - glib 2.82.1 *_1 license: LGPL-2.1-or-later purls: [] - size: 4020802 - timestamp: 1729191545578 + size: 4032190 + timestamp: 1728938351635 - kind: conda name: libglu version: 9.0.0 @@ -25278,203 +25262,203 @@ packages: - kind: conda name: liblapack version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e - md5: 4dc03a53fc69371a6158d0ed37214cd3 + build: 22_osx64_openblas + build_number: 22 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + sha256: e36744f3e780564d6748b5dd05e15ad6a1af9184cf32ab9d1304c13a6bc3e16b + md5: f21b282ff7ba14df6134a0fe6ab42b1b depends: - - libblas 3.9.0 25_linux64_openblas + - libblas 3.9.0 22_osx64_openblas constrains: - - liblapacke 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas + - libcblas 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15608 - timestamp: 1729642910812 + size: 14657 + timestamp: 1712542322711 - kind: conda name: liblapack version: 3.9.0 - build: 25_linuxaarch64_openblas - build_number: 25 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-25_linuxaarch64_openblas.conda - sha256: 2b399e65e0338bf249657b98333e910cd7086ea1332d4d6f303735883ca49318 - md5: 0eb74e81de46454960bde9e44e7ee378 + build: 24_linux64_openblas + build_number: 24 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda + sha256: a15da20c3c0fb5f356e5b4e2f1e87b0da11b9a46805a7f2609bf30f23453831a + md5: fd540578678aefe025705f4b58b36b2e depends: - - libblas 3.9.0 25_linuxaarch64_openblas + - libblas 3.9.0 24_linux64_openblas constrains: - blas * openblas - - liblapacke 3.9.0 25_linuxaarch64_openblas - - libcblas 3.9.0 25_linuxaarch64_openblas + - libcblas 3.9.0 24_linux64_openblas + - liblapacke 3.9.0 24_linux64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15711 - timestamp: 1729643010817 + size: 14911 + timestamp: 1726668467187 - kind: conda name: liblapack version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - sha256: 2a9a6143d103e7e21511cbf439521645bdd506bfabfcac9d6398dd0562c6905c - md5: dda0e24b4605ebbd381e48606a107bed + build: 24_linuxaarch64_openblas + build_number: 24 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-24_linuxaarch64_openblas.conda + sha256: 8bed380952364519a25730ac997c172d2c067726bc57b282f6c924f2b89a3426 + md5: a5ed3c9636f97ac4078cc96e7d79614c depends: - - libblas 3.9.0 25_osx64_openblas + - libblas 3.9.0 24_linuxaarch64_openblas constrains: - - liblapacke 3.9.0 25_osx64_openblas + - liblapacke 3.9.0 24_linuxaarch64_openblas - blas * openblas - - libcblas 3.9.0 25_osx64_openblas + - libcblas 3.9.0 24_linuxaarch64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15852 - timestamp: 1729643174413 + size: 14897 + timestamp: 1726668550136 - kind: conda name: liblapack version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 + build: 24_osxarm64_openblas + build_number: 24 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - sha256: fdd742407672a9af20e70764550cf18b3ab67f12e48bf04163b90492fbc401e7 - md5: 19bbddfec972d401838330453186108d + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-24_osxarm64_openblas.conda + sha256: 67fbfd0466eee443cda9596ed22daabedc96b7b4d1b31f49b1c1b0983dd1dd2c + md5: 49a3241f76cdbe705e346204a328f66c depends: - - libblas 3.9.0 25_osxarm64_openblas + - libblas 3.9.0 24_osxarm64_openblas constrains: - blas * openblas - - liblapacke 3.9.0 25_osxarm64_openblas - - libcblas 3.9.0 25_osxarm64_openblas + - liblapacke 3.9.0 24_osxarm64_openblas + - libcblas 3.9.0 24_osxarm64_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15823 - timestamp: 1729643275943 + size: 15063 + timestamp: 1726668815824 - kind: conda name: liblapack version: 3.9.0 - build: 25_win64_mkl - build_number: 25 + build: 24_win64_mkl + build_number: 24 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-25_win64_mkl.conda - sha256: 98c13a28596389539abe3f608c6fbd2826df47671f77c58a331df878c6140c53 - md5: f716ef84564c574e8e74ae725f5d5f93 + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-24_win64_mkl.conda + sha256: 37dfa34e4c37c7bbb20df61e5badbf42d01e75e687c20be72ab13f80be99ceb9 + md5: c69b7b6756a8d58cc8cf17081fffdc5c depends: - - libblas 3.9.0 25_win64_mkl + - libblas 3.9.0 24_win64_mkl constrains: - blas * mkl - - libcblas 3.9.0 25_win64_mkl - - liblapacke 3.9.0 25_win64_mkl + - libcblas 3.9.0 24_win64_mkl + - liblapacke 3.9.0 24_win64_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 3736560 - timestamp: 1729643588182 + size: 5183452 + timestamp: 1726669499566 - kind: conda name: liblapacke version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda - sha256: f8bc6fe22126ca0bf204c27f829d1e0006069cc98776a33122bf8d0548940b3c - md5: 8f5ead31b3a168aedd488b8a87736c41 + build: 22_osx64_openblas + build_number: 22 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-22_osx64_openblas.conda + sha256: 85309564345d8d7648d4bcb26715004128c2d8c90d6635666ff806b7a3ba8295 + md5: 97be1e168d6657643c9e89fc5dd1fc6d depends: - - libblas 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - liblapack 3.9.0 25_linux64_openblas + - libblas 3.9.0 22_osx64_openblas + - libcblas 3.9.0 22_osx64_openblas + - liblapack 3.9.0 22_osx64_openblas constrains: - blas * openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15609 - timestamp: 1729642916038 + size: 14654 + timestamp: 1712542334599 - kind: conda name: liblapacke version: 3.9.0 - build: 25_linuxaarch64_openblas - build_number: 25 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-25_linuxaarch64_openblas.conda - sha256: f0a591a2ac7e1259971124ddd466ce39da646699decda1a8ab45a2fabd257665 - md5: 1e68063075954830f707b41dab6c7fd8 + build: 24_linux64_openblas + build_number: 24 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-24_linux64_openblas.conda + sha256: fdbdbdd2502de3c5eabe9d33bad0b504ddd1a374d6eaf440506cd61e1eb2f173 + md5: 6db5d87ee60d6c7b5e64d18862a233d5 depends: - - libblas 3.9.0 25_linuxaarch64_openblas - - libcblas 3.9.0 25_linuxaarch64_openblas - - liblapack 3.9.0 25_linuxaarch64_openblas + - libblas 3.9.0 24_linux64_openblas + - libcblas 3.9.0 24_linux64_openblas + - liblapack 3.9.0 24_linux64_openblas constrains: - blas * openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15712 - timestamp: 1729643014949 + size: 14948 + timestamp: 1726668473393 - kind: conda name: liblapacke version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-25_osx64_openblas.conda - sha256: 14e1ec71bd47d63ec32b95801b04d850f12fb8ece3b03483fd36f898336d987b - md5: ddd746770d7811274ba38e0a832e3a50 + build: 24_linuxaarch64_openblas + build_number: 24 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-24_linuxaarch64_openblas.conda + sha256: 76c2b71922ca616191774797513b4d3736f55933272c83e7fafe14f5d5dd0510 + md5: 71432f1b3c394a610ed990635004e04e depends: - - libblas 3.9.0 25_osx64_openblas - - libcblas 3.9.0 25_osx64_openblas - - liblapack 3.9.0 25_osx64_openblas + - libblas 3.9.0 24_linuxaarch64_openblas + - libcblas 3.9.0 24_linuxaarch64_openblas + - liblapack 3.9.0 24_linuxaarch64_openblas constrains: - blas * openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15846 - timestamp: 1729643185849 + size: 14897 + timestamp: 1726668555480 - kind: conda name: liblapacke version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 + build: 24_osxarm64_openblas + build_number: 24 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-25_osxarm64_openblas.conda - sha256: 3db3a803a9295784c1fae97c1397b44f5c1c58472b7b06834d8387ed986778f9 - md5: fe649c1f453f9952a9048b80dc25f92f + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-24_osxarm64_openblas.conda + sha256: f8f462e72ed7f506a01c05ed552cc1b96a781861bf2961a1e67925bff9ae3f9a + md5: bb43697527f0b93d9f2f793a68f6b4ac depends: - - libblas 3.9.0 25_osxarm64_openblas - - libcblas 3.9.0 25_osxarm64_openblas - - liblapack 3.9.0 25_osxarm64_openblas + - libblas 3.9.0 24_osxarm64_openblas + - libcblas 3.9.0 24_osxarm64_openblas + - liblapack 3.9.0 24_osxarm64_openblas constrains: - blas * openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 15836 - timestamp: 1729643281243 + size: 15077 + timestamp: 1726668822406 - kind: conda name: liblapacke version: 3.9.0 - build: 25_win64_mkl - build_number: 25 + build: 24_win64_mkl + build_number: 24 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-25_win64_mkl.conda - sha256: a7a6d417bf963659bdfa6ef6f5604696fb0717f7bed7f594ceb1ceedf7d93d16 - md5: d59fc46f1e1c2f3cf38a08a0a76ffee5 + url: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-24_win64_mkl.conda + sha256: 6651f9f1cbc7e06ed7afceaa762166d3aeea897256a48f81f3e73a774fe89854 + md5: 783f608f74e98ded5a45f767e5022d3a depends: - - libblas 3.9.0 25_win64_mkl - - libcblas 3.9.0 25_win64_mkl - - liblapack 3.9.0 25_win64_mkl + - libblas 3.9.0 24_win64_mkl + - libcblas 3.9.0 24_win64_mkl + - liblapack 3.9.0 24_win64_mkl constrains: - blas * mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 3736581 - timestamp: 1729643615092 + size: 5183421 + timestamp: 1726669550167 - kind: conda name: libllvm16 version: 16.0.6 @@ -25711,89 +25695,92 @@ packages: timestamp: 1729025168222 - kind: conda name: libnghttp2 - version: 1.64.0 - build: h161d5f1_0 + version: 1.58.0 + build: h47da74e_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 - md5: 19e57602824042dfd0446292ef90488b + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda + sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb + md5: 700ac6ea6d53d5510591c4344d5c989a depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.32.3,<2.0a0 + - c-ares >=1.23.0,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 license: MIT license_family: MIT purls: [] - size: 647599 - timestamp: 1729571887612 + size: 631936 + timestamp: 1702130036271 - kind: conda name: libnghttp2 - version: 1.64.0 - build: h6d7220d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f - md5: 3408c02539cee5f1141f9f11450b6a51 + version: 1.58.0 + build: h64cf6d3_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + sha256: 412fd768e787e586602f8e9ea52bf089f3460fc630f6987f0cbd89b70e9a4380 + md5: faecc55c2a8155d9ff1c0ff9a0fef64f depends: - - __osx >=11.0 - - c-ares >=1.34.2,<2.0a0 - - libcxx >=17 + - __osx >=10.9 + - c-ares >=1.23.0,<2.0a0 + - libcxx >=16.0.6 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 license: MIT license_family: MIT purls: [] - size: 566719 - timestamp: 1729572385640 + size: 599736 + timestamp: 1702130398536 - kind: conda name: libnghttp2 - version: 1.64.0 - build: hc7306c3_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda - sha256: 0dcfdcf3a445d2d7de4f3b186ab0a794dc872f4ea21622f9b997be72712c027f - md5: ab21007194b97beade22ceb7a3f6fee5 + version: 1.58.0 + build: ha4dd798_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda + sha256: fc97aaaf0c6d0f508be313d86c2705b490998d382560df24be918b8e977802cd + md5: 1813e066bfcef82de579a0be8a766df4 depends: - - __osx >=10.13 - - c-ares >=1.34.2,<2.0a0 - - libcxx >=17 + - __osx >=10.9 + - c-ares >=1.23.0,<2.0a0 + - libcxx >=16.0.6 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 license: MIT license_family: MIT purls: [] - size: 606663 - timestamp: 1729572019083 + size: 565451 + timestamp: 1702130473930 - kind: conda name: libnghttp2 - version: 1.64.0 - build: hc8609a4_0 + version: 1.58.0 + build: hb0e430d_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda - sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 - md5: f52c614fa214a8bedece9421c771670d + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda + sha256: ecc11e4f92f9d5830a90d42b4db55c66c4ad531e00dcf30d55171d934a568cb5 + md5: 8f724cdddffa79152de61f5564a3526b depends: - - c-ares >=1.32.3,<2.0a0 + - c-ares >=1.23.0,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 license: MIT license_family: MIT purls: [] - size: 714610 - timestamp: 1729571912479 + size: 677508 + timestamp: 1702130071743 - kind: conda name: libnl version: 3.10.0 @@ -25872,83 +25859,86 @@ packages: timestamp: 1609781914458 - kind: conda name: libopenblas - version: 0.3.28 - build: openmp_h517c56d_0 + version: 0.3.27 + build: openmp_h517c56d_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_h517c56d_0.conda - sha256: 43d69d072f1a3774994d31f9d3241cfa0f1c5560b536989020d7cde30fbef956 - md5: 9306fd5b6b39b2b7e13c1d50c3fee354 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + sha256: 46cfcc592b5255262f567cd098be3c61da6bca6c24d640e878dc8342b0f6d069 + md5: 71b8a34d70aa567a990162f327e81505 depends: - __osx >=11.0 - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.28,<0.3.29.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 2934061 - timestamp: 1723931625423 + size: 2925328 + timestamp: 1720425811743 - kind: conda name: libopenblas - version: 0.3.28 - build: openmp_h8869122_0 + version: 0.3.27 + build: openmp_h8869122_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_h8869122_0.conda - sha256: f86ff61991104bfa4fc7725c6d45c29516e7eb504a6d73ee23c50cd208900906 - md5: 6bf3c78f6d014543765570c8e1c65642 + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_h8869122_1.conda + sha256: 83b0b9d3d09889b3648a81d2c18a2d78c405b03b115107941f0496a8b358ce6d + md5: c0798ad76ddd730dade6ff4dff66e0b5 depends: - __osx >=10.13 - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.28,<0.3.29.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 6052706 - timestamp: 1723932292682 + size: 6047513 + timestamp: 1720426759731 - kind: conda name: libopenblas - version: 0.3.28 - build: pthreads_h94d23a6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda - sha256: 1e41a6d63e07be996238a1e840a426f86068956a45e0c0bb24e49a8dad9874c1 - md5: 9ebc9aedafaa2515ab247ff6bb509458 + version: 0.3.27 + build: pthreads_h076ed1e_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda + sha256: 17b74989b2c94d6427d6c3a7a0b7d8e28e1ce34928b021773a1242c10b86d72e + md5: cc0a15e3a6f92f454b6132ca6aca8e8d depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=14 + - libgcc-ng >=12 - libgfortran-ng - - libgfortran5 >=14.1.0 + - libgfortran5 >=12.3.0 constrains: - - openblas >=0.3.28,<0.3.29.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 5572213 - timestamp: 1723932528810 + size: 4290434 + timestamp: 1720425850976 - kind: conda name: libopenblas - version: 0.3.28 - build: pthreads_h9d3fd7e_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_0.conda - sha256: 7b016a2474430c69182216dd930ae68ea608ae1b89153f08ca8b2aad914a6c1b - md5: 554edd2031035f21b042fdbc74429774 + version: 0.3.27 + build: pthreads_hac2b453_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda + sha256: 714cb82d7c4620ea2635a92d3df263ab841676c9b183d0c01992767bb2451c39 + md5: ae05ece66d3924ac3d48b4aa3fa96cec depends: - - libgcc-ng >=14 + - libgcc-ng >=12 - libgfortran-ng - - libgfortran5 >=14.1.0 + - libgfortran5 >=12.3.0 constrains: - - openblas >=0.3.28,<0.3.29.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4793837 - timestamp: 1723932448032 + size: 5563053 + timestamp: 1720426334043 - kind: conda name: libopencv version: 4.10.0 @@ -26052,57 +26042,6 @@ packages: - pkg:pypi/opencv-python-headless?source=hash-mapping size: 21882735 timestamp: 1729146319134 -- kind: conda - name: libopencv - version: 4.10.0 - build: headless_py311hab275b9_10 - build_number: 10 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopencv-4.10.0-headless_py311hab275b9_10.conda - sha256: fb71c3bc53496e8d943c95387c3acf977400f7ba225b5e97caf9ac5359bc8763 - md5: a1a695cb8cf9815258e21e0cb510810a - depends: - - __osx >=10.13 - - ffmpeg >=7.1.0,<8.0a0 - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - hdf5 >=1.14.4,<1.14.5.0a0 - - jasper >=4.2.4,<5.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=17 - - libgettextpo >=0.22.5,<1.0a0 - - libglib >=2.82.2,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - liblapacke >=3.9.0,<4.0a0 - - libopenvino >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-batch-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-hetero-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-cpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-ir-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-onnx-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-paddle-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-pytorch-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-lite-frontend >=2024.4.0,<2024.4.1.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.19,<3 - - openexr >=3.3.1,<3.4.0a0 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/opencv-python?source=hash-mapping - - pkg:pypi/opencv-python-headless?source=hash-mapping - size: 27553662 - timestamp: 1729611073656 - kind: conda name: libopencv version: 4.10.0 @@ -26155,110 +26094,6 @@ packages: - pkg:pypi/opencv-python-headless?source=hash-mapping size: 20081023 timestamp: 1729146542505 -- kind: conda - name: libopencv - version: 4.10.0 - build: headless_py311hc436ff1_10 - build_number: 10 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopencv-4.10.0-headless_py311hc436ff1_10.conda - sha256: 8639c354fc3862e590e973d495178414db8e133bf9542793d9be396b2c47a4b0 - md5: 6cb5c8d2c44f19bc08188664faf26df3 - depends: - - __osx >=11.0 - - ffmpeg >=7.1.0,<8.0a0 - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - hdf5 >=1.14.4,<1.14.5.0a0 - - jasper >=4.2.4,<5.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=17 - - libgettextpo >=0.22.5,<1.0a0 - - libglib >=2.82.2,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - liblapacke >=3.9.0,<4.0a0 - - libopenvino >=2024.4.0,<2024.4.1.0a0 - - libopenvino-arm-cpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-batch-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-hetero-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-ir-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-onnx-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-paddle-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-pytorch-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-lite-frontend >=2024.4.0,<2024.4.1.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.19,<3 - - openexr >=3.3.1,<3.4.0a0 - - python >=3.11,<3.12.0a0 *_cpython - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/opencv-python?source=hash-mapping - - pkg:pypi/opencv-python-headless?source=hash-mapping - size: 21962369 - timestamp: 1729610768240 -- kind: conda - name: libopencv - version: 4.10.0 - build: headless_py311he432950_10 - build_number: 10 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.10.0-headless_py311he432950_10.conda - sha256: 1fc58e8488c43a3f2e733d5cf4bbb2f9e4ee8d857c82c9245148041eb15481ec - md5: 25ffa06b4e8881aeea4bafa13a7d4efb - depends: - - _openmp_mutex >=4.5 - - ffmpeg >=7.1.0,<8.0a0 - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - hdf5 >=1.14.4,<1.14.5.0a0 - - jasper >=4.2.4,<5.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=13 - - libgettextpo >=0.22.5,<1.0a0 - - libglib >=2.82.2,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - liblapacke >=3.9.0,<4.0a0 - - libopenvino >=2024.4.0,<2024.4.1.0a0 - - libopenvino-arm-cpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-batch-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-hetero-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-ir-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-onnx-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-paddle-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-pytorch-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-lite-frontend >=2024.4.0,<2024.4.1.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.19,<3 - - openexr >=3.3.1,<3.4.0a0 - - python >=3.11,<3.12.0a0 *_cpython - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/opencv-python?source=hash-mapping - - pkg:pypi/opencv-python-headless?source=hash-mapping - size: 20077524 - timestamp: 1729610521498 - kind: conda name: libopencv version: 4.10.0 @@ -26316,116 +26151,6 @@ packages: - pkg:pypi/opencv-python-headless?source=hash-mapping size: 30816534 timestamp: 1729146582038 -- kind: conda - name: libopencv - version: 4.10.0 - build: qt6_py311h9c5307e_610 - build_number: 610 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.10.0-qt6_py311h9c5307e_610.conda - sha256: 931a2396d44a77276c2667929a93e234a4c238919cf6eaea555d71ab2b52ec11 - md5: 21a5140a4e65f18c7ace475bf9bdbac5 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - ffmpeg >=7.1.0,<8.0a0 - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - hdf5 >=1.14.4,<1.14.5.0a0 - - jasper >=4.2.4,<5.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libcblas >=3.9.0,<4.0a0 - - libegl >=1.7.0,<2.0a0 - - libgcc >=13 - - libgettextpo >=0.22.5,<1.0a0 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.82.2,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - liblapacke >=3.9.0,<4.0a0 - - libopenvino >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-batch-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-hetero-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-cpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-gpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-npu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-ir-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-onnx-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-paddle-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-pytorch-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-lite-frontend >=2024.4.0,<2024.4.1.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.19,<3 - - openexr >=3.3.1,<3.4.0a0 - - qt6-main >=6.7.3,<6.8.0a0 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/opencv-python?source=hash-mapping - - pkg:pypi/opencv-python-headless?source=hash-mapping - size: 30890852 - timestamp: 1729610413162 -- kind: conda - name: libopencv - version: 4.10.0 - build: qt6_py311hc6c75a9_610 - build_number: 610 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopencv-4.10.0-qt6_py311hc6c75a9_610.conda - sha256: 3046e3161ff3a4c1f4f40176d31ac348e97ea577c86825e2664745fda009d30a - md5: ea652f5f45376724dee57352473fb659 - depends: - - ffmpeg >=7.1.0,<8.0a0 - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - hdf5 >=1.14.4,<1.14.5.0a0 - - jasper >=4.2.4,<5.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgettextpo >=0.22.5,<1.0a0 - - libglib >=2.82.2,<3.0a0 - - libintl >=0.22.5,<1.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - liblapacke >=3.9.0,<4.0a0 - - libopenvino >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-batch-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-auto-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-hetero-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-cpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-intel-gpu-plugin >=2024.4.0,<2024.4.1.0a0 - - libopenvino-ir-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-onnx-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-paddle-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-pytorch-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-frontend >=2024.4.0,<2024.4.1.0a0 - - libopenvino-tensorflow-lite-frontend >=2024.4.0,<2024.4.1.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.19,<3 - - openexr >=3.3.1,<3.4.0a0 - - qt6-main >=6.7.3,<6.8.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/opencv-python?source=hash-mapping - - pkg:pypi/opencv-python-headless?source=hash-mapping - size: 33036784 - timestamp: 1729611203634 - kind: conda name: libopencv version: 4.10.0 @@ -26513,23 +26238,6 @@ packages: purls: [] size: 4231912 timestamp: 1727735006500 -- kind: conda - name: libopenvino - version: 2024.4.0 - build: h84cb933_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-2024.4.0-h84cb933_2.conda - sha256: 7cddc199a26c7d2889b0dbd025726a49978bfc47166ca464d740942e4f600610 - md5: 2dbab95dc55ef0be83138374220e3cd6 - depends: - - __osx >=10.15 - - libcxx >=17 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 4243159 - timestamp: 1729589312735 - kind: conda name: libopenvino version: 2024.4.0 @@ -26548,41 +26256,6 @@ packages: purls: [] size: 5362939 timestamp: 1727739762768 -- kind: conda - name: libopenvino - version: 2024.4.0 - build: hac27bb2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_2.conda - sha256: 1f804b6238951d59b3a431c2e01bd831d44e015ea6835809775bb60b6978e3b3 - md5: ba5ac0bb9ec5aec38dec37c230b12d64 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 5362131 - timestamp: 1729594675874 -- kind: conda - name: libopenvino - version: 2024.4.0 - build: hbfeda7a_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2024.4.0-hbfeda7a_2.conda - sha256: 372064e0ae774b50ce66522699648b3115837afad6261d7a6dec447b701611d2 - md5: bfb018530a5e9beacd8ef7d01ce01708 - depends: - - __osx >=11.0 - - libcxx >=17 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 3947154 - timestamp: 1729589796148 - kind: conda name: libopenvino version: 2024.4.0 @@ -26600,23 +26273,6 @@ packages: purls: [] size: 4907367 timestamp: 1727736165150 -- kind: conda - name: libopenvino - version: 2024.4.0 - build: hd7d4d4f_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2024.4.0-hd7d4d4f_2.conda - sha256: fa92fa4e9da3cb1a6ac37004c0f63922e62d3b2fe631385c923436a51d76005e - md5: 842ca0bee620b70ce30d397d7eb47d26 - depends: - - libgcc >=13 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 4902384 - timestamp: 1729590142049 - kind: conda name: libopenvino version: 2024.4.0 @@ -26635,24 +26291,6 @@ packages: purls: [] size: 3323185 timestamp: 1727742797259 -- kind: conda - name: libopenvino - version: 2024.4.0 - build: hfe1841e_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-2024.4.0-hfe1841e_2.conda - sha256: eb24dc441b6234a7f2259b0f34484cc4ab7b2c0ef37e6a78467772c826b3234d - md5: ca1f434dc9b599772c9a9ba0e10c34e7 - depends: - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 3315154 - timestamp: 1729596416745 - kind: conda name: libopenvino-arm-cpu-plugin version: 2024.4.0 @@ -26671,24 +26309,6 @@ packages: purls: [] size: 7441642 timestamp: 1727734456011 -- kind: conda - name: libopenvino-arm-cpu-plugin - version: 2024.4.0 - build: hbfeda7a_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2024.4.0-hbfeda7a_2.conda - sha256: 1d6119f9012bdf4d5c044bd23ae7bea05fab435e216b9861521b2d241ba186c2 - md5: 76383ff76071f723294edff67968ed18 - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 7430916 - timestamp: 1729589826098 - kind: conda name: libopenvino-arm-cpu-plugin version: 2024.4.0 @@ -26707,24 +26327,6 @@ packages: purls: [] size: 8396025 timestamp: 1727736188890 -- kind: conda - name: libopenvino-arm-cpu-plugin - version: 2024.4.0 - build: hd7d4d4f_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2024.4.0-hd7d4d4f_2.conda - sha256: f8c598062b07f7c7047c1a3fe5479aad30884cf02bbb49842e9fdcd1ed1468fb - md5: e5817f6e796293f49bd94c9ce47b2d69 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 8377593 - timestamp: 1729590158748 - kind: conda name: libopenvino-auto-batch-plugin version: 2024.4.0 @@ -26743,24 +26345,6 @@ packages: purls: [] size: 99710 timestamp: 1727742845056 -- kind: conda - name: libopenvino-auto-batch-plugin - version: 2024.4.0 - build: h04f32e0_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-batch-plugin-2024.4.0-h04f32e0_2.conda - sha256: df72f57fd09be5ec3045ada38c52d96cb5fb3dd5c0b63cf7863da2e7a0f171d1 - md5: 9da7c58a1a74f939ce35072939f6190a - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - tbb >=2021.13.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 99458 - timestamp: 1729596450079 - kind: conda name: libopenvino-auto-batch-plugin version: 2024.4.0 @@ -26779,24 +26363,6 @@ packages: purls: [] size: 111910 timestamp: 1727739789783 -- kind: conda - name: libopenvino-auto-batch-plugin - version: 2024.4.0 - build: h4d9b6c2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_2.conda - sha256: dc596ff555b7ae19a7cd62af8965445575e1441dd486b8aec6a647f9ecbada3a - md5: 1d05a25da36ba5f98291d7237fc6b8ce - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - tbb >=2021.13.0 - purls: [] - size: 111701 - timestamp: 1729594696807 - kind: conda name: libopenvino-auto-batch-plugin version: 2024.4.0 @@ -26831,23 +26397,6 @@ packages: purls: [] size: 105675 timestamp: 1727735029695 -- kind: conda - name: libopenvino-auto-batch-plugin - version: 2024.4.0 - build: h92dab7a_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-batch-plugin-2024.4.0-h92dab7a_2.conda - sha256: 241f05b5f2519e1a18276a91fdf623f07911a8175142d0925574bbc41b192db1 - md5: a0eab88b714e3d6ddcfe7b1b3fa99283 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - tbb >=2021.13.0 - purls: [] - size: 105809 - timestamp: 1729589338818 - kind: conda name: libopenvino-auto-batch-plugin version: 2024.4.0 @@ -26865,40 +26414,6 @@ packages: purls: [] size: 107990 timestamp: 1727736222949 -- kind: conda - name: libopenvino-auto-batch-plugin - version: 2024.4.0 - build: hf15766e_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2024.4.0-hf15766e_2.conda - sha256: f0c1a7e5a5654328c88814590ed53aa98ac6d079d336c3335d9f0ba00d70ffc0 - md5: 1f737fa48eadcbadc5e35cd86c1b0036 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - - tbb >=2021.13.0 - purls: [] - size: 108042 - timestamp: 1729590183012 -- kind: conda - name: libopenvino-auto-batch-plugin - version: 2024.4.0 - build: hf276634_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2024.4.0-hf276634_2.conda - sha256: 1d182574a0987728971e9d119b11bb4cfadf71fde28f0e357e11c7af2b7a82b9 - md5: a8669452d6178b41f9bc9ead21f9b7d3 - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - tbb >=2021.13.0 - purls: [] - size: 104374 - timestamp: 1729589873528 - kind: conda name: libopenvino-auto-plugin version: 2024.4.0 @@ -26917,24 +26432,6 @@ packages: purls: [] size: 194349 timestamp: 1727742884368 -- kind: conda - name: libopenvino-auto-plugin - version: 2024.4.0 - build: h04f32e0_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-auto-plugin-2024.4.0-h04f32e0_2.conda - sha256: 916fad203b281d35cf82264273d4c6a0fe6c86155151ee385a8aeffdc1c8f28f - md5: 6b231f5d7b287a3225ee0fc0e9905e60 - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - tbb >=2021.13.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 193740 - timestamp: 1729596483320 - kind: conda name: libopenvino-auto-plugin version: 2024.4.0 @@ -26953,24 +26450,6 @@ packages: purls: [] size: 237482 timestamp: 1727739801582 -- kind: conda - name: libopenvino-auto-plugin - version: 2024.4.0 - build: h4d9b6c2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_2.conda - sha256: 27b732f1ba3ae7dc8263f59e69447eebabcc76de86e2ec4c9722842a1d2f4aa8 - md5: 838b2db868f9ab69a7bad9c065a3362d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - tbb >=2021.13.0 - purls: [] - size: 237694 - timestamp: 1729594707449 - kind: conda name: libopenvino-auto-plugin version: 2024.4.0 @@ -27005,23 +26484,6 @@ packages: purls: [] size: 217416 timestamp: 1727735046115 -- kind: conda - name: libopenvino-auto-plugin - version: 2024.4.0 - build: h92dab7a_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-auto-plugin-2024.4.0-h92dab7a_2.conda - sha256: b69690a03c940e00e3d373c5d31131745a54f4cb40b51826d53e3a6cc95c6676 - md5: 4492ac7a52a13ed860ade97d1353c890 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - tbb >=2021.13.0 - purls: [] - size: 218057 - timestamp: 1729589358476 - kind: conda name: libopenvino-auto-plugin version: 2024.4.0 @@ -27039,74 +26501,6 @@ packages: purls: [] size: 224280 timestamp: 1727736262029 -- kind: conda - name: libopenvino-auto-plugin - version: 2024.4.0 - build: hf15766e_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2024.4.0-hf15766e_2.conda - sha256: 2de62ad880f30283778fa9c148b6e9095a206f0a1f0fb6b6d5f7bcaf9572d184 - md5: 040cfcec2cccffd2599ba746d8dac9a6 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - - tbb >=2021.13.0 - purls: [] - size: 224080 - timestamp: 1729590192079 -- kind: conda - name: libopenvino-auto-plugin - version: 2024.4.0 - build: hf276634_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2024.4.0-hf276634_2.conda - sha256: 52c22114bd16956d5a810c9dc9a624a53446578a872a2cdb4188333256b04dac - md5: 0a6f2709c335049b804d7ce23c1dc46f - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - tbb >=2021.13.0 - purls: [] - size: 211623 - timestamp: 1729589895613 -- kind: conda - name: libopenvino-hetero-plugin - version: 2024.4.0 - build: h03892cd_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2024.4.0-h03892cd_2.conda - sha256: 5ec87af2db01843ed4ecef25485e772b75e77d1b484b459a9ce56c28442b4e56 - md5: cfd28b170b1a6e097a014c4e1f514bdc - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 174162 - timestamp: 1729589920318 -- kind: conda - name: libopenvino-hetero-plugin - version: 2024.4.0 - build: h14156cc_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-hetero-plugin-2024.4.0-h14156cc_2.conda - sha256: 47a1f9ea6c9887c6f04eb2b36231f6466bca2adda5477536e5899c85c187f85b - md5: 3225cf138956bff656e09f88af51aa13 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 181211 - timestamp: 1729589379396 - kind: conda name: libopenvino-hetero-plugin version: 2024.4.0 @@ -27142,24 +26536,6 @@ packages: purls: [] size: 159985 timestamp: 1727742935549 -- kind: conda - name: libopenvino-hetero-plugin - version: 2024.4.0 - build: h372dad0_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-hetero-plugin-2024.4.0-h372dad0_2.conda - sha256: 9e042cb9565bd4df991d2e1d6e04a77afa7a141754d51d634a950abe69a28e7c - md5: 15388e73cd24ba415b36c3b43c849639 - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - pugixml >=1.14,<1.15.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 160127 - timestamp: 1729596509788 - kind: conda name: libopenvino-hetero-plugin version: 2024.4.0 @@ -27178,24 +26554,6 @@ packages: purls: [] size: 197778 timestamp: 1727739813474 -- kind: conda - name: libopenvino-hetero-plugin - version: 2024.4.0 - build: h3f63f65_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_2.conda - sha256: 0c7cd10c9e3d99d6f23e4d7b48cd8e72aeb4a1c7acb801b6ca9add0f87f238d3 - md5: 00a6127960a3f41d4bfcabd35d5fbeec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 197567 - timestamp: 1729594718187 - kind: conda name: libopenvino-hetero-plugin version: 2024.4.0 @@ -27213,23 +26571,6 @@ packages: purls: [] size: 184604 timestamp: 1727736275255 -- kind: conda - name: libopenvino-hetero-plugin - version: 2024.4.0 - build: h6ef32b0_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2024.4.0-h6ef32b0_2.conda - sha256: 215665ba9169a61f30d96c197bf799b85223963af483fdd137f508e7865fa057 - md5: b106de2dc7ebc8cb930061cffbd117e0 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 184694 - timestamp: 1729590203040 - kind: conda name: libopenvino-hetero-plugin version: 2024.4.0 @@ -27265,24 +26606,6 @@ packages: purls: [] size: 11144640 timestamp: 1727735085846 -- kind: conda - name: libopenvino-intel-cpu-plugin - version: 2024.4.0 - build: h84cb933_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-intel-cpu-plugin-2024.4.0-h84cb933_2.conda - sha256: 369d68c966507b3a46562f87462bb17740adfdeb86f02e4a12e9bff2d931d8d2 - md5: 0c91ffaa947cbc17dc3b579b69b2c5d1 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 11143246 - timestamp: 1729589403635 - kind: conda name: libopenvino-intel-cpu-plugin version: 2024.4.0 @@ -27302,25 +26625,6 @@ packages: purls: [] size: 12108325 timestamp: 1727739826180 -- kind: conda - name: libopenvino-intel-cpu-plugin - version: 2024.4.0 - build: hac27bb2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_2.conda - sha256: 5642443645408f030e9dfbe20dbe2c2ab6d852daf02c9a36eac123b44bf2980f - md5: 6cfc840bc39c17d92fb25e5a35789e5b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 12101994 - timestamp: 1729594729554 - kind: conda name: libopenvino-intel-cpu-plugin version: 2024.4.0 @@ -27340,25 +26644,6 @@ packages: purls: [] size: 8038586 timestamp: 1727742976578 -- kind: conda - name: libopenvino-intel-cpu-plugin - version: 2024.4.0 - build: hfe1841e_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-cpu-plugin-2024.4.0-hfe1841e_2.conda - sha256: 4049a7613da003e2f220d976549e4110f501d2feba7f0778483a5504856eec07 - md5: fbacb501be2a46be7dcf20cd299ac53c - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 8031319 - timestamp: 1729596537775 - kind: conda name: libopenvino-intel-gpu-plugin version: 2024.4.0 @@ -27379,26 +26664,6 @@ packages: purls: [] size: 8888831 timestamp: 1727739870204 -- kind: conda - name: libopenvino-intel-gpu-plugin - version: 2024.4.0 - build: hac27bb2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_2.conda - sha256: 508d0e36febebfb66628d8cb0312b4133c212eac1e8d891fc8977e0d85b23741 - md5: 9e9814b40d8fdfd8485451e3fa2f1719 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - ocl-icd >=2.3.2,<3.0a0 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 8885078 - timestamp: 1729594772427 - kind: conda name: libopenvino-intel-gpu-plugin version: 2024.4.0 @@ -27419,26 +26684,6 @@ packages: purls: [] size: 7182614 timestamp: 1727743041822 -- kind: conda - name: libopenvino-intel-gpu-plugin - version: 2024.4.0 - build: hfe1841e_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-intel-gpu-plugin-2024.4.0-hfe1841e_2.conda - sha256: 5e971f5db8eadc20420a7b9f4d9044d38b7daab3d6179ce9d36b2d1f45e43016 - md5: 6d7f9d318217a23933801669f61b5be2 - depends: - - khronos-opencl-icd-loader >=2024.5.8 - - libopenvino 2024.4.0 hfe1841e_2 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 7173636 - timestamp: 1729596587870 - kind: conda name: libopenvino-intel-npu-plugin version: 2024.4.0 @@ -27458,59 +26703,6 @@ packages: purls: [] size: 799441 timestamp: 1727739906554 -- kind: conda - name: libopenvino-intel-npu-plugin - version: 2024.4.0 - build: hac27bb2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_2.conda - sha256: a07bdb55c3214cd5b27736ee6d06abe55782ddf1cfaeb9fffee96179bf12390b - md5: 724719ce97feb6f310f88ae8dbb40afd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - - tbb >=2021.13.0 - purls: [] - size: 799335 - timestamp: 1729594804720 -- kind: conda - name: libopenvino-ir-frontend - version: 2024.4.0 - build: h03892cd_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2024.4.0-h03892cd_2.conda - sha256: 60026c3fe4655c210bde3c447ab84c8f23c9794657f4ea758f27427983056b90 - md5: 928ecc20581599707acda5c5434bf98d - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 173928 - timestamp: 1729589940535 -- kind: conda - name: libopenvino-ir-frontend - version: 2024.4.0 - build: h14156cc_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-ir-frontend-2024.4.0-h14156cc_2.conda - sha256: a665badcd30db3dddd46f18e1fb3a7f58513a49859d2cafddf554045dc4b9960 - md5: fa87ea4e22a4b782f0a1bff5f983afcd - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 182877 - timestamp: 1729589458940 - kind: conda name: libopenvino-ir-frontend version: 2024.4.0 @@ -27546,24 +26738,6 @@ packages: purls: [] size: 158232 timestamp: 1727743098747 -- kind: conda - name: libopenvino-ir-frontend - version: 2024.4.0 - build: h372dad0_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-ir-frontend-2024.4.0-h372dad0_2.conda - sha256: d6d7f9d2fcbdffc39a2256c838c3b26a0826330576b844e48f5f050551887032 - md5: 63b4d6cbf08c634fe74b428811204368 - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - pugixml >=1.14,<1.15.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 157792 - timestamp: 1729596630667 - kind: conda name: libopenvino-ir-frontend version: 2024.4.0 @@ -27582,24 +26756,6 @@ packages: purls: [] size: 205142 timestamp: 1727739919196 -- kind: conda - name: libopenvino-ir-frontend - version: 2024.4.0 - build: h3f63f65_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_2.conda - sha256: 6038aefea84aeb9534aaf6963d2b266eb757fa36c1a7a9f5e29d6d813bd85a2c - md5: 8908f31eab30f65636eb61ab9cb1f3ad - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 204163 - timestamp: 1729594816408 - kind: conda name: libopenvino-ir-frontend version: 2024.4.0 @@ -27617,23 +26773,6 @@ packages: purls: [] size: 192039 timestamp: 1727736288484 -- kind: conda - name: libopenvino-ir-frontend - version: 2024.4.0 - build: h6ef32b0_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2024.4.0-h6ef32b0_2.conda - sha256: 846de69b4e387684857d824974e07a42213781d6519ab59a7bca768d94c49736 - md5: 60f6f88fa0b0cda9c635963aef4013d7 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - - pugixml >=1.14,<1.15.0a0 - purls: [] - size: 192130 - timestamp: 1729590212150 - kind: conda name: libopenvino-ir-frontend version: 2024.4.0 @@ -27690,65 +26829,6 @@ packages: purls: [] size: 991756 timestamp: 1727743145820 -- kind: conda - name: libopenvino-onnx-frontend - version: 2024.4.0 - build: h5c8f2c3_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-h5c8f2c3_2.conda - sha256: b68c2ee5fd08c0974ad9395ea0de809b306c261485114cbcbbc0f55c1e0285b3 - md5: e098caa87868e8dcc7ed5d011981207d - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - purls: [] - size: 1559399 - timestamp: 1729594827815 -- kind: conda - name: libopenvino-onnx-frontend - version: 2024.4.0 - build: h7d5e7ba_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-onnx-frontend-2024.4.0-h7d5e7ba_2.conda - sha256: 4565e94965d036c9964dd1368a1150c872c1f13e57c08b7e7d683a9b0fafc62c - md5: 6ac156a9f05804265b464eec179e75a7 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libopenvino 2024.4.0 hfe1841e_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 991143 - timestamp: 1729596659689 -- kind: conda - name: libopenvino-onnx-frontend - version: 2024.4.0 - build: h7f5a098_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2024.4.0-h7f5a098_2.conda - sha256: 6f7e9871a71e06e8dae9f2cd43db209fdbe4f957ac778cc7f0f0bed556e04f26 - md5: 26dcc0a3c16a97c717f88981472db4aa - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - purls: [] - size: 1227299 - timestamp: 1729589977734 - kind: conda name: libopenvino-onnx-frontend version: 2024.4.0 @@ -27768,44 +26848,6 @@ packages: purls: [] size: 1281366 timestamp: 1727735162793 -- kind: conda - name: libopenvino-onnx-frontend - version: 2024.4.0 - build: haa99d6a_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2024.4.0-haa99d6a_2.conda - sha256: e33692a3da876040d877c207290e7df5bef56639466769cb7fdec935754e699d - md5: a626d0a2138aea9e65f978e936069fe5 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - purls: [] - size: 1404356 - timestamp: 1729590221767 -- kind: conda - name: libopenvino-onnx-frontend - version: 2024.4.0 - build: he28f95a_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-onnx-frontend-2024.4.0-he28f95a_2.conda - sha256: 63542752306ef2fa873074bb65b8166bdccfd76c2012e3460147334edf318b5b - md5: bc40f66f9d366cac822c806d330af921 - depends: - - __osx >=10.15 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - purls: [] - size: 1281082 - timestamp: 1729589492958 - kind: conda name: libopenvino-onnx-frontend version: 2024.4.0 @@ -27884,65 +26926,6 @@ packages: purls: [] size: 419305 timestamp: 1727743190562 -- kind: conda - name: libopenvino-paddle-frontend - version: 2024.4.0 - build: h5c8f2c3_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-h5c8f2c3_2.conda - sha256: fa57b201fb92af0adc2118de8e92648959b98c0dc1a60b278ba2b79c5601eea6 - md5: 59bb8c3502cb9d35f1fb26691730288c - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - purls: [] - size: 653105 - timestamp: 1729594841297 -- kind: conda - name: libopenvino-paddle-frontend - version: 2024.4.0 - build: h7d5e7ba_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-paddle-frontend-2024.4.0-h7d5e7ba_2.conda - sha256: 49700da26843986434f340b44407eb742f3128cc73392d1f3b050bca3321b1a8 - md5: 2601cb643104e143a84eedde3b9d4689 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libopenvino 2024.4.0 hfe1841e_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 419425 - timestamp: 1729596690710 -- kind: conda - name: libopenvino-paddle-frontend - version: 2024.4.0 - build: h7f5a098_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2024.4.0-h7f5a098_2.conda - sha256: 4bc7994673c5b7bfe700ca6297f563d7f535403ba28178e6b7f4d54959534aa2 - md5: c109c0314b83a852d7c85a91b98b277f - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - purls: [] - size: 418862 - timestamp: 1729590007426 - kind: conda name: libopenvino-paddle-frontend version: 2024.4.0 @@ -27962,44 +26945,6 @@ packages: purls: [] size: 427045 timestamp: 1727735182582 -- kind: conda - name: libopenvino-paddle-frontend - version: 2024.4.0 - build: haa99d6a_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2024.4.0-haa99d6a_2.conda - sha256: 43c3ef7aeb90bcafe93e3946c063d72dc82933818eff7f9eb7a5b51bad430703 - md5: 75480960fe1dfcfc5f8eeea26e56b4be - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - purls: [] - size: 605764 - timestamp: 1729590232511 -- kind: conda - name: libopenvino-paddle-frontend - version: 2024.4.0 - build: he28f95a_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-paddle-frontend-2024.4.0-he28f95a_2.conda - sha256: 6b59752d19e7082b05c4e1fa62fd597bafad952c974fedd3452ea7a37e9d20e1 - md5: 3da602a667ba557a94d42944216bfc39 - depends: - - __osx >=10.15 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - purls: [] - size: 427736 - timestamp: 1729589516305 - kind: conda name: libopenvino-paddle-frontend version: 2024.4.0 @@ -28055,22 +27000,6 @@ packages: purls: [] size: 788511 timestamp: 1727735199787 -- kind: conda - name: libopenvino-pytorch-frontend - version: 2024.4.0 - build: h5833ebf_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2024.4.0-h5833ebf_2.conda - sha256: 2b6ee15f5b2f44331c5e161cff01c15b2b109582131f73c6557666748633faac - md5: 31f2b940f1c0a5390353b10b72449832 - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - purls: [] - size: 766073 - timestamp: 1729590028174 - kind: conda name: libopenvino-pytorch-frontend version: 2024.4.0 @@ -28088,23 +27017,6 @@ packages: purls: [] size: 1075147 timestamp: 1727739960801 -- kind: conda - name: libopenvino-pytorch-frontend - version: 2024.4.0 - build: h5888daf_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_2.conda - sha256: a029b3ebff1e8d1d2736a548a616c20066ed6508f238782afbf3a77a4f57c6cd - md5: e0b88fd64dc95f715ef52e607a9af89b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - purls: [] - size: 1075090 - timestamp: 1729594854413 - kind: conda name: libopenvino-pytorch-frontend version: 2024.4.0 @@ -28121,38 +27033,6 @@ packages: purls: [] size: 996782 timestamp: 1727736334613 -- kind: conda - name: libopenvino-pytorch-frontend - version: 2024.4.0 - build: h5ad3122_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2024.4.0-h5ad3122_2.conda - sha256: e86b89a8d7fda8d1015abc1918a23785310348f64b73012e1ea87a639e27a14a - md5: fbeb65db200c04bac9e95ad05b859161 - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - purls: [] - size: 996903 - timestamp: 1729590242095 -- kind: conda - name: libopenvino-pytorch-frontend - version: 2024.4.0 - build: hc3d39de_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-pytorch-frontend-2024.4.0-hc3d39de_2.conda - sha256: b336c446fc28c07e832424c96758f244f3fae1d63968129f9948d023a86951be - md5: 55223d989ddad9d8908ec1310b28b0f8 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - purls: [] - size: 788593 - timestamp: 1729589537016 - kind: conda name: libopenvino-pytorch-frontend version: 2024.4.0 @@ -28170,23 +27050,6 @@ packages: purls: [] size: 677864 timestamp: 1727743230045 -- kind: conda - name: libopenvino-pytorch-frontend - version: 2024.4.0 - build: he0c23c2_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-pytorch-frontend-2024.4.0-he0c23c2_2.conda - sha256: 2ed421b6874a1cc924d4a304161a38e5228588822f7833bcedcfdf188bab4e7e - md5: 61bc081531072227ff4ef79110578933 - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 677080 - timestamp: 1729596717862 - kind: conda name: libopenvino-pytorch-frontend version: 2024.4.0 @@ -28223,47 +27086,6 @@ packages: purls: [] size: 932670 timestamp: 1727734671391 -- kind: conda - name: libopenvino-tensorflow-frontend - version: 2024.4.0 - build: h488aad4_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-frontend-2024.4.0-h488aad4_2.conda - sha256: 15633c02ffb36dc695f653b06c74e723610b8d4de45a812f0cb950bb32e45a31 - md5: 9dc93ef2d110b5b5268627d8c879e6a8 - depends: - - __osx >=10.15 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - snappy >=1.2.1,<1.3.0a0 - purls: [] - size: 976222 - timestamp: 1729589585972 -- kind: conda - name: libopenvino-tensorflow-frontend - version: 2024.4.0 - build: h6481b9d_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h6481b9d_2.conda - sha256: fdc4871a05bbb61cfe6db1e60018d74cbd6d65d82f03b9be515c3ad41bb7ca04 - md5: 12bf831b85f17368bc71a26ac93a8493 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - - snappy >=1.2.1,<1.3.0a0 - purls: [] - size: 1282840 - timestamp: 1729594867098 - kind: conda name: libopenvino-tensorflow-frontend version: 2024.4.0 @@ -28284,27 +27106,6 @@ packages: purls: [] size: 1192551 timestamp: 1727736349937 -- kind: conda - name: libopenvino-tensorflow-frontend - version: 2024.4.0 - build: h7d689a8_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-frontend-2024.4.0-h7d689a8_2.conda - sha256: 4a8e8b7f55a8cb7867a7fad550feeac0e48b51428b5aa6aef65bdcb5ee9fe5b9 - md5: 311bf783bf1677e63d8fbd10545856da - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libopenvino 2024.4.0 hfe1841e_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - snappy >=1.2.1,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 877353 - timestamp: 1729596749023 - kind: conda name: libopenvino-tensorflow-frontend version: 2024.4.0 @@ -28326,26 +27127,6 @@ packages: purls: [] size: 1281944 timestamp: 1727739974736 -- kind: conda - name: libopenvino-tensorflow-frontend - version: 2024.4.0 - build: h9d544f2_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2024.4.0-h9d544f2_2.conda - sha256: 577dff3fa81c389878312200a649b4360f44430c4aaf06c93c8f827256b5c6ac - md5: 9acac136a616aa3f36fd317eb9ff821a - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - snappy >=1.2.1,<1.3.0a0 - purls: [] - size: 932555 - timestamp: 1729590076653 - kind: conda name: libopenvino-tensorflow-frontend version: 2024.4.0 @@ -28366,26 +27147,6 @@ packages: purls: [] size: 975929 timestamp: 1727735239249 -- kind: conda - name: libopenvino-tensorflow-frontend - version: 2024.4.0 - build: he24a241_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2024.4.0-he24a241_2.conda - sha256: d7f2247da62e2605f768694144100637afff046989aa6b5d4aff8bc74cdeffbc - md5: 91a86ff710cd96f4241ef18aa594a764 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - libstdcxx >=13 - - snappy >=1.2.1,<1.3.0a0 - purls: [] - size: 1192974 - timestamp: 1729590252604 - kind: conda name: libopenvino-tensorflow-frontend version: 2024.4.0 @@ -28423,22 +27184,6 @@ packages: purls: [] size: 369174 timestamp: 1727735257807 -- kind: conda - name: libopenvino-tensorflow-lite-frontend - version: 2024.4.0 - build: h5833ebf_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5833ebf_2.conda - sha256: 0583c58e6c6796f7c756a10937fa6c7a1c52b1afc1f75451c4690a38ec57f7fd - md5: e6b793ea4b5dc41ea6ae1dfc65becabc - depends: - - __osx >=11.0 - - libcxx >=17 - - libopenvino 2024.4.0 hbfeda7a_2 - purls: [] - size: 369779 - timestamp: 1729590097301 - kind: conda name: libopenvino-tensorflow-lite-frontend version: 2024.4.0 @@ -28456,23 +27201,6 @@ packages: purls: [] size: 466688 timestamp: 1727739988327 -- kind: conda - name: libopenvino-tensorflow-lite-frontend - version: 2024.4.0 - build: h5888daf_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_2.conda - sha256: a8f26058cf57159492c63fb0622ea2858763ea22338c507ff40a6e9bb792295e - md5: d48c774c40ea2047adbff043e9076e7a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libopenvino 2024.4.0 hac27bb2_2 - - libstdcxx >=13 - purls: [] - size: 466563 - timestamp: 1729594879557 - kind: conda name: libopenvino-tensorflow-lite-frontend version: 2024.4.0 @@ -28489,38 +27217,6 @@ packages: purls: [] size: 429769 timestamp: 1727736364966 -- kind: conda - name: libopenvino-tensorflow-lite-frontend - version: 2024.4.0 - build: h5ad3122_2 - build_number: 2 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5ad3122_2.conda - sha256: b67b4c74e97a810a902e4aa81a173db9281955270dae2890afc29320df7659ae - md5: a3f82dbd3189dffd49ed67216f21e35a - depends: - - libgcc >=13 - - libopenvino 2024.4.0 hd7d4d4f_2 - - libstdcxx >=13 - purls: [] - size: 430404 - timestamp: 1729590264452 -- kind: conda - name: libopenvino-tensorflow-lite-frontend - version: 2024.4.0 - build: hc3d39de_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenvino-tensorflow-lite-frontend-2024.4.0-hc3d39de_2.conda - sha256: 9076a899090bb8f9f9d5c2ef5c0d2c46f69570af4b5b3f6b46870f36e62cf1de - md5: ac195e5406bc31fd5650208d88def549 - depends: - - __osx >=10.15 - - libcxx >=17 - - libopenvino 2024.4.0 h84cb933_2 - purls: [] - size: 368215 - timestamp: 1729589610964 - kind: conda name: libopenvino-tensorflow-lite-frontend version: 2024.4.0 @@ -28538,23 +27234,6 @@ packages: purls: [] size: 324141 timestamp: 1727743317824 -- kind: conda - name: libopenvino-tensorflow-lite-frontend - version: 2024.4.0 - build: he0c23c2_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libopenvino-tensorflow-lite-frontend-2024.4.0-he0c23c2_2.conda - sha256: e2f6c8c63b3c4a3800a0f8bab558cf7075822a3aa105399cf0c26c1137b02b5a - md5: 06f6a53a17c793422a1f3c6ca2bd7a74 - depends: - - libopenvino 2024.4.0 hfe1841e_2 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - purls: [] - size: 324037 - timestamp: 1729596776958 - kind: conda name: libopenvino-tensorflow-lite-frontend version: 2024.4.0 @@ -28651,15 +27330,15 @@ packages: - kind: conda name: libparquet version: 14.0.2 - build: h21a6562_48_cpu - build_number: 48 + build: h21a6562_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_48_cpu.conda - sha256: 1374b0b00be9d45819e4a3378632b46b79a416aa9868e37f35557d9a5b10ebfc - md5: c0de2efe8ea40e8d90a8afb853a40938 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-14.0.2-h21a6562_47_cpu.conda + sha256: fba337d07eeb815bef112d9219a6e72acf0873c528b774e1614c6a77fc6ed067 + md5: d5058290d842048ef0020e9f3ee74bb3 depends: - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 h6f9f739_48_cpu + - libarrow 14.0.2 h987bebd_47_cpu - libgcc >=13 - libstdcxx >=13 - libthrift >=0.21.0,<0.21.1.0a0 @@ -28667,39 +27346,39 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 1101839 - timestamp: 1729668848492 + size: 1101216 + timestamp: 1728664983765 - kind: conda name: libparquet version: 14.0.2 - build: h2be9fba_48_cpu - build_number: 48 + build: h2be9fba_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_48_cpu.conda - sha256: 7eb4829951b1153c8a0f25db691a4594975500d2ffc98b0534a924456100b01f - md5: 79c58d3cf32740d828f547c72de035f2 + url: https://conda.anaconda.org/conda-forge/osx-64/libparquet-14.0.2-h2be9fba_47_cpu.conda + sha256: 4c93858a128eaa323a02be84a4849940b068677758fd4b81c89ea2ecb5ad0edd + md5: 7ddcc301e6f3b432abbb4c64830cb102 depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu - libcxx >=17 - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 925575 - timestamp: 1729671380285 + size: 927020 + timestamp: 1728665338750 - kind: conda name: libparquet version: 14.0.2 - build: h59f2d37_48_cpu - build_number: 48 + build: h59f2d37_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_48_cpu.conda - sha256: 7e9d2031e0b5e8f48748c6cd779b7975a54ddb43154edd346767e3681f156d22 - md5: f241c4760d92b856ca1db83fbaa743c0 + url: https://conda.anaconda.org/conda-forge/win-64/libparquet-14.0.2-h59f2d37_47_cpu.conda + sha256: cc9e2c640c50d3b7191c8a33280baed3682558b3c1300dd746301a089bc602e8 + md5: 9a90fb42f22e7a2800772226ef910e8e depends: - - libarrow 14.0.2 h607190a_48_cpu + - libarrow 14.0.2 h7c049e1_47_cpu - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.3.2,<4.0a0 - ucrt >=10.0.20348.0 @@ -28708,41 +27387,41 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 784764 - timestamp: 1729670909879 + size: 784336 + timestamp: 1728666006062 - kind: conda name: libparquet version: 14.0.2 - build: h8aa6169_48_cpu - build_number: 48 + build: h8aa6169_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_48_cpu.conda - sha256: 63b7d6c3a16596547f0669b10f9fa180d5c3275cfbceb4a271825a006f10226a - md5: e8199371ea4978d4fdfc32da7c062171 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-14.0.2-h8aa6169_47_cpu.conda + sha256: a1c5354882bab38e040349779fa3d786cd9c85a1f4ae4f21a0c01a657bd5bedf + md5: 76617ce6c075340ba45a67bb53267d96 depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu - libcxx >=17 - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.3.2,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 868899 - timestamp: 1729670157679 + size: 868893 + timestamp: 1728665863313 - kind: conda name: libparquet version: 14.0.2 - build: hd082c85_48_cpu - build_number: 48 + build: hd082c85_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_48_cpu.conda - sha256: d5f00e97a49419691bf9e724be2086629cca94eb53111e8213382e96e239e88c - md5: 0530fd302b2514394d92e5c29056ea1e + url: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-hd082c85_47_cpu.conda + sha256: 5373891415d7939c0666ec1e7cf381ad940d89c08fc06620a7b1d64fff785bec + md5: 3dfae9ac1778d6e5113c32acf3dc8c21 depends: - __glibc >=2.17,<3.0.a0 - gflags >=2.2.2,<2.3.0a0 - - libarrow 14.0.2 ha84fcd3_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu - libgcc >=13 - libstdcxx >=13 - libthrift >=0.21.0,<0.21.1.0a0 @@ -28750,8 +27429,8 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 1181527 - timestamp: 1729668847731 + size: 1181697 + timestamp: 1728664694634 - kind: conda name: libpciaccess version: '0.18' @@ -28967,103 +27646,6 @@ packages: purls: [] size: 6090012 timestamp: 1727424307861 -- kind: conda - name: libprotobuf - version: 5.28.2 - build: h029595c_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.2-h029595c_0.conda - sha256: d8c7b6f851bfc53494d9b8e54d473c4f11ab26483a6e64df6f7967563df166b1 - md5: 538dbe0ad9f248e2e109abb9b6809ea5 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2802876 - timestamp: 1728564881988 -- kind: conda - name: libprotobuf - version: 5.28.2 - build: h5b01275_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda - sha256: 5e8fd4aa00193c85602ce6101dd28fe31306dff85c9725048f6dc828dfa7c421 - md5: ab0bff36363bec94720275a681af8b83 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2945348 - timestamp: 1728565355702 -- kind: conda - name: libprotobuf - version: 5.28.2 - build: h8b30cf6_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.2-h8b30cf6_0.conda - sha256: e240c2003e301ede0a0f4af7688adb8456559ffaa4af2eed3fce879c22c80a0e - md5: 2302089e5bcb04ce891ce765c963befb - depends: - - __osx >=10.13 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2428926 - timestamp: 1728565541606 -- kind: conda - name: libprotobuf - version: 5.28.2 - build: h8f0b736_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.2-h8f0b736_0.conda - sha256: f732a6fa918428e2d5ba61e78fe11bb44a002cc8f6bb74c94ee5b1297fefcfd8 - md5: d2cb5991f2fb8eb079c80084435e9ce6 - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2374965 - timestamp: 1728565334796 -- kind: conda - name: libprotobuf - version: 5.28.2 - build: hcaed137_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-5.28.2-hcaed137_0.conda - sha256: 798c6675fb709ceaa6a9bd83e9cffe06bc98e83f519c7d7d881243d2e6d0c34d - md5: 97c6d2f83edd7b400a22660e2a4d1488 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6033581 - timestamp: 1728565880841 - kind: conda name: libre2-11 version: 2024.07.02 @@ -29207,81 +27789,81 @@ packages: timestamp: 1724801833649 - kind: conda name: libsqlite - version: 3.47.0 + version: 3.46.1 build: h2466b09_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda - sha256: 4f3cd0477c831eab48fb7fa3ed91d918aeb644fad9b4014726d445339750cdcc - md5: 964bef59135d876c596ae67b3315e812 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda + sha256: ef83f90961630bc54a95e48062b05cf9c9173a822ea01784288029613a45eea4 + md5: 8a7c1ad01f58623bfbae8d601db7cf3b depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense purls: [] - size: 884970 - timestamp: 1729592254351 + size: 876666 + timestamp: 1725354171439 - kind: conda name: libsqlite - version: 3.47.0 - build: h2f8c449_0 + version: 3.46.1 + build: h4b8f8c9_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_0.conda - sha256: 6bae3280dc402c9d306275363f3a88f6a667b8e3bfa68859b7928d42f0f1495a - md5: 9dbe833ae53f6756fd87e32bd5fa508e + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda + sha256: 1d075cb823f0cad7e196871b7c57961d669cbbb6cd0e798bf50cbf520dda65fb + md5: 84de0078b58f899fc164303b0603ff0e depends: - __osx >=10.13 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 915473 - timestamp: 1729591970061 + size: 908317 + timestamp: 1725353652135 - kind: conda name: libsqlite - version: 3.47.0 + version: 3.46.1 build: hadc24fc_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda - sha256: 76ffc7a5823b51735c11d535f3666b3c9c7d1519f9fbb6fa9cdff79db01960b9 - md5: 540296f0ce9d3352188c15a89b30b9ac + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda + sha256: 9851c049abafed3ee329d6c7c2033407e2fc269d33a75c071110ab52300002b0 + md5: 36f79405ab16bf271edb55b213836dac depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 874704 - timestamp: 1729591931557 + size: 865214 + timestamp: 1725353659783 - kind: conda name: libsqlite - version: 3.47.0 - build: hbaaea75_0 + version: 3.46.1 + build: hc14010f_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - sha256: 76aa4bbbaa2334689b16048f04ac4c7406e9bfb1f225ac7107fd2a73f85329cf - md5: 5bbe4802d5460b80620411fe1da8fec3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda + sha256: 3725f962f490c5d44dae326d5f5b2e3c97f71a6322d914ccc85b5ddc2e50d120 + md5: 58050ec1724e58668d0126a1615553fa depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 837789 - timestamp: 1729592072314 + size: 829500 + timestamp: 1725353720793 - kind: conda name: libsqlite - version: 3.47.0 + version: 3.46.1 build: hc4a20ef_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda - sha256: 469ed05e9a1622b0204a2b6cf620c9054bf6904e2ed818a1f91ee96a7bc64517 - md5: ccbe261fb8c1f1cd1a3122592247d3c4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda + sha256: b4ee96d292fea6bdfceb34dff5e5f0e4b21a0a3dab0559a21fc4a35dc217764e + md5: cd559337c1bd9545ecbeaad017e7d878 depends: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 1042108 - timestamp: 1729592001716 + size: 1053752 + timestamp: 1725354110633 - kind: conda name: libssh2 version: 1.11.0 @@ -29783,12 +28365,27 @@ packages: timestamp: 1680113474501 - kind: conda name: libuv - version: 1.49.2 + version: 1.49.0 + build: hee94a50_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.0-hee94a50_0.conda + sha256: 78fde5f3a8d959f575e2f9974be4338dc23ab8f3ca3f842dc331141d8a53c3cf + md5: 7bf2331bb296918912506cc06fba82a0 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 415238 + timestamp: 1727283251435 +- kind: conda + name: libuv + version: 1.49.1 build: h2466b09_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.2-h2466b09_0.conda - sha256: d598c536f0e432901ba8b489564799f6f570471b2a3ce9b76e152ee0a961a380 - md5: 30ebb43533efcdc8c357ef409bad86b6 + url: https://conda.anaconda.org/conda-forge/win-64/libuv-1.49.1-h2466b09_0.conda + sha256: 2dbf9f337e980950eed7b3c63a7a8b838fc42c94a7b9315ae778b7afd3e756f1 + md5: 1785e24e029e7f07c69d57f1de7eb14d depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -29796,69 +28393,54 @@ packages: license: MIT license_family: MIT purls: [] - size: 290376 - timestamp: 1729322844056 + size: 289993 + timestamp: 1728653493597 - kind: conda name: libuv - version: 1.49.2 + version: 1.49.1 build: h7ab814d_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - sha256: 0e5176af1e788ad5006cf261c4ea5a288a935fda48993b0240ddd2e562dc3d02 - md5: 4bc348e3a1a74d20a3f9beb866d75e0a + url: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.1-h7ab814d_0.conda + sha256: 47c3d7fad65258d13aa30967609310f8ff8b27b414bb8087fa60343b7e9fc400 + md5: e3efd5e5ca0eaa06fd7619f9f1c80e9c depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 410500 - timestamp: 1729322654121 + size: 412704 + timestamp: 1728653228204 - kind: conda name: libuv - version: 1.49.2 + version: 1.49.1 build: h86ecc28_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda - sha256: adf4eca89339ac7780f2394e7e6699be81259eb91f79f9d9fdf2c1bc6b26f210 - md5: 1899e1ec2be63386c41c4db31d3056af + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.1-h86ecc28_0.conda + sha256: 79236d2c04e90231df4de2fd75e61aef9bdf1a62d00db2c88a00086848d4b9a5 + md5: 5fd74100363fa0a57515800d57b764e1 depends: - libgcc >=13 license: MIT license_family: MIT purls: [] - size: 627484 - timestamp: 1729322575379 + size: 606994 + timestamp: 1728653097318 - kind: conda name: libuv - version: 1.49.2 + version: 1.49.1 build: hb9d3cd8_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda - sha256: a35cd81cd1a9add11024097da83cc06b0aae83186fe4124b77710876f37d8f31 - md5: 070e3c9ddab77e38799d5c30b109c633 + url: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.1-hb9d3cd8_0.conda + sha256: e9336f0cb4f1c2763ef1db163402fe556aaa8d840d62191d9d5062aa6d7dd658 + md5: 52849ca4b3be33ac3f01c77da737e068 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] - size: 884647 - timestamp: 1729322566955 -- kind: conda - name: libuv - version: 1.49.2 - build: hd79239c_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda - sha256: a2083200357513f932b44e88858a50a638d1a751a050bc62b2cbee2ac54f102c - md5: ec36c2438046ca8d2b4368d62dd5c38c - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 413607 - timestamp: 1729322686826 + size: 879954 + timestamp: 1728653174677 - kind: conda name: libva version: 2.22.0 @@ -30749,46 +29331,47 @@ packages: requires_python: '>=3.8' - kind: pypi name: markupsafe - version: 3.0.2 - url: https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl - sha256: 9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d + version: 3.0.1 + url: https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7 requires_python: '>=3.9' - kind: pypi name: markupsafe - version: 3.0.2 - url: https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 + version: 3.0.1 + url: https://files.pythonhosted.org/packages/8d/43/fd588ef5d192308c5e05974bac659bf6ae29c202b7ea2c4194bcf01eacee/MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583 requires_python: '>=3.9' - kind: pypi name: markupsafe - version: 3.0.2 - url: https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl - sha256: 70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b + version: 3.0.1 + url: https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b requires_python: '>=3.9' - kind: pypi name: markupsafe - version: 3.0.2 - url: https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 + version: 3.0.1 + url: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: 26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad requires_python: '>=3.9' - kind: pypi name: markupsafe - version: 3.0.2 - url: https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 + version: 3.0.1 + url: https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl + sha256: 9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf requires_python: '>=3.9' - kind: conda name: markupsafe - version: 3.0.2 - build: py311h2dc5d0c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda - sha256: 364a0d55abc4c60bc575c81a4acc9e98ea27565147d4d4dc672bad4b2d069710 - md5: 15e4dadd59e93baad7275249f10b9472 + version: 3.0.1 + build: py311h0ecf0c1_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.1-py311h0ecf0c1_1.conda + sha256: a74c76b7286e13983f057bee629456e48fa950203e772de8c88574032eb2f1fd + md5: 6695c608873406694c0a9252884757e0 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - __osx >=11.0 - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 constrains: - jinja2 >=3.0.0 @@ -30796,61 +29379,64 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 25591 - timestamp: 1729351519326 + size: 25128 + timestamp: 1728489362504 - kind: conda name: markupsafe - version: 3.0.2 - build: py311h5082efb_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_0.conda - sha256: 8a2022af5237e0fdf7e646856f1122735b71e4cdeaf42684b533ec4bad5a885f - md5: 84e78e335b0f9292060f1ac6d8ce0e3e + version: 3.0.1 + build: py311h2dc5d0c_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.1-py311h2dc5d0c_1.conda + sha256: 3f632607bf3b12a5a98845f2c8b2d52104ad945eaa06d0bf778822db7bbc1cc2 + md5: 137fc3129d21210605d8ee63db86b66f depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 28244 - timestamp: 1729351760960 + size: 25450 + timestamp: 1728489178847 - kind: conda name: markupsafe - version: 3.0.2 - build: py311h56c23cb_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h56c23cb_0.conda - sha256: 74bbdf6dbfe561026fed5c7d5c1a123e6dff0fedc5bc7ed0c6e9037c95ca96d7 - md5: be48a4cc178a91af3b1ccd58c14efde2 + version: 3.0.1 + build: py311h5082efb_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.1-py311h5082efb_1.conda + sha256: 95c6dd6d4af9d92040e37fdb9eaab7c74c48c75a0a6056df659977161105e8a6 + md5: e344a7dbeae2587c8ab3f3ea3467012d depends: - - __osx >=11.0 - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 25180 - timestamp: 1729351536390 + size: 28549 + timestamp: 1728490094930 - kind: conda name: markupsafe - version: 3.0.2 - build: py311h8b4e8a7_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311h8b4e8a7_0.conda - sha256: dd3554cee0aedc19a0cd56b52555c26fb0392e97749ceb202ddac7de55e3acf2 - md5: 87074906abc091b40ac46e7881b7e45d + version: 3.0.1 + build: py311ha09ea12_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.1-py311ha09ea12_1.conda + sha256: c798f7787e97bf52f36708f808b1eb7e4c8beea58ba21c4b22766b6cf2254078 + md5: 2305862953a9d719e79af1fd32fa6be0 depends: - - __osx >=10.13 + - libgcc >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: @@ -30859,18 +29445,19 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 24409 - timestamp: 1729351443593 + size: 25922 + timestamp: 1728490278138 - kind: conda name: markupsafe - version: 3.0.2 - build: py311ha09ea12_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_0.conda - sha256: 8714908e7190f362bc04636e6ff28ae8a3c008bbc92b126839ce7130c0c975f5 - md5: f40833364f9c3e847cc35a94c055f5c2 + version: 3.0.1 + build: py311ha971863_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.1-py311ha971863_1.conda + sha256: 2af5eafc1d88a6f32f200b4fcfca8bf8f1f2f3e50f7bc499449916c2c6e7d053 + md5: 257339ac5fa1aceefd4b2e826d343c22 depends: - - libgcc >=13 + - __osx >=10.13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: @@ -30879,8 +29466,8 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 25805 - timestamp: 1729352296161 + size: 24661 + timestamp: 1728489218742 - kind: pypi name: marshmallow version: 3.23.0 @@ -31424,21 +30011,21 @@ packages: requires_python: '>=3.9' - kind: conda name: mkl - version: 2024.2.2 - build: h66d3029_14 - build_number: 14 + version: 2024.1.0 + build: h66d3029_694 + build_number: 694 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_14.conda - sha256: 098ba4a3cb82f627bc79dc0ab1111b44859c9ef4aaa8d75ce043bce107770cb3 - md5: f011e7cc21918dc9d1efe0209e27fa16 + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda + sha256: 4f86e9ad74a7792c836cd4cb7fc415bcdb50718ffbaa90c5571297f71764b980 + md5: a17423859d3fb912c8f2e9797603ddb6 depends: - intel-openmp 2024.* - tbb 2021.* license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] - size: 103019089 - timestamp: 1727378392081 + size: 109381621 + timestamp: 1716561374449 - kind: pypi name: ml-dtypes version: 0.5.0 @@ -31800,42 +30387,44 @@ packages: - kind: conda name: mysql-common version: 9.0.1 - build: h266115a_2 - build_number: 2 + build: h266115a_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - sha256: bf0c230c35ca70e2c98530eb064a99f0c4d4596793a0be3ca8a3cbd92094ef82 - md5: 85c0dc0bcd110c998b01856975486ee7 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_1.conda + sha256: f77130a529afa61fde755ae60b6d71df20c20c866a9ad75709107cf63a9f777c + md5: e97f73d51b5acdf1340a15b195738f16 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - openssl >=3.3.2,<4.0a0 license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 649443 - timestamp: 1729804130603 + size: 640042 + timestamp: 1727340440162 - kind: conda name: mysql-libs version: 9.0.1 - build: he0572af_2 - build_number: 2 + build: he0572af_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda - sha256: e376189cd11304f4089971b372dac8a1cbbab6eacda8ca978ead2c220d16b8a4 - md5: 57a9e7ee3c0840d3c8c9012473978629 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_1.conda + sha256: b1c95888b3b900f5dd45446d9addb60c64bd0ea6547eb074624892c36634701c + md5: 274f367df5d56f152a49ed3203c3b1c1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - - mysql-common 9.0.1 h266115a_2 + - mysql-common 9.0.1 h266115a_1 - openssl >=3.3.2,<4.0a0 - zstd >=1.5.6,<1.6.0a0 license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 1372671 - timestamp: 1729804203990 + size: 1368648 + timestamp: 1727340508054 - kind: conda name: nasm version: 2.16.03 @@ -32089,9 +30678,9 @@ packages: requires_python: '>=3.5' - kind: pypi name: networkx - version: 3.4.2 - url: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl - sha256: df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f + version: 3.4.1 + url: https://files.pythonhosted.org/packages/8b/4e/bf7a4ccc11ded738efd0bda39296c7cee3617e800f890f919de5c0fe00c8/networkx-3.4.1-py3-none-any.whl + sha256: e30a87b48c9a6a7cc220e732bffefaee585bdb166d13377734446ce1a0620eed requires_dist: - numpy>=1.24 ; extra == 'default' - scipy!=1.11.0,!=1.11.1,>=1.10 ; extra == 'default' @@ -32781,25 +31370,6 @@ packages: - tqdm requires_python: '>=3.10' editable: true -- kind: conda - name: opencv - version: 4.10.0 - build: headless_py311h702c529_10 - build_number: 10 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.10.0-headless_py311h702c529_10.conda - sha256: 6007777476c9b9788c9bf772073132f3eb76dcb2140304f92a609cbdabb2ae1e - md5: 1ba907658b4e3aace9c67a0ab71efada - depends: - - libopencv 4.10.0 headless_py311he432950_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - py-opencv 4.10.0 headless_py311ha6054f4_10 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 26637 - timestamp: 1729610596217 - kind: conda name: opencv version: 4.10.0 @@ -32819,25 +31389,6 @@ packages: purls: [] size: 26342 timestamp: 1729146614678 -- kind: conda - name: opencv - version: 4.10.0 - build: headless_py311h8df38f0_10 - build_number: 10 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/opencv-4.10.0-headless_py311h8df38f0_10.conda - sha256: f6c374a4f872d3ff10a2d7424752af127c03f128877ee62d5d56545747d69959 - md5: 08a06465e1fae8c93d8879de38f6780f - depends: - - libopencv 4.10.0 headless_py311hab275b9_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - py-opencv 4.10.0 headless_py311hc1ddf2c_10 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 26427 - timestamp: 1729611176238 - kind: conda name: opencv version: 4.10.0 @@ -32857,25 +31408,6 @@ packages: purls: [] size: 26354 timestamp: 1729146566975 -- kind: conda - name: opencv - version: 4.10.0 - build: headless_py311hc0d1824_10 - build_number: 10 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/opencv-4.10.0-headless_py311hc0d1824_10.conda - sha256: c38b3f057b7126d5b8940d950094c8422e69c00d955a237bfeb4d82efff401f5 - md5: 14913703ebe3b67a947b2c2202d89817 - depends: - - libopencv 4.10.0 headless_py311hc436ff1_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - py-opencv 4.10.0 headless_py311he1e16fa_10 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 26559 - timestamp: 1729610846219 - kind: conda name: opencv version: 4.10.0 @@ -32914,44 +31446,6 @@ packages: purls: [] size: 26976 timestamp: 1729148700903 -- kind: conda - name: opencv - version: 4.10.0 - build: qt6_py311h3b854cf_610 - build_number: 610 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.10.0-qt6_py311h3b854cf_610.conda - sha256: d17397685dd2873d67001d21919c7acb9d6d94024ed75350db13ae0efa7e424e - md5: be65d73e07fad51de0638cc0bacf36a9 - depends: - - libopencv 4.10.0 qt6_py311h9c5307e_610 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - py-opencv 4.10.0 qt6_py311hb16a24f_610 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 26445 - timestamp: 1729610502168 -- kind: conda - name: opencv - version: 4.10.0 - build: qt6_py311h66d6932_610 - build_number: 610 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/opencv-4.10.0-qt6_py311h66d6932_610.conda - sha256: 88b32722c92c1d2b7da22656d7dc4bffd301e2e2c7101fb30f5c20d48b064f66 - md5: 65fba48009cd9cd52114d028c6477cce - depends: - - libopencv 4.10.0 qt6_py311hc6c75a9_610 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - py-opencv 4.10.0 qt6_py311hf00e9c7_610 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 26791 - timestamp: 1729611312861 - kind: conda name: opencv version: 4.10.0 @@ -33059,14 +31553,14 @@ packages: - kind: conda name: openexr version: 3.3.1 - build: h483ef7f_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h483ef7f_2.conda - sha256: 18e46da72ae5238214a92f20e50043d7e171820353f082918f4df6b59701d3c1 - md5: 130687d65ecf832813bccc9ee9c0c104 + build: h0631237_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-h0631237_1.conda + sha256: 21253f9f9694b5e5beac20da77a5525234c233e05000c4209b6c36047001b0b4 + md5: 45a3555d4738170331db7266df35eda5 depends: - - __osx >=11.0 + - __osx >=10.13 - imath >=3.1.12,<3.1.13.0a0 - libcxx >=17 - libdeflate >=1.22,<1.23.0a0 @@ -33074,38 +31568,37 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 1199722 - timestamp: 1729546993047 + size: 1231812 + timestamp: 1729069726073 - kind: conda name: openexr version: 3.3.1 - build: h974021d_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h974021d_2.conda - sha256: fc23c2cbd9694e2bbb30cfbb44a7e69ead17e2127d46f46634c68cf748e217ee - md5: 96786f3f3db7a7ccd89b87ee400ec2a7 + build: h0aba339_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openexr-3.3.1-h0aba339_1.conda + sha256: 2dbc4b7919ab46480eb1ccfad119f6b7c404547b42d4f479ebb27f039863a244 + md5: d37a9c0dc4a89156ee01f9542b5f0642 depends: + - __osx >=11.0 - imath >=3.1.12,<3.1.13.0a0 + - libcxx >=17 - libdeflate >=1.22,<1.23.0a0 - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] - size: 1178553 - timestamp: 1729546904039 + size: 1200108 + timestamp: 1729069702818 - kind: conda name: openexr version: 3.3.1 - build: haace395_2 - build_number: 2 + build: h2673917_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-haace395_2.conda - sha256: 915f62f283331860d26cb2f6df57249ead3f8cf46a143beeed8ad0bff6311993 - md5: c9d36ef5708c97f3398b18eb92f51fe7 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.3.1-h2673917_1.conda + sha256: 7f8d4d3865f1f67a544e6b5061e99fd2b3a80b8458955f99e62ca28fcd476a75 + md5: 3a20c06cf1b47e8471f3159a0c1a34ad depends: - imath >=3.1.12,<3.1.13.0a0 - libdeflate >=1.22,<1.23.0a0 @@ -33115,49 +31608,50 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 1353236 - timestamp: 1729546539373 + size: 1355322 + timestamp: 1729069554604 - kind: conda name: openexr version: 3.3.1 - build: hb646618_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openexr-3.3.1-hb646618_2.conda - sha256: 7776e9f94a66038ee25dd5db7b2f21eb9a8c827887540c4d1ff9729654aa61cc - md5: 32a1de3ea59abfa3dfdd4d0b1c02141a + build: h6ed009d_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-h6ed009d_1.conda + sha256: 397c0436f58835e8cf0579e72d6a550d1fd41a43adf46c7d75465fbc57f59d80 + md5: cd8540e3633fc20e5c941c3cf3518224 depends: - - __osx >=10.13 + - __glibc >=2.17,<3.0.a0 - imath >=3.1.12,<3.1.13.0a0 - - libcxx >=17 - libdeflate >=1.22,<1.23.0a0 + - libgcc >=13 + - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1228945 - timestamp: 1729547003988 + size: 1405733 + timestamp: 1729069720890 - kind: conda name: openexr version: 3.3.1 - build: hccdc605_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.3.1-hccdc605_2.conda - sha256: de1abf7be0caca0cd83174ea77a9dbfeb1d36d748508e524cd2b9253ec3d86f6 - md5: 907ffbb8a276c12c5a8a8aed2c5a10f9 + build: h81979ff_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openexr-3.3.1-h81979ff_1.conda + sha256: 78e25be0d187222dffe1fbbeeda37aad124b43db6272cc30dddb255e55c7dd12 + md5: 6ebd583e3544243baf64c5ce009b0636 depends: - - __glibc >=2.17,<3.0.a0 - imath >=3.1.12,<3.1.13.0a0 - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] - size: 1405340 - timestamp: 1729546542495 + size: 1177925 + timestamp: 1729069954062 - kind: conda name: openh264 version: 2.4.1 @@ -34698,9 +33192,9 @@ packages: timestamp: 1728546232937 - kind: pypi name: proto-plus - version: 1.25.0 - url: https://files.pythonhosted.org/packages/dd/25/0b7cc838ae3d76d46539020ec39fc92bfc9acc29367e58fe912702c2a79e/proto_plus-1.25.0-py3-none-any.whl - sha256: c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961 + version: 1.24.0 + url: https://files.pythonhosted.org/packages/7c/6f/db31f0711c0402aa477257205ce7d29e86a75cb52cd19f7afb585f75cda0/proto_plus-1.24.0-py3-none-any.whl + sha256: 402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12 requires_dist: - protobuf<6.0.0.dev0,>=3.19.0 - google-api-core>=1.31.5 ; extra == 'testing' @@ -34713,176 +33207,97 @@ packages: requires_python: '>=3.7' - kind: pypi name: protobuf - version: 5.28.3 - url: https://files.pythonhosted.org/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl - sha256: a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687 + version: 5.28.2 + url: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl + sha256: 5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f requires_python: '>=3.8' - kind: pypi name: protobuf - version: 5.28.3 - url: https://files.pythonhosted.org/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl - sha256: 712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135 + version: 5.28.2 + url: https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl + sha256: a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7 requires_python: '>=3.8' - kind: pypi name: protobuf - version: 5.28.3 - url: https://files.pythonhosted.org/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl - sha256: 3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584 + version: 5.28.2 + url: https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl + sha256: 2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132 requires_python: '>=3.8' - kind: pypi name: protobuf - version: 5.28.3 - url: https://files.pythonhosted.org/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl - sha256: 91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868 + version: 5.28.2 + url: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl + sha256: 35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f requires_python: '>=3.8' - kind: pypi name: psutil - version: 6.1.0 - url: https://files.pythonhosted.org/packages/01/9e/8be43078a171381953cfee33c07c0d628594b5dbfc5157847b85022c2c1b/psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl - sha256: 6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688 - requires_dist: - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - virtualenv ; extra == 'dev' - - wheel ; extra == 'dev' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' + version: 6.0.0 + url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl + sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 + requires_dist: + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil - version: 6.1.0 - url: https://files.pythonhosted.org/packages/11/91/87fa6f060e649b1e1a7b19a4f5869709fbf750b7c8c262ee776ec32f3028/psutil-6.1.0-cp37-abi3-win_amd64.whl - sha256: a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be - requires_dist: - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - virtualenv ; extra == 'dev' - - wheel ; extra == 'dev' - - pyreadline ; extra == 'dev' - - pdbpp ; extra == 'dev' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' - - pywin32 ; extra == 'test' - - wheel ; extra == 'test' - - wmi ; extra == 'test' + version: 6.0.0 + url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd + requires_dist: + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil - version: 6.1.0 - url: https://files.pythonhosted.org/packages/1d/cb/313e80644ea407f04f6602a9e23096540d9dc1878755f3952ea8d3d104be/psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl - sha256: 0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e - requires_dist: - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - virtualenv ; extra == 'dev' - - wheel ; extra == 'dev' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' + version: 6.0.0 + url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl + sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 + requires_dist: + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil - version: 6.1.0 - url: https://files.pythonhosted.org/packages/27/c2/d034856ac47e3b3cdfa9720d0e113902e615f4190d5d1bdb8df4b2015fb2/psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a - requires_dist: - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - virtualenv ; extra == 'dev' - - wheel ; extra == 'dev' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' + version: 6.0.0 + url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 + requires_dist: + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil - version: 6.1.0 - url: https://files.pythonhosted.org/packages/58/4d/8245e6f76a93c98aab285a43ea71ff1b171bcd90c9d238bf81f7021fb233/psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b - requires_dist: - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - virtualenv ; extra == 'dev' - - wheel ; extra == 'dev' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' + version: 6.0.0 + url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 + requires_dist: + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: conda name: psutil - version: 6.1.0 - build: py311h1314207_0 + version: 6.0.0 + build: py311h1314207_2 + build_number: 2 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py311h1314207_0.conda - sha256: 340d19b16a2f5b663b4f000188467831b107dcaa5b15522e172d6a27820d3b01 - md5: 446e328d89429c077ccd74d7e9d8853e + url: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.0.0-py311h1314207_2.conda + sha256: e277e2d1deebc79f5d8de8d4a9b0460c3f4dec11de696db741cb6c4dadb58910 + md5: fe445c1bac949f22c62abad0ea88854c depends: - __osx >=10.13 - python >=3.11,<3.12.0a0 @@ -34891,16 +33306,17 @@ packages: license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 512211 - timestamp: 1729847190327 + size: 517609 + timestamp: 1728965367083 - kind: conda name: psutil - version: 6.1.0 - build: py311h9ecbd09_0 + version: 6.0.0 + build: py311h9ecbd09_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda - sha256: 2ac3f1ed6e6a2a0c67a3922f4b5faf382855ad02cc0c85c5d56291c7a94296d0 - md5: 0ffc1f53106a38f059b151c465891ed3 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_2.conda + sha256: dda8211015c82fd3f9f54a1e0b58826b02800426480fb3ab4f9ce7fdd2d8ef98 + md5: 8b746f1e8fc1cd8f7ce67ad694d7530b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -34910,16 +33326,17 @@ packages: license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 505408 - timestamp: 1729847169876 + size: 510027 + timestamp: 1728965276551 - kind: conda name: psutil - version: 6.1.0 - build: py311ha879c10_0 + version: 6.0.0 + build: py311ha879c10_2 + build_number: 2 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.0-py311ha879c10_0.conda - sha256: 2864f8c5ab505f1d886bea31a6a9be8c531ec41b9c97c03540b47fe0ab7ddb33 - md5: 5a5273b2b8da61110ad53a995ece662f + url: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.0.0-py311ha879c10_2.conda + sha256: 56f8ef174f0d2bceb57bc54cdc500b2591776feea91279c1bf4f1dfff67144ad + md5: 412e0476ce775f42e7eda5ba3887cd9e depends: - libgcc >=13 - python >=3.11,<3.12.0a0 @@ -34929,16 +33346,17 @@ packages: license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 506301 - timestamp: 1729847258378 + size: 512882 + timestamp: 1728965365611 - kind: conda name: psutil - version: 6.1.0 - build: py311hae2e1ce_0 + version: 6.0.0 + build: py311hae2e1ce_2 + build_number: 2 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py311hae2e1ce_0.conda - sha256: 6237f04371995fa8e8f16481dcd4e01d2733a82750180a362a9f4953ffbb3cde - md5: e226eba0c52ecd6786e73c8ad7f41e79 + url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.0.0-py311hae2e1ce_2.conda + sha256: ae55c3d420cd12f0d4c79c6a5241d7b60e4cf93c0ad469d6874ac3fdb5994236 + md5: 0eb709db6c3df7018487a4768f040587 depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 @@ -34948,16 +33366,17 @@ packages: license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 514316 - timestamp: 1729847396776 + size: 519030 + timestamp: 1728965348539 - kind: conda name: psutil - version: 6.1.0 - build: py311he736701_0 + version: 6.0.0 + build: py311he736701_2 + build_number: 2 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/psutil-6.1.0-py311he736701_0.conda - sha256: 303c988247c4b1638f1cc90cd40465f5c74ca0ecfd83114033af637654dc2b6b - md5: 307267e6a028bca3382d98e06a372ebf + url: https://conda.anaconda.org/conda-forge/win-64/psutil-6.0.0-py311he736701_2.conda + sha256: d83eb8174cd069eb4d8c86d592fa2a71127250e1b5d36b329945f457d309bb71 + md5: 47ca3eec0bd6b6e8a3f859f858ff7b65 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 @@ -34968,8 +33387,8 @@ packages: license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 521434 - timestamp: 1729847606018 + size: 526270 + timestamp: 1728965869847 - kind: pypi name: psygnal version: 0.11.1 @@ -35259,46 +33678,6 @@ packages: purls: [] size: 1153019 timestamp: 1729146550014 -- kind: conda - name: py-opencv - version: 4.10.0 - build: headless_py311ha6054f4_10 - build_number: 10 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.10.0-headless_py311ha6054f4_10.conda - sha256: e148979f4e0088e080f7cff1015bd348c8df2d8d3859fe13b1abe6624d3cf9e0 - md5: c5f111e923a6c159dd07ac2cff31d151 - depends: - - libopencv 4.10.0 headless_py311he432950_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1153323 - timestamp: 1729610590255 -- kind: conda - name: py-opencv - version: 4.10.0 - build: headless_py311hc1ddf2c_10 - build_number: 10 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.10.0-headless_py311hc1ddf2c_10.conda - sha256: 712bcbb09344c55f9e5d613cfea889cfd4576b7ac448823a5ccb726e2cc80373 - md5: 33f5a98f1f9687042f8bd049849119a1 - depends: - - libopencv 4.10.0 headless_py311hab275b9_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1153175 - timestamp: 1729611159924 - kind: conda name: py-opencv version: 4.10.0 @@ -35319,26 +33698,6 @@ packages: purls: [] size: 1153016 timestamp: 1729146370525 -- kind: conda - name: py-opencv - version: 4.10.0 - build: headless_py311he1e16fa_10 - build_number: 10 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.10.0-headless_py311he1e16fa_10.conda - sha256: 3c34005af22402018e4334a5f37a0ae116683d79c29cafc606cd187db8f84469 - md5: c091ea024adcde65e767d18df6bf14a8 - depends: - - libopencv 4.10.0 headless_py311hc436ff1_10 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1153074 - timestamp: 1729610825507 - kind: conda name: py-opencv version: 4.10.0 @@ -35359,26 +33718,6 @@ packages: purls: [] size: 1153386 timestamp: 1729146607715 -- kind: conda - name: py-opencv - version: 4.10.0 - build: qt6_py311hb16a24f_610 - build_number: 610 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.10.0-qt6_py311hb16a24f_610.conda - sha256: fc6fee428bb80982cd7d5e205a77c13a68ecaf08d7a97be482610fbf6a4a183e - md5: f5826eeecd0b0e386019a3f966742bba - depends: - - libopencv 4.10.0 qt6_py311h9c5307e_610 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1152691 - timestamp: 1729610493802 - kind: conda name: py-opencv version: 4.10.0 @@ -35419,26 +33758,6 @@ packages: purls: [] size: 1153147 timestamp: 1729148670164 -- kind: conda - name: py-opencv - version: 4.10.0 - build: qt6_py311hf00e9c7_610 - build_number: 610 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.10.0-qt6_py311hf00e9c7_610.conda - sha256: 38c710824bb8cc7e6fd8f6ee310d947c0feb112826764f068bde60a8f480daba - md5: 4b285d97a84c91d5e75b17b0fa7bf64e - depends: - - libopencv 4.10.0 qt6_py311hc6c75a9_610 - - libprotobuf >=5.28.2,<5.28.3.0a0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1153448 - timestamp: 1729611302668 - kind: pypi name: pyarrow version: 17.0.0 @@ -35507,23 +33826,23 @@ packages: - kind: conda name: pyarrow version: 14.0.2 - build: py311h48f3fce_48_cpu - build_number: 48 + build: py311h48f3fce_47_cpu + build_number: 47 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_48_cpu.conda - sha256: 17222a1117b9b330135394643e30b16f5c51fed655c40e6064dccb6aa3452a8d - md5: e6bb1724bea6b2fd39b447737300fd54 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.2-py311h48f3fce_47_cpu.conda + sha256: 254b6d5f393e0052fc7d817b411f7c506fe6edd5e6333247d2df11fbdfa2aa6a + md5: 3187be28cbdccf67b8f2b0da26519f3a depends: - __osx >=11.0 - - libarrow 14.0.2 h528447d_48_cpu - - libarrow-acero 14.0.2 h5833ebf_48_cpu - - libarrow-dataset 14.0.2 h5833ebf_48_cpu - - libarrow-flight 14.0.2 h1a98edb_48_cpu - - libarrow-flight-sql 14.0.2 h54b16e1_48_cpu - - libarrow-gandiva 14.0.2 h6d50e30_48_cpu - - libarrow-substrait 14.0.2 hec64ae3_48_cpu + - libarrow 14.0.2 hd88f88e_47_cpu + - libarrow-acero 14.0.2 h5833ebf_47_cpu + - libarrow-dataset 14.0.2 h5833ebf_47_cpu + - libarrow-flight 14.0.2 h1a98edb_47_cpu + - libarrow-flight-sql 14.0.2 h54b16e1_47_cpu + - libarrow-gandiva 14.0.2 hc2e7243_47_cpu + - libarrow-substrait 14.0.2 hec64ae3_47_cpu - libcxx >=17 - - libparquet 14.0.2 h8aa6169_48_cpu + - libparquet 14.0.2 h8aa6169_47_cpu - libzlib >=1.3.1,<2.0a0 - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 @@ -35536,28 +33855,28 @@ packages: license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 3964465 - timestamp: 1729671248076 + size: 3966003 + timestamp: 1728666498891 - kind: conda name: pyarrow version: 14.0.2 - build: py311h6f6cc43_48_cpu - build_number: 48 + build: py311h6f6cc43_47_cpu + build_number: 47 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_48_cpu.conda - sha256: db83286e43e814868a7fd5bc53d6726988e14d562c9e863874880fc1d5947175 - md5: 3f8687f2d3e2ee2c23fe57f4fd7bc6f8 + url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py311h6f6cc43_47_cpu.conda + sha256: 67eb068d60421969f78f70b5338111baf58279095c227f25b9b0f64c37b4f7b8 + md5: 2b8482744d2ff401d89c69cef6ebda48 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 14.0.2 ha84fcd3_48_cpu - - libarrow-acero 14.0.2 h5d0bfc1_48_cpu - - libarrow-dataset 14.0.2 h5d0bfc1_48_cpu - - libarrow-flight 14.0.2 h15553ab_48_cpu - - libarrow-flight-sql 14.0.2 ha33d14e_48_cpu - - libarrow-gandiva 14.0.2 h18fa613_48_cpu - - libarrow-substrait 14.0.2 ha33d14e_48_cpu + - libarrow 14.0.2 h5d20d7a_47_cpu + - libarrow-acero 14.0.2 h5d0bfc1_47_cpu + - libarrow-dataset 14.0.2 h5d0bfc1_47_cpu + - libarrow-flight 14.0.2 h15553ab_47_cpu + - libarrow-flight-sql 14.0.2 ha33d14e_47_cpu + - libarrow-gandiva 14.0.2 hecbfe32_47_cpu + - libarrow-substrait 14.0.2 ha33d14e_47_cpu - libgcc >=13 - - libparquet 14.0.2 hd082c85_48_cpu + - libparquet 14.0.2 hd082c85_47_cpu - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - numpy >=1.23.5,<2.0a0 @@ -35570,28 +33889,28 @@ packages: license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 4528143 - timestamp: 1729669628218 + size: 4522378 + timestamp: 1728666635372 - kind: conda name: pyarrow version: 14.0.2 - build: py311h8d0d729_48_cpu - build_number: 48 + build: py311h8d0d729_47_cpu + build_number: 47 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_48_cpu.conda - sha256: b8e201528c84e800601e1d760a189579c0f28a8f48c6c8e188f42d93ed0bb5bb - md5: f368251d9dc84d017e8ed3120b45b113 + url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.2-py311h8d0d729_47_cpu.conda + sha256: a1617e5ac0d0298a81abc2664121b33bcddceff70de1df0f473fee5a19776e6e + md5: 0c72a94ebf4dd77da311f660f4c1f027 depends: - __osx >=10.13 - - libarrow 14.0.2 h3fcefee_48_cpu - - libarrow-acero 14.0.2 h97d8b74_48_cpu - - libarrow-dataset 14.0.2 h97d8b74_48_cpu - - libarrow-flight 14.0.2 h2627002_48_cpu - - libarrow-flight-sql 14.0.2 h5924cc9_48_cpu - - libarrow-gandiva 14.0.2 h13f1c6c_48_cpu - - libarrow-substrait 14.0.2 h5924cc9_48_cpu + - libarrow 14.0.2 h4caaaa1_47_cpu + - libarrow-acero 14.0.2 h97d8b74_47_cpu + - libarrow-dataset 14.0.2 h97d8b74_47_cpu + - libarrow-flight 14.0.2 h2627002_47_cpu + - libarrow-flight-sql 14.0.2 h5924cc9_47_cpu + - libarrow-gandiva 14.0.2 hbd7cc15_47_cpu + - libarrow-substrait 14.0.2 h5924cc9_47_cpu - libcxx >=17 - - libparquet 14.0.2 h2be9fba_48_cpu + - libparquet 14.0.2 h2be9fba_47_cpu - libzlib >=1.3.1,<2.0a0 - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 @@ -35603,27 +33922,27 @@ packages: license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 4026571 - timestamp: 1729672631803 + size: 4023367 + timestamp: 1728666964519 - kind: conda name: pyarrow version: 14.0.2 - build: py311hbe0f5d6_48_cpu - build_number: 48 + build: py311hbe0f5d6_47_cpu + build_number: 47 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_48_cpu.conda - sha256: 98d775ff2082dd32039e9246e51da3d26f0b9e6a96cfcbd682082d9fa6f8e445 - md5: 3440aae9d514b85263aa8982e3c1d903 - depends: - - libarrow 14.0.2 h6f9f739_48_cpu - - libarrow-acero 14.0.2 h8b12148_48_cpu - - libarrow-dataset 14.0.2 h8b12148_48_cpu - - libarrow-flight 14.0.2 hc9c23c4_48_cpu - - libarrow-flight-sql 14.0.2 hc52717e_48_cpu - - libarrow-gandiva 14.0.2 h2242f43_48_cpu - - libarrow-substrait 14.0.2 h5950f91_48_cpu + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-14.0.2-py311hbe0f5d6_47_cpu.conda + sha256: 278bb9313b1cdf35aa96ee34c860be3910e1085bfa003f4e2c15617d78221ff6 + md5: 544ca709fa4a1f0a4e88b3ac0f583128 + depends: + - libarrow 14.0.2 h987bebd_47_cpu + - libarrow-acero 14.0.2 h8b12148_47_cpu + - libarrow-dataset 14.0.2 h8b12148_47_cpu + - libarrow-flight 14.0.2 hc9c23c4_47_cpu + - libarrow-flight-sql 14.0.2 hc52717e_47_cpu + - libarrow-gandiva 14.0.2 hb8d7e52_47_cpu + - libarrow-substrait 14.0.2 h5950f91_47_cpu - libgcc >=13 - - libparquet 14.0.2 h21a6562_48_cpu + - libparquet 14.0.2 h21a6562_47_cpu - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - numpy >=1.23.5,<2.0a0 @@ -35637,26 +33956,26 @@ packages: license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 4412462 - timestamp: 1729670811432 + size: 4415012 + timestamp: 1728665625011 - kind: conda name: pyarrow version: 14.0.2 - build: py311hd901c93_48_cpu - build_number: 48 + build: py311hd901c93_47_cpu + build_number: 47 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_48_cpu.conda - sha256: 35bfb0f1935a62d03779def938e89ce468fc5ee9a9232c67831af8f8cec86050 - md5: b91bdc75e69e0761013cacfb0e3ff739 - depends: - - libarrow 14.0.2 h607190a_48_cpu - - libarrow-acero 14.0.2 hac47afa_48_cpu - - libarrow-dataset 14.0.2 hac47afa_48_cpu - - libarrow-flight 14.0.2 hf55736b_48_cpu - - libarrow-flight-sql 14.0.2 h301f888_48_cpu - - libarrow-gandiva 14.0.2 h56cbd03_48_cpu - - libarrow-substrait 14.0.2 ha9530af_48_cpu - - libparquet 14.0.2 h59f2d37_48_cpu + url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.2-py311hd901c93_47_cpu.conda + sha256: 3d602aa745230ec8797a39232d0cb52a3063721e0e9cc05dc6e92832c73e1274 + md5: 3a521056f149210ff44c62f0e23edfe1 + depends: + - libarrow 14.0.2 h7c049e1_47_cpu + - libarrow-acero 14.0.2 hac47afa_47_cpu + - libarrow-dataset 14.0.2 hac47afa_47_cpu + - libarrow-flight 14.0.2 hf55736b_47_cpu + - libarrow-flight-sql 14.0.2 h301f888_47_cpu + - libarrow-gandiva 14.0.2 h507ade9_47_cpu + - libarrow-substrait 14.0.2 ha9530af_47_cpu + - libparquet 14.0.2 h59f2d37_47_cpu - libzlib >=1.3.1,<2.0a0 - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 @@ -35671,8 +33990,8 @@ packages: license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 3528322 - timestamp: 1729671550297 + size: 3522728 + timestamp: 1728668362022 - kind: pypi name: pyasn1 version: 0.6.1 @@ -36681,6 +35000,18 @@ packages: - hatch ; extra == 'dev' - jupyterlab ; extra == 'dev' - watchfiles ; extra == 'dev' +- kind: pypi + name: rerun-notebook + version: 0.20.0a1+dev + path: rerun_notebook + sha256: f20def987d6c97a658313841861dd7ce129fde8a658647756571844989b1451e + requires_dist: + - anywidget + - jupyter-ui-poll + - watchfiles ; extra == 'dev' + - jupyterlab ; extra == 'dev' + - hatch ; extra == 'dev' + editable: true - kind: pypi name: rerun-notebook version: 0.20.0a1+dev @@ -36867,9 +35198,9 @@ packages: timestamp: 1728886721623 - kind: pypi name: rich - version: 13.9.3 - url: https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl - sha256: 9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283 + version: 13.9.2 + url: https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl + sha256: 8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1 requires_dist: - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - markdown-it-py>=2.2.0 @@ -38704,39 +37035,39 @@ packages: - kind: conda name: sysroot_linux-64 version: '2.17' - build: h4a8ded7_18 - build_number: 18 + build: h4a8ded7_17 + build_number: 17 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda - sha256: 23c7ab371c1b74d01a187e05aa7240e3f5654599e364a9adff7f0b02e26f471f - md5: 0ea96f90a10838f58412aa84fdd9df09 + url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda + sha256: 5629b0e93c8e9fb9152de46e244d32ff58184b2cbf0f67757826a9610f3d1a21 + md5: f58cb23983633068700a756f0b5f165a depends: - - kernel-headers_linux-64 3.10.0 he073ed8_18 + - kernel-headers_linux-64 3.10.0 he073ed8_17 - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 license_family: GPL purls: [] - size: 15500960 - timestamp: 1729794510631 + size: 15141219 + timestamp: 1727437660028 - kind: conda name: sysroot_linux-aarch64 version: '2.17' - build: h5b4a56d_18 - build_number: 18 + build: h5b4a56d_17 + build_number: 17 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_18.conda - sha256: 769a720e0066e3b5c4168d6de455dbde12c2ee11ee3a19fc614659d04f726370 - md5: d42f4bece921c5e59f56a36414106dc1 + url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_17.conda + sha256: 961f96d6031e73a6ccc5f162ba4732f091084d293f052e0f52b2cbf42457390d + md5: 55f7fbd62e213daa84bc717a45c33332 depends: - - kernel-headers_linux-aarch64 4.18.0 h05a177a_18 + - kernel-headers_linux-aarch64 4.18.0 h05a177a_17 - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 license_family: GPL purls: [] - size: 15669544 - timestamp: 1729794509305 + size: 15921991 + timestamp: 1727437634601 - kind: conda name: tapi version: 1300.6.5 @@ -39022,9 +37353,9 @@ packages: requires_python: '>=3.7' - kind: pypi name: tinycss2 - version: 1.4.0 - url: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - sha256: 3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 + version: 1.3.0 + url: https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl + sha256: 54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7 requires_dist: - webencodings>=0.4 - sphinx ; extra == 'doc' @@ -39515,9 +37846,9 @@ packages: requires_python: '>=3.8' - kind: pypi name: transformers - version: 4.46.0 - url: https://files.pythonhosted.org/packages/db/88/1ef8a624a33d7fe460a686b9e0194a7916320fc0d67d4e38e570beeac039/transformers-4.46.0-py3-none-any.whl - sha256: e161268ae8bee315eb9e9b4c0b27f1bd6980f91e0fc292d75249193d339704c0 + version: 4.45.2 + url: https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl + sha256: c551b33660cfc815bae1f9f097ecfd1e65be623f13c6ee0dda372bd881460210 requires_dist: - filelock - huggingface-hub<1.0,>=0.23.2 @@ -39541,6 +37872,7 @@ packages: - accelerate>=0.26.0 ; extra == 'all' - av==9.2.0 ; extra == 'all' - codecarbon==1.2.0 ; extra == 'all' + - decord==0.6.0 ; extra == 'all' - flax<=0.7.0,>=0.4.1 ; extra == 'all' - jax<=0.4.13,>=0.4.1 ; extra == 'all' - jaxlib<=0.4.13,>=0.4.1 ; extra == 'all' @@ -39608,6 +37940,7 @@ packages: - codecarbon==1.2.0 ; extra == 'dev' - cookiecutter==1.7.3 ; extra == 'dev' - datasets!=2.5.0 ; extra == 'dev' + - decord==0.6.0 ; extra == 'dev' - dill<0.3.5 ; extra == 'dev' - evaluate>=0.2.0 ; extra == 'dev' - faiss-cpu ; extra == 'dev' @@ -39876,6 +38209,7 @@ packages: - torch ; extra == 'torchhub' - tqdm>=4.27 ; extra == 'torchhub' - av==9.2.0 ; extra == 'video' + - decord==0.6.0 ; extra == 'video' - pillow<=15.0,>=10.0.1 ; extra == 'vision' requires_python: '>=3.8.0' - kind: pypi @@ -39954,9 +38288,9 @@ packages: - torch ; extra == 'tutorials' - kind: pypi name: trove-classifiers - version: 2024.10.21.16 - url: https://files.pythonhosted.org/packages/35/35/5055ab8d215af853d07bbff1a74edf48f91ed308f037380a5ca52dd73348/trove_classifiers-2024.10.21.16-py3-none-any.whl - sha256: 0fb11f1e995a757807a8ef1c03829fbd4998d817319abcef1f33165750f103be + version: 2024.10.16 + url: https://files.pythonhosted.org/packages/75/a0/dd773135ca0f7227e8257555fd2f7a0c88672bfd111a400361f10c09face/trove_classifiers-2024.10.16-py3-none-any.whl + sha256: 9b02a4cb49bd2e85c13e728ee461f4f332d6334736b18d61254c964643687144 - kind: pypi name: types-deprecated version: 1.2.9.2 @@ -40010,12 +38344,12 @@ packages: timestamp: 1717802653893 - kind: conda name: typos - version: 1.26.8 - build: h0ef69ab_0 + version: 1.26.0 + build: h3bba108_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.8-h0ef69ab_0.conda - sha256: 56a3b28fcdc47a45ca0ddc60ea5a5e24ba083fd449991d3d3f2c9fb65148cd37 - md5: 1d350a1836ba70bc31c1fd27bae16400 + url: https://conda.anaconda.org/conda-forge/osx-arm64/typos-1.26.0-h3bba108_0.conda + sha256: 299ab927e54100208f2c6a62567c37d5d496f7f936e163ccfd27517e065a23b7 + md5: 9d6fc2bb4024b4b95eea6b6d88eed2b0 depends: - __osx >=11.0 constrains: @@ -40023,16 +38357,16 @@ packages: license: MIT license_family: MIT purls: [] - size: 2678662 - timestamp: 1729803395059 + size: 2675904 + timestamp: 1728341009751 - kind: conda name: typos - version: 1.26.8 + version: 1.26.0 build: h8fae777_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.8-h8fae777_0.conda - sha256: 8dafba5d6755052eb6f7008d6d3bb0210c59ebffb087db3739ad372f7eb61b83 - md5: 439606cdc04aeff03c41c03256fa74bc + url: https://conda.anaconda.org/conda-forge/linux-64/typos-1.26.0-h8fae777_0.conda + sha256: b7233e9dd1df8edbfd7ceffebec3bf5a8a62c71271869e325f3a47ea26426724 + md5: 2b230bb461f22d67b6fe8f4881a755af depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -40041,16 +38375,16 @@ packages: license: MIT license_family: MIT purls: [] - size: 3157370 - timestamp: 1729803085106 + size: 3191789 + timestamp: 1728340800764 - kind: conda name: typos - version: 1.26.8 - build: h926acf8_0 + version: 1.26.0 + build: h9bb4cbb_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.8-h926acf8_0.conda - sha256: 2452ae38fc673b2f22865f447326830c8f9daff9c16c2734940c77b735cf80ab - md5: 86f39df5abf1d7246f0284d30b0a3ec6 + url: https://conda.anaconda.org/conda-forge/osx-64/typos-1.26.0-h9bb4cbb_0.conda + sha256: 166871e076d1bd280037517894cfebf690ee4e33be54bc450bb7bb21c202c8ea + md5: f917408f11923a2301033d2a49c50dad depends: - __osx >=10.13 constrains: @@ -40058,16 +38392,16 @@ packages: license: MIT license_family: MIT purls: [] - size: 2707266 - timestamp: 1729803528836 + size: 2704143 + timestamp: 1728340739039 - kind: conda name: typos - version: 1.26.8 + version: 1.26.0 build: ha073cba_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.8-ha073cba_0.conda - sha256: b4ac831be0a5d3df040d72426a2737f63be7dd0261fc844d9954174a4fbccaba - md5: ed848d0cd2d0c94b1e05ddf496af1a0e + url: https://conda.anaconda.org/conda-forge/win-64/typos-1.26.0-ha073cba_0.conda + sha256: cea08737e93d0ac4d0b06d01538a4c0ceb50b22631aca11ffa7ef84272aaaed0 + md5: 6fc2c93245a65f1d94803a4d72ecb3ed depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -40075,16 +38409,16 @@ packages: license: MIT license_family: MIT purls: [] - size: 2294217 - timestamp: 1729803437953 + size: 2290598 + timestamp: 1728341369170 - kind: conda name: typos - version: 1.26.8 + version: 1.26.0 build: ha3529ed_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.8-ha3529ed_0.conda - sha256: 680be4ed5833ac3f2a2add081e9679d25a5c1089ed1991dd827efb55777ce7c7 - md5: 20e2bcc5ea5009e3b2eaffd5f460c626 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/typos-1.26.0-ha3529ed_0.conda + sha256: fef377f2dcb4b4a009c349653061507301779e14cb1181dbc6ca5d15199c4094 + md5: b4cbbb4a8ffb157fcb23dfbf42d0f1e1 depends: - libgcc >=13 constrains: @@ -40092,8 +38426,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 3055129 - timestamp: 1729802854507 + size: 2981836 + timestamp: 1728340598410 - kind: pypi name: tzdata version: '2024.2' @@ -40244,33 +38578,33 @@ packages: requires_python: '>=3.7' - kind: pypi name: uv - version: 0.4.26 - url: https://files.pythonhosted.org/packages/33/52/009ea704318c5d0f290fb2ea4e1874d5625a60b290c6e5e49aae4d140091/uv-0.4.26-py3-none-manylinux_2_28_aarch64.whl - sha256: c4c69532cb4d0c1e160883142b8bf0133a5a67e9aed5148e13743ae55c2dfc03 + version: 0.4.23 + url: https://files.pythonhosted.org/packages/67/a1/ade5c9d1c42af44231899244e7c7274efb046b5288f4347f7c9b24eb4f39/uv-0.4.23-py3-none-win_amd64.whl + sha256: 8a416cb239e6be6c246da6803bf957a32a81fed21fda2fb32d012e5caa1e0b4f requires_python: '>=3.8' - kind: pypi name: uv - version: 0.4.26 - url: https://files.pythonhosted.org/packages/36/ce/dd9b312c2230705119d3de910a32bbd32dc500bf147c7a0076a31bdfd153/uv-0.4.26-py3-none-macosx_11_0_arm64.whl - sha256: acaa25b304db6f1e8064d3280532ecb80a58346e37f4199659269847848c4da0 + version: 0.4.23 + url: https://files.pythonhosted.org/packages/9d/b9/8f518e9e67d07d47981ec34f245db0aee2343aef9fdf990cffb0bb978a33/uv-0.4.23-py3-none-macosx_11_0_arm64.whl + sha256: 2f19527992f7d557fd3faec281b43005f1e8c9ebdf07f90bef229d510e002ca0 requires_python: '>=3.8' - kind: pypi name: uv - version: 0.4.26 - url: https://files.pythonhosted.org/packages/46/91/c76682177dbe46dc0cc9221f9483b186ad3d8e0b59056c2cdae5c011609c/uv-0.4.26-py3-none-win_amd64.whl - sha256: e826b544020ef407387ed734a89850cac011ee4b5daf94b4f616b71eff2c8a94 + version: 0.4.23 + url: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + sha256: 1663219972c92cdd2a24ab0437284c4fcaac483814e3399e1cafa231c47b0c46 requires_python: '>=3.8' - kind: pypi name: uv - version: 0.4.26 - url: https://files.pythonhosted.org/packages/92/27/2235628adcf468bc6be98b84e509afa54240d359b4705454e7e957a9650d/uv-0.4.26-py3-none-macosx_10_12_x86_64.whl - sha256: 391a6f5e31b212cb72a8f460493bbdf4088e66049666ad064ac8530230031289 + version: 0.4.23 + url: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 23269724349a1831881319e5f2854a5b8260f444ecb2528ac44ffe039a091ac4 requires_python: '>=3.8' - kind: pypi name: uv - version: 0.4.26 - url: https://files.pythonhosted.org/packages/da/9a/5a6a3ea6c2bc42904343897b666cb8c9ac921bf9551b463aeb592cd49d45/uv-0.4.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 9a63a6fe6f249a9fff72328204c3e6b457aae5914590e6881b9b39dcc72d24df + version: 0.4.23 + url: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + sha256: cbb9754f18d0796337a1756e628f0faa74c215ffb139a35bf490ab07fa626ca8 requires_python: '>=3.8' - kind: conda name: vc @@ -40321,9 +38655,9 @@ packages: - pytest ; extra == 'test' - kind: pypi name: virtualenv - version: 20.27.0 - url: https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl - sha256: 44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655 + version: 20.26.6 + url: https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl + sha256: 7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2 requires_dist: - distlib<1,>=0.3.7 - filelock<4,>=3.12.2 @@ -40348,7 +38682,7 @@ packages: - pytest>=7.4 ; extra == 'test' - setuptools>=68 ; extra == 'test' - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' - requires_python: '>=3.8' + requires_python: '>=3.7' - kind: conda name: vs2015_runtime version: 14.40.33810 @@ -41405,12 +39739,12 @@ packages: timestamp: 1660348056328 - kind: conda name: yarl - version: 1.16.0 + version: 1.15.3 build: py311h1314207_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.16.0-py311h1314207_0.conda - sha256: 0eac88992fc8723f72c6a71cd34d764fc053b5c276f03d03edc952fe15f47f38 - md5: fb561ef18a99a110a082b0d46ac5b871 + url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.15.3-py311h1314207_0.conda + sha256: 60a8934efaebbcf2b5af1b8cab0190a11327d167cff7ca7506b7a029a71557cf + md5: 13aa8cc057003bf3a4bdb2695e686688 depends: - __osx >=10.13 - idna >=2.0 @@ -41422,16 +39756,16 @@ packages: license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 139681 - timestamp: 1729798620477 + size: 131909 + timestamp: 1729069888087 - kind: conda name: yarl - version: 1.16.0 + version: 1.15.3 build: py311h9ecbd09_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda - sha256: 949fee5b985113293c10a925ff9290deb5552d185f99bb17f9b0da51c9941f77 - md5: d9c23163e7ac5f8926372c7d792a996f + url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.3-py311h9ecbd09_0.conda + sha256: 4ce47917f2aa7f20f38bd405543750ae1b461e94979923bdc47d385a0e86dc38 + md5: ff33935060d0c1e63b1f3f1ad4efbf3b depends: - __glibc >=2.17,<3.0.a0 - idna >=2.0 @@ -41444,16 +39778,16 @@ packages: license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 150436 - timestamp: 1729798497731 + size: 141733 + timestamp: 1729069857540 - kind: conda name: yarl - version: 1.16.0 + version: 1.15.3 build: py311ha879c10_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.16.0-py311ha879c10_0.conda - sha256: eb9bb9ddb14798a3769e9934e540d7fb8c0d61c3980478dc2249b447d5b3c565 - md5: bcac90c8c6cfd60a8fcc8bce889988c8 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.15.3-py311ha879c10_0.conda + sha256: c18d4b26b2b08a2f1dd9ac45b439c8442d85acfe301c6a7824777f45cf0b617a + md5: fa8846feed3551d56b41d743df94b112 depends: - idna >=2.0 - libgcc >=13 @@ -41466,16 +39800,16 @@ packages: license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 148892 - timestamp: 1729798635841 + size: 140254 + timestamp: 1729069930186 - kind: conda name: yarl - version: 1.16.0 + version: 1.15.3 build: py311hae2e1ce_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.16.0-py311hae2e1ce_0.conda - sha256: de25041378a43fb0f178b3faf2cb5059c5dae8fddce0aa44777bb92d6618f044 - md5: 7857fc6365ac18c8d1f15a0dc24f598c + url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.15.3-py311hae2e1ce_0.conda + sha256: 2622f094debb2fb92019f3bc7eaae96f37e2f2783d5a204dc03b6b0ee652c152 + md5: 1494a505ff068448dd8f6bb577d8ccec depends: - __osx >=11.0 - idna >=2.0 @@ -41488,16 +39822,16 @@ packages: license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 139424 - timestamp: 1729798679046 + size: 132522 + timestamp: 1729069934539 - kind: conda name: yarl - version: 1.16.0 + version: 1.15.3 build: py311he736701_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/yarl-1.16.0-py311he736701_0.conda - sha256: a0215d06bbe2935cccb985683d0f963a4fb8bd30e4f274bcacd187d2be3502e6 - md5: 650b88ef7dffd64e5a669265bd6c1e1c + url: https://conda.anaconda.org/conda-forge/win-64/yarl-1.15.3-py311he736701_0.conda + sha256: 565ec154bcdedfda7f14a81ea890ef68712656ac0d5fbd70054a550007a77d70 + md5: 87ad7268d3332dd479b8a18f759e8ce2 depends: - idna >=2.0 - multidict >=4.0 @@ -41511,13 +39845,13 @@ packages: license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 139955 - timestamp: 1729798855715 + size: 132378 + timestamp: 1729070014089 - kind: pypi name: yfinance - version: 0.2.47 - url: https://files.pythonhosted.org/packages/34/98/5340f9be95a2dea20a9afb36c564aeba774d84fcf42acc5068756444e562/yfinance-0.2.47-py2.py3-none-any.whl - sha256: e9c7afd965776d23f1f561c1617917a696936ad2ca63e3490dfaf2a8606c80de + version: 0.2.44 + url: https://files.pythonhosted.org/packages/51/31/72b8f5aa9ed9c4a6afd09c0bab491862ba5837facf7d81e1ed51a555ae8e/yfinance-0.2.44-py2.py3-none-any.whl + sha256: fdc18791662f286539f7a08dccd7e8191b1ca509814f7b0faac264623bebe8a8 requires_dist: - pandas>=1.3.0 - numpy>=1.16.5 From f3ff5f670d82a3e5fddafc0688432efb5e5b8195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 09:48:22 +0100 Subject: [PATCH 120/159] WIP: Change to `Utf8Pair` --- .../rerun/components/graph_edge.fbs | 2 +- .../rerun/components/graph_node.fbs | 4 +- .../re_types/definitions/rerun/datatypes.fbs | 3 +- .../rerun/datatypes/graph_edge.fbs | 14 -- .../rerun/datatypes/graph_node.fbs | 15 -- .../definitions/rerun/datatypes/utf8_pair.fbs | 14 ++ .../re_types/src/components/graph_edge.rs | 22 +-- .../re_types/src/components/graph_node.rs | 24 +-- .../re_types/src/components/graph_node_ext.rs | 17 ++ crates/store/re_types/src/components/mod.rs | 1 + .../re_types/src/datatypes/.gitattributes | 3 +- .../re_types/src/datatypes/graph_edge_ext.rs | 10 - .../re_types/src/datatypes/graph_node.rs | 172 ------------------ .../re_types/src/datatypes/graph_node_ext.rs | 19 -- crates/store/re_types/src/datatypes/mod.rs | 9 +- .../datatypes/{graph_edge.rs => utf8pair.rs} | 110 ++++++----- .../re_types/src/datatypes/utf8pair_ext.rs | 10 + .../viewer/re_space_view_graph/src/error.rs | 6 +- .../re_space_view_graph/src/graph/hash.rs | 6 +- .../re_space_view_graph/src/graph/index.rs | 4 +- .../re_space_view_graph/src/graph/mod.rs | 4 +- .../viewer/re_space_view_graph/src/types.rs | 18 +- .../viewer/re_space_view_graph/src/ui/mod.rs | 8 +- .../viewer/re_space_view_graph/src/ui/node.rs | 2 +- .../src/visualizers/edges.rs | 4 +- crates/viewer/re_viewer/src/reflection/mod.rs | 6 +- .../reference/types/components/graph_edge.md | 2 +- .../reference/types/components/graph_node.md | 2 +- docs/content/reference/types/datatypes.md | 3 +- .../reference/types/datatypes/.gitattributes | 3 +- .../reference/types/datatypes/graph_edge.md | 21 --- .../reference/types/datatypes/graph_node.md | 21 --- .../content/reference/types/datatypes/utf8.md | 2 + .../reference/types/datatypes/utf8pair.md | 21 +++ rerun_cpp/src/rerun/components/graph_edge.hpp | 20 +- rerun_cpp/src/rerun/components/graph_node.hpp | 29 ++- rerun_cpp/src/rerun/datatypes.hpp | 3 +- rerun_cpp/src/rerun/datatypes/.gitattributes | 6 +- rerun_cpp/src/rerun/datatypes/graph_node.cpp | 57 ------ rerun_cpp/src/rerun/datatypes/graph_node.hpp | 58 ------ .../{graph_edge.cpp => utf8pair.cpp} | 30 +-- .../{graph_edge.hpp => utf8pair.hpp} | 28 +-- .../rerun_sdk/rerun/archetypes/graph_edges.py | 2 +- .../rerun_sdk/rerun/archetypes/graph_nodes.py | 2 +- .../rerun_sdk/rerun/components/graph_edge.py | 8 +- .../rerun_sdk/rerun/components/graph_node.py | 8 +- .../rerun_sdk/rerun/datatypes/.gitattributes | 3 +- .../rerun_sdk/rerun/datatypes/__init__.py | 18 +- .../rerun_sdk/rerun/datatypes/graph_edge.py | 104 ----------- .../rerun_sdk/rerun/datatypes/graph_node.py | 71 -------- .../rerun_sdk/rerun/datatypes/utf8pair.py | 104 +++++++++++ 51 files changed, 357 insertions(+), 776 deletions(-) delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs delete mode 100644 crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs create mode 100644 crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs create mode 100644 crates/store/re_types/src/components/graph_node_ext.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_edge_ext.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_node.rs delete mode 100644 crates/store/re_types/src/datatypes/graph_node_ext.rs rename crates/store/re_types/src/datatypes/{graph_edge.rs => utf8pair.rs} (79%) create mode 100644 crates/store/re_types/src/datatypes/utf8pair_ext.rs delete mode 100644 docs/content/reference/types/datatypes/graph_edge.md delete mode 100644 docs/content/reference/types/datatypes/graph_node.md create mode 100644 docs/content/reference/types/datatypes/utf8pair.md delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_node.cpp delete mode 100644 rerun_cpp/src/rerun/datatypes/graph_node.hpp rename rerun_cpp/src/rerun/datatypes/{graph_edge.cpp => utf8pair.cpp} (67%) rename rerun_cpp/src/rerun/datatypes/{graph_edge.hpp => utf8pair.hpp} (52%) delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py delete mode 100644 rerun_py/rerun_sdk/rerun/datatypes/graph_node.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index e1d671eeac6e..a7c849fd681b 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -9,5 +9,5 @@ table GraphEdge ( "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - edge: rerun.datatypes.GraphEdge (order: 100); + edge: rerun.datatypes.Utf8Pair (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_node.fbs b/crates/store/re_types/definitions/rerun/components/graph_node.fbs index 758b89de3200..8c5fc0f960fe 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node.fbs @@ -6,10 +6,10 @@ namespace rerun.components; table GraphNode ( "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", "attr.rust.repr": "transparent", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { - id: rerun.datatypes.GraphNode (order: 100); + id: rerun.datatypes.Utf8 (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/datatypes.fbs b/crates/store/re_types/definitions/rerun/datatypes.fbs index 41ad91c02491..d841a05b047b 100644 --- a/crates/store/re_types/definitions/rerun/datatypes.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes.fbs @@ -12,8 +12,6 @@ include "./datatypes/color_model.fbs"; include "./datatypes/entity_path.fbs"; include "./datatypes/float32.fbs"; include "./datatypes/float64.fbs"; -include "./datatypes/graph_edge.fbs"; -include "./datatypes/graph_node.fbs"; include "./datatypes/image_format.fbs"; include "./datatypes/keypoint_id.fbs"; include "./datatypes/keypoint_pair.fbs"; @@ -34,6 +32,7 @@ include "./datatypes/uint16.fbs"; include "./datatypes/uint32.fbs"; include "./datatypes/uint64.fbs"; include "./datatypes/utf8.fbs"; +include "./datatypes/utf8_pair.fbs"; include "./datatypes/uuid.fbs"; include "./datatypes/uvec2d.fbs"; include "./datatypes/uvec3d.fbs"; diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs deleted file mode 100644 index 5449d22ed508..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs +++ /dev/null @@ -1,14 +0,0 @@ -namespace rerun.datatypes; - -/// An edge in a graph connecting two nodes. -table GraphEdge ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - /// The id of the source node. - source: rerun.datatypes.GraphNode (order: 100); - - /// The id of the target node. - target: rerun.datatypes.GraphNode (order: 200); -} diff --git a/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs b/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs deleted file mode 100644 index baf4b2670566..000000000000 --- a/crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs +++ /dev/null @@ -1,15 +0,0 @@ -namespace rerun.datatypes; - -/// A string-based ID representing a node in a graph. -table GraphNode ( - "attr.arrow.transparent", - "attr.python.aliases": "str", - "attr.python.array_aliases": "Sequence[str]", - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", - "attr.rust.repr": "transparent", - "attr.rust.tuple_struct", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' -) { - id: string (order: 100); -} diff --git a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs new file mode 100644 index 000000000000..7c649ad3eb3b --- /dev/null +++ b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs @@ -0,0 +1,14 @@ +namespace rerun.datatypes; + +/// Stores a tuple of UTF-8 strings. +table Utf8Pair ( + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' +) { + /// The first string. + first: rerun.datatypes.Utf8 (order: 100); + + /// The second string. + second: rerun.datatypes.Utf8 (order: 200); +} diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge.rs index 4fdc295e2d53..14b17f497bb4 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -22,7 +22,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge(pub crate::datatypes::GraphEdge); +pub struct GraphEdge(pub crate::datatypes::Utf8Pair); impl ::re_types_core::SizeBytes for GraphEdge { #[inline] @@ -32,35 +32,35 @@ impl ::re_types_core::SizeBytes for GraphEdge { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphEdge { +impl> From for GraphEdge { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphEdge { +impl std::borrow::Borrow for GraphEdge { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphEdge { + fn borrow(&self) -> &crate::datatypes::Utf8Pair { &self.0 } } impl std::ops::Deref for GraphEdge { - type Target = crate::datatypes::GraphEdge; + type Target = crate::datatypes::Utf8Pair; #[inline] - fn deref(&self) -> &crate::datatypes::GraphEdge { + fn deref(&self) -> &crate::datatypes::Utf8Pair { &self.0 } } impl std::ops::DerefMut for GraphEdge { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphEdge { + fn deref_mut(&mut self) -> &mut crate::datatypes::Utf8Pair { &mut self.0 } } @@ -77,7 +77,7 @@ impl ::re_types_core::Loggable for GraphEdge { #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphEdge::arrow_datatype() + crate::datatypes::Utf8Pair::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphEdge { where Self: Clone + 'a, { - crate::datatypes::GraphEdge::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::Utf8Pair::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,7 @@ impl ::re_types_core::Loggable for GraphEdge { where Self: Sized, { - crate::datatypes::GraphEdge::from_arrow_opt(arrow_data) + crate::datatypes::Utf8Pair::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/graph_node.rs b/crates/store/re_types/src/components/graph_node.rs index 24cbf370bb47..c46e3b582235 100644 --- a/crates/store/re_types/src/components/graph_node.rs +++ b/crates/store/re_types/src/components/graph_node.rs @@ -19,10 +19,10 @@ use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: A string-based ID representing a node in a graph. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNode(pub crate::datatypes::GraphNode); +pub struct GraphNode(pub crate::datatypes::Utf8); impl ::re_types_core::SizeBytes for GraphNode { #[inline] @@ -32,35 +32,35 @@ impl ::re_types_core::SizeBytes for GraphNode { #[inline] fn is_pod() -> bool { - ::is_pod() + ::is_pod() } } -impl> From for GraphNode { +impl> From for GraphNode { fn from(v: T) -> Self { Self(v.into()) } } -impl std::borrow::Borrow for GraphNode { +impl std::borrow::Borrow for GraphNode { #[inline] - fn borrow(&self) -> &crate::datatypes::GraphNode { + fn borrow(&self) -> &crate::datatypes::Utf8 { &self.0 } } impl std::ops::Deref for GraphNode { - type Target = crate::datatypes::GraphNode; + type Target = crate::datatypes::Utf8; #[inline] - fn deref(&self) -> &crate::datatypes::GraphNode { + fn deref(&self) -> &crate::datatypes::Utf8 { &self.0 } } impl std::ops::DerefMut for GraphNode { #[inline] - fn deref_mut(&mut self) -> &mut crate::datatypes::GraphNode { + fn deref_mut(&mut self) -> &mut crate::datatypes::Utf8 { &mut self.0 } } @@ -77,7 +77,7 @@ impl ::re_types_core::Loggable for GraphNode { #[inline] fn arrow_datatype() -> arrow2::datatypes::DataType { - crate::datatypes::GraphNode::arrow_datatype() + crate::datatypes::Utf8::arrow_datatype() } fn to_arrow_opt<'a>( @@ -86,7 +86,7 @@ impl ::re_types_core::Loggable for GraphNode { where Self: Clone + 'a, { - crate::datatypes::GraphNode::to_arrow_opt(data.into_iter().map(|datum| { + crate::datatypes::Utf8::to_arrow_opt(data.into_iter().map(|datum| { datum.map(|datum| match datum.into() { ::std::borrow::Cow::Borrowed(datum) => ::std::borrow::Cow::Borrowed(&datum.0), ::std::borrow::Cow::Owned(datum) => ::std::borrow::Cow::Owned(datum.0), @@ -100,7 +100,7 @@ impl ::re_types_core::Loggable for GraphNode { where Self: Sized, { - crate::datatypes::GraphNode::from_arrow_opt(arrow_data) + crate::datatypes::Utf8::from_arrow_opt(arrow_data) .map(|v| v.into_iter().map(|v| v.map(Self)).collect()) } } diff --git a/crates/store/re_types/src/components/graph_node_ext.rs b/crates/store/re_types/src/components/graph_node_ext.rs new file mode 100644 index 000000000000..568bda997112 --- /dev/null +++ b/crates/store/re_types/src/components/graph_node_ext.rs @@ -0,0 +1,17 @@ +use super::GraphNode; + +impl GraphNode { + /// Returns the string slice of the graph node. + #[inline] + pub fn as_str(&self) -> &str { + self.0.as_str() + } +} + +impl From for String { + #[inline] + fn from(value: GraphNode) -> Self { + value.as_str().to_owned() + } +} + diff --git a/crates/store/re_types/src/components/mod.rs b/crates/store/re_types/src/components/mod.rs index 3a1cc3200f35..bacc6107be11 100644 --- a/crates/store/re_types/src/components/mod.rs +++ b/crates/store/re_types/src/components/mod.rs @@ -26,6 +26,7 @@ mod gamma_correction; mod gamma_correction_ext; mod graph_edge; mod graph_node; +mod graph_node_ext; mod graph_type; mod half_size2d; mod half_size2d_ext; diff --git a/crates/store/re_types/src/datatypes/.gitattributes b/crates/store/re_types/src/datatypes/.gitattributes index a469e4c3048e..df15ca592c8b 100644 --- a/crates/store/re_types/src/datatypes/.gitattributes +++ b/crates/store/re_types/src/datatypes/.gitattributes @@ -9,8 +9,6 @@ class_description.rs linguist-generated=true class_description_map_elem.rs linguist-generated=true class_id.rs linguist-generated=true color_model.rs linguist-generated=true -graph_edge.rs linguist-generated=true -graph_node.rs linguist-generated=true image_format.rs linguist-generated=true keypoint_id.rs linguist-generated=true keypoint_pair.rs linguist-generated=true @@ -28,6 +26,7 @@ tensor_data.rs linguist-generated=true tensor_dimension.rs linguist-generated=true tensor_dimension_index_selection.rs linguist-generated=true tensor_dimension_selection.rs linguist-generated=true +utf8pair.rs linguist-generated=true uuid.rs linguist-generated=true uvec2d.rs linguist-generated=true uvec3d.rs linguist-generated=true diff --git a/crates/store/re_types/src/datatypes/graph_edge_ext.rs b/crates/store/re_types/src/datatypes/graph_edge_ext.rs deleted file mode 100644 index 45687a7441ca..000000000000 --- a/crates/store/re_types/src/datatypes/graph_edge_ext.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::datatypes::{GraphEdge, GraphNode}; - -impl> From<(T, T)> for GraphEdge { - fn from(value: (T, T)) -> Self { - Self { - source: value.0.into(), - target: value.1.into(), - } - } -} diff --git a/crates/store/re_types/src/datatypes/graph_node.rs b/crates/store/re_types/src/datatypes/graph_node.rs deleted file mode 100644 index 2ee7ff3defd1..000000000000 --- a/crates/store/re_types/src/datatypes/graph_node.rs +++ /dev/null @@ -1,172 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". - -#![allow(unused_imports)] -#![allow(unused_parens)] -#![allow(clippy::clone_on_copy)] -#![allow(clippy::cloned_instead_of_copied)] -#![allow(clippy::map_flatten)] -#![allow(clippy::needless_question_mark)] -#![allow(clippy::new_without_default)] -#![allow(clippy::redundant_closure)] -#![allow(clippy::too_many_arguments)] -#![allow(clippy::too_many_lines)] - -use ::re_types_core::external::arrow2; -use ::re_types_core::ComponentName; -use ::re_types_core::SerializationResult; -use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; -use ::re_types_core::{DeserializationError, DeserializationResult}; - -/// **Datatype**: A string-based ID representing a node in a graph. -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[repr(transparent)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphNode(pub ::re_types_core::ArrowString); - -impl ::re_types_core::SizeBytes for GraphNode { - #[inline] - fn heap_size_bytes(&self) -> u64 { - self.0.heap_size_bytes() - } - - #[inline] - fn is_pod() -> bool { - <::re_types_core::ArrowString>::is_pod() - } -} - -impl From<::re_types_core::ArrowString> for GraphNode { - #[inline] - fn from(id: ::re_types_core::ArrowString) -> Self { - Self(id) - } -} - -impl From for ::re_types_core::ArrowString { - #[inline] - fn from(value: GraphNode) -> Self { - value.0 - } -} - -::re_types_core::macros::impl_into_cow!(GraphNode); - -impl ::re_types_core::Loggable for GraphNode { - type Name = ::re_types_core::DatatypeName; - - #[inline] - fn name() -> Self::Name { - "rerun.datatypes.GraphNode".into() - } - - #[inline] - fn arrow_datatype() -> arrow2::datatypes::DataType { - #![allow(clippy::wildcard_imports)] - use arrow2::datatypes::*; - DataType::Utf8 - } - - fn to_arrow_opt<'a>( - data: impl IntoIterator>>>, - ) -> SerializationResult> - where - Self: Clone + 'a, - { - #![allow(clippy::wildcard_imports)] - #![allow(clippy::manual_is_variant_and)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, datatypes::*}; - Ok({ - let (somes, data0): (Vec<_>, Vec<_>) = data - .into_iter() - .map(|datum| { - let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into); - let datum = datum.map(|datum| datum.into_owned().0); - (datum.is_some(), datum) - }) - .unzip(); - let data0_bitmap: Option = { - let any_nones = somes.iter().any(|some| !*some); - any_nones.then(|| somes.into()) - }; - { - let offsets = arrow2::offset::Offsets::::try_from_lengths( - data0 - .iter() - .map(|opt| opt.as_ref().map(|datum| datum.len()).unwrap_or_default()), - )? - .into(); - let inner_data: arrow2::buffer::Buffer = - data0.into_iter().flatten().flat_map(|s| s.0).collect(); - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - unsafe { - Utf8Array::::new_unchecked( - Self::arrow_datatype(), - offsets, - inner_data, - data0_bitmap, - ) - } - .boxed() - } - }) - } - - fn from_arrow_opt( - arrow_data: &dyn arrow2::array::Array, - ) -> DeserializationResult>> - where - Self: Sized, - { - #![allow(clippy::wildcard_imports)] - use ::re_types_core::{Loggable as _, ResultExt as _}; - use arrow2::{array::*, buffer::*, datatypes::*}; - Ok({ - let arrow_data = arrow_data - .as_any() - .downcast_ref::>() - .ok_or_else(|| { - let expected = Self::arrow_datatype(); - let actual = arrow_data.data_type().clone(); - DeserializationError::datatype_mismatch(expected, actual) - }) - .with_context("rerun.datatypes.GraphNode#id")?; - let arrow_data_buf = arrow_data.values(); - let offsets = arrow_data.offsets(); - arrow2::bitmap::utils::ZipValidity::new_with_validity( - offsets.iter().zip(offsets.lengths()), - arrow_data.validity(), - ) - .map(|elem| { - elem.map(|(start, len)| { - let start = *start as usize; - let end = start + len; - if end > arrow_data_buf.len() { - return Err(DeserializationError::offset_slice_oob( - (start, end), - arrow_data_buf.len(), - )); - } - - #[allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - let data = unsafe { arrow_data_buf.clone().sliced_unchecked(start, len) }; - Ok(data) - }) - .transpose() - }) - .map(|res_or_opt| { - res_or_opt.map(|res_or_opt| res_or_opt.map(|v| ::re_types_core::ArrowString(v))) - }) - .collect::>>>() - .with_context("rerun.datatypes.GraphNode#id")? - .into_iter() - } - .map(|v| v.ok_or_else(DeserializationError::missing_data)) - .map(|res| res.map(|v| Some(Self(v)))) - .collect::>>>() - .with_context("rerun.datatypes.GraphNode#id") - .with_context("rerun.datatypes.GraphNode")?) - } -} diff --git a/crates/store/re_types/src/datatypes/graph_node_ext.rs b/crates/store/re_types/src/datatypes/graph_node_ext.rs deleted file mode 100644 index 3265bdd535b9..000000000000 --- a/crates/store/re_types/src/datatypes/graph_node_ext.rs +++ /dev/null @@ -1,19 +0,0 @@ -use super::GraphNode; - -impl std::convert::From<&str> for GraphNode { - fn from(s: &str) -> Self { - Self(s.into()) - } -} - -impl std::convert::From for GraphNode { - fn from(s: String) -> Self { - Self(s.into()) - } -} - -impl std::fmt::Display for GraphNode { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} diff --git a/crates/store/re_types/src/datatypes/mod.rs b/crates/store/re_types/src/datatypes/mod.rs index 8a32b6d30630..a580fd2f8852 100644 --- a/crates/store/re_types/src/datatypes/mod.rs +++ b/crates/store/re_types/src/datatypes/mod.rs @@ -16,10 +16,6 @@ mod class_id; mod class_id_ext; mod color_model; mod color_model_ext; -mod graph_edge; -mod graph_edge_ext; -mod graph_node; -mod graph_node_ext; mod image_format; mod image_format_ext; mod keypoint_id; @@ -51,6 +47,8 @@ mod tensor_dimension_ext; mod tensor_dimension_index_selection; mod tensor_dimension_selection; mod tensor_dimension_selection_ext; +mod utf8pair; +mod utf8pair_ext; mod uuid; mod uuid_ext; mod uvec2d; @@ -78,8 +76,6 @@ pub use self::class_description::ClassDescription; pub use self::class_description_map_elem::ClassDescriptionMapElem; pub use self::class_id::ClassId; pub use self::color_model::ColorModel; -pub use self::graph_edge::GraphEdge; -pub use self::graph_node::GraphNode; pub use self::image_format::ImageFormat; pub use self::keypoint_id::KeypointId; pub use self::keypoint_pair::KeypointPair; @@ -96,6 +92,7 @@ pub use self::tensor_data::TensorData; pub use self::tensor_dimension::TensorDimension; pub use self::tensor_dimension_index_selection::TensorDimensionIndexSelection; pub use self::tensor_dimension_selection::TensorDimensionSelection; +pub use self::utf8pair::Utf8Pair; pub use self::uuid::Uuid; pub use self::uvec2d::UVec2D; pub use self::uvec3d::UVec3D; diff --git a/crates/store/re_types/src/datatypes/graph_edge.rs b/crates/store/re_types/src/datatypes/utf8pair.rs similarity index 79% rename from crates/store/re_types/src/datatypes/graph_edge.rs rename to crates/store/re_types/src/datatypes/utf8pair.rs index 1e6ca6abec49..9070524e4b79 100644 --- a/crates/store/re_types/src/datatypes/graph_edge.rs +++ b/crates/store/re_types/src/datatypes/utf8pair.rs @@ -1,5 +1,5 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs". #![allow(unused_imports)] #![allow(unused_parens)] @@ -18,37 +18,37 @@ use ::re_types_core::SerializationResult; use ::re_types_core::{ComponentBatch, MaybeOwnedComponentBatch}; use ::re_types_core::{DeserializationError, DeserializationResult}; -/// **Datatype**: An edge in a graph connecting two nodes. +/// **Datatype**: Stores a tuple of UTF-8 strings. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct GraphEdge { - /// The id of the source node. - pub source: crate::datatypes::GraphNode, +pub struct Utf8Pair { + /// The first string. + pub first: crate::datatypes::Utf8, - /// The id of the target node. - pub target: crate::datatypes::GraphNode, + /// The second string. + pub second: crate::datatypes::Utf8, } -impl ::re_types_core::SizeBytes for GraphEdge { +impl ::re_types_core::SizeBytes for Utf8Pair { #[inline] fn heap_size_bytes(&self) -> u64 { - self.source.heap_size_bytes() + self.target.heap_size_bytes() + self.first.heap_size_bytes() + self.second.heap_size_bytes() } #[inline] fn is_pod() -> bool { - ::is_pod() && ::is_pod() + ::is_pod() && ::is_pod() } } -::re_types_core::macros::impl_into_cow!(GraphEdge); +::re_types_core::macros::impl_into_cow!(Utf8Pair); -impl ::re_types_core::Loggable for GraphEdge { +impl ::re_types_core::Loggable for Utf8Pair { type Name = ::re_types_core::DatatypeName; #[inline] fn name() -> Self::Name { - "rerun.datatypes.GraphEdge".into() + "rerun.datatypes.Utf8Pair".into() } #[inline] @@ -56,16 +56,8 @@ impl ::re_types_core::Loggable for GraphEdge { #![allow(clippy::wildcard_imports)] use arrow2::datatypes::*; DataType::Struct(std::sync::Arc::new(vec![ - Field::new( - "source", - ::arrow_datatype(), - false, - ), - Field::new( - "target", - ::arrow_datatype(), - false, - ), + Field::new("first", ::arrow_datatype(), false), + Field::new("second", ::arrow_datatype(), false), ])) } @@ -95,25 +87,25 @@ impl ::re_types_core::Loggable for GraphEdge { Self::arrow_datatype(), vec![ { - let (somes, source): (Vec<_>, Vec<_>) = data + let (somes, first): (Vec<_>, Vec<_>) = data .iter() .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.source.clone()); + let datum = datum.as_ref().map(|datum| datum.first.clone()); (datum.is_some(), datum) }) .unzip(); - let source_bitmap: Option = { + let first_bitmap: Option = { let any_nones = somes.iter().any(|some| !*some); any_nones.then(|| somes.into()) }; { let offsets = arrow2::offset::Offsets::::try_from_lengths( - source.iter().map(|opt| { + first.iter().map(|opt| { opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() }), )? .into(); - let inner_data: arrow2::buffer::Buffer = source + let inner_data: arrow2::buffer::Buffer = first .into_iter() .flatten() .flat_map(|datum| datum.0 .0) @@ -125,32 +117,32 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Utf8, offsets, inner_data, - source_bitmap, + first_bitmap, ) } .boxed() } }, { - let (somes, target): (Vec<_>, Vec<_>) = data + let (somes, second): (Vec<_>, Vec<_>) = data .iter() .map(|datum| { - let datum = datum.as_ref().map(|datum| datum.target.clone()); + let datum = datum.as_ref().map(|datum| datum.second.clone()); (datum.is_some(), datum) }) .unzip(); - let target_bitmap: Option = { + let second_bitmap: Option = { let any_nones = somes.iter().any(|some| !*some); any_nones.then(|| somes.into()) }; { let offsets = arrow2::offset::Offsets::::try_from_lengths( - target.iter().map(|opt| { + second.iter().map(|opt| { opt.as_ref().map(|datum| datum.0.len()).unwrap_or_default() }), )? .into(); - let inner_data: arrow2::buffer::Buffer = target + let inner_data: arrow2::buffer::Buffer = second .into_iter() .flatten() .flat_map(|datum| datum.0 .0) @@ -162,7 +154,7 @@ impl ::re_types_core::Loggable for GraphEdge { DataType::Utf8, offsets, inner_data, - target_bitmap, + second_bitmap, ) } .boxed() @@ -193,7 +185,7 @@ impl ::re_types_core::Loggable for GraphEdge { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphEdge")?; + .with_context("rerun.datatypes.Utf8Pair")?; if arrow_data.is_empty() { Vec::new() } else { @@ -204,15 +196,15 @@ impl ::re_types_core::Loggable for GraphEdge { .map(|field| field.name.as_str()) .zip(arrow_data_arrays) .collect(); - let source = { - if !arrays_by_name.contains_key("source") { + let first = { + if !arrays_by_name.contains_key("first") { return Err(DeserializationError::missing_struct_field( Self::arrow_datatype(), - "source", + "first", )) - .with_context("rerun.datatypes.GraphEdge"); + .with_context("rerun.datatypes.Utf8Pair"); } - let arrow_data = &**arrays_by_name["source"]; + let arrow_data = &**arrays_by_name["first"]; { let arrow_data = arrow_data .as_any() @@ -222,7 +214,7 @@ impl ::re_types_core::Loggable for GraphEdge { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphEdge#source")?; + .with_context("rerun.datatypes.Utf8Pair#first")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -250,24 +242,24 @@ impl ::re_types_core::Loggable for GraphEdge { .map(|res_or_opt| { res_or_opt.map(|res_or_opt| { res_or_opt.map(|v| { - crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + crate::datatypes::Utf8(::re_types_core::ArrowString(v)) }) }) }) .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#source")? + .with_context("rerun.datatypes.Utf8Pair#first")? .into_iter() } }; - let target = { - if !arrays_by_name.contains_key("target") { + let second = { + if !arrays_by_name.contains_key("second") { return Err(DeserializationError::missing_struct_field( Self::arrow_datatype(), - "target", + "second", )) - .with_context("rerun.datatypes.GraphEdge"); + .with_context("rerun.datatypes.Utf8Pair"); } - let arrow_data = &**arrays_by_name["target"]; + let arrow_data = &**arrays_by_name["second"]; { let arrow_data = arrow_data .as_any() @@ -277,7 +269,7 @@ impl ::re_types_core::Loggable for GraphEdge { let actual = arrow_data.data_type().clone(); DeserializationError::datatype_mismatch(expected, actual) }) - .with_context("rerun.datatypes.GraphEdge#target")?; + .with_context("rerun.datatypes.Utf8Pair#second")?; let arrow_data_buf = arrow_data.values(); let offsets = arrow_data.offsets(); arrow2::bitmap::utils::ZipValidity::new_with_validity( @@ -305,34 +297,34 @@ impl ::re_types_core::Loggable for GraphEdge { .map(|res_or_opt| { res_or_opt.map(|res_or_opt| { res_or_opt.map(|v| { - crate::datatypes::GraphNode(::re_types_core::ArrowString(v)) + crate::datatypes::Utf8(::re_types_core::ArrowString(v)) }) }) }) .collect::>>>() - .with_context("rerun.datatypes.GraphEdge#target")? + .with_context("rerun.datatypes.Utf8Pair#second")? .into_iter() } }; arrow2::bitmap::utils::ZipValidity::new_with_validity( - ::itertools::izip!(source, target), + ::itertools::izip!(first, second), arrow_data.validity(), ) .map(|opt| { - opt.map(|(source, target)| { + opt.map(|(first, second)| { Ok(Self { - source: source + first: first .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphEdge#source")?, - target: target + .with_context("rerun.datatypes.Utf8Pair#first")?, + second: second .ok_or_else(DeserializationError::missing_data) - .with_context("rerun.datatypes.GraphEdge#target")?, + .with_context("rerun.datatypes.Utf8Pair#second")?, }) }) .transpose() }) .collect::>>() - .with_context("rerun.datatypes.GraphEdge")? + .with_context("rerun.datatypes.Utf8Pair")? } }) } diff --git a/crates/store/re_types/src/datatypes/utf8pair_ext.rs b/crates/store/re_types/src/datatypes/utf8pair_ext.rs new file mode 100644 index 000000000000..eed733d30ccb --- /dev/null +++ b/crates/store/re_types/src/datatypes/utf8pair_ext.rs @@ -0,0 +1,10 @@ +use crate::datatypes::Utf8; + +impl> From<(T, T)> for super::Utf8Pair { + fn from(value: (T, T)) -> Self { + Self { + first: value.0.into(), + second: value.1.into(), + } + } +} diff --git a/crates/viewer/re_space_view_graph/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs index 98395bde37b2..d293bc1abd99 100644 --- a/crates/viewer/re_space_view_graph/src/error.rs +++ b/crates/viewer/re_space_view_graph/src/error.rs @@ -1,5 +1,3 @@ -use re_log_types::EntityPath; -use re_types::datatypes; use re_viewer_context::SpaceViewSystemExecutionError; #[derive(thiserror::Error, Debug)] @@ -7,8 +5,8 @@ pub enum Error { #[error("edge has unknown node")] EdgeUnknownNode, - #[error("missing layout information for node `{1}` in entity `{0}`")] - MissingLayoutInformation(EntityPath, datatypes::GraphNode), + #[error("missing layout information for node `{node}` in entity `{entity}`")] + MissingLayoutInformation { entity: String, node: String }, } impl From for SpaceViewSystemExecutionError { diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 472cc20229a9..17adcd5dec25 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -1,5 +1,5 @@ use re_log_types::hash::Hash64; -use re_types::datatypes; +use re_types::components; /// A 64 bit hash of [`GraphNodeId`] with very small risk of collision. #[derive(Copy, Clone, Eq, PartialOrd, Ord)] @@ -27,8 +27,8 @@ impl std::fmt::Debug for GraphNodeHash { } } -impl From<&datatypes::GraphNode> for GraphNodeHash { - fn from(node_id: &datatypes::GraphNode) -> Self { +impl From<&components::GraphNode> for GraphNodeHash { + fn from(node_id: &components::GraphNode) -> Self { Self(Hash64::hash(node_id)) } } diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index 8418d838b01f..aa3982594db8 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -1,5 +1,5 @@ use re_log_types::{EntityPath, EntityPathHash}; -use re_types::datatypes; +use re_types::components; use super::GraphNodeHash; @@ -20,7 +20,7 @@ impl std::hash::Hash for NodeIndex { } impl NodeIndex { - pub fn from_entity_node(entity_path: &EntityPath, node: &datatypes::GraphNode) -> Self { + pub fn from_entity_node(entity_path: &EntityPath, node: &components::GraphNode) -> Self { Self { entity_hash: entity_path.hash(), node_hash: GraphNodeHash::from(node), diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index dbe31d926f91..e70468162b6d 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,5 +1,5 @@ use re_log_types::EntityPath; -use re_types::datatypes; +use re_types::components; use crate::{ types::UnknownNodeInstance, @@ -14,7 +14,7 @@ pub(crate) use index::NodeIndex; // TODO(grtlr): This struct should act as an abstraction over the graph in the future. pub(crate) struct Graph<'a> { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: ahash::HashSet<(&'a EntityPath, datatypes::GraphNode)>, + unknown: ahash::HashSet<(&'a EntityPath, components::GraphNode)>, } impl<'a> Graph<'a> { diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index ce851427e5cd..171726bfb782 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,11 +1,11 @@ use re_log_types::{EntityPath, Instance}; -use re_types::{components, datatypes, ArrowString}; +use re_types::{components, ArrowString}; use crate::graph::NodeIndex; impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { - [self.source, self.target].into_iter() + pub fn nodes(&'a self) -> impl Iterator { + [&self.source, &self.target].into_iter() } } @@ -28,7 +28,7 @@ impl<'a> From> for NodeIndex { } pub struct NodeInstance<'a> { - pub node_id: &'a datatypes::GraphNode, + pub node_id: &'a components::GraphNode, pub entity_path: &'a EntityPath, pub instance: Instance, pub label: Option<&'a ArrowString>, @@ -38,8 +38,8 @@ pub struct NodeInstance<'a> { } pub struct EdgeInstance<'a> { - pub source: &'a datatypes::GraphNode, - pub target: &'a datatypes::GraphNode, + pub source: components::GraphNode, + pub target: components::GraphNode, pub entity_path: &'a re_log_types::EntityPath, pub instance: Instance, pub edge_type: components::GraphType, @@ -47,16 +47,16 @@ pub struct EdgeInstance<'a> { impl<'a> EdgeInstance<'a> { pub fn source_ix(&self) -> NodeIndex { - NodeIndex::from_entity_node(self.entity_path, self.source) + NodeIndex::from_entity_node(self.entity_path, &self.source) } pub fn target_ix(&self) -> NodeIndex { - NodeIndex::from_entity_node(self.entity_path, self.target) + NodeIndex::from_entity_node(self.entity_path, &self.target) } } pub struct UnknownNodeInstance<'a> { - pub node_id: &'a datatypes::GraphNode, + pub node_id: &'a components::GraphNode, pub entity_path: &'a EntityPath, } diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 92113637ed9c..576f518d292d 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -13,8 +13,12 @@ pub(crate) mod scene; use crate::types::UnknownNodeInstance; pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance<'_>) -> egui::Response { - let text = egui::RichText::new(format!("{} @ {}", instance.node_id, instance.entity_path)) - .color(ui.style().visuals.widgets.noninteractive.text_color()); + let text = egui::RichText::new(format!( + "{} @ {}", + instance.node_id.as_str(), + instance.entity_path + )) + .color(ui.style().visuals.widgets.noninteractive.text_color()); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); ui.add(egui::Button::new(text)) } diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index aaaca650a224..1bde5120422d 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -60,6 +60,6 @@ pub fn draw_node( } .on_hover_text(format!( "Node ID: `{}` in `{}`", - instance.node_id, instance.entity_path + instance.node_id.as_str(), instance.entity_path )) } diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs index 594e337c186d..e4bb622ce30a 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -31,8 +31,8 @@ impl EdgeData { Option::<()>::default, ) .map(|(edge, instance, _placeholder)| EdgeInstance { - source: &edge.source, - target: &edge.target, + source: edge.first.clone().into(), + target: edge.second.clone().into(), entity_path: &self.entity_path, instance, edge_type: self.graph_type, diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index df2431e4fe87..c5fe6cb39f02 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -376,21 +376,21 @@ fn generate_component_reflection() -> Result::name(), ComponentReflection { docstring_md: "An edge in a graph connecting two nodes.", - placeholder: Some(GraphEdge::default().to_arrow()?), + custom_placeholder: Some(GraphEdge::default().to_arrow()?), }, ), ( ::name(), ComponentReflection { docstring_md: "A string-based ID representing a node in a graph.", - placeholder: Some(GraphNode::default().to_arrow()?), + custom_placeholder: Some(GraphNode::default().to_arrow()?), }, ), ( ::name(), ComponentReflection { docstring_md: "Specifies if a graph has directed or undirected edges.", - placeholder: Some(GraphType::default().to_arrow()?), + custom_placeholder: Some(GraphType::default().to_arrow()?), }, ), ( diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md index 1771979ef3ac..a249f3c9a8bd 100644 --- a/docs/content/reference/types/components/graph_edge.md +++ b/docs/content/reference/types/components/graph_edge.md @@ -7,7 +7,7 @@ An edge in a graph connecting two nodes. ## Fields -* edge: [`GraphEdge`](../datatypes/graph_edge.md) +* edge: [`Utf8Pair`](../datatypes/utf8pair.md) ## API reference links * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) diff --git a/docs/content/reference/types/components/graph_node.md b/docs/content/reference/types/components/graph_node.md index 2a85374325b7..f1c7f3ad1580 100644 --- a/docs/content/reference/types/components/graph_node.md +++ b/docs/content/reference/types/components/graph_node.md @@ -7,7 +7,7 @@ A string-based ID representing a node in a graph. ## Fields -* id: [`GraphNode`](../datatypes/graph_node.md) +* id: [`Utf8`](../datatypes/utf8.md) ## API reference links * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html) diff --git a/docs/content/reference/types/datatypes.md b/docs/content/reference/types/datatypes.md index 5584a1200e7d..ebf495541a59 100644 --- a/docs/content/reference/types/datatypes.md +++ b/docs/content/reference/types/datatypes.md @@ -19,8 +19,6 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`EntityPath`](datatypes/entity_path.md): A path to an entity in the `ChunkStore`. * [`Float32`](datatypes/float32.md): A single-precision 32-bit IEEE 754 floating point number. * [`Float64`](datatypes/float64.md): A double-precision 64-bit IEEE 754 floating point number. -* [`GraphEdge`](datatypes/graph_edge.md): An edge in a graph connecting two nodes. -* [`GraphNode`](datatypes/graph_node.md): A string-based ID representing a node in a graph. * [`ImageFormat`](datatypes/image_format.md): The metadata describing the contents of a [`components.ImageBuffer`](https://rerun.io/docs/reference/types/components/image_buffer). * [`KeypointId`](datatypes/keypoint_id.md): A 16-bit ID representing a type of semantic keypoint within a class. * [`KeypointPair`](datatypes/keypoint_pair.md): A connection between two [`datatypes.KeypointId`](https://rerun.io/docs/reference/types/datatypes/keypoint_id)s. @@ -47,6 +45,7 @@ Data types are the lowest layer of the data model hierarchy. They are re-usable * [`UVec3D`](datatypes/uvec3d.md): A uint32 vector in 3D space. * [`UVec4D`](datatypes/uvec4d.md): A uint vector in 4D space. * [`Utf8`](datatypes/utf8.md): A string of text, encoded as UTF-8. +* [`Utf8Pair`](datatypes/utf8pair.md): Stores a tuple of UTF-8 strings. * [`Uuid`](datatypes/uuid.md): A 16-byte UUID. * [`Vec2D`](datatypes/vec2d.md): A vector in 2D space. * [`Vec3D`](datatypes/vec3d.md): A vector in 3D space. diff --git a/docs/content/reference/types/datatypes/.gitattributes b/docs/content/reference/types/datatypes/.gitattributes index a2de869ac5a1..f66b6b014000 100644 --- a/docs/content/reference/types/datatypes/.gitattributes +++ b/docs/content/reference/types/datatypes/.gitattributes @@ -13,8 +13,6 @@ color_model.md linguist-generated=true entity_path.md linguist-generated=true float32.md linguist-generated=true float64.md linguist-generated=true -graph_edge.md linguist-generated=true -graph_node.md linguist-generated=true image_format.md linguist-generated=true keypoint_id.md linguist-generated=true keypoint_pair.md linguist-generated=true @@ -38,6 +36,7 @@ uint16.md linguist-generated=true uint32.md linguist-generated=true uint64.md linguist-generated=true utf8.md linguist-generated=true +utf8pair.md linguist-generated=true uuid.md linguist-generated=true uvec2d.md linguist-generated=true uvec3d.md linguist-generated=true diff --git a/docs/content/reference/types/datatypes/graph_edge.md b/docs/content/reference/types/datatypes/graph_edge.md deleted file mode 100644 index d28d0a08292f..000000000000 --- a/docs/content/reference/types/datatypes/graph_edge.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphEdge" ---- - - -An edge in a graph connecting two nodes. - -## Fields - -* source: [`GraphNode`](../datatypes/graph_node.md) -* target: [`GraphNode`](../datatypes/graph_node.md) - -## API reference links - * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphEdge.html) - * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphEdge) - * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphEdge.html) - - -## Used by - -* [`GraphEdge`](../components/graph_edge.md) diff --git a/docs/content/reference/types/datatypes/graph_node.md b/docs/content/reference/types/datatypes/graph_node.md deleted file mode 100644 index f46b63970e32..000000000000 --- a/docs/content/reference/types/datatypes/graph_node.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "GraphNode" ---- - - -A string-based ID representing a node in a graph. - -## Fields - -* id: `string` - -## API reference links - * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1GraphNode.html) - * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.GraphNode) - * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/datatypes/struct.GraphNode.html) - - -## Used by - -* [`GraphEdge`](../datatypes/graph_edge.md) -* [`GraphNode`](../components/graph_node.md) diff --git a/docs/content/reference/types/datatypes/utf8.md b/docs/content/reference/types/datatypes/utf8.md index 2c4f3f251d50..68110e0efc24 100644 --- a/docs/content/reference/types/datatypes/utf8.md +++ b/docs/content/reference/types/datatypes/utf8.md @@ -18,8 +18,10 @@ A string of text, encoded as UTF-8. ## Used by * [`AnnotationInfo`](../datatypes/annotation_info.md) +* [`GraphNode`](../components/graph_node.md) * [`MediaType`](../components/media_type.md) * [`Name`](../components/name.md) * [`TextLogLevel`](../components/text_log_level.md) * [`Text`](../components/text.md) +* [`Utf8Pair`](../datatypes/utf8pair.md) * [`VisibleTimeRange`](../datatypes/visible_time_range.md) diff --git a/docs/content/reference/types/datatypes/utf8pair.md b/docs/content/reference/types/datatypes/utf8pair.md new file mode 100644 index 000000000000..41ea970df3bb --- /dev/null +++ b/docs/content/reference/types/datatypes/utf8pair.md @@ -0,0 +1,21 @@ +--- +title: "Utf8Pair" +--- + + +Stores a tuple of UTF-8 strings. + +## Fields + +* first: [`Utf8`](../datatypes/utf8.md) +* second: [`Utf8`](../datatypes/utf8.md) + +## API reference links + * 🌊 [C++ API docs for `Utf8Pair`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1Utf8Pair.html) + * 🐍 [Python API docs for `Utf8Pair`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.Utf8Pair) + * 🦀 [Rust API docs for `Utf8Pair`](https://docs.rs/rerun/latest/rerun/datatypes/struct.Utf8Pair.html) + + +## Used by + +* [`GraphEdge`](../components/graph_edge.md) diff --git a/rerun_cpp/src/rerun/components/graph_edge.hpp b/rerun_cpp/src/rerun/components/graph_edge.hpp index 08925f2aaf77..70156dacbe34 100644 --- a/rerun_cpp/src/rerun/components/graph_edge.hpp +++ b/rerun_cpp/src/rerun/components/graph_edge.hpp @@ -3,7 +3,7 @@ #pragma once -#include "../datatypes/graph_edge.hpp" +#include "../datatypes/utf8pair.hpp" #include "../result.hpp" #include @@ -13,27 +13,27 @@ namespace rerun::components { /// **Component**: An edge in a graph connecting two nodes. struct GraphEdge { - rerun::datatypes::GraphEdge edge; + rerun::datatypes::Utf8Pair edge; public: GraphEdge() = default; - GraphEdge(rerun::datatypes::GraphEdge edge_) : edge(std::move(edge_)) {} + GraphEdge(rerun::datatypes::Utf8Pair edge_) : edge(std::move(edge_)) {} - GraphEdge& operator=(rerun::datatypes::GraphEdge edge_) { + GraphEdge& operator=(rerun::datatypes::Utf8Pair edge_) { edge = std::move(edge_); return *this; } - /// Cast to the underlying GraphEdge datatype - operator rerun::datatypes::GraphEdge() const { + /// Cast to the underlying Utf8Pair datatype + operator rerun::datatypes::Utf8Pair() const { return edge; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphEdge) == sizeof(components::GraphEdge)); + static_assert(sizeof(rerun::datatypes::Utf8Pair) == sizeof(components::GraphEdge)); /// \private template <> @@ -42,7 +42,7 @@ namespace rerun { /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } /// Serializes an array of `rerun::components::GraphEdge` into an arrow array. @@ -50,14 +50,14 @@ namespace rerun { const components::GraphEdge* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( + return Loggable::to_arrow( &instances->edge, num_instances ); diff --git a/rerun_cpp/src/rerun/components/graph_node.hpp b/rerun_cpp/src/rerun/components/graph_node.hpp index 1b2f6fc5b3e9..000f589b6327 100644 --- a/rerun_cpp/src/rerun/components/graph_node.hpp +++ b/rerun_cpp/src/rerun/components/graph_node.hpp @@ -3,7 +3,7 @@ #pragma once -#include "../datatypes/graph_node.hpp" +#include "../datatypes/utf8.hpp" #include "../result.hpp" #include @@ -14,34 +14,34 @@ namespace rerun::components { /// **Component**: A string-based ID representing a node in a graph. struct GraphNode { - rerun::datatypes::GraphNode id; + rerun::datatypes::Utf8 id; public: GraphNode() = default; - GraphNode(rerun::datatypes::GraphNode id_) : id(std::move(id_)) {} + GraphNode(rerun::datatypes::Utf8 id_) : id(std::move(id_)) {} - GraphNode& operator=(rerun::datatypes::GraphNode id_) { + GraphNode& operator=(rerun::datatypes::Utf8 id_) { id = std::move(id_); return *this; } - GraphNode(std::string id_) : id(std::move(id_)) {} + GraphNode(std::string value_) : id(std::move(value_)) {} - GraphNode& operator=(std::string id_) { - id = std::move(id_); + GraphNode& operator=(std::string value_) { + id = std::move(value_); return *this; } - /// Cast to the underlying GraphNode datatype - operator rerun::datatypes::GraphNode() const { + /// Cast to the underlying Utf8 datatype + operator rerun::datatypes::Utf8() const { return id; } }; } // namespace rerun::components namespace rerun { - static_assert(sizeof(rerun::datatypes::GraphNode) == sizeof(components::GraphNode)); + static_assert(sizeof(rerun::datatypes::Utf8) == sizeof(components::GraphNode)); /// \private template <> @@ -50,7 +50,7 @@ namespace rerun { /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype() { - return Loggable::arrow_datatype(); + return Loggable::arrow_datatype(); } /// Serializes an array of `rerun::components::GraphNode` into an arrow array. @@ -58,17 +58,14 @@ namespace rerun { const components::GraphNode* instances, size_t num_instances ) { if (num_instances == 0) { - return Loggable::to_arrow(nullptr, 0); + return Loggable::to_arrow(nullptr, 0); } else if (instances == nullptr) { return rerun::Error( ErrorCode::UnexpectedNullArgument, "Passed array instances is null when num_elements> 0." ); } else { - return Loggable::to_arrow( - &instances->id, - num_instances - ); + return Loggable::to_arrow(&instances->id, num_instances); } } }; diff --git a/rerun_cpp/src/rerun/datatypes.hpp b/rerun_cpp/src/rerun/datatypes.hpp index a544a27f3836..2709b0ce8604 100644 --- a/rerun_cpp/src/rerun/datatypes.hpp +++ b/rerun_cpp/src/rerun/datatypes.hpp @@ -14,8 +14,6 @@ #include "datatypes/entity_path.hpp" #include "datatypes/float32.hpp" #include "datatypes/float64.hpp" -#include "datatypes/graph_edge.hpp" -#include "datatypes/graph_node.hpp" #include "datatypes/image_format.hpp" #include "datatypes/keypoint_id.hpp" #include "datatypes/keypoint_pair.hpp" @@ -39,6 +37,7 @@ #include "datatypes/uint32.hpp" #include "datatypes/uint64.hpp" #include "datatypes/utf8.hpp" +#include "datatypes/utf8pair.hpp" #include "datatypes/uuid.hpp" #include "datatypes/uvec2d.hpp" #include "datatypes/uvec3d.hpp" diff --git a/rerun_cpp/src/rerun/datatypes/.gitattributes b/rerun_cpp/src/rerun/datatypes/.gitattributes index 54664fbd114a..d128068688c4 100644 --- a/rerun_cpp/src/rerun/datatypes/.gitattributes +++ b/rerun_cpp/src/rerun/datatypes/.gitattributes @@ -25,10 +25,6 @@ float32.cpp linguist-generated=true float32.hpp linguist-generated=true float64.cpp linguist-generated=true float64.hpp linguist-generated=true -graph_edge.cpp linguist-generated=true -graph_edge.hpp linguist-generated=true -graph_node.cpp linguist-generated=true -graph_node.hpp linguist-generated=true image_format.cpp linguist-generated=true image_format.hpp linguist-generated=true keypoint_id.cpp linguist-generated=true @@ -75,6 +71,8 @@ uint64.cpp linguist-generated=true uint64.hpp linguist-generated=true utf8.cpp linguist-generated=true utf8.hpp linguist-generated=true +utf8pair.cpp linguist-generated=true +utf8pair.hpp linguist-generated=true uuid.cpp linguist-generated=true uuid.hpp linguist-generated=true uvec2d.cpp linguist-generated=true diff --git a/rerun_cpp/src/rerun/datatypes/graph_node.cpp b/rerun_cpp/src/rerun/datatypes/graph_node.cpp deleted file mode 100644 index bd40260590f0..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_node.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". - -#include "graph_node.hpp" - -#include -#include - -namespace rerun::datatypes {} - -namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { - static const auto datatype = arrow::utf8(); - return datatype; - } - - Result> Loggable::to_arrow( - const datatypes::GraphNode* instances, size_t num_instances - ) { - // TODO(andreas): Allow configuring the memory pool. - arrow::MemoryPool* pool = arrow::default_memory_pool(); - auto datatype = arrow_datatype(); - - ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) - if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( - static_cast(builder.get()), - instances, - num_instances - )); - } - std::shared_ptr array; - ARROW_RETURN_NOT_OK(builder->Finish(&array)); - return array; - } - - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements - ) { - if (builder == nullptr) { - return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); - } - if (elements == nullptr) { - return rerun::Error( - ErrorCode::UnexpectedNullArgument, - "Cannot serialize null pointer to arrow array." - ); - } - - ARROW_RETURN_NOT_OK(builder->Reserve(static_cast(num_elements))); - for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - ARROW_RETURN_NOT_OK(builder->Append(elements[elem_idx].id)); - } - - return Error::ok(); - } -} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_node.hpp b/rerun_cpp/src/rerun/datatypes/graph_node.hpp deleted file mode 100644 index 109a872dd06c..000000000000 --- a/rerun_cpp/src/rerun/datatypes/graph_node.hpp +++ /dev/null @@ -1,58 +0,0 @@ -// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". - -#pragma once - -#include "../result.hpp" - -#include -#include -#include -#include - -namespace arrow { - class Array; - class DataType; - class StringBuilder; -} // namespace arrow - -namespace rerun::datatypes { - /// **Datatype**: A string-based ID representing a node in a graph. - struct GraphNode { - std::string id; - - public: - GraphNode() = default; - - GraphNode(std::string id_) : id(std::move(id_)) {} - - GraphNode& operator=(std::string id_) { - id = std::move(id_); - return *this; - } - }; -} // namespace rerun::datatypes - -namespace rerun { - template - struct Loggable; - - /// \private - template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphNode"; - - /// Returns the arrow data type this type corresponds to. - static const std::shared_ptr& arrow_datatype(); - - /// Serializes an array of `rerun::datatypes::GraphNode` into an arrow array. - static Result> to_arrow( - const datatypes::GraphNode* instances, size_t num_instances - ); - - /// Fills an arrow array builder with an array of this type. - static rerun::Error fill_arrow_array_builder( - arrow::StringBuilder* builder, const datatypes::GraphNode* elements, size_t num_elements - ); - }; -} // namespace rerun diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp b/rerun_cpp/src/rerun/datatypes/utf8pair.cpp similarity index 67% rename from rerun_cpp/src/rerun/datatypes/graph_edge.cpp rename to rerun_cpp/src/rerun/datatypes/utf8pair.cpp index 1e4134b5873c..2014e39616e5 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.cpp +++ b/rerun_cpp/src/rerun/datatypes/utf8pair.cpp @@ -1,9 +1,9 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs". -#include "graph_edge.hpp" +#include "utf8pair.hpp" -#include "graph_node.hpp" +#include "utf8.hpp" #include #include @@ -11,16 +11,16 @@ namespace rerun::datatypes {} namespace rerun { - const std::shared_ptr& Loggable::arrow_datatype() { + const std::shared_ptr& Loggable::arrow_datatype() { static const auto datatype = arrow::struct_({ - arrow::field("source", Loggable::arrow_datatype(), false), - arrow::field("target", Loggable::arrow_datatype(), false), + arrow::field("first", Loggable::arrow_datatype(), false), + arrow::field("second", Loggable::arrow_datatype(), false), }); return datatype; } - Result> Loggable::to_arrow( - const datatypes::GraphEdge* instances, size_t num_instances + Result> Loggable::to_arrow( + const datatypes::Utf8Pair* instances, size_t num_instances ) { // TODO(andreas): Allow configuring the memory pool. arrow::MemoryPool* pool = arrow::default_memory_pool(); @@ -28,7 +28,7 @@ namespace rerun { ARROW_ASSIGN_OR_RAISE(auto builder, arrow::MakeBuilder(datatype, pool)) if (instances && num_instances > 0) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( static_cast(builder.get()), instances, num_instances @@ -39,8 +39,8 @@ namespace rerun { return array; } - rerun::Error Loggable::fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphEdge* elements, size_t num_elements + rerun::Error Loggable::fill_arrow_array_builder( + arrow::StructBuilder* builder, const datatypes::Utf8Pair* elements, size_t num_elements ) { if (builder == nullptr) { return rerun::Error(ErrorCode::UnexpectedNullArgument, "Passed array builder is null."); @@ -56,9 +56,9 @@ namespace rerun { auto field_builder = static_cast(builder->field_builder(0)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( field_builder, - &elements[elem_idx].source, + &elements[elem_idx].first, 1 )); } @@ -67,9 +67,9 @@ namespace rerun { auto field_builder = static_cast(builder->field_builder(1)); ARROW_RETURN_NOT_OK(field_builder->Reserve(static_cast(num_elements))); for (size_t elem_idx = 0; elem_idx < num_elements; elem_idx += 1) { - RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( + RR_RETURN_NOT_OK(Loggable::fill_arrow_array_builder( field_builder, - &elements[elem_idx].target, + &elements[elem_idx].second, 1 )); } diff --git a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp b/rerun_cpp/src/rerun/datatypes/utf8pair.hpp similarity index 52% rename from rerun_cpp/src/rerun/datatypes/graph_edge.hpp rename to rerun_cpp/src/rerun/datatypes/utf8pair.hpp index edaf93bb6737..5b8e846da778 100644 --- a/rerun_cpp/src/rerun/datatypes/graph_edge.hpp +++ b/rerun_cpp/src/rerun/datatypes/utf8pair.hpp @@ -1,10 +1,10 @@ // DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/cpp/mod.rs -// Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". +// Based on "crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs". #pragma once #include "../result.hpp" -#include "graph_node.hpp" +#include "utf8.hpp" #include #include @@ -16,16 +16,16 @@ namespace arrow { } // namespace arrow namespace rerun::datatypes { - /// **Datatype**: An edge in a graph connecting two nodes. - struct GraphEdge { - /// The id of the source node. - rerun::datatypes::GraphNode source; + /// **Datatype**: Stores a tuple of UTF-8 strings. + struct Utf8Pair { + /// The first string. + rerun::datatypes::Utf8 first; - /// The id of the target node. - rerun::datatypes::GraphNode target; + /// The second string. + rerun::datatypes::Utf8 second; public: - GraphEdge() = default; + Utf8Pair() = default; }; } // namespace rerun::datatypes @@ -35,20 +35,20 @@ namespace rerun { /// \private template <> - struct Loggable { - static constexpr const char Name[] = "rerun.datatypes.GraphEdge"; + struct Loggable { + static constexpr const char Name[] = "rerun.datatypes.Utf8Pair"; /// Returns the arrow data type this type corresponds to. static const std::shared_ptr& arrow_datatype(); - /// Serializes an array of `rerun::datatypes::GraphEdge` into an arrow array. + /// Serializes an array of `rerun::datatypes::Utf8Pair` into an arrow array. static Result> to_arrow( - const datatypes::GraphEdge* instances, size_t num_instances + const datatypes::Utf8Pair* instances, size_t num_instances ); /// Fills an arrow array builder with an array of this type. static rerun::Error fill_arrow_array_builder( - arrow::StructBuilder* builder, const datatypes::GraphEdge* elements, size_t num_elements + arrow::StructBuilder* builder, const datatypes::Utf8Pair* elements, size_t num_elements ); }; } // namespace rerun diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py index 992e431ddf2f..00403957c273 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -26,7 +26,7 @@ class GraphEdges(Archetype): By default, edges are undirected. """ - def __init__(self: Any, edges: datatypes.GraphEdgeArrayLike, *, graph_type: components.GraphTypeLike | None = None): + def __init__(self: Any, edges: datatypes.Utf8PairArrayLike, *, graph_type: components.GraphTypeLike | None = None): """ Create a new instance of the GraphEdges archetype. diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py index e3d494b7bcc3..437b8dc24a19 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py @@ -24,7 +24,7 @@ class GraphNodes(Archetype): def __init__( self: Any, - node_ids: datatypes.GraphNodeArrayLike, + node_ids: datatypes.Utf8ArrayLike, *, positions: datatypes.Vec2DArrayLike | None = None, colors: datatypes.Rgba32ArrayLike | None = None, diff --git a/rerun_py/rerun_sdk/rerun/components/graph_edge.py b/rerun_py/rerun_sdk/rerun/components/graph_edge.py index 62f0bded664e..28190c6599a6 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_edge.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_edge.py @@ -14,21 +14,21 @@ __all__ = ["GraphEdge", "GraphEdgeBatch", "GraphEdgeType"] -class GraphEdge(datatypes.GraphEdge, ComponentMixin): +class GraphEdge(datatypes.Utf8Pair, ComponentMixin): """**Component**: An edge in a graph connecting two nodes.""" _BATCH_TYPE = None # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - # Note: there are no fields here because GraphEdge delegates to datatypes.GraphEdge + # Note: there are no fields here because GraphEdge delegates to datatypes.Utf8Pair pass -class GraphEdgeType(datatypes.GraphEdgeType): +class GraphEdgeType(datatypes.Utf8PairType): _TYPE_NAME: str = "rerun.components.GraphEdge" -class GraphEdgeBatch(datatypes.GraphEdgeBatch, ComponentBatchMixin): +class GraphEdgeBatch(datatypes.Utf8PairBatch, ComponentBatchMixin): _ARROW_TYPE = GraphEdgeType() diff --git a/rerun_py/rerun_sdk/rerun/components/graph_node.py b/rerun_py/rerun_sdk/rerun/components/graph_node.py index 89bdfcb71fc2..50683df51326 100644 --- a/rerun_py/rerun_sdk/rerun/components/graph_node.py +++ b/rerun_py/rerun_sdk/rerun/components/graph_node.py @@ -14,21 +14,21 @@ __all__ = ["GraphNode", "GraphNodeBatch", "GraphNodeType"] -class GraphNode(datatypes.GraphNode, ComponentMixin): +class GraphNode(datatypes.Utf8, ComponentMixin): """**Component**: A string-based ID representing a node in a graph.""" _BATCH_TYPE = None # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py - # Note: there are no fields here because GraphNode delegates to datatypes.GraphNode + # Note: there are no fields here because GraphNode delegates to datatypes.Utf8 pass -class GraphNodeType(datatypes.GraphNodeType): +class GraphNodeType(datatypes.Utf8Type): _TYPE_NAME: str = "rerun.components.GraphNode" -class GraphNodeBatch(datatypes.GraphNodeBatch, ComponentBatchMixin): +class GraphNodeBatch(datatypes.Utf8Batch, ComponentBatchMixin): _ARROW_TYPE = GraphNodeType() diff --git a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes index 585d0be6e2a8..436e96b5983e 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes +++ b/rerun_py/rerun_sdk/rerun/datatypes/.gitattributes @@ -14,8 +14,6 @@ color_model.py linguist-generated=true entity_path.py linguist-generated=true float32.py linguist-generated=true float64.py linguist-generated=true -graph_edge.py linguist-generated=true -graph_node.py linguist-generated=true image_format.py linguist-generated=true keypoint_id.py linguist-generated=true keypoint_pair.py linguist-generated=true @@ -39,6 +37,7 @@ uint16.py linguist-generated=true uint32.py linguist-generated=true uint64.py linguist-generated=true utf8.py linguist-generated=true +utf8pair.py linguist-generated=true uuid.py linguist-generated=true uvec2d.py linguist-generated=true uvec3d.py linguist-generated=true diff --git a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py index a8eb70dc69bd..8052ba28cf6f 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/__init__.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/__init__.py @@ -38,8 +38,6 @@ from .entity_path import EntityPath, EntityPathArrayLike, EntityPathBatch, EntityPathLike, EntityPathType from .float32 import Float32, Float32ArrayLike, Float32Batch, Float32Like, Float32Type from .float64 import Float64, Float64ArrayLike, Float64Batch, Float64Like, Float64Type -from .graph_edge import GraphEdge, GraphEdgeArrayLike, GraphEdgeBatch, GraphEdgeLike, GraphEdgeType -from .graph_node import GraphNode, GraphNodeArrayLike, GraphNodeBatch, GraphNodeLike, GraphNodeType from .image_format import ImageFormat, ImageFormatArrayLike, ImageFormatBatch, ImageFormatLike, ImageFormatType from .keypoint_id import KeypointId, KeypointIdArrayLike, KeypointIdBatch, KeypointIdLike, KeypointIdType from .keypoint_pair import KeypointPair, KeypointPairArrayLike, KeypointPairBatch, KeypointPairLike, KeypointPairType @@ -93,6 +91,7 @@ from .uint32 import UInt32, UInt32ArrayLike, UInt32Batch, UInt32Like, UInt32Type from .uint64 import UInt64, UInt64ArrayLike, UInt64Batch, UInt64Like, UInt64Type from .utf8 import Utf8, Utf8ArrayLike, Utf8Batch, Utf8Like, Utf8Type +from .utf8pair import Utf8Pair, Utf8PairArrayLike, Utf8PairBatch, Utf8PairLike, Utf8PairType from .uuid import Uuid, UuidArrayLike, UuidBatch, UuidLike, UuidType from .uvec2d import UVec2D, UVec2DArrayLike, UVec2DBatch, UVec2DLike, UVec2DType from .uvec3d import UVec3D, UVec3DArrayLike, UVec3DBatch, UVec3DLike, UVec3DType @@ -183,16 +182,6 @@ "Float64Batch", "Float64Like", "Float64Type", - "GraphEdge", - "GraphEdgeArrayLike", - "GraphEdgeBatch", - "GraphEdgeLike", - "GraphEdgeType", - "GraphNode", - "GraphNodeArrayLike", - "GraphNodeBatch", - "GraphNodeLike", - "GraphNodeType", "ImageFormat", "ImageFormatArrayLike", "ImageFormatBatch", @@ -322,6 +311,11 @@ "Utf8ArrayLike", "Utf8Batch", "Utf8Like", + "Utf8Pair", + "Utf8PairArrayLike", + "Utf8PairBatch", + "Utf8PairLike", + "Utf8PairType", "Utf8Type", "Uuid", "UuidArrayLike", diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py deleted file mode 100644 index 600b8feaab3f..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_edge.py +++ /dev/null @@ -1,104 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_edge.fbs". - -# You can extend this class by creating a "GraphEdgeExt" class in "graph_edge_ext.py". - -from __future__ import annotations - -from typing import Any, Sequence, Union - -import pyarrow as pa -from attrs import define, field - -from .. import datatypes -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphEdge", "GraphEdgeArrayLike", "GraphEdgeBatch", "GraphEdgeLike", "GraphEdgeType"] - - -def _graph_edge__source__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: - if isinstance(x, datatypes.GraphNode): - return x - else: - return datatypes.GraphNode(x) - - -def _graph_edge__target__special_field_converter_override(x: datatypes.GraphNodeLike) -> datatypes.GraphNode: - if isinstance(x, datatypes.GraphNode): - return x - else: - return datatypes.GraphNode(x) - - -@define(init=False) -class GraphEdge: - """**Datatype**: An edge in a graph connecting two nodes.""" - - def __init__(self: Any, source: datatypes.GraphNodeLike, target: datatypes.GraphNodeLike): - """ - Create a new instance of the GraphEdge datatype. - - Parameters - ---------- - source: - The id of the source node. - target: - The id of the target node. - - """ - - # You can define your own __init__ function as a member of GraphEdgeExt in graph_edge_ext.py - self.__attrs_init__(source=source, target=target) - - source: datatypes.GraphNode = field(converter=_graph_edge__source__special_field_converter_override) - # The id of the source node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - target: datatypes.GraphNode = field(converter=_graph_edge__target__special_field_converter_override) - # The id of the target node. - # - # (Docstring intentionally commented out to hide this field from the docs) - - -GraphEdgeLike = GraphEdge -GraphEdgeArrayLike = Union[ - GraphEdge, - Sequence[GraphEdgeLike], -] - - -class GraphEdgeType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphEdge" - - def __init__(self) -> None: - pa.ExtensionType.__init__( - self, - pa.struct([ - pa.field("source", pa.utf8(), nullable=False, metadata={}), - pa.field("target", pa.utf8(), nullable=False, metadata={}), - ]), - self._TYPE_NAME, - ) - - -class GraphEdgeBatch(BaseBatch[GraphEdgeArrayLike]): - _ARROW_TYPE = GraphEdgeType() - - @staticmethod - def _native_to_pa_array(data: GraphEdgeArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import GraphNodeBatch - - if isinstance(data, GraphEdge): - data = [data] - - return pa.StructArray.from_arrays( - [ - GraphNodeBatch([x.source for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - GraphNodeBatch([x.target for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - ], - fields=list(data_type), - ) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py b/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py deleted file mode 100644 index 5d11311ecb0d..000000000000 --- a/rerun_py/rerun_sdk/rerun/datatypes/graph_node.py +++ /dev/null @@ -1,71 +0,0 @@ -# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs -# Based on "crates/store/re_types/definitions/rerun/datatypes/graph_node.fbs". - -# You can extend this class by creating a "GraphNodeExt" class in "graph_node_ext.py". - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Sequence, Union - -import numpy as np -import numpy.typing as npt -import pyarrow as pa -from attrs import define, field - -from .._baseclasses import ( - BaseBatch, - BaseExtensionType, -) - -__all__ = ["GraphNode", "GraphNodeArrayLike", "GraphNodeBatch", "GraphNodeLike", "GraphNodeType"] - - -@define(init=False) -class GraphNode: - """**Datatype**: A string-based ID representing a node in a graph.""" - - def __init__(self: Any, id: GraphNodeLike): - """Create a new instance of the GraphNode datatype.""" - - # You can define your own __init__ function as a member of GraphNodeExt in graph_node_ext.py - self.__attrs_init__(id=id) - - id: str = field(converter=str) - - def __str__(self) -> str: - return str(self.id) - - def __hash__(self) -> int: - return hash(self.id) - - -if TYPE_CHECKING: - GraphNodeLike = Union[GraphNode, str] -else: - GraphNodeLike = Any - -GraphNodeArrayLike = Union[GraphNode, Sequence[GraphNodeLike], Sequence[str]] - - -class GraphNodeType(BaseExtensionType): - _TYPE_NAME: str = "rerun.datatypes.GraphNode" - - def __init__(self) -> None: - pa.ExtensionType.__init__(self, pa.utf8(), self._TYPE_NAME) - - -class GraphNodeBatch(BaseBatch[GraphNodeArrayLike]): - _ARROW_TYPE = GraphNodeType() - - @staticmethod - def _native_to_pa_array(data: GraphNodeArrayLike, data_type: pa.DataType) -> pa.Array: - if isinstance(data, str): - array: Union[list[str], npt.ArrayLike] = [data] - elif isinstance(data, Sequence): - array = [str(datum) for datum in data] - elif isinstance(data, np.ndarray): - array = data - else: - array = [str(data)] - - return pa.array(array, type=data_type) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py new file mode 100644 index 000000000000..057b4b79a2cd --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py @@ -0,0 +1,104 @@ +# DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/python/mod.rs +# Based on "crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs". + +# You can extend this class by creating a "Utf8PairExt" class in "utf8pair_ext.py". + +from __future__ import annotations + +from typing import Any, Sequence, Union + +import pyarrow as pa +from attrs import define, field + +from .. import datatypes +from .._baseclasses import ( + BaseBatch, + BaseExtensionType, +) + +__all__ = ["Utf8Pair", "Utf8PairArrayLike", "Utf8PairBatch", "Utf8PairLike", "Utf8PairType"] + + +def _utf8pair__first__special_field_converter_override(x: datatypes.Utf8Like) -> datatypes.Utf8: + if isinstance(x, datatypes.Utf8): + return x + else: + return datatypes.Utf8(x) + + +def _utf8pair__second__special_field_converter_override(x: datatypes.Utf8Like) -> datatypes.Utf8: + if isinstance(x, datatypes.Utf8): + return x + else: + return datatypes.Utf8(x) + + +@define(init=False) +class Utf8Pair: + """**Datatype**: Stores a tuple of UTF-8 strings.""" + + def __init__(self: Any, first: datatypes.Utf8Like, second: datatypes.Utf8Like): + """ + Create a new instance of the Utf8Pair datatype. + + Parameters + ---------- + first: + The first string. + second: + The second string. + + """ + + # You can define your own __init__ function as a member of Utf8PairExt in utf8pair_ext.py + self.__attrs_init__(first=first, second=second) + + first: datatypes.Utf8 = field(converter=_utf8pair__first__special_field_converter_override) + # The first string. + # + # (Docstring intentionally commented out to hide this field from the docs) + + second: datatypes.Utf8 = field(converter=_utf8pair__second__special_field_converter_override) + # The second string. + # + # (Docstring intentionally commented out to hide this field from the docs) + + +Utf8PairLike = Utf8Pair +Utf8PairArrayLike = Union[ + Utf8Pair, + Sequence[Utf8PairLike], +] + + +class Utf8PairType(BaseExtensionType): + _TYPE_NAME: str = "rerun.datatypes.Utf8Pair" + + def __init__(self) -> None: + pa.ExtensionType.__init__( + self, + pa.struct([ + pa.field("first", pa.utf8(), nullable=False, metadata={}), + pa.field("second", pa.utf8(), nullable=False, metadata={}), + ]), + self._TYPE_NAME, + ) + + +class Utf8PairBatch(BaseBatch[Utf8PairArrayLike]): + _ARROW_TYPE = Utf8PairType() + + @staticmethod + def _native_to_pa_array(data: Utf8PairArrayLike, data_type: pa.DataType) -> pa.Array: + from rerun.datatypes import Utf8Batch + + if isinstance(data, Utf8Pair): + data = [data] + + return pa.StructArray.from_arrays( + [ + Utf8Batch([x.first for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + Utf8Batch([x.second for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] + ], + fields=list(data_type), + ) From 59049fe6a4f3645618eaf514e1893a2646266662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 11:31:45 +0100 Subject: [PATCH 121/159] WIP: `attr.doc` and docstrings --- .../definitions/rerun/archetypes/graph_edges.fbs | 7 +++++-- .../definitions/rerun/archetypes/graph_nodes.fbs | 9 +++++---- .../re_types/definitions/rerun/components/graph_edge.fbs | 1 + .../re_types/definitions/rerun/components/graph_node.fbs | 1 + .../re_types/definitions/rerun/components/graph_type.fbs | 1 + .../re_types/definitions/rerun/datatypes/utf8_pair.fbs | 7 ++++--- crates/store/re_types/src/components/graph_node_ext.rs | 1 - crates/viewer/re_space_view_graph/src/ui/node.rs | 3 ++- docs/content/reference/types/archetypes/graph_edges.md | 6 +++--- docs/content/reference/types/components/graph_edge.md | 2 +- docs/content/reference/types/components/graph_type.md | 2 +- 11 files changed, 24 insertions(+), 16 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index d7d2286d3d3e..864624dc9e98 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -6,9 +6,10 @@ namespace rerun.archetypes; /// /// By default, edges are undirected. table GraphEdges ( - "attr.rust.derive": "PartialEq, Eq", "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" + "attr.docs.unreleased", + "attr.docs.view_types": "Graph View", + "attr.rust.derive": "PartialEq, Eq", ) { // --- Required --- @@ -19,6 +20,8 @@ table GraphEdges ( // --- Recommended --- /// Specifies if the graph is directed or undirected. + /// + /// If no `GraphType` is provided, the graph is assumed to be undirected. graph_type: rerun.components.GraphType ("attr.rerun.component_recommended", nullable, order: 2000); } diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs index 9aabe3112668..9ecd41e3bcb0 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -4,9 +4,10 @@ namespace rerun.archetypes; /// A list of nodes in a graph with optional labels, colors, etc. table GraphNodes ( - "attr.rust.derive": "PartialEq", "attr.docs.category": "Graph", - "attr.docs.view_types": "Graph View" + "attr.docs.unreleased", + "attr.docs.view_types": "Graph View", + "attr.rust.derive": "PartialEq", ) { // --- Required --- @@ -16,10 +17,10 @@ table GraphNodes ( // --- Optional --- /// Optional center positions of the nodes. - positions: [rerun.components.Position2D] ("attr.rerun.component_recommended", nullable, order: 3000); + positions: [rerun.components.Position2D] ("attr.rerun.component_optional", nullable, order: 3000); /// Optional colors for the boxes. - colors: [rerun.components.Color] ("attr.rerun.component_recommended", nullable, order: 3100); + colors: [rerun.components.Color] ("attr.rerun.component_optional", nullable, order: 3100); /// Optional text labels for the node. labels: [rerun.components.Text] ("attr.rerun.component_optional", nullable, order: 3200); diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index a7c849fd681b..963ece54445a 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -4,6 +4,7 @@ namespace rerun.components; /// An edge in a graph connecting two nodes. table GraphEdge ( + "attr.docs.unreleased", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.repr": "transparent", "attr.rust.custom_clause": diff --git a/crates/store/re_types/definitions/rerun/components/graph_node.fbs b/crates/store/re_types/definitions/rerun/components/graph_node.fbs index 8c5fc0f960fe..827f704d622c 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node.fbs @@ -4,6 +4,7 @@ namespace rerun.components; /// A string-based ID representing a node in a graph. table GraphNode ( + "attr.docs.unreleased", "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs index 0742d79c3758..fb6f5c62f6e5 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_type.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_type.fbs @@ -4,6 +4,7 @@ namespace rerun.components; /// Specifies if a graph has directed or undirected edges. enum GraphType: ubyte ( + "attr.docs.unreleased", "attr.rust.derive": "Default, PartialEq, Eq", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' diff --git a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs index 7c649ad3eb3b..4aa7d7024eb1 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs @@ -2,9 +2,10 @@ namespace rerun.datatypes; /// Stores a tuple of UTF-8 strings. table Utf8Pair ( - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.docs.unreleased", + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", + "attr.rust.custom_clause": + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))', ) { /// The first string. first: rerun.datatypes.Utf8 (order: 100); diff --git a/crates/store/re_types/src/components/graph_node_ext.rs b/crates/store/re_types/src/components/graph_node_ext.rs index 568bda997112..e45b48b77310 100644 --- a/crates/store/re_types/src/components/graph_node_ext.rs +++ b/crates/store/re_types/src/components/graph_node_ext.rs @@ -14,4 +14,3 @@ impl From for String { value.as_str().to_owned() } } - diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index 1bde5120422d..783da391be33 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -60,6 +60,7 @@ pub fn draw_node( } .on_hover_text(format!( "Node ID: `{}` in `{}`", - instance.node_id.as_str(), instance.entity_path + instance.node_id.as_str(), + instance.entity_path )) } diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges.md index 7a4461545fc7..4c3eb318970b 100644 --- a/docs/content/reference/types/archetypes/graph_edges.md +++ b/docs/content/reference/types/archetypes/graph_edges.md @@ -18,7 +18,7 @@ By default, edges are undirected. * [DataframeView](../views/dataframe_view.md) ## API reference links - * 🌊 [C++ API docs for `GraphEdges`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdges.html) - * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphEdges) - * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html) + * 🌊 [C++ API docs for `GraphEdges`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphEdges.html?speculative-link) + * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes?speculative-link#rerun.archetypes.GraphEdges) + * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html?speculative-link) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md index a249f3c9a8bd..998a670f1f9d 100644 --- a/docs/content/reference/types/components/graph_edge.md +++ b/docs/content/reference/types/components/graph_edge.md @@ -17,4 +17,4 @@ An edge in a graph connecting two nodes. ## Used by -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdges`](../archetypes/graph_edges.md?speculative-link) diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md index 922acbb6a71a..a6712342fefe 100644 --- a/docs/content/reference/types/components/graph_type.md +++ b/docs/content/reference/types/components/graph_type.md @@ -18,4 +18,4 @@ Specifies if a graph has directed or undirected edges. ## Used by -* [`GraphEdges`](../archetypes/graph_edges.md) +* [`GraphEdges`](../archetypes/graph_edges.md?speculative-link) From b3d7b4c37001e0c35ce5b9ec25187098c798b5e7 Mon Sep 17 00:00:00 2001 From: Antoine Beyeler Date: Mon, 28 Oct 2024 12:16:54 +0100 Subject: [PATCH 122/159] Register GraphType component edit ui --- crates/viewer/re_component_ui/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/viewer/re_component_ui/src/lib.rs b/crates/viewer/re_component_ui/src/lib.rs index dd390bc96c3d..de8297910d4b 100644 --- a/crates/viewer/re_component_ui/src/lib.rs +++ b/crates/viewer/re_component_ui/src/lib.rs @@ -30,9 +30,9 @@ use re_types::{ blueprint::components::{BackgroundKind, Corner2D, LockRangeDuringZoom, ViewFit, Visible}, components::{ AggregationPolicy, AlbedoFactor, AxisLength, Color, DepthMeter, DrawOrder, FillMode, - FillRatio, GammaCorrection, ImagePlaneDistance, MagnificationFilter, MarkerSize, Name, - Opacity, Range1D, Scale3D, ShowLabels, StrokeWidth, Text, TransformRelation, Translation3D, - ValueRange, + FillRatio, GammaCorrection, GraphType, ImagePlaneDistance, MagnificationFilter, MarkerSize, + Name, Opacity, Range1D, Scale3D, ShowLabels, StrokeWidth, Text, TransformRelation, + Translation3D, ValueRange, }, Loggable as _, }; @@ -90,6 +90,7 @@ pub fn create_component_ui_registry() -> re_viewer_context::ComponentUiRegistry registry.add_singleline_edit_or_view::(edit_view_enum); registry.add_singleline_edit_or_view::(edit_view_enum); registry.add_singleline_edit_or_view::(edit_view_enum); + registry.add_singleline_edit_or_view::(edit_view_enum); registry.add_singleline_edit_or_view::(edit_view_enum); registry.add_singleline_edit_or_view::(edit_view_enum); registry.add_singleline_edit_or_view::(edit_view_enum); From 9ef47be2e4c3f547c616e5376e34fbec675d1ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 12:40:12 +0100 Subject: [PATCH 123/159] WIP: `pixi run codegen` --- .../rerun/archetypes/graph_edges.fbs | 2 +- .../rerun/archetypes/graph_nodes.fbs | 2 +- .../definitions/rerun/datatypes/utf8_pair.fbs | 2 +- .../re_types/src/archetypes/graph_edges.rs | 4 +++ .../re_types/src/archetypes/graph_nodes.rs | 16 ++++------ crates/viewer/re_space_view_graph/src/lib.rs | 1 + .../re_space_view_graph/src/properties.rs | 27 ++++++++++++++++ .../viewer/re_space_view_graph/src/ui/mod.rs | 14 ++------- .../re_space_view_graph/src/ui/state.rs | 21 ++++--------- crates/viewer/re_space_view_graph/src/view.rs | 31 ++++++++++++++++--- crates/viewer/re_viewer/src/reflection/mod.rs | 3 +- .../reference/types/archetypes/graph_nodes.md | 10 +++--- .../reference/types/components/color.md | 2 +- .../reference/types/components/graph_edge.md | 6 ++-- .../reference/types/components/graph_node.md | 8 ++--- .../reference/types/components/graph_type.md | 6 ++-- .../reference/types/components/position2d.md | 2 +- .../reference/types/components/show_labels.md | 2 +- .../reference/types/components/text.md | 2 +- .../content/reference/types/datatypes/utf8.md | 4 +-- .../reference/types/datatypes/utf8pair.md | 8 ++--- .../src/rerun/archetypes/graph_edges.hpp | 4 +++ .../rerun_sdk/rerun/archetypes/graph_edges.py | 4 +++ 23 files changed, 109 insertions(+), 72 deletions(-) create mode 100644 crates/viewer/re_space_view_graph/src/properties.rs diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index 864624dc9e98..c216d673fe44 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -9,7 +9,7 @@ table GraphEdges ( "attr.docs.category": "Graph", "attr.docs.unreleased", "attr.docs.view_types": "Graph View", - "attr.rust.derive": "PartialEq, Eq", + "attr.rust.derive": "PartialEq, Eq" ) { // --- Required --- diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs index 9ecd41e3bcb0..6e3d91b7783c 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -7,7 +7,7 @@ table GraphNodes ( "attr.docs.category": "Graph", "attr.docs.unreleased", "attr.docs.view_types": "Graph View", - "attr.rust.derive": "PartialEq", + "attr.rust.derive": "PartialEq" ) { // --- Required --- diff --git a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs index 4aa7d7024eb1..428320c30224 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs @@ -5,7 +5,7 @@ table Utf8Pair ( "attr.docs.unreleased", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))', + 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' ) { /// The first string. first: rerun.datatypes.Utf8 (order: 100); diff --git a/crates/store/re_types/src/archetypes/graph_edges.rs b/crates/store/re_types/src/archetypes/graph_edges.rs index 348b2f486fd3..327150be638a 100644 --- a/crates/store/re_types/src/archetypes/graph_edges.rs +++ b/crates/store/re_types/src/archetypes/graph_edges.rs @@ -27,6 +27,8 @@ pub struct GraphEdges { pub edges: Vec, /// Specifies if the graph is directed or undirected. + /// + /// If no `GraphType` is provided, the graph is assumed to be undirected. pub graph_type: Option, } @@ -178,6 +180,8 @@ impl GraphEdges { } /// Specifies if the graph is directed or undirected. + /// + /// If no `GraphType` is provided, the graph is assumed to be undirected. #[inline] pub fn with_graph_type(mut self, graph_type: impl Into) -> Self { self.graph_type = Some(graph_type.into()); diff --git a/crates/store/re_types/src/archetypes/graph_nodes.rs b/crates/store/re_types/src/archetypes/graph_nodes.rs index f0a2b2c61290..4fc88d9ce024 100644 --- a/crates/store/re_types/src/archetypes/graph_nodes.rs +++ b/crates/store/re_types/src/archetypes/graph_nodes.rs @@ -60,18 +60,14 @@ impl ::re_types_core::SizeBytes for GraphNodes { static REQUIRED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = once_cell::sync::Lazy::new(|| ["rerun.components.GraphNode".into()]); -static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = +static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.GraphNodesIndicator".into()]); + +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 4usize]> = once_cell::sync::Lazy::new(|| { [ "rerun.components.Position2D".into(), "rerun.components.Color".into(), - "rerun.components.GraphNodesIndicator".into(), - ] - }); - -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = - once_cell::sync::Lazy::new(|| { - [ "rerun.components.Text".into(), "rerun.components.ShowLabels".into(), ] @@ -81,16 +77,16 @@ static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 6usize]> = once_cell::sync::Lazy::new(|| { [ "rerun.components.GraphNode".into(), + "rerun.components.GraphNodesIndicator".into(), "rerun.components.Position2D".into(), "rerun.components.Color".into(), - "rerun.components.GraphNodesIndicator".into(), "rerun.components.Text".into(), "rerun.components.ShowLabels".into(), ] }); impl GraphNodes { - /// The total number of components in the archetype: 1 required, 3 recommended, 2 optional + /// The total number of components in the archetype: 1 required, 1 recommended, 4 optional pub const NUM_COMPONENTS: usize = 6usize; } diff --git a/crates/viewer/re_space_view_graph/src/lib.rs b/crates/viewer/re_space_view_graph/src/lib.rs index 13d47924cd73..fcf34f4cc1e3 100644 --- a/crates/viewer/re_space_view_graph/src/lib.rs +++ b/crates/viewer/re_space_view_graph/src/lib.rs @@ -7,6 +7,7 @@ mod graph; mod types; mod ui; mod view; +mod properties; mod visualizers; pub use view::GraphSpaceView; diff --git a/crates/viewer/re_space_view_graph/src/properties.rs b/crates/viewer/re_space_view_graph/src/properties.rs new file mode 100644 index 000000000000..edd2e81c8e25 --- /dev/null +++ b/crates/viewer/re_space_view_graph/src/properties.rs @@ -0,0 +1,27 @@ +use re_types::blueprint::components::VisualBounds2D; +use re_viewer_context::{SpaceViewStateExt as _, TypedComponentFallbackProvider}; + +use crate::{ui::{bounding_rect_from_iter, GraphSpaceViewState}, GraphSpaceView}; + +fn valid_bound(rect: &egui::Rect) -> bool { + rect.is_finite() && rect.is_positive() +} + +impl TypedComponentFallbackProvider for GraphSpaceView { + fn fallback_for(&self, ctx: &re_viewer_context::QueryContext<'_>) -> VisualBounds2D { + let Ok(state) = ctx.view_state.downcast_ref::() else { + return VisualBounds2D::default(); + }; + + let default_scene_rect = bounding_rect_from_iter(state.layout.values()); + + if valid_bound(&default_scene_rect) { + default_scene_rect.into() + } else { + // Nothing in scene, probably. + VisualBounds2D::default() + } + } +} + +re_viewer_context::impl_component_fallback_provider!(GraphSpaceView => [VisualBounds2D]); diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 576f518d292d..9ed29591aacd 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -60,16 +60,6 @@ pub fn draw_entity( pub fn bounding_rect_from_iter<'a>( rectangles: impl Iterator, -) -> Option { - // Start with `None` and gradually expand the bounding box. - let mut bounding_rect: Option = None; - - for rect in rectangles { - bounding_rect = match bounding_rect { - Some(bounding) => Some(bounding.union(*rect)), - None => Some(*rect), - }; - } - - bounding_rect +) -> egui::Rect { + rectangles.fold(egui::Rect::NOTHING, |acc, rect| acc.union(*rect)) } diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index d05564773778..84416229d586 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use re_format::format_f32; +use re_types::blueprint::components::VisualBounds2D; use re_ui::UiExt; use re_viewer_context::SpaceViewState; @@ -17,10 +18,11 @@ pub struct GraphSpaceViewState { /// Indicates if the viewer should fit to the screen the next time it is rendered. pub should_fit_to_screen: bool, - pub should_tick: bool, /// Positions of the nodes in world space. pub layout: HashMap, + + pub visual_bounds_2d: Option, } impl GraphSpaceViewState { @@ -29,10 +31,9 @@ impl GraphSpaceViewState { .on_hover_text("The bounding box encompassing all Entities in the view right now"); ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(egui::Rect { min, max }) = bounding_rect_from_iter(self.layout.values()) { - ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); - ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); - } + let egui::Rect { min, max } = bounding_rect_from_iter(self.layout.values()); + ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); + ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); }); ui.end_row(); @@ -50,16 +51,6 @@ impl GraphSpaceViewState { .on_hover_text("Shows debug information for the current graph"); ui.end_row(); } - - pub fn simulation_ui(&mut self, ui: &mut egui::Ui) { - ui.grid_left_hand_label("Simulation") - .on_hover_text("Control the simulation of the graph layout"); - if ui.button("Tick").clicked() { - self.should_tick = true; - } - - ui.end_row(); - } } impl SpaceViewState for GraphSpaceViewState { diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 92ccb8e01dd9..c436a3bf2ff8 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -15,7 +15,7 @@ use re_viewer_context::{ use crate::{ graph::{Graph, NodeIndex}, - ui::{self, GraphSpaceViewState}, + ui::{self, bounding_rect_from_iter, GraphSpaceViewState}, visualizers::{EdgesVisualizer, NodeVisualizer}, }; @@ -54,11 +54,33 @@ impl SpaceViewClass for GraphSpaceView { Box::::default() } - fn preferred_tile_aspect_ratio(&self, _state: &dyn SpaceViewState) -> Option { - // Prefer a square tile if possible. - Some(1.0) + fn preferred_tile_aspect_ratio(&self, state: &dyn SpaceViewState) -> Option { + state + .downcast_ref::() + .ok() + .map(|state| { + let (width, height) = state.visual_bounds_2d.map_or_else( + || { + let bbox = bounding_rect_from_iter(state.layout.values()); + ( + (bbox.max.x - bbox.min.x).abs(), + (bbox.max.y - bbox.min.y).abs(), + ) + }, + |bounds| { + ( + bounds.x_range.abs_len() as f32, + bounds.y_range.abs_len() as f32, + ) + }, + ); + + width / height + }) } + // TODO(grtlr): implement `recommended_root_for_entities` + fn layout_priority(&self) -> SpaceViewClassLayoutPriority { Default::default() } @@ -92,7 +114,6 @@ impl SpaceViewClass for GraphSpaceView { ui.selection_grid("graph_settings_ui").show(ui, |ui| { state.bounding_box_ui(ui); state.debug_ui(ui); - state.simulation_ui(ui); }); Ok(()) diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index c5fe6cb39f02..d29d5c4a5078 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -1096,7 +1096,8 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { docstring_md : "A list of node IDs.", is_required : true, }, ArchetypeFieldReflection { component_name : "rerun.components.GraphType".into(), display_name : "Graph type", - docstring_md : "Specifies if the graph is directed or undirected.", + docstring_md : + "Specifies if the graph is directed or undirected.\n\nIf no `GraphType` is provided, the graph is assumed to be undirected.", is_required : false, }, ], }, diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index f6116ec57129..1c9bcfa07cf0 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -9,16 +9,14 @@ A list of nodes in a graph with optional labels, colors, etc. **Required**: [`GraphNode`](../components/graph_node.md) -**Recommended**: [`Position2D`](../components/position2d.md), [`Color`](../components/color.md) - -**Optional**: [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md) +**Optional**: [`Position2D`](../components/position2d.md), [`Color`](../components/color.md), [`Text`](../components/text.md), [`ShowLabels`](../components/show_labels.md) ## Shown in * [Graph View](../views/graph_view.md) * [DataframeView](../views/dataframe_view.md) ## API reference links - * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html) - * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes#rerun.archetypes.GraphNodes) - * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html) + * 🌊 [C++ API docs for `GraphNodes`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1archetypes_1_1GraphNodes.html?speculative-link) + * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes?speculative-link#rerun.archetypes.GraphNodes) + * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html?speculative-link) diff --git a/docs/content/reference/types/components/color.md b/docs/content/reference/types/components/color.md index 2b44c7449f83..9732a48db9d3 100644 --- a/docs/content/reference/types/components/color.md +++ b/docs/content/reference/types/components/color.md @@ -26,7 +26,7 @@ byte is `R` and the least significant byte is `A`. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`GraphNodes`](../archetypes/graph_nodes.md?speculative-link) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/docs/content/reference/types/components/graph_edge.md b/docs/content/reference/types/components/graph_edge.md index 998a670f1f9d..247390628179 100644 --- a/docs/content/reference/types/components/graph_edge.md +++ b/docs/content/reference/types/components/graph_edge.md @@ -10,9 +10,9 @@ An edge in a graph connecting two nodes. * edge: [`Utf8Pair`](../datatypes/utf8pair.md) ## API reference links - * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html) - * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphEdge) - * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html) + * 🌊 [C++ API docs for `GraphEdge`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphEdge.html?speculative-link) + * 🐍 [Python API docs for `GraphEdge`](https://ref.rerun.io/docs/python/stable/common/components?speculative-link#rerun.components.GraphEdge) + * 🦀 [Rust API docs for `GraphEdge`](https://docs.rs/rerun/latest/rerun/components/struct.GraphEdge.html?speculative-link) ## Used by diff --git a/docs/content/reference/types/components/graph_node.md b/docs/content/reference/types/components/graph_node.md index f1c7f3ad1580..6933b7fbc5c4 100644 --- a/docs/content/reference/types/components/graph_node.md +++ b/docs/content/reference/types/components/graph_node.md @@ -10,11 +10,11 @@ A string-based ID representing a node in a graph. * id: [`Utf8`](../datatypes/utf8.md) ## API reference links - * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html) - * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphNode) - * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNode.html) + * 🌊 [C++ API docs for `GraphNode`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1components_1_1GraphNode.html?speculative-link) + * 🐍 [Python API docs for `GraphNode`](https://ref.rerun.io/docs/python/stable/common/components?speculative-link#rerun.components.GraphNode) + * 🦀 [Rust API docs for `GraphNode`](https://docs.rs/rerun/latest/rerun/components/struct.GraphNode.html?speculative-link) ## Used by -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`GraphNodes`](../archetypes/graph_nodes.md?speculative-link) diff --git a/docs/content/reference/types/components/graph_type.md b/docs/content/reference/types/components/graph_type.md index a6712342fefe..77f0207a6f9d 100644 --- a/docs/content/reference/types/components/graph_type.md +++ b/docs/content/reference/types/components/graph_type.md @@ -11,9 +11,9 @@ Specifies if a graph has directed or undirected edges. * Directed ## API reference links - * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1components.html) - * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components#rerun.components.GraphType) - * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/enum.GraphType.html) + * 🌊 [C++ API docs for `GraphType`](https://ref.rerun.io/docs/cpp/stable/namespacererun_1_1components.html?speculative-link) + * 🐍 [Python API docs for `GraphType`](https://ref.rerun.io/docs/python/stable/common/components?speculative-link#rerun.components.GraphType) + * 🦀 [Rust API docs for `GraphType`](https://docs.rs/rerun/latest/rerun/components/enum.GraphType.html?speculative-link) ## Used by diff --git a/docs/content/reference/types/components/position2d.md b/docs/content/reference/types/components/position2d.md index a787c7672dda..fe58f7e04c7b 100644 --- a/docs/content/reference/types/components/position2d.md +++ b/docs/content/reference/types/components/position2d.md @@ -19,5 +19,5 @@ A position in 2D space. * [`Arrows2D`](../archetypes/arrows2d.md) * [`Boxes2D`](../archetypes/boxes2d.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`GraphNodes`](../archetypes/graph_nodes.md?speculative-link) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/show_labels.md b/docs/content/reference/types/components/show_labels.md index f6e6534dae61..d3f4e4b052a9 100644 --- a/docs/content/reference/types/components/show_labels.md +++ b/docs/content/reference/types/components/show_labels.md @@ -26,7 +26,7 @@ blueprints. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`GraphNodes`](../archetypes/graph_nodes.md?speculative-link) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/components/text.md b/docs/content/reference/types/components/text.md index f04869ef164c..57f650779c3a 100644 --- a/docs/content/reference/types/components/text.md +++ b/docs/content/reference/types/components/text.md @@ -22,7 +22,7 @@ A string of text, e.g. for labels and text documents. * [`Boxes2D`](../archetypes/boxes2d.md) * [`Boxes3D`](../archetypes/boxes3d.md) * [`Ellipsoids3D`](../archetypes/ellipsoids3d.md) -* [`GraphNodes`](../archetypes/graph_nodes.md) +* [`GraphNodes`](../archetypes/graph_nodes.md?speculative-link) * [`LineStrips2D`](../archetypes/line_strips2d.md) * [`LineStrips3D`](../archetypes/line_strips3d.md) * [`Points2D`](../archetypes/points2d.md) diff --git a/docs/content/reference/types/datatypes/utf8.md b/docs/content/reference/types/datatypes/utf8.md index 68110e0efc24..940020f6f00b 100644 --- a/docs/content/reference/types/datatypes/utf8.md +++ b/docs/content/reference/types/datatypes/utf8.md @@ -18,10 +18,10 @@ A string of text, encoded as UTF-8. ## Used by * [`AnnotationInfo`](../datatypes/annotation_info.md) -* [`GraphNode`](../components/graph_node.md) +* [`GraphNode`](../components/graph_node.md?speculative-link) * [`MediaType`](../components/media_type.md) * [`Name`](../components/name.md) * [`TextLogLevel`](../components/text_log_level.md) * [`Text`](../components/text.md) -* [`Utf8Pair`](../datatypes/utf8pair.md) +* [`Utf8Pair`](../datatypes/utf8pair.md?speculative-link) * [`VisibleTimeRange`](../datatypes/visible_time_range.md) diff --git a/docs/content/reference/types/datatypes/utf8pair.md b/docs/content/reference/types/datatypes/utf8pair.md index 41ea970df3bb..094e1601485a 100644 --- a/docs/content/reference/types/datatypes/utf8pair.md +++ b/docs/content/reference/types/datatypes/utf8pair.md @@ -11,11 +11,11 @@ Stores a tuple of UTF-8 strings. * second: [`Utf8`](../datatypes/utf8.md) ## API reference links - * 🌊 [C++ API docs for `Utf8Pair`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1Utf8Pair.html) - * 🐍 [Python API docs for `Utf8Pair`](https://ref.rerun.io/docs/python/stable/common/datatypes#rerun.datatypes.Utf8Pair) - * 🦀 [Rust API docs for `Utf8Pair`](https://docs.rs/rerun/latest/rerun/datatypes/struct.Utf8Pair.html) + * 🌊 [C++ API docs for `Utf8Pair`](https://ref.rerun.io/docs/cpp/stable/structrerun_1_1datatypes_1_1Utf8Pair.html?speculative-link) + * 🐍 [Python API docs for `Utf8Pair`](https://ref.rerun.io/docs/python/stable/common/datatypes?speculative-link#rerun.datatypes.Utf8Pair) + * 🦀 [Rust API docs for `Utf8Pair`](https://docs.rs/rerun/latest/rerun/datatypes/struct.Utf8Pair.html?speculative-link) ## Used by -* [`GraphEdge`](../components/graph_edge.md) +* [`GraphEdge`](../components/graph_edge.md?speculative-link) diff --git a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp index 8cf8ed2b5ba6..b6cd7322b3f7 100644 --- a/rerun_cpp/src/rerun/archetypes/graph_edges.hpp +++ b/rerun_cpp/src/rerun/archetypes/graph_edges.hpp @@ -25,6 +25,8 @@ namespace rerun::archetypes { Collection edges; /// Specifies if the graph is directed or undirected. + /// + /// If no `GraphType` is provided, the graph is assumed to be undirected. std::optional graph_type; public: @@ -42,6 +44,8 @@ namespace rerun::archetypes { : edges(std::move(_edges)) {} /// Specifies if the graph is directed or undirected. + /// + /// If no `GraphType` is provided, the graph is assumed to be undirected. GraphEdges with_graph_type(rerun::components::GraphType _graph_type) && { graph_type = std::move(_graph_type); // See: https://github.com/rerun-io/rerun/issues/4027 diff --git a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py index 00403957c273..3dc7fc7e6c61 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py @@ -37,6 +37,8 @@ def __init__(self: Any, edges: datatypes.Utf8PairArrayLike, *, graph_type: compo graph_type: Specifies if the graph is directed or undirected. + If no `GraphType` is provided, the graph is assumed to be undirected. + """ # You can define your own __init__ function as a member of GraphEdgesExt in graph_edges_ext.py @@ -74,6 +76,8 @@ def _clear(cls) -> GraphEdges: ) # Specifies if the graph is directed or undirected. # + # If no `GraphType` is provided, the graph is assumed to be undirected. + # # (Docstring intentionally commented out to hide this field from the docs) __str__ = Archetype.__str__ From 0674ef0d345a7438cf7ac9e886e8a77be6d260ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 12:48:37 +0100 Subject: [PATCH 124/159] WIP: prevent nodes from being dragged --- crates/viewer/re_space_view_graph/src/ui/scene.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/scene.rs b/crates/viewer/re_space_view_graph/src/ui/scene.rs index 6abeeb5376f3..386e39f9c0aa 100644 --- a/crates/viewer/re_space_view_graph/src/ui/scene.rs +++ b/crates/viewer/re_space_view_graph/src/ui/scene.rs @@ -165,7 +165,7 @@ impl<'a> Scene<'a> { .expect("The counter should never run out."), )), ) - .current_pos(pos) + .fixed_pos(pos) .order(Order::Foreground) .constrain(false) .show(self.ui.ctx(), |ui| { From 81d556d39117f219db26ef35e74eac45bb06adff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 18:31:45 +0100 Subject: [PATCH 125/159] WIP: basic blueprint support --- crates/viewer/re_space_view_graph/src/lib.rs | 2 +- .../re_space_view_graph/src/properties.rs | 5 +- .../viewer/re_space_view_graph/src/ui/mod.rs | 4 +- .../re_space_view_graph/src/ui/scene.rs | 92 ++++++++----------- .../re_space_view_graph/src/ui/state.rs | 27 ++---- crates/viewer/re_space_view_graph/src/view.rs | 61 +++++++++--- 6 files changed, 101 insertions(+), 90 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/lib.rs b/crates/viewer/re_space_view_graph/src/lib.rs index fcf34f4cc1e3..f5c91aa82ea7 100644 --- a/crates/viewer/re_space_view_graph/src/lib.rs +++ b/crates/viewer/re_space_view_graph/src/lib.rs @@ -4,10 +4,10 @@ mod error; mod graph; +mod properties; mod types; mod ui; mod view; -mod properties; mod visualizers; pub use view::GraphSpaceView; diff --git a/crates/viewer/re_space_view_graph/src/properties.rs b/crates/viewer/re_space_view_graph/src/properties.rs index edd2e81c8e25..e9cae792ab5a 100644 --- a/crates/viewer/re_space_view_graph/src/properties.rs +++ b/crates/viewer/re_space_view_graph/src/properties.rs @@ -1,7 +1,10 @@ use re_types::blueprint::components::VisualBounds2D; use re_viewer_context::{SpaceViewStateExt as _, TypedComponentFallbackProvider}; -use crate::{ui::{bounding_rect_from_iter, GraphSpaceViewState}, GraphSpaceView}; +use crate::{ + ui::{bounding_rect_from_iter, GraphSpaceViewState}, + GraphSpaceView, +}; fn valid_bound(rect: &egui::Rect) -> bool { rect.is_finite() && rect.is_positive() diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 9ed29591aacd..2695b13cb209 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -58,8 +58,6 @@ pub fn draw_entity( response } -pub fn bounding_rect_from_iter<'a>( - rectangles: impl Iterator, -) -> egui::Rect { +pub fn bounding_rect_from_iter<'a>(rectangles: impl Iterator) -> egui::Rect { rectangles.fold(egui::Rect::NOTHING, |acc, rect| acc.union(*rect)) } diff --git a/crates/viewer/re_space_view_graph/src/ui/scene.rs b/crates/viewer/re_space_view_graph/src/ui/scene.rs index 386e39f9c0aa..4f69568dd2b5 100644 --- a/crates/viewer/re_space_view_graph/src/ui/scene.rs +++ b/crates/viewer/re_space_view_graph/src/ui/scene.rs @@ -4,80 +4,63 @@ use egui::{ emath::TSTransform, Area, Color32, Id, LayerId, Order, Painter, Pos2, Rect, Response, Sense, Stroke, Ui, }; -use re_log::external::log; + +fn fit_to_world_rect(clip_rect_window: Rect, world_rect: Rect) -> TSTransform { + let available_size = clip_rect_window.size(); + + // Compute the scale factor to fit the bounding rectangle into the available screen size. + let scale_x = available_size.x / world_rect.width(); + let scale_y = available_size.y / world_rect.height(); + + // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. + let scale = scale_x.min(scale_y).min(1.0); + + // Compute the translation to center the bounding rect in the screen. + let center_screen = Pos2::new(available_size.x / 2.0, available_size.y / 2.0); + let center_world = world_rect.center().to_vec2(); + + // Set the transformation to scale and then translate to center. + + TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) + * TSTransform::from_scaling(scale) +} pub struct ViewBuilder { - world_to_view: TSTransform, - clip_rect_window: Rect, - // TODO(grtlr): separate state from builder - pub show_debug: bool, + show_debug: bool, + world_bounds: Rect, bounding_rect: Rect, } -impl Default for ViewBuilder { - fn default() -> Self { +impl ViewBuilder { + pub fn from_world_bounds(world_bounds: impl Into) -> Self { Self { - world_to_view: Default::default(), - clip_rect_window: Rect::NOTHING, + world_bounds: world_bounds.into(), show_debug: false, bounding_rect: Rect::NOTHING, } } -} - -impl ViewBuilder { - fn fit_to_rect(&mut self, bounding_rect: Rect) { - let available_size = self.clip_rect_window.size(); - - // Compute the scale factor to fit the bounding rectangle into the available screen size. - let scale_x = available_size.x / bounding_rect.width(); - let scale_y = available_size.y / bounding_rect.height(); - // Use the smaller of the two scales to ensure the whole rectangle fits on the screen. - let scale = scale_x.min(scale_y).min(1.0); - - // Compute the translation to center the bounding rect in the screen. - let center_screen = Pos2::new(available_size.x / 2.0, available_size.y / 2.0); - let center_world = bounding_rect.center().to_vec2(); - - // Set the transformation to scale and then translate to center. - self.world_to_view = - TSTransform::from_translation(center_screen.to_vec2() - center_world * scale) - * TSTransform::from_scaling(scale); - } - - pub fn fit_to_screen(&mut self) { - self.fit_to_rect(self.bounding_rect); + pub fn show_debug(&mut self) { + self.show_debug = true; } /// Return the clip rect of the scene in window coordinates. - pub fn scene(&mut self, ui: &mut Ui, add_scene_contents: F) -> Rect + pub fn scene(mut self, ui: &mut Ui, add_scene_contents: F) -> (Rect, Response) where F: for<'b> FnOnce(Scene<'b>), { let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); - self.clip_rect_window = clip_rect_window; - let response = ui.interact(clip_rect_window, id, Sense::click_and_drag()); + let mut world_to_view = fit_to_world_rect(clip_rect_window, self.world_bounds); + if response.dragged() { - self.world_to_view.translation += response.drag_delta(); + world_to_view.translation += response.drag_delta(); } let view_to_window = TSTransform::from_translation(ui.min_rect().left_top().to_vec2()); - let world_to_window = view_to_window * self.world_to_view; - - #[cfg(debug_assertions)] - if response.double_clicked() { - if let Some(window) = response.interact_pointer_pos() { - log::debug!( - "Click event! Window: {:?}, View: {:?} World: {:?}", - window, - view_to_window.inverse() * window, - world_to_window.inverse() * window, - ); - } - } + + let world_to_window = view_to_window * world_to_view; if let Some(pointer) = ui.ctx().input(|i| i.pointer.hover_pos()) { // Note: doesn't catch zooming / panning if a button in this PanZoom container is hovered. @@ -87,13 +70,13 @@ impl ViewBuilder { let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); // Zoom in on pointer: - self.world_to_view = self.world_to_view + world_to_view = world_to_view * TSTransform::from_translation(pointer_in_world.to_vec2()) * TSTransform::from_scaling(zoom_delta) * TSTransform::from_translation(-pointer_in_world.to_vec2()); // Pan: - self.world_to_view = TSTransform::from_translation(pan_delta) * self.world_to_view; + world_to_view = TSTransform::from_translation(pan_delta) * world_to_view; } } @@ -137,7 +120,10 @@ impl ViewBuilder { } } - clip_rect_window + ( + (view_to_window * world_to_view).inverse() * clip_rect_window, + response, + ) } } diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index 84416229d586..d2e4a6f87a79 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -7,28 +7,25 @@ use re_viewer_context::SpaceViewState; use crate::graph::NodeIndex; -use super::{bounding_rect_from_iter, scene::ViewBuilder}; +use super::bounding_rect_from_iter; /// Space view state for the custom space view. /// /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] pub struct GraphSpaceViewState { - pub viewer: ViewBuilder, - - /// Indicates if the viewer should fit to the screen the next time it is rendered. - pub should_fit_to_screen: bool, - /// Positions of the nodes in world space. pub layout: HashMap, - pub visual_bounds_2d: Option, + pub show_debug: bool, + + pub world_bounds: Option, } impl GraphSpaceViewState { - pub fn bounding_box_ui(&mut self, ui: &mut egui::Ui) { - ui.grid_left_hand_label("Bounding box") - .on_hover_text("The bounding box encompassing all Entities in the view right now"); + pub fn layout_ui(&mut self, ui: &mut egui::Ui) { + ui.grid_left_hand_label("Layout") + .on_hover_text("The bounding box encompassing all entities in the view right now"); ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); let egui::Rect { min, max } = bounding_rect_from_iter(self.layout.values()); @@ -36,18 +33,10 @@ impl GraphSpaceViewState { ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); }); ui.end_row(); - - if ui - .button("Fit to screen") - .on_hover_text("Fit the bounding box to the screen") - .clicked() - { - self.should_fit_to_screen = true; - } } pub fn debug_ui(&mut self, ui: &mut egui::Ui) { - ui.re_checkbox(&mut self.viewer.show_debug, "Show debug information") + ui.re_checkbox(&mut self.show_debug, "Show debug information") .on_hover_text("Shows debug information for the current graph"); ui.end_row(); } diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index c436a3bf2ff8..80bf422f4149 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -2,9 +2,14 @@ use std::collections::HashSet; use egui::{self, Rect}; +use re_log::ResultExt as _; use re_log_types::EntityPath; -use re_types::{components, SpaceViewClassIdentifier}; -use re_ui::{self, UiExt}; +use re_space_view::view_property_ui; +use re_types::{ + blueprint::{self, archetypes::VisualBounds2D}, + components, SpaceViewClassIdentifier, +}; +use re_ui::{self, UiExt as _}; use re_viewer_context::{ external::re_entity_db::InstancePath, IdentifiedViewSystem as _, Item, SpaceViewClass, SpaceViewClassLayoutPriority, SpaceViewClassRegistryError, SpaceViewId, @@ -12,10 +17,11 @@ use re_viewer_context::{ SpaceViewSystemExecutionError, SpaceViewSystemRegistrator, SystemExecutionOutput, ViewQuery, ViewerContext, }; +use re_viewport_blueprint::ViewProperty; use crate::{ graph::{Graph, NodeIndex}, - ui::{self, bounding_rect_from_iter, GraphSpaceViewState}, + ui::{self, bounding_rect_from_iter, scene::ViewBuilder, GraphSpaceViewState}, visualizers::{EdgesVisualizer, NodeVisualizer}, }; @@ -59,7 +65,7 @@ impl SpaceViewClass for GraphSpaceView { .downcast_ref::() .ok() .map(|state| { - let (width, height) = state.visual_bounds_2d.map_or_else( + let (width, height) = state.world_bounds.map_or_else( || { let bbox = bounding_rect_from_iter(state.layout.values()); ( @@ -103,19 +109,21 @@ impl SpaceViewClass for GraphSpaceView { /// In this sample we show a combo box to select the color coordinates mode. fn selection_ui( &self, - _ctx: &ViewerContext<'_>, + ctx: &ViewerContext<'_>, ui: &mut egui::Ui, state: &mut dyn SpaceViewState, _space_origin: &EntityPath, - _space_view_id: SpaceViewId, + space_view_id: SpaceViewId, ) -> Result<(), SpaceViewSystemExecutionError> { let state = state.downcast_mut::()?; - ui.selection_grid("graph_settings_ui").show(ui, |ui| { - state.bounding_box_ui(ui); + ui.selection_grid("graph_view_settings_ui").show(ui, |ui| { + state.layout_ui(ui); state.debug_ui(ui); }); + view_property_ui::(ctx, ui, space_view_id, self, state); + Ok(()) } @@ -145,7 +153,28 @@ impl SpaceViewClass for GraphSpaceView { let layout_was_empty = state.layout.is_empty(); - state.viewer.scene(ui, |mut scene| { + let bounds_property = ViewProperty::from_archetype::( + ctx.blueprint_db(), + ctx.blueprint_query, + query.space_view_id, + ); + + let bounds: blueprint::components::VisualBounds2D = bounds_property + .component_or_fallback(ctx, self, state) + .ok_or_log_error() + .unwrap_or_default(); + + state.world_bounds = Some(bounds); + let bounds_rect: egui::Rect = bounds.into(); + + let mut viewer = ViewBuilder::from_world_bounds(bounds_rect); + + // TODO(grtlr): Is there a blueprint archetype for debug information? + if state.show_debug { + viewer.show_debug(); + } + + let (new_world_bounds, response) = viewer.scene(ui, |mut scene| { for data in &node_system.data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); @@ -215,13 +244,19 @@ impl SpaceViewClass for GraphSpaceView { } }); + // Update blueprint if changed + let updated_bounds: blueprint::components::VisualBounds2D = new_world_bounds.into(); + if response.double_clicked() || layout_was_empty { + bounds_property.reset_blueprint_component::(ctx); + } else if bounds != updated_bounds { + bounds_property.save_blueprint_component(ctx, &updated_bounds); + } + // Update stored bounds on the state, so visualizers see an up-to-date value. + state.world_bounds = Some(bounds); + // Clean up the layout for nodes that are no longer present. state.layout.retain(|k, _| seen.contains(k)); - if layout_was_empty { - state.viewer.fit_to_screen(); - } - Ok(()) } } From 50a11a92eb3943f823a7ca0d6dd395b3f5c979e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 19:07:45 +0100 Subject: [PATCH 126/159] WIP: fix Python example --- .../definitions/rerun/datatypes/utf8_pair.fbs | 1 + examples/python/node_link/node_link.py | 9 +--- .../rerun_sdk/rerun/datatypes/utf8pair.py | 24 ++++------ .../rerun_sdk/rerun/datatypes/utf8pair_ext.py | 47 +++++++++++++++++++ 4 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/utf8pair_ext.py diff --git a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs index 428320c30224..b6767d803ce8 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs @@ -3,6 +3,7 @@ namespace rerun.datatypes; /// Stores a tuple of UTF-8 strings. table Utf8Pair ( "attr.docs.unreleased", + "attr.python.aliases": "Sequence[datatypes.Utf8Like]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", "attr.rust.custom_clause": 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index b5413e1f0270..a4a0b730b460 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -45,10 +45,6 @@ ] -def to_edge(e: tuple[str, str]) -> rr.components.GraphEdge: - return rr.components.GraphEdge(source=e[0], target=e[1]) - - def main() -> None: rr.init("rerun_example_py_node_link", spawn=True) @@ -69,10 +65,7 @@ def main() -> None: if len(level["edges"]) > 0: t = t + 1 rr.set_time_seconds("stable_time", t) - rr.log( - "binary_tree", - rr.GraphEdges(list(map(to_edge, level["edges"]))), - ) + rr.log("binary_tree", rr.GraphEdges(level["edges"])) if __name__ == "__main__": diff --git a/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py index 057b4b79a2cd..53e63fb6acc5 100644 --- a/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py +++ b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py @@ -5,7 +5,7 @@ from __future__ import annotations -from typing import Any, Sequence, Union +from typing import TYPE_CHECKING, Any, Sequence, Union import pyarrow as pa from attrs import define, field @@ -15,6 +15,7 @@ BaseBatch, BaseExtensionType, ) +from .utf8pair_ext import Utf8PairExt __all__ = ["Utf8Pair", "Utf8PairArrayLike", "Utf8PairBatch", "Utf8PairLike", "Utf8PairType"] @@ -34,7 +35,7 @@ def _utf8pair__second__special_field_converter_override(x: datatypes.Utf8Like) - @define(init=False) -class Utf8Pair: +class Utf8Pair(Utf8PairExt): """**Datatype**: Stores a tuple of UTF-8 strings.""" def __init__(self: Any, first: datatypes.Utf8Like, second: datatypes.Utf8Like): @@ -64,7 +65,11 @@ def __init__(self: Any, first: datatypes.Utf8Like, second: datatypes.Utf8Like): # (Docstring intentionally commented out to hide this field from the docs) -Utf8PairLike = Utf8Pair +if TYPE_CHECKING: + Utf8PairLike = Union[Utf8Pair, Sequence[datatypes.Utf8Like]] +else: + Utf8PairLike = Any + Utf8PairArrayLike = Union[ Utf8Pair, Sequence[Utf8PairLike], @@ -90,15 +95,4 @@ class Utf8PairBatch(BaseBatch[Utf8PairArrayLike]): @staticmethod def _native_to_pa_array(data: Utf8PairArrayLike, data_type: pa.DataType) -> pa.Array: - from rerun.datatypes import Utf8Batch - - if isinstance(data, Utf8Pair): - data = [data] - - return pa.StructArray.from_arrays( - [ - Utf8Batch([x.first for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - Utf8Batch([x.second for x in data]).as_arrow_array().storage, # type: ignore[misc, arg-type] - ], - fields=list(data_type), - ) + return Utf8PairExt.native_to_pa_array_override(data, data_type) diff --git a/rerun_py/rerun_sdk/rerun/datatypes/utf8pair_ext.py b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair_ext.py new file mode 100644 index 000000000000..58146f44f63b --- /dev/null +++ b/rerun_py/rerun_sdk/rerun/datatypes/utf8pair_ext.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyarrow as pa + +if TYPE_CHECKING: + from . import ( + Utf8Pair, + Utf8PairArrayLike, + Utf8PairLike, + ) + + +def _utf8_pair_converter( + data: Utf8PairLike, +) -> Utf8Pair: + from . import Utf8Pair + + if isinstance(data, Utf8Pair): + return data + else: + return Utf8Pair(*data) + + +class Utf8PairExt: + """Extension for [Utf8Pair][rerun.datatypes.Utf8Pair].""" + + @staticmethod + def native_to_pa_array_override(data: Utf8PairArrayLike, data_type: pa.DataType) -> pa.Array: + from . import Utf8Batch, Utf8Pair + + if isinstance(data, Utf8Pair): + data = [data] + + strings = [_utf8_pair_converter(item) for item in data] + + string0 = [pair.first for pair in strings] + string1 = [pair.second for pair in strings] + + string0_array = Utf8Batch(string0).as_arrow_array().storage + string1_array = Utf8Batch(string1).as_arrow_array().storage + + return pa.StructArray.from_arrays( + arrays=[string0_array, string1_array], + fields=[data_type.field("first"), data_type.field("second")], + ) From 24b3ed7701b24b7cbf20a879a2758aa221d323e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 28 Oct 2024 19:30:32 +0100 Subject: [PATCH 127/159] WIP: try to provide types --- examples/python/node_link/node_link.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index a4a0b730b460..3ccc811739b2 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -10,7 +10,10 @@ # Potentially unbalanced and not sorted binary tree. :nerd_face:. # :warning: The nodes have to be unique, which is why we use `5_0`… -nodes = { +NodeId = str +NodeInfo = dict[NodeId, str | tuple[float, float]] + +nodes: dict[NodeId, NodeInfo] = { "1": {"label": "1", "pos": (0 * s, 0 * s)}, "7": {"label": "7", "pos": (-20 * s, 30 * s)}, "2": {"label": "2", "pos": (-30 * s, 60 * s)}, @@ -22,7 +25,10 @@ "5_1": {"label": "5", "pos": (20 * s, 90 * s)}, } -levels = [ +LevelInfo = dict[str, list[NodeId] | list[tuple[NodeId, NodeId]]] +Levels = list[LevelInfo] + +levels: Levels = [ {"nodes": ["1"], "edges": []}, {"nodes": ["1", "7", "9_0"], "edges": [("1", "7"), ("1", "9_0")]}, { From 82f190c8cd6be37d6546ee77f6ad782c3a874f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 08:07:49 +0100 Subject: [PATCH 128/159] WIP: more feedback --- crates/viewer/re_space_view_graph/Cargo.toml | 1 - crates/viewer/re_space_view_graph/src/graph/hash.rs | 4 +++- crates/viewer/re_space_view_graph/src/graph/index.rs | 2 ++ crates/viewer/re_viewer/src/app.rs | 4 +--- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index bc201cac3636..2c9f10386832 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -34,7 +34,6 @@ re_viewport_blueprint.workspace = true egui.workspace = true -#TODO(grtlr): check if all of these are still needed bytemuck = "1.18" thiserror = "1.0" ahash = "0.8" diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 17adcd5dec25..10801afee27d 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -14,10 +14,12 @@ impl GraphNodeHash { } } +// We implement `Hash` manually, because `nohash_hasher` requires a single call to `state.write_*`. +// More info: https://crates.io/crates/nohash-hasher impl std::hash::Hash for GraphNodeHash { #[inline] fn hash(&self, state: &mut H) { - self.0.hash(state); + state.write_u64(self.hash64()); } } diff --git a/crates/viewer/re_space_view_graph/src/graph/index.rs b/crates/viewer/re_space_view_graph/src/graph/index.rs index aa3982594db8..11ba80da6a25 100644 --- a/crates/viewer/re_space_view_graph/src/graph/index.rs +++ b/crates/viewer/re_space_view_graph/src/graph/index.rs @@ -11,6 +11,8 @@ pub(crate) struct NodeIndex { impl nohash_hasher::IsEnabled for NodeIndex {} +// We implement `Hash` manually, because `nohash_hasher` requires a single call to `state.write_*`. +// More info: https://crates.io/crates/nohash-hasher impl std::hash::Hash for NodeIndex { fn hash(&self, state: &mut H) { // TODO(grtlr): Consider using `write_usize` here, to further decrease the risk of collision. diff --git a/crates/viewer/re_viewer/src/app.rs b/crates/viewer/re_viewer/src/app.rs index fbd387752484..de3f4eef5550 100644 --- a/crates/viewer/re_viewer/src/app.rs +++ b/crates/viewer/re_viewer/src/app.rs @@ -1817,6 +1817,7 @@ fn populate_space_view_class_registry_with_builtin( re_tracing::profile_function!(); space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; + space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; @@ -1824,9 +1825,6 @@ fn populate_space_view_class_registry_with_builtin( space_view_class_registry.add_class::()?; space_view_class_registry.add_class::()?; - // The following are experimental views. - space_view_class_registry.add_class::()?; - Ok(()) } From ec64a20a4d9caa40eb617d9bc42e322ded312842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 08:11:38 +0100 Subject: [PATCH 129/159] WIP: cleanup --- crates/viewer/re_space_view_graph/src/ui/node.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index 783da391be33..4a5a3f5c808a 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -20,7 +20,6 @@ pub fn draw_node( HoverHighlight::None => ui.style().visuals.widgets.noninteractive.bg_fill, HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, }; - // ui.style().visuals.faint_bg_color if let (true, Some(label)) = (instance.show_labels, instance.label) { let text = egui::RichText::new(label.to_string()); From 36f6670db3ca17a77dd42c89e00f1f7c2664ce60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 09:26:41 +0100 Subject: [PATCH 130/159] WIP: add `binary_tree` example to Rust --- Cargo.lock | 4 +- .../re_types/src/datatypes/utf8pair_ext.rs | 11 +++ .../{node_link_graph => node_link}/Cargo.toml | 4 +- .../{node_link_graph => node_link}/README.md | 0 .../node_link/src/examples/binary_tree.rs | 90 +++++++++++++++++++ .../src/examples/lattice.rs | 0 examples/rust/node_link/src/examples/mod.rs | 2 + .../src/main.rs | 4 +- .../rust/node_link_graph/src/examples/mod.rs | 1 - 9 files changed, 110 insertions(+), 6 deletions(-) rename examples/rust/{node_link_graph => node_link}/Cargo.toml (85%) rename examples/rust/{node_link_graph => node_link}/README.md (100%) create mode 100644 examples/rust/node_link/src/examples/binary_tree.rs rename examples/rust/{node_link_graph => node_link}/src/examples/lattice.rs (100%) create mode 100644 examples/rust/node_link/src/examples/mod.rs rename examples/rust/{node_link_graph => node_link}/src/main.rs (89%) delete mode 100644 examples/rust/node_link_graph/src/examples/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 971e1470d022..9413ca52ab59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3852,8 +3852,8 @@ dependencies = [ ] [[package]] -name = "node_link_graph" -version = "0.19.0-alpha.1+dev" +name = "node_link" +version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", diff --git a/crates/store/re_types/src/datatypes/utf8pair_ext.rs b/crates/store/re_types/src/datatypes/utf8pair_ext.rs index eed733d30ccb..3bcaa04d5a43 100644 --- a/crates/store/re_types/src/datatypes/utf8pair_ext.rs +++ b/crates/store/re_types/src/datatypes/utf8pair_ext.rs @@ -1,6 +1,7 @@ use crate::datatypes::Utf8; impl> From<(T, T)> for super::Utf8Pair { + #[inline(always)] fn from(value: (T, T)) -> Self { Self { first: value.0.into(), @@ -8,3 +9,13 @@ impl> From<(T, T)> for super::Utf8Pair { } } } + +impl From<&(&str, &str)> for super::Utf8Pair { + #[inline(always)] + fn from(value: &(&str, &str)) -> Self { + Self { + first: value.0.into(), + second: value.1.into(), + } + } +} diff --git a/examples/rust/node_link_graph/Cargo.toml b/examples/rust/node_link/Cargo.toml similarity index 85% rename from examples/rust/node_link_graph/Cargo.toml rename to examples/rust/node_link/Cargo.toml index abfad846affb..9ec35c74fe37 100644 --- a/examples/rust/node_link_graph/Cargo.toml +++ b/examples/rust/node_link/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "node_link_graph" -version = "0.19.0-alpha.1+dev" +name = "node_link" +version = "0.20.0-alpha.1+dev" edition = "2021" rust-version = "1.76" license = "MIT OR Apache-2.0" diff --git a/examples/rust/node_link_graph/README.md b/examples/rust/node_link/README.md similarity index 100% rename from examples/rust/node_link_graph/README.md rename to examples/rust/node_link/README.md diff --git a/examples/rust/node_link/src/examples/binary_tree.rs b/examples/rust/node_link/src/examples/binary_tree.rs new file mode 100644 index 000000000000..57fa1c786116 --- /dev/null +++ b/examples/rust/node_link/src/examples/binary_tree.rs @@ -0,0 +1,90 @@ +use rerun::{GraphEdges, GraphNodes}; + +use crate::Args; +use std::collections::HashMap; + +pub fn run(args: &Args) -> anyhow::Result<()> { + let (rec, _serve_guard) = args.rerun.init("rerun_example_graph_binary_tree")?; + let s = 3.0; // scaling factor for the positions + + // Potentially unbalanced and not sorted binary tree. :nerd_face:. + // :warning: The nodes have to be unique, which is why we use `5_0`… + + // (label, position) + type NodeInfo = (&'static str, (f32, f32)); + + let nodes: HashMap<&str, NodeInfo> = [ + ("1", ("1", (0.0 * s, 0.0 * s))), + ("7", ("7", (-20.0 * s, 30.0 * s))), + ("2", ("2", (-30.0 * s, 60.0 * s))), + ("6", ("6", (-10.0 * s, 60.0 * s))), + ("5_0", ("5", (-20.0 * s, 90.0 * s))), + ("11", ("11", (0.0 * s, 90.0 * s))), + ("9_0", ("9", (20.0 * s, 30.0 * s))), + ("9_1", ("9", (30.0 * s, 60.0 * s))), + ("5_1", ("5", (20.0 * s, 90.0 * s))), + ] + .into_iter() + .collect(); + + struct Level<'a> { + nodes: &'a [&'a str], + edges: &'a [(&'a str, &'a str)], + } + + let levels: Vec = vec![ + Level { + nodes: &["1"], + edges: &[], + }, + Level { + nodes: &["1", "7", "9_0"], + edges: &[("1", "7"), ("1", "9_0")], + }, + Level { + nodes: &["1", "7", "9_0", "2", "6", "9_1"], + edges: &[ + ("1", "7"), + ("1", "9_0"), + ("7", "2"), + ("7", "6"), + ("9_0", "9_1"), + ], + }, + Level { + nodes: &["1", "7", "9_0", "2", "6", "9_1", "5_0", "11", "5_1"], + edges: &[ + ("1", "7"), + ("1", "9_0"), + ("7", "2"), + ("7", "6"), + ("9_0", "9_1"), + ("6", "5_0"), + ("6", "11"), + ("9_1", "5_1"), + ], + }, + ]; + + let mut t = 0; + for level in levels { + if !level.nodes.is_empty() { + t += 1; + rec.set_time_seconds("stable_time", t as f64); + let _ = rec.log( + "binary_tree", + &GraphNodes::new(level.nodes.iter().map(|&n| n)) + .with_labels(level.nodes.iter().map(|n| nodes[n].0)) + .with_positions(level.nodes.iter().map(|n| nodes[n].1)), + ); + } + + if !level.edges.is_empty() { + t += 1; + rec.set_time_seconds("stable_time", t as f64); + let _ = rec.log("binary_tree", &GraphEdges::new(level.edges)); + } + } + + Ok(()) +} diff --git a/examples/rust/node_link_graph/src/examples/lattice.rs b/examples/rust/node_link/src/examples/lattice.rs similarity index 100% rename from examples/rust/node_link_graph/src/examples/lattice.rs rename to examples/rust/node_link/src/examples/lattice.rs diff --git a/examples/rust/node_link/src/examples/mod.rs b/examples/rust/node_link/src/examples/mod.rs new file mode 100644 index 000000000000..e8cf1ee085bc --- /dev/null +++ b/examples/rust/node_link/src/examples/mod.rs @@ -0,0 +1,2 @@ +pub mod binary_tree; +pub mod lattice; diff --git a/examples/rust/node_link_graph/src/main.rs b/examples/rust/node_link/src/main.rs similarity index 89% rename from examples/rust/node_link_graph/src/main.rs rename to examples/rust/node_link/src/main.rs index f2345b8ef038..d16b635872b8 100644 --- a/examples/rust/node_link_graph/src/main.rs +++ b/examples/rust/node_link/src/main.rs @@ -2,7 +2,7 @@ //! //! Usage: //! ``` -//! cargo run -p node_link_graph -- --connect +//! cargo run -p node_link -- --connect //! ``` use rerun::external::{log, re_log}; @@ -12,12 +12,14 @@ mod examples; #[derive(Copy, Clone, Debug, clap::ValueEnum, strum_macros::EnumIter)] enum Example { + BinaryTree, Lattice, } impl Example { fn run(&self, args: &Args) -> anyhow::Result<()> { match self { + Example::BinaryTree => examples::binary_tree::run(args), Example::Lattice => examples::lattice::run(args, 10), } } diff --git a/examples/rust/node_link_graph/src/examples/mod.rs b/examples/rust/node_link_graph/src/examples/mod.rs deleted file mode 100644 index 5e3a7371904c..000000000000 --- a/examples/rust/node_link_graph/src/examples/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod lattice; From 53753848253d20201825a60d75be93c9ec677b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 09:52:35 +0100 Subject: [PATCH 131/159] WIP: fix `machete` warnings --- Cargo.lock | 2 -- crates/viewer/re_space_view_graph/Cargo.toml | 1 - crates/viewer/re_space_view_graph/src/ui/scene.rs | 2 ++ examples/rust/node_link/Cargo.toml | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 59e843524ea4..263eea71595a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4164,7 +4164,6 @@ version = "0.20.0-alpha.1+dev" dependencies = [ "anyhow", "clap", - "glam", "itertools 0.13.0", "rerun", "strum", @@ -6200,7 +6199,6 @@ name = "re_space_view_graph" version = "0.20.0-alpha.1+dev" dependencies = [ "ahash", - "bytemuck", "egui", "nohash-hasher", "re_chunk", diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 2c9f10386832..88653e2751e6 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -34,7 +34,6 @@ re_viewport_blueprint.workspace = true egui.workspace = true -bytemuck = "1.18" thiserror = "1.0" ahash = "0.8" nohash-hasher = "0.2" diff --git a/crates/viewer/re_space_view_graph/src/ui/scene.rs b/crates/viewer/re_space_view_graph/src/ui/scene.rs index 4f69568dd2b5..0645782fe5bd 100644 --- a/crates/viewer/re_space_view_graph/src/ui/scene.rs +++ b/crates/viewer/re_space_view_graph/src/ui/scene.rs @@ -49,6 +49,8 @@ impl ViewBuilder { where F: for<'b> FnOnce(Scene<'b>), { + re_tracing::profile_function!(); + let (id, clip_rect_window) = ui.allocate_space(ui.available_size()); let response = ui.interact(clip_rect_window, id, Sense::click_and_drag()); diff --git a/examples/rust/node_link/Cargo.toml b/examples/rust/node_link/Cargo.toml index 9ec35c74fe37..f3748deb13a4 100644 --- a/examples/rust/node_link/Cargo.toml +++ b/examples/rust/node_link/Cargo.toml @@ -11,7 +11,6 @@ rerun = { path = "../../../crates/top/rerun", features = ["clap"] } anyhow = "1.0" clap = { version = "4.0", features = ["derive"] } -glam = "0.28" # Iterate over enums strum = "0.26" From 9f6d989ec68993bd60a89e1a4f9421332b021e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 09:59:16 +0100 Subject: [PATCH 132/159] WIP: use packages from the workspace --- crates/viewer/re_space_view_graph/Cargo.toml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 88653e2751e6..22b6f0763f8a 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -32,8 +32,7 @@ re_ui.workspace = true re_viewer_context.workspace = true re_viewport_blueprint.workspace = true +ahash.workspace = true egui.workspace = true - -thiserror = "1.0" -ahash = "0.8" -nohash-hasher = "0.2" +nohash-hasher.workspace = true +thiserror.workspace = true From a80192c4bb21e4ad0892a67d65a9fafd8175ae9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 10:12:49 +0100 Subject: [PATCH 133/159] WIP: remove `serde` from codegen --- .../re_types/definitions/rerun/components/graph_edge.fbs | 4 +--- .../re_types/definitions/rerun/components/graph_node.fbs | 4 +--- .../re_types/definitions/rerun/components/graph_type.fbs | 4 +--- .../store/re_types/definitions/rerun/datatypes/utf8_pair.fbs | 4 +--- crates/store/re_types/src/components/graph_edge.rs | 1 - crates/store/re_types/src/components/graph_node.rs | 1 - crates/store/re_types/src/components/graph_type.rs | 1 - crates/store/re_types/src/datatypes/utf8pair.rs | 1 - 8 files changed, 4 insertions(+), 16 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs index 963ece54445a..1f97a2e6c506 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_edge.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_edge.fbs @@ -6,9 +6,7 @@ namespace rerun.components; table GraphEdge ( "attr.docs.unreleased", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.repr": "transparent", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.repr": "transparent" ) { edge: rerun.datatypes.Utf8Pair (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_node.fbs b/crates/store/re_types/definitions/rerun/components/graph_node.fbs index 827f704d622c..7867665a380a 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_node.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_node.fbs @@ -8,9 +8,7 @@ table GraphNode ( "attr.python.aliases": "str", "attr.python.array_aliases": "str, Sequence[str]", "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord, Hash", - "attr.rust.repr": "transparent", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.repr": "transparent" ) { id: rerun.datatypes.Utf8 (order: 100); } diff --git a/crates/store/re_types/definitions/rerun/components/graph_type.fbs b/crates/store/re_types/definitions/rerun/components/graph_type.fbs index fb6f5c62f6e5..283e3a2b93b4 100644 --- a/crates/store/re_types/definitions/rerun/components/graph_type.fbs +++ b/crates/store/re_types/definitions/rerun/components/graph_type.fbs @@ -5,9 +5,7 @@ namespace rerun.components; /// Specifies if a graph has directed or undirected edges. enum GraphType: ubyte ( "attr.docs.unreleased", - "attr.rust.derive": "Default, PartialEq, Eq", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.derive": "Default, PartialEq, Eq" ) { /// Invalid value. Won't show up in generated types. Invalid = 0, diff --git a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs index b6767d803ce8..305323fa8e89 100644 --- a/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs +++ b/crates/store/re_types/definitions/rerun/datatypes/utf8_pair.fbs @@ -4,9 +4,7 @@ namespace rerun.datatypes; table Utf8Pair ( "attr.docs.unreleased", "attr.python.aliases": "Sequence[datatypes.Utf8Like]", - "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord", - "attr.rust.custom_clause": - 'cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))' + "attr.rust.derive": "Default, PartialEq, Eq, PartialOrd, Ord" ) { /// The first string. first: rerun.datatypes.Utf8 (order: 100); diff --git a/crates/store/re_types/src/components/graph_edge.rs b/crates/store/re_types/src/components/graph_edge.rs index 14b17f497bb4..a396dbd0d6e8 100644 --- a/crates/store/re_types/src/components/graph_edge.rs +++ b/crates/store/re_types/src/components/graph_edge.rs @@ -21,7 +21,6 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: An edge in a graph connecting two nodes. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphEdge(pub crate::datatypes::Utf8Pair); impl ::re_types_core::SizeBytes for GraphEdge { diff --git a/crates/store/re_types/src/components/graph_node.rs b/crates/store/re_types/src/components/graph_node.rs index c46e3b582235..50d84d467e04 100644 --- a/crates/store/re_types/src/components/graph_node.rs +++ b/crates/store/re_types/src/components/graph_node.rs @@ -21,7 +21,6 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: A string-based ID representing a node in a graph. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct GraphNode(pub crate::datatypes::Utf8); impl ::re_types_core::SizeBytes for GraphNode { diff --git a/crates/store/re_types/src/components/graph_type.rs b/crates/store/re_types/src/components/graph_type.rs index 5e1c19b69bcd..b1d20c9fe396 100644 --- a/crates/store/re_types/src/components/graph_type.rs +++ b/crates/store/re_types/src/components/graph_type.rs @@ -21,7 +21,6 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Component**: Specifies if a graph has directed or undirected edges. #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[repr(u8)] pub enum GraphType { /// The graph has undirected edges. diff --git a/crates/store/re_types/src/datatypes/utf8pair.rs b/crates/store/re_types/src/datatypes/utf8pair.rs index 9070524e4b79..d82ade8c2eed 100644 --- a/crates/store/re_types/src/datatypes/utf8pair.rs +++ b/crates/store/re_types/src/datatypes/utf8pair.rs @@ -20,7 +20,6 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// **Datatype**: Stores a tuple of UTF-8 strings. #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct Utf8Pair { /// The first string. pub first: crate::datatypes::Utf8, From 954844c856cfe9a9d87d55fed6cbaaa19de8736a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 11:33:44 +0100 Subject: [PATCH 134/159] WIP: `clippy` --- examples/rust/node_link/Cargo.toml | 2 +- examples/rust/node_link/src/examples/binary_tree.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/rust/node_link/Cargo.toml b/examples/rust/node_link/Cargo.toml index f3748deb13a4..aea356e74866 100644 --- a/examples/rust/node_link/Cargo.toml +++ b/examples/rust/node_link/Cargo.toml @@ -2,7 +2,7 @@ name = "node_link" version = "0.20.0-alpha.1+dev" edition = "2021" -rust-version = "1.76" +rust-version = "1.79" license = "MIT OR Apache-2.0" publish = false diff --git a/examples/rust/node_link/src/examples/binary_tree.rs b/examples/rust/node_link/src/examples/binary_tree.rs index 57fa1c786116..604e6b842ea0 100644 --- a/examples/rust/node_link/src/examples/binary_tree.rs +++ b/examples/rust/node_link/src/examples/binary_tree.rs @@ -73,7 +73,7 @@ pub fn run(args: &Args) -> anyhow::Result<()> { rec.set_time_seconds("stable_time", t as f64); let _ = rec.log( "binary_tree", - &GraphNodes::new(level.nodes.iter().map(|&n| n)) + &GraphNodes::new(level.nodes.iter().copied()) .with_labels(level.nodes.iter().map(|n| nodes[n].0)) .with_positions(level.nodes.iter().map(|n| nodes[n].1)), ); From 3b7608ef4805c773a1fd4554473357cc0935dd5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 11:53:24 +0100 Subject: [PATCH 135/159] WIP: feedback and removal of lifetimes --- .../re_space_view_graph/src/graph/mod.rs | 14 ++++++----- .../viewer/re_space_view_graph/src/types.rs | 25 +++++++++++-------- .../viewer/re_space_view_graph/src/ui/mod.rs | 2 +- crates/viewer/re_space_view_graph/src/view.rs | 20 +++++++-------- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index e70468162b6d..1ff8c5a225d3 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -12,13 +12,13 @@ mod index; pub(crate) use index::NodeIndex; // TODO(grtlr): This struct should act as an abstraction over the graph in the future. -pub(crate) struct Graph<'a> { +pub(crate) struct Graph { /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: ahash::HashSet<(&'a EntityPath, components::GraphNode)>, + unknown: ahash::HashSet<(EntityPath, components::GraphNode)>, } -impl<'a> Graph<'a> { - pub fn from_nodes_edges(nodes: &'a [NodeData], edges: &'a [EdgeData]) -> Self { +impl Graph { + pub fn from_nodes_edges(nodes: &[NodeData], edges: &[EdgeData]) -> Self { let seen = nodes .iter() .flat_map(|entity| entity.nodes()) @@ -32,7 +32,7 @@ impl<'a> Graph<'a> { if seen.contains(&NodeIndex::from_entity_node(&entity.entity_path, node)) { continue; } - unknown.insert((&entity.entity_path, node.clone())); + unknown.insert((entity.entity_path.clone(), node.clone())); } } } @@ -40,12 +40,14 @@ impl<'a> Graph<'a> { Self { unknown } } - pub fn unknown_nodes(&'a self) -> impl Iterator> { + pub fn unknown_nodes(&self) -> Vec { self.unknown .iter() + .cloned() .map(|(entity_path, node_id)| UnknownNodeInstance { entity_path, node_id, }) + .collect() } } diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 171726bfb782..b812e121d824 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -46,34 +46,37 @@ pub struct EdgeInstance<'a> { } impl<'a> EdgeInstance<'a> { - pub fn source_ix(&self) -> NodeIndex { + pub fn source_index(&self) -> NodeIndex { NodeIndex::from_entity_node(self.entity_path, &self.source) } - pub fn target_ix(&self) -> NodeIndex { + pub fn target_index(&self) -> NodeIndex { NodeIndex::from_entity_node(self.entity_path, &self.target) } } -pub struct UnknownNodeInstance<'a> { - pub node_id: &'a components::GraphNode, - pub entity_path: &'a EntityPath, +/// This instance is used to represent nodes that were found in an edge but that were not specified explicitly in the [`GraphNodes`](crate::GraphNodes) archetype. +pub struct UnknownNodeInstance { + pub node_id: components::GraphNode, + + /// The entity path of the edge that contained this node. + pub entity_path: EntityPath, } -impl<'a> From<&UnknownNodeInstance<'a>> for NodeIndex { - fn from(node: &UnknownNodeInstance<'a>) -> Self { +impl From<&UnknownNodeInstance> for NodeIndex { + fn from(node: &UnknownNodeInstance) -> Self { Self { entity_hash: node.entity_path.hash(), - node_hash: node.node_id.into(), + node_hash: (&node.node_id).into(), } } } -impl<'a> From> for NodeIndex { - fn from(node: UnknownNodeInstance<'a>) -> Self { +impl From for NodeIndex { + fn from(node: UnknownNodeInstance) -> Self { Self { entity_hash: node.entity_path.hash(), - node_hash: node.node_id.into(), + node_hash: (&node.node_id).into(), } } } diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 2695b13cb209..6af26a0317ea 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -12,7 +12,7 @@ pub(crate) mod scene; use crate::types::UnknownNodeInstance; -pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance<'_>) -> egui::Response { +pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { let text = egui::RichText::new(format!( "{} @ {}", instance.node_id.as_str(), diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 80bf422f4149..141bfb984584 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -138,10 +138,10 @@ impl SpaceViewClass for GraphSpaceView { query: &ViewQuery<'_>, system_output: SystemExecutionOutput, ) -> Result<(), SpaceViewSystemExecutionError> { - let node_system = system_output.view_systems.get::()?; - let edge_system = system_output.view_systems.get::()?; + let node_data = &system_output.view_systems.get::()?.data; + let edge_data = &system_output.view_systems.get::()?.data; - let graph = Graph::from_nodes_edges(&node_system.data, &edge_system.data); + let graph = Graph::from_nodes_edges(node_data, edge_data); let state = state.downcast_mut::()?; @@ -159,10 +159,8 @@ impl SpaceViewClass for GraphSpaceView { query.space_view_id, ); - let bounds: blueprint::components::VisualBounds2D = bounds_property - .component_or_fallback(ctx, self, state) - .ok_or_log_error() - .unwrap_or_default(); + let bounds: blueprint::components::VisualBounds2D = + bounds_property.component_or_fallback(ctx, self, state)?; state.world_bounds = Some(bounds); let bounds_rect: egui::Rect = bounds.into(); @@ -175,7 +173,7 @@ impl SpaceViewClass for GraphSpaceView { } let (new_world_bounds, response) = viewer.scene(ui, |mut scene| { - for data in &node_system.data { + for data in node_data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); // We keep track of the size of the current entity. @@ -221,13 +219,13 @@ impl SpaceViewClass for GraphSpaceView { *current = response.rect; } - for data in &edge_system.data { + for data in edge_data { let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); for edge in data.edges() { if let (Some(source_pos), Some(target_pos)) = ( - state.layout.get(&edge.source_ix()), - state.layout.get(&edge.target_ix()), + state.layout.get(&edge.source_index()), + state.layout.get(&edge.target_index()), ) { scene.edge(|ui| { ui::draw_edge( From b636bc390f5344a70f0457b472056becbfe1209a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 29 Oct 2024 19:44:16 +0100 Subject: [PATCH 136/159] WIP: refactor per entity drawing --- .../re_space_view_graph/src/graph/mod.rs | 49 ------ .../viewer/re_space_view_graph/src/types.rs | 61 ++----- .../viewer/re_space_view_graph/src/ui/mod.rs | 59 ++++--- .../viewer/re_space_view_graph/src/ui/node.rs | 23 ++- crates/viewer/re_space_view_graph/src/view.rs | 149 ++++++++++-------- .../src/visualizers/edges.rs | 83 +++++----- .../src/visualizers/nodes.rs | 95 +++++------ .../node_link/src/examples/binary_tree.rs | 70 ++++++-- 8 files changed, 277 insertions(+), 312 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/graph/mod.rs b/crates/viewer/re_space_view_graph/src/graph/mod.rs index 1ff8c5a225d3..d38426bd15dc 100644 --- a/crates/viewer/re_space_view_graph/src/graph/mod.rs +++ b/crates/viewer/re_space_view_graph/src/graph/mod.rs @@ -1,53 +1,4 @@ -use re_log_types::EntityPath; -use re_types::components; - -use crate::{ - types::UnknownNodeInstance, - visualizers::{EdgeData, NodeData}, -}; - mod hash; pub(crate) use hash::GraphNodeHash; mod index; pub(crate) use index::NodeIndex; - -// TODO(grtlr): This struct should act as an abstraction over the graph in the future. -pub(crate) struct Graph { - /// Contains all nodes that are part mentioned in the edges but not part of the `nodes` list - unknown: ahash::HashSet<(EntityPath, components::GraphNode)>, -} - -impl Graph { - pub fn from_nodes_edges(nodes: &[NodeData], edges: &[EdgeData]) -> Self { - let seen = nodes - .iter() - .flat_map(|entity| entity.nodes()) - .map(NodeIndex::from) - .collect::>(); - - let mut unknown = ahash::HashSet::default(); - for entity in edges { - for edge in entity.edges() { - for node in edge.nodes() { - if seen.contains(&NodeIndex::from_entity_node(&entity.entity_path, node)) { - continue; - } - unknown.insert((entity.entity_path.clone(), node.clone())); - } - } - } - - Self { unknown } - } - - pub fn unknown_nodes(&self) -> Vec { - self.unknown - .iter() - .cloned() - .map(|(entity_path, node_id)| UnknownNodeInstance { - entity_path, - node_id, - }) - .collect() - } -} diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index b812e121d824..47da67f0d7ff 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,57 +1,26 @@ -use re_log_types::{EntityPath, Instance}; -use re_types::{components, ArrowString}; +use re_log_types::{EntityPath}; +use re_types::{components::{self, GraphNode}, ArrowString}; use crate::graph::NodeIndex; -impl<'a> EdgeInstance<'a> { - pub fn nodes(&'a self) -> impl Iterator { - [&self.source, &self.target].into_iter() - } -} - -impl<'a> From<&NodeInstance<'a>> for NodeIndex { - fn from(node: &NodeInstance<'a>) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_hash: node.node_id.into(), - } - } -} - -impl<'a> From> for NodeIndex { - fn from(node: NodeInstance<'a>) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_hash: node.node_id.into(), - } - } -} - -pub struct NodeInstance<'a> { - pub node_id: &'a components::GraphNode, - pub entity_path: &'a EntityPath, - pub instance: Instance, - pub label: Option<&'a ArrowString>, - pub show_labels: bool, +pub struct NodeInstance { + pub node: components::GraphNode, + pub index: NodeIndex, + pub label: Option, pub color: Option, - pub position: Option<[f32; 2]>, + pub position: Option, } -pub struct EdgeInstance<'a> { - pub source: components::GraphNode, - pub target: components::GraphNode, - pub entity_path: &'a re_log_types::EntityPath, - pub instance: Instance, - pub edge_type: components::GraphType, +pub struct EdgeInstance { + pub source: GraphNode, + pub target: GraphNode, + pub source_index: NodeIndex, + pub target_index: NodeIndex, } -impl<'a> EdgeInstance<'a> { - pub fn source_index(&self) -> NodeIndex { - NodeIndex::from_entity_node(self.entity_path, &self.source) - } - - pub fn target_index(&self) -> NodeIndex { - NodeIndex::from_entity_node(self.entity_path, &self.target) +impl EdgeInstance { + pub fn nodes(&self) -> impl Iterator { + [&self.source, &self.target].into_iter() } } diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index 6af26a0317ea..a03a17e4f3bc 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -4,25 +4,12 @@ use re_viewer_context::SpaceViewHighlights; mod edge; pub(crate) use edge::draw_edge; mod node; -pub(crate) use node::draw_node; +pub(crate) use node::{draw_dummy, draw_node}; mod state; pub(crate) use state::GraphSpaceViewState; pub(crate) mod scene; -use crate::types::UnknownNodeInstance; - -pub fn draw_dummy(ui: &mut egui::Ui, instance: &UnknownNodeInstance) -> egui::Response { - let text = egui::RichText::new(format!( - "{} @ {}", - instance.node_id.as_str(), - instance.entity_path - )) - .color(ui.style().visuals.widgets.noninteractive.text_color()); - ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - ui.add(egui::Button::new(text)) -} - pub fn draw_entity( ui: &mut egui::Ui, rect: egui::Rect, @@ -31,29 +18,39 @@ pub fn draw_entity( ) -> egui::Response { let (rect, response) = ui.allocate_at_least(rect.size(), egui::Sense::hover()); + let color = if highlights + .entity_outline_mask(entity_path.hash()) + .overall + .is_some() + { + ui.ctx().style().visuals.text_color() + } else { + ui.ctx() + .style() + .visuals + .gray_out(ui.ctx().style().visuals.text_color()) + }; + let padded = rect.expand(10.0); let tc = ui.ctx().style().visuals.text_color(); ui.painter().rect( padded, - ui.style().visuals.window_rounding, - egui::Color32::from_rgba_unmultiplied(tc.r(), tc.g(), tc.b(), 4), - egui::Stroke::NONE, + 0.0, + egui::Color32::TRANSPARENT, + egui::Stroke::new(1.0, color), ); - if highlights - .entity_outline_mask(entity_path.hash()) - .overall - .is_some() - { - // TODO(grtlr): text should be presented in window space. - ui.painter().text( - padded.left_top(), - egui::Align2::LEFT_BOTTOM, - entity_path.to_string(), - egui::FontId::default(), - ui.ctx().style().visuals.text_color(), - ); - } + ui.painter().text( + padded.left_top(), + egui::Align2::LEFT_BOTTOM, + entity_path.to_string(), + egui::FontId { + size: 12.0, + family: Default::default(), + }, + color, + ); + // } response } diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index 4a5a3f5c808a..ef3c40dcf078 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -1,10 +1,23 @@ +use re_log_types::EntityPath; +use re_types::components::GraphNode; use re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}; use crate::types::NodeInstance; +pub fn draw_dummy(ui: &mut egui::Ui, entity_path: &EntityPath, node: &GraphNode) -> egui::Response { + let text = egui::RichText::new(format!( + "{} @ {}", + node.as_str(), + entity_path + )) + .color(ui.style().visuals.widgets.noninteractive.text_color()); + ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); + ui.add(egui::Button::new(text)) +} + pub fn draw_node( ui: &mut egui::Ui, - instance: &NodeInstance<'_>, + instance: &NodeInstance, highlight: InteractionHighlight, ) -> egui::Response { let hcolor = match ( @@ -21,7 +34,7 @@ pub fn draw_node( HoverHighlight::Hovered => ui.style().visuals.widgets.hovered.bg_fill, }; - if let (true, Some(label)) = (instance.show_labels, instance.label) { + if let Some(label) = &instance.label { let text = egui::RichText::new(label.to_string()); egui::Frame::default() @@ -57,9 +70,5 @@ pub fn draw_node( }) .response } - .on_hover_text(format!( - "Node ID: `{}` in `{}`", - instance.node_id.as_str(), - instance.entity_path - )) + .on_hover_text(format!("Node: `{}`", instance.node.as_str(),)) } diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 141bfb984584..7321603ce37b 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,8 +1,7 @@ -use std::collections::HashSet; +use std::collections::{BTreeSet, HashSet}; use egui::{self, Rect}; -use re_log::ResultExt as _; use re_log_types::EntityPath; use re_space_view::view_property_ui; use re_types::{ @@ -20,7 +19,7 @@ use re_viewer_context::{ use re_viewport_blueprint::ViewProperty; use crate::{ - graph::{Graph, NodeIndex}, + graph::{NodeIndex}, ui::{self, bounding_rect_from_iter, scene::ViewBuilder, GraphSpaceViewState}, visualizers::{EdgesVisualizer, NodeVisualizer}, }; @@ -141,16 +140,11 @@ impl SpaceViewClass for GraphSpaceView { let node_data = &system_output.view_systems.get::()?.data; let edge_data = &system_output.view_systems.get::()?.data; - let graph = Graph::from_nodes_edges(node_data, edge_data); + // We need to sort the entities to ensure that we are always drawing them in the right order. + let entities = node_data.keys().chain(edge_data.keys()).collect::>(); let state = state.downcast_mut::()?; - // We keep track of the nodes in the data to clean up the layout. - // TODO(grtlr): once we settle on a design, it might make sense to create a - // `Layout` struct that keeps track of the layout and the nodes that - // get added and removed and cleans up automatically (guard pattern). - let mut seen: HashSet = HashSet::new(); - let layout_was_empty = state.layout.is_empty(); let bounds_property = ViewProperty::from_archetype::( @@ -172,72 +166,93 @@ impl SpaceViewClass for GraphSpaceView { viewer.show_debug(); } + // We keep track of the nodes in the data to clean up the layout. + // TODO(grtlr): once we settle on a design, it might make sense to create a + // `Layout` struct that keeps track of the layout and the nodes that + // get added and removed and cleans up automatically (guard pattern). + let mut seen: HashSet = HashSet::new(); + let (new_world_bounds, response) = viewer.scene(ui, |mut scene| { - for data in node_data { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + // We store the offset to draw entities next to each other. + // This is a workaround and will probably be removed once we have auto-layout. + let mut entity_offset = egui::Vec2::ZERO; - // We keep track of the size of the current entity. - let mut entity_rect: Option = None; - - for node in data.nodes() { - let ix = NodeIndex::from(&node); - seen.insert(ix); - let current = state.layout.entry(ix).or_insert( - node.position.map_or(egui::Rect::ZERO, |p| { - Rect::from_center_size(p.into(), egui::Vec2::ZERO) - }), - ); - - let response = scene.node(current.min, |ui| { - ui::draw_node(ui, &node, ent_highlight.index_highlight(node.instance)) - }); + for entity in entities { + let ent_highlight = query.highlights.entity_highlight(entity.hash()); - let instance = InstancePath::instance(data.entity_path.clone(), node.instance); - ctx.select_hovered_on_click( - &response, - Item::DataResult(query.space_view_id, instance), - ); + // We keep track of the size of the current entity. + let mut entity_rect = egui::Rect::NOTHING; + if let Some(data) = node_data.get(entity) { + for node in &data.nodes { + seen.insert(node.index); + let current = state.layout.entry(node.index).or_insert( + node.position + .map_or(egui::Rect::ZERO.translate(entity_offset), |p| { + Rect::from_center_size(p.into(), egui::Vec2::ZERO) + }), + ); + + let response = scene.node(current.min + entity_offset, |ui| { + ui::draw_node( + ui, + &node, + Default::default(), // TODO(grtlr): we currently don't have any highlighting + ) + }); - *current = response.rect; - entity_rect = - entity_rect.map_or(Some(response.rect), |e| Some(e.union(response.rect))); + // TODO(grtlr): ⚠️ This is hacky: + // We need to undo the `entity_offset` otherwise the offset will increase each frame. + *current = response.rect.translate(-entity_offset); + entity_rect = entity_rect.union(response.rect); + } } - // TODO(grtlr): handle interactions - let _response = entity_rect.map(|rect| { - scene.entity(rect.min, |ui| { - ui::draw_entity(ui, rect, &data.entity_path, &query.highlights) - }) - }); - } + if let Some(data) = edge_data.get(entity) { + let unknown_nodes = data + .edges + .iter() + .flat_map(|e| e.nodes()) + .filter(|n| !seen.contains(&NodeIndex::from_entity_node(entity, n))) + .collect::>(); + + for node in unknown_nodes { + let ix = NodeIndex::from_entity_node(entity, node); + seen.insert(ix); + let current = state.layout.entry(ix).or_insert(Rect::ZERO); + let response = + scene.node(current.min, |ui| ui::draw_dummy(ui, entity, node)); + *current = response.rect; + entity_rect = entity_rect.union(response.rect); + } - for dummy in graph.unknown_nodes() { - let ix = NodeIndex::from(&dummy); - seen.insert(ix); - let current = state.layout.entry(ix).or_insert(Rect::ZERO); - let response = scene.node(current.min, |ui| ui::draw_dummy(ui, &dummy)); - *current = response.rect; - } + for edge in &data.edges { + if let (Some(source_pos), Some(target_pos)) = ( + state.layout.get(&edge.source_index), + state.layout.get(&edge.target_index), + ) { + scene.edge(|ui| { + ui::draw_edge( + ui, + None, // TODO(grtlr): change this back once we have edge colors + &source_pos.translate(entity_offset), + &target_pos.translate(entity_offset), + Default::default(), // TODO(grtlr): we currently don't have any highlighting + data.graph_type == components::GraphType::Directed, + ) + }); + } + } + } - for data in edge_data { - let ent_highlight = query.highlights.entity_highlight(data.entity_path.hash()); + if entity_rect.is_positive() { + // TODO(grtlr): handle interactions + let _response = scene.entity(entity_rect.min, |ui| { + ui::draw_entity(ui, entity_rect, entity, &query.highlights) + }); - for edge in data.edges() { - if let (Some(source_pos), Some(target_pos)) = ( - state.layout.get(&edge.source_index()), - state.layout.get(&edge.target_index()), - ) { - scene.edge(|ui| { - ui::draw_edge( - ui, - None, // TODO(grtlr): change this back once we have edge colors - source_pos, - target_pos, - ent_highlight.index_highlight(edge.instance), - edge.edge_type == components::GraphType::Directed, - ) - }); - } + // TODO(grtlr): Should take padding from `draw_entity` into account. + let between_entities = 80.0; + entity_offset.x += entity_rect.width() + between_entities; } } }); diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs index e4bb622ce30a..2a089069ef79 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -1,43 +1,26 @@ -use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; -use re_log_types::Instance; -use re_query::{clamped_zip_2x1, range_zip_1x1}; +use re_chunk::LatestAtQuery; +use re_log_types::EntityPath; use re_space_view::{DataResultQuery, RangeResultsExt}; -use re_types::{self, archetypes, components, Loggable as _}; +use re_types::{ + self, archetypes, + components::{self, GraphEdge, GraphNode}, + Loggable as _, +}; use re_viewer_context::{ self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; -use crate::types::EdgeInstance; +use crate::{graph::NodeIndex, types::EdgeInstance}; #[derive(Default)] pub struct EdgesVisualizer { - pub data: Vec, + pub data: ahash::HashMap, } pub struct EdgeData { - pub entity_path: re_log_types::EntityPath, pub graph_type: components::GraphType, - edges: ChunkComponentIterItem, -} - -impl EdgeData { - pub fn edges(&self) -> impl Iterator> { - clamped_zip_2x1( - self.edges.iter(), - (0..).map(Instance::from), - // A placeholder for components that we will add in the future. - std::iter::repeat(None), - Option::<()>::default, - ) - .map(|(edge, instance, _placeholder)| EdgeInstance { - source: edge.first.clone().into(), - target: edge.second.clone().into(), - entity_path: &self.entity_path, - instance, - edge_type: self.graph_type, - }) - } + pub edges: Vec, } impl IdentifiedViewSystem for EdgesVisualizer { @@ -68,23 +51,35 @@ impl VisualizerSystem for EdgesVisualizer { ); let all_indexed_edges = results.iter_as(query.timeline, components::GraphEdge::name()); - let all_graph_type = results.iter_as(query.timeline, components::GraphType::name()); - - let data = range_zip_1x1( - all_indexed_edges.component::(), - all_graph_type.component::(), - ); - - for (_index, edges, graph_type) in data { - self.data.push(EdgeData { - entity_path: data_result.entity_path.clone(), - edges, - graph_type: graph_type - .unwrap_or_default() - .first() - .copied() - .unwrap_or_default(), - }); + let graph_type = results.get_mono_with_fallback::(); + + for (_index, edges) in all_indexed_edges.component::() { + let edges = edges + .iter() + .map(|edge| { + let source = GraphNode::from(edge.first.clone()); + let target = GraphNode::from(edge.second.clone()); + + let entity_path = &data_result.entity_path; + let source_index = NodeIndex::from_entity_node(entity_path, &source); + let target_index = NodeIndex::from_entity_node(entity_path, &target); + + EdgeInstance { + source, + target, + source_index, + target_index, + } + }) + .collect(); + + self.data.insert( + data_result.entity_path.clone(), + EdgeData { + edges, + graph_type, + }, + ); } } diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index df9828296207..4ea1ea5e4c7c 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -1,10 +1,8 @@ -use egui::Color32; -use re_chunk::{ChunkComponentIterItem, LatestAtQuery}; +use re_chunk::LatestAtQuery; use re_log_types::EntityPath; -use re_log_types::Instance; -use re_query::clamped_zip_2x3; -use re_query::range_zip_1x4; +use re_query::{clamped_zip_1x3, range_zip_1x3}; use re_space_view::{DataResultQuery, RangeResultsExt}; +use re_types::components::Color; use re_types::{ self, archetypes, components::{self}, @@ -15,51 +13,16 @@ use re_viewer_context::{ ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; +use crate::graph::NodeIndex; use crate::types::NodeInstance; -/// Our space view consist of single part which holds a list of egui colors for each entity path. #[derive(Default)] pub struct NodeVisualizer { - pub data: Vec, + pub data: ahash::HashMap, } pub struct NodeData { - pub entity_path: EntityPath, - node_ids: ChunkComponentIterItem, - - // Clamped - colors: ChunkComponentIterItem, - labels: Vec, - positions: Vec<[f32; 2]>, - - // Non-repeated - show_labels: Option, -} - -impl NodeData { - pub fn nodes(&self) -> impl Iterator> { - clamped_zip_2x3( - self.node_ids.iter(), - (0..).map(Instance::from), - self.colors.iter().map(Option::Some), - Option::<&components::Color>::default, - self.positions.iter().copied().map(Option::Some), - Option::<[f32; 2]>::default, - self.labels.iter().map(Option::Some), - Option::<&ArrowString>::default, - ) - .map( - move |(node_id, instance, color, position, label)| NodeInstance { - entity_path: &self.entity_path, - node_id, - instance, - color: color.map(|c| Color32::from(c.0)), - position, - show_labels: self.show_labels.map_or(true, bool::from), - label, - }, - ) - } + pub nodes: Vec, } impl IdentifiedViewSystem for NodeVisualizer { @@ -93,25 +56,47 @@ impl VisualizerSystem for NodeVisualizer { let all_colors = results.iter_as(query.timeline, components::Color::name()); let all_positions = results.iter_as(query.timeline, components::Position2D::name()); let all_labels = results.iter_as(query.timeline, components::Text::name()); - let all_show_labels = results.iter_as(query.timeline, components::ShowLabels::name()); - let data = range_zip_1x4( + let show_labels = results + .get_mono::() + .map_or(true, bool::from); + + let data = range_zip_1x3( all_indexed_nodes.component::(), all_colors.component::(), all_positions.primitive_array::<2, f32>(), all_labels.string(), - all_show_labels.component::(), ); - for (_index, node_ids, colors, positions, labels, show_labels) in data { - self.data.push(NodeData { - entity_path: data_result.entity_path.clone(), - node_ids, - colors: colors.unwrap_or_default(), - positions: positions.unwrap_or_default().to_vec(), - labels: labels.unwrap_or_default(), - show_labels: show_labels.unwrap_or_default().first().copied(), - }); + for (_index, nodes, colors, positions, labels) in data { + + let nodes = clamped_zip_1x3( + nodes.iter(), + colors.unwrap_or_default().iter().map(Option::Some), + Option::<&Color>::default, + positions + .unwrap_or_default() + .iter() + .copied() + .map(Option::Some), + Option::<[f32; 2]>::default, + labels + .unwrap_or_default() + .iter() + .map(|l| show_labels.then_some(l)), + Option::<&ArrowString>::default, + ) + .map(|(node, color, position, label)| NodeInstance { + node: node.clone(), + index: NodeIndex::from_entity_node(&data_result.entity_path, node), + color: color.map(|&Color(color)| color.into()), + position: position.map(|[x, y]| egui::Pos2::new(x, y)), + label: if show_labels { label.cloned() } else { None }, + }) + .collect(); + + self.data + .insert(data_result.entity_path.clone(), NodeData { nodes }); } } diff --git a/examples/rust/node_link/src/examples/binary_tree.rs b/examples/rust/node_link/src/examples/binary_tree.rs index 604e6b842ea0..33e85a1f356b 100644 --- a/examples/rust/node_link/src/examples/binary_tree.rs +++ b/examples/rust/node_link/src/examples/binary_tree.rs @@ -1,4 +1,4 @@ -use rerun::{GraphEdges, GraphNodes}; +use rerun::{components::GraphType, GraphEdges, GraphNodes}; use crate::Args; use std::collections::HashMap; @@ -13,7 +13,12 @@ pub fn run(args: &Args) -> anyhow::Result<()> { // (label, position) type NodeInfo = (&'static str, (f32, f32)); - let nodes: HashMap<&str, NodeInfo> = [ + struct Level<'a> { + nodes: &'a [&'a str], + edges: &'a [(&'a str, &'a str)], + } + + let nodes_unsorted: HashMap<&str, NodeInfo> = [ ("1", ("1", (0.0 * s, 0.0 * s))), ("7", ("7", (-20.0 * s, 30.0 * s))), ("2", ("2", (-30.0 * s, 60.0 * s))), @@ -27,12 +32,7 @@ pub fn run(args: &Args) -> anyhow::Result<()> { .into_iter() .collect(); - struct Level<'a> { - nodes: &'a [&'a str], - edges: &'a [(&'a str, &'a str)], - } - - let levels: Vec = vec![ + let levels_unsorted: Vec = vec![ Level { nodes: &["1"], edges: &[], @@ -66,23 +66,67 @@ pub fn run(args: &Args) -> anyhow::Result<()> { }, ]; + let nodes_sorted: HashMap<&str, NodeInfo> = [ + ("6", ("6", (0.0 * s, 0.0 * s))), + ("5_0", ("5", (-20.0 * s, 30.0 * s))), + ("9_0", ("9", (20.0 * s, 30.0 * s))), + // ("6", ("6", (-10.0 * s, 60.0 * s))), + // ("5_0", ("5", (-20.0 * s, 90.0 * s))), + // ("11", ("11", (0.0 * s, 90.0 * s))), + // ("9_0", ("9", (20.0 * s, 30.0 * s))), + // ("9_1", ("9", (30.0 * s, 60.0 * s))), + // ("5_1", ("5", (20.0 * s, 90.0 * s))), + ] + .into_iter() + .collect(); + + let levels_sorted: Vec = vec![ + Level { + nodes: &["6"], + edges: &[], + }, + Level { + nodes: &["6", "5_0", "9_0"], + edges: &[("6", "5_0"), ("6", "9_0")], + }, + ]; + let mut t = 0; - for level in levels { + for level in levels_unsorted { + if !level.nodes.is_empty() { + t += 1; + rec.set_time_seconds("stable_time", t as f64); + let _ = rec.log( + "unsorted", + &GraphNodes::new(level.nodes.iter().copied()) + .with_labels(level.nodes.iter().map(|n| nodes_unsorted[n].0)) + .with_positions(level.nodes.iter().map(|n| nodes_unsorted[n].1)), + ); + } + + if !level.edges.is_empty() { + t += 1; + rec.set_time_seconds("stable_time", t as f64); + let _ = rec.log("unsorted", &GraphEdges::new(level.edges)); + } + } + + for level in levels_sorted { if !level.nodes.is_empty() { t += 1; rec.set_time_seconds("stable_time", t as f64); let _ = rec.log( - "binary_tree", + "sorted", &GraphNodes::new(level.nodes.iter().copied()) - .with_labels(level.nodes.iter().map(|n| nodes[n].0)) - .with_positions(level.nodes.iter().map(|n| nodes[n].1)), + .with_labels(level.nodes.iter().map(|n| nodes_sorted[n].0)) + .with_positions(level.nodes.iter().map(|n| nodes_sorted[n].1)), ); } if !level.edges.is_empty() { t += 1; rec.set_time_seconds("stable_time", t as f64); - let _ = rec.log("binary_tree", &GraphEdges::new(level.edges)); + let _ = rec.log("sorted", &GraphEdges::new(level.edges).with_graph_type(GraphType::Directed)); } } From ead179fbdd1d975b1deffdbd1c0e3e83a463be29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 08:22:13 +0100 Subject: [PATCH 137/159] WIP: Minor improvements --- .../viewer/re_space_view_graph/src/ui/node.rs | 4 ++-- .../src/visualizers/edges.rs | 2 +- .../src/visualizers/nodes.rs | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index ef3c40dcf078..b677d96087f5 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -45,9 +45,9 @@ pub fn draw_node( .show(ui, |ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); if let Some(color) = instance.color { - ui.add(egui::Button::new(text.color(color))); + ui.add(egui::Label::new(text.color(color))); } else { - ui.add(egui::Button::new(text)); + ui.add(egui::Label::new(text)); } }) .response diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs index 2a089069ef79..c367de0428ca 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -25,7 +25,7 @@ pub struct EdgeData { impl IdentifiedViewSystem for EdgesVisualizer { fn identifier() -> ViewSystemIdentifier { - "GraphEdgesDirected".into() + "GraphEdges".into() } } diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 4ea1ea5e4c7c..e7cdc3d96a60 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -1,6 +1,6 @@ use re_chunk::LatestAtQuery; use re_log_types::EntityPath; -use re_query::{clamped_zip_1x3, range_zip_1x3}; +use re_query::{clamped_zip_1x3, range_zip_1x4}; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::components::Color; use re_types::{ @@ -56,19 +56,22 @@ impl VisualizerSystem for NodeVisualizer { let all_colors = results.iter_as(query.timeline, components::Color::name()); let all_positions = results.iter_as(query.timeline, components::Position2D::name()); let all_labels = results.iter_as(query.timeline, components::Text::name()); + let all_show_labels = results.iter_as(query.timeline, components::ShowLabels::name()); - let show_labels = results - .get_mono::() - .map_or(true, bool::from); - - let data = range_zip_1x3( + let data = range_zip_1x4( all_indexed_nodes.component::(), all_colors.component::(), all_positions.primitive_array::<2, f32>(), all_labels.string(), + all_show_labels.component::(), ); - for (_index, nodes, colors, positions, labels) in data { + for (_index, nodes, colors, positions, labels, show_labels) in data { + let show_labels = show_labels + .unwrap_or_default() + .first() + .copied() + .map_or(true, bool::from); let nodes = clamped_zip_1x3( nodes.iter(), From 10233944f7492aeff5f21d2db03dbd2c3930351a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 08:25:54 +0100 Subject: [PATCH 138/159] WIP: use mono component --- .../re_space_view_graph/src/visualizers/nodes.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index e7cdc3d96a60..7642f48a2f10 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -1,6 +1,6 @@ use re_chunk::LatestAtQuery; use re_log_types::EntityPath; -use re_query::{clamped_zip_1x3, range_zip_1x4}; +use re_query::{clamped_zip_1x3, range_zip_1x3}; use re_space_view::{DataResultQuery, RangeResultsExt}; use re_types::components::Color; use re_types::{ @@ -56,22 +56,16 @@ impl VisualizerSystem for NodeVisualizer { let all_colors = results.iter_as(query.timeline, components::Color::name()); let all_positions = results.iter_as(query.timeline, components::Position2D::name()); let all_labels = results.iter_as(query.timeline, components::Text::name()); - let all_show_labels = results.iter_as(query.timeline, components::ShowLabels::name()); + let show_labels = results.get_mono::().map_or(true, bool::from); - let data = range_zip_1x4( + let data = range_zip_1x3( all_indexed_nodes.component::(), all_colors.component::(), all_positions.primitive_array::<2, f32>(), all_labels.string(), - all_show_labels.component::(), ); - for (_index, nodes, colors, positions, labels, show_labels) in data { - let show_labels = show_labels - .unwrap_or_default() - .first() - .copied() - .map_or(true, bool::from); + for (_index, nodes, colors, positions, labels) in data { let nodes = clamped_zip_1x3( nodes.iter(), From bc4580dff0f3df7462c4a951f74aed4fda2540ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 08:59:38 +0100 Subject: [PATCH 139/159] WIP: add entity selections --- .../viewer/re_space_view_graph/src/ui/mod.rs | 2 +- crates/viewer/re_space_view_graph/src/view.rs | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/ui/mod.rs b/crates/viewer/re_space_view_graph/src/ui/mod.rs index a03a17e4f3bc..b3fb23ab8633 100644 --- a/crates/viewer/re_space_view_graph/src/ui/mod.rs +++ b/crates/viewer/re_space_view_graph/src/ui/mod.rs @@ -32,7 +32,7 @@ pub fn draw_entity( }; let padded = rect.expand(10.0); - let tc = ui.ctx().style().visuals.text_color(); + ui.painter().rect( padded, 0.0, diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 7321603ce37b..98c0c75d2787 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -19,7 +19,7 @@ use re_viewer_context::{ use re_viewport_blueprint::ViewProperty; use crate::{ - graph::{NodeIndex}, + graph::NodeIndex, ui::{self, bounding_rect_from_iter, scene::ViewBuilder, GraphSpaceViewState}, visualizers::{EdgesVisualizer, NodeVisualizer}, }; @@ -141,7 +141,10 @@ impl SpaceViewClass for GraphSpaceView { let edge_data = &system_output.view_systems.get::()?.data; // We need to sort the entities to ensure that we are always drawing them in the right order. - let entities = node_data.keys().chain(edge_data.keys()).collect::>(); + let entities = node_data + .keys() + .chain(edge_data.keys()) + .collect::>(); let state = state.downcast_mut::()?; @@ -245,12 +248,19 @@ impl SpaceViewClass for GraphSpaceView { } if entity_rect.is_positive() { - // TODO(grtlr): handle interactions - let _response = scene.entity(entity_rect.min, |ui| { + let response = scene.entity(entity_rect.min, |ui| { ui::draw_entity(ui, entity_rect, entity, &query.highlights) }); + let instance_path = InstancePath::entity_all(entity.clone()); + ctx.select_hovered_on_click( + &response, + vec![(Item::DataResult(query.space_view_id, instance_path), None)] + .into_iter(), + ); + // TODO(grtlr): Should take padding from `draw_entity` into account. + // It's very likely that this part of the code is going to change once we introduce auto-layout. let between_entities = 80.0; entity_offset.x += entity_rect.width() + between_entities; } From c790ef410fa56feb3d67bd64f0d6a5880eec5b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 09:49:30 +0100 Subject: [PATCH 140/159] WIP: handle implicit nodes --- .../viewer/re_space_view_graph/src/types.rs | 27 --------- .../viewer/re_space_view_graph/src/ui/node.rs | 57 ++++++++++--------- crates/viewer/re_space_view_graph/src/view.rs | 24 ++++---- .../src/visualizers/mod.rs | 4 +- .../src/visualizers/nodes.rs | 13 +++-- .../node_link/src/examples/binary_tree.rs | 2 +- 6 files changed, 55 insertions(+), 72 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index 47da67f0d7ff..fae7287a527a 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,4 +1,3 @@ -use re_log_types::{EntityPath}; use re_types::{components::{self, GraphNode}, ArrowString}; use crate::graph::NodeIndex; @@ -23,29 +22,3 @@ impl EdgeInstance { [&self.source, &self.target].into_iter() } } - -/// This instance is used to represent nodes that were found in an edge but that were not specified explicitly in the [`GraphNodes`](crate::GraphNodes) archetype. -pub struct UnknownNodeInstance { - pub node_id: components::GraphNode, - - /// The entity path of the edge that contained this node. - pub entity_path: EntityPath, -} - -impl From<&UnknownNodeInstance> for NodeIndex { - fn from(node: &UnknownNodeInstance) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_hash: (&node.node_id).into(), - } - } -} - -impl From for NodeIndex { - fn from(node: UnknownNodeInstance) -> Self { - Self { - entity_hash: node.entity_path.hash(), - node_hash: (&node.node_id).into(), - } - } -} diff --git a/crates/viewer/re_space_view_graph/src/ui/node.rs b/crates/viewer/re_space_view_graph/src/ui/node.rs index b677d96087f5..72bc4d7213c1 100644 --- a/crates/viewer/re_space_view_graph/src/ui/node.rs +++ b/crates/viewer/re_space_view_graph/src/ui/node.rs @@ -1,18 +1,33 @@ -use re_log_types::EntityPath; use re_types::components::GraphNode; use re_viewer_context::{HoverHighlight, InteractionHighlight, SelectionHighlight}; use crate::types::NodeInstance; -pub fn draw_dummy(ui: &mut egui::Ui, entity_path: &EntityPath, node: &GraphNode) -> egui::Response { - let text = egui::RichText::new(format!( - "{} @ {}", - node.as_str(), - entity_path - )) - .color(ui.style().visuals.widgets.noninteractive.text_color()); - ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - ui.add(egui::Button::new(text)) +fn draw_circle_node( + ui: &mut egui::Ui, + fill_color: egui::Color32, + stroke: egui::Stroke, +) -> egui::Response { + egui::Frame::default() + .show(ui, |ui| { + let r = 4.0; + ui.add(|ui: &mut egui::Ui| { + let (rect, response) = + ui.allocate_at_least(egui::Vec2::new(2.0 * r, 2.0 * r), egui::Sense::drag()); // Frame size + ui.painter().circle(rect.center(), r, fill_color, stroke); + response + }) + }) + .response +} + +pub fn draw_dummy(ui: &mut egui::Ui, node: &GraphNode) -> egui::Response { + draw_circle_node( + ui, + ui.style().visuals.gray_out(ui.style().visuals.text_color()), + egui::Stroke::NONE, + ) + .on_hover_text(format!("Implicit Node: `{}`", node.as_str(),)) } pub fn draw_node( @@ -52,23 +67,11 @@ pub fn draw_node( }) .response } else { - egui::Frame::default() - .show(ui, |ui| { - let r = 4.0; - ui.add(|ui: &mut egui::Ui| { - let (rect, response) = ui - .allocate_at_least(egui::Vec2::new(2.0 * r, 2.0 * r), egui::Sense::drag()); // Frame size - ui.painter().circle( - rect.center(), - // pos + egui::Vec2::new(r, r), - r, - instance.color.unwrap_or(ui.style().visuals.text_color()), - hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), - ); - response - }) - }) - .response + draw_circle_node( + ui, + instance.color.unwrap_or(ui.style().visuals.text_color()), + hcolor.map_or(egui::Stroke::NONE, |c| egui::Stroke::new(2.0, c)), + ) } .on_hover_text(format!("Node: `{}`", instance.node.as_str(),)) } diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index 98c0c75d2787..a6b025d87afa 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -1,6 +1,6 @@ use std::collections::{BTreeSet, HashSet}; -use egui::{self, Rect}; +use egui::{self, Rect, Vec2}; use re_log_types::EntityPath; use re_space_view::view_property_ui; @@ -181,8 +181,6 @@ impl SpaceViewClass for GraphSpaceView { let mut entity_offset = egui::Vec2::ZERO; for entity in entities { - let ent_highlight = query.highlights.entity_highlight(entity.hash()); - // We keep track of the size of the current entity. let mut entity_rect = egui::Rect::NOTHING; if let Some(data) = node_data.get(entity) { @@ -191,14 +189,14 @@ impl SpaceViewClass for GraphSpaceView { let current = state.layout.entry(node.index).or_insert( node.position .map_or(egui::Rect::ZERO.translate(entity_offset), |p| { - Rect::from_center_size(p.into(), egui::Vec2::ZERO) + Rect::from_center_size(p, egui::Vec2::ZERO) }), ); let response = scene.node(current.min + entity_offset, |ui| { ui::draw_node( ui, - &node, + node, Default::default(), // TODO(grtlr): we currently don't have any highlighting ) }); @@ -211,21 +209,25 @@ impl SpaceViewClass for GraphSpaceView { } if let Some(data) = edge_data.get(entity) { - let unknown_nodes = data + // An implicit node is a node that is not explicitly specified in the `GraphNodes` archetype. + let implicit_nodes = data .edges .iter() .flat_map(|e| e.nodes()) .filter(|n| !seen.contains(&NodeIndex::from_entity_node(entity, n))) .collect::>(); - for node in unknown_nodes { + // TODO(grtlr): The following logic is quite hacky, because we have to place the implicit nodes somewhere. + let mut current_implicit_offset = Vec2::new(entity_rect.min.x, entity_rect.height() + 40.0); + for node in implicit_nodes { let ix = NodeIndex::from_entity_node(entity, node); seen.insert(ix); - let current = state.layout.entry(ix).or_insert(Rect::ZERO); + let current = state.layout.entry(ix).or_insert(egui::Rect::ZERO.translate(entity_offset).translate(current_implicit_offset)); let response = - scene.node(current.min, |ui| ui::draw_dummy(ui, entity, node)); - *current = response.rect; - entity_rect = entity_rect.union(response.rect); + scene.node(current.min, |ui| ui::draw_dummy(ui, node)); + *current = response.rect.translate(-entity_offset); + // entity_rect = entity_rect.union(response.rect); + current_implicit_offset.x += 10.0; } for edge in &data.edges { diff --git a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs index 2d96d709c41a..83730d36ef8d 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/mod.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/mod.rs @@ -1,5 +1,5 @@ mod edges; mod nodes; -pub use edges::{EdgeData, EdgesVisualizer}; -pub use nodes::{NodeData, NodeVisualizer}; +pub use edges::EdgesVisualizer; +pub use nodes::NodeVisualizer; diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 7642f48a2f10..8d736ddbd471 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -2,15 +2,14 @@ use re_chunk::LatestAtQuery; use re_log_types::EntityPath; use re_query::{clamped_zip_1x3, range_zip_1x3}; use re_space_view::{DataResultQuery, RangeResultsExt}; -use re_types::components::Color; +use re_types::components::{Color, ShowLabels}; use re_types::{ self, archetypes, components::{self}, ArrowString, Loggable as _, }; use re_viewer_context::{ - self, IdentifiedViewSystem, SpaceViewSystemExecutionError, ViewContext, ViewContextCollection, - ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, + self, IdentifiedViewSystem, QueryContext, SpaceViewSystemExecutionError, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem }; use crate::graph::NodeIndex; @@ -109,4 +108,10 @@ impl VisualizerSystem for NodeVisualizer { } } -re_viewer_context::impl_component_fallback_provider!(NodeVisualizer => []); +impl TypedComponentFallbackProvider for NodeVisualizer { + fn fallback_for(&self, _ctx: &QueryContext<'_>) -> ShowLabels { + true.into() + } +} + +re_viewer_context::impl_component_fallback_provider!(NodeVisualizer => [ShowLabels]); diff --git a/examples/rust/node_link/src/examples/binary_tree.rs b/examples/rust/node_link/src/examples/binary_tree.rs index 33e85a1f356b..4b0f52232b18 100644 --- a/examples/rust/node_link/src/examples/binary_tree.rs +++ b/examples/rust/node_link/src/examples/binary_tree.rs @@ -87,7 +87,7 @@ pub fn run(args: &Args) -> anyhow::Result<()> { }, Level { nodes: &["6", "5_0", "9_0"], - edges: &[("6", "5_0"), ("6", "9_0")], + edges: &[("6", "5_0"), ("6", "9_0"), ("1", "6"), ("1", "42")], }, ]; From d1d144a419617d7f971ca55272228fbea3d1c639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 10:15:46 +0100 Subject: [PATCH 141/159] WIP: remove unneeded `error` --- crates/viewer/re_space_view_graph/src/error.rs | 17 ----------------- crates/viewer/re_space_view_graph/src/lib.rs | 1 - 2 files changed, 18 deletions(-) delete mode 100644 crates/viewer/re_space_view_graph/src/error.rs diff --git a/crates/viewer/re_space_view_graph/src/error.rs b/crates/viewer/re_space_view_graph/src/error.rs deleted file mode 100644 index d293bc1abd99..000000000000 --- a/crates/viewer/re_space_view_graph/src/error.rs +++ /dev/null @@ -1,17 +0,0 @@ -use re_viewer_context::SpaceViewSystemExecutionError; - -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("edge has unknown node")] - EdgeUnknownNode, - - #[error("missing layout information for node `{node}` in entity `{entity}`")] - MissingLayoutInformation { entity: String, node: String }, -} - -impl From for SpaceViewSystemExecutionError { - fn from(val: Error) -> Self { - // TODO(grtlr): Ensure that this is the correct error type. - Self::DrawDataCreationError(Box::new(val)) - } -} diff --git a/crates/viewer/re_space_view_graph/src/lib.rs b/crates/viewer/re_space_view_graph/src/lib.rs index f5c91aa82ea7..9edbaacfd2cf 100644 --- a/crates/viewer/re_space_view_graph/src/lib.rs +++ b/crates/viewer/re_space_view_graph/src/lib.rs @@ -2,7 +2,6 @@ //! //! A Space View that shows a graph (node-link diagram). -mod error; mod graph; mod properties; mod types; From 08eff6eab5e6cf5097a485624816587929335cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 13:09:42 +0100 Subject: [PATCH 142/159] WIP: add Python and Rust snippets --- .../rerun/archetypes/graph_edges.fbs | 5 ++++ .../rerun/archetypes/graph_nodes.fbs | 5 ++++ .../src/archetypes/graph_edges_ext.rs | 15 +++++++++++ crates/store/re_types/src/archetypes/mod.rs | 1 + .../reference/types/archetypes/graph_edges.md | 26 +++++++++++++++++++ .../reference/types/archetypes/graph_nodes.md | 26 +++++++++++++++++++ .../snippets/all/archetypes/graph_directed.py | 17 ++++++++++++ .../snippets/all/archetypes/graph_directed.rs | 20 ++++++++++++++ .../all/archetypes/graph_undirected.py | 18 +++++++++++++ .../all/archetypes/graph_undirected.rs | 20 ++++++++++++++ 10 files changed, 153 insertions(+) create mode 100644 crates/store/re_types/src/archetypes/graph_edges_ext.rs create mode 100644 docs/snippets/all/archetypes/graph_directed.py create mode 100644 docs/snippets/all/archetypes/graph_directed.rs create mode 100644 docs/snippets/all/archetypes/graph_undirected.py create mode 100644 docs/snippets/all/archetypes/graph_undirected.rs diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs index c216d673fe44..1816f2849df3 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_edges.fbs @@ -2,9 +2,14 @@ namespace rerun.archetypes; // --- +// TODO(ab): Add images to snippets. + /// A list of edges in a graph. /// /// By default, edges are undirected. +/// +/// \example archetypes/graph_undirected !api title="Simple undirected graph" image="" +/// \example archetypes/graph_directed !api title="Simple directed graph" image="" table GraphEdges ( "attr.docs.category": "Graph", "attr.docs.unreleased", diff --git a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs index 6e3d91b7783c..5899488f8b7b 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/graph_nodes.fbs @@ -2,7 +2,12 @@ namespace rerun.archetypes; // --- +// TODO(ab): Add images to snippets. + /// A list of nodes in a graph with optional labels, colors, etc. +/// +/// \example archetypes/graph_undirected !api title="Simple undirected graph" image="" +/// \example archetypes/graph_directed !api title="Simple directed graph" image="" table GraphNodes ( "attr.docs.category": "Graph", "attr.docs.unreleased", diff --git a/crates/store/re_types/src/archetypes/graph_edges_ext.rs b/crates/store/re_types/src/archetypes/graph_edges_ext.rs new file mode 100644 index 000000000000..752010d2f0fc --- /dev/null +++ b/crates/store/re_types/src/archetypes/graph_edges_ext.rs @@ -0,0 +1,15 @@ +use super::GraphEdges; + +impl GraphEdges { + /// Creates a graph with undirected edges. + pub fn with_undirected_edges(mut self) -> Self { + self.graph_type = Some(crate::components::GraphType::Undirected); + self + } + + /// Creates a graph with directed edges. + pub fn with_directed_edges(mut self) -> Self { + self.graph_type = Some(crate::components::GraphType::Directed); + self + } +} diff --git a/crates/store/re_types/src/archetypes/mod.rs b/crates/store/re_types/src/archetypes/mod.rs index 17be0a803878..bd16031bd181 100644 --- a/crates/store/re_types/src/archetypes/mod.rs +++ b/crates/store/re_types/src/archetypes/mod.rs @@ -23,6 +23,7 @@ mod encoded_image; mod encoded_image_ext; mod geo_points; mod graph_edges; +mod graph_edges_ext; mod graph_nodes; mod image; mod image_ext; diff --git a/docs/content/reference/types/archetypes/graph_edges.md b/docs/content/reference/types/archetypes/graph_edges.md index 4c3eb318970b..8a727623def0 100644 --- a/docs/content/reference/types/archetypes/graph_edges.md +++ b/docs/content/reference/types/archetypes/graph_edges.md @@ -22,3 +22,29 @@ By default, edges are undirected. * 🐍 [Python API docs for `GraphEdges`](https://ref.rerun.io/docs/python/stable/common/archetypes?speculative-link#rerun.archetypes.GraphEdges) * 🦀 [Rust API docs for `GraphEdges`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphEdges.html?speculative-link) +## Examples + +### Simple undirected graph + +snippet: archetypes/graph_undirected + + + + + + + + + +### Simple directed graph + +snippet: archetypes/graph_directed + + + + + + + + + diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index 1c9bcfa07cf0..acf3235a9d0c 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -20,3 +20,29 @@ A list of nodes in a graph with optional labels, colors, etc. * 🐍 [Python API docs for `GraphNodes`](https://ref.rerun.io/docs/python/stable/common/archetypes?speculative-link#rerun.archetypes.GraphNodes) * 🦀 [Rust API docs for `GraphNodes`](https://docs.rs/rerun/latest/rerun/archetypes/struct.GraphNodes.html?speculative-link) +## Examples + +### Simple undirected graph + +snippet: archetypes/graph_undirected + + + + + + + + + +### Simple directed graph + +snippet: archetypes/graph_directed + + + + + + + + + diff --git a/docs/snippets/all/archetypes/graph_directed.py b/docs/snippets/all/archetypes/graph_directed.py new file mode 100644 index 000000000000..e4397bcfc9fb --- /dev/null +++ b/docs/snippets/all/archetypes/graph_directed.py @@ -0,0 +1,17 @@ +"""Log a simple directed graph.""" + +import rerun as rr + +rr.init("rerun_example_graph_directed", spawn=True) + +rr.log( + "simple", + rr.GraphNodes( + node_ids=["a", "b", "c"], positions=[(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)], labels=["A", "B", "C"] + ), +) +# Note: We log to the same entity here. +rr.log( + "edges", + rr.GraphEdges(edges=[("a", "b"), ("b", "c"), ("c", "a")], graph_type="directed"), +) diff --git a/docs/snippets/all/archetypes/graph_directed.rs b/docs/snippets/all/archetypes/graph_directed.rs new file mode 100644 index 000000000000..a794465ae956 --- /dev/null +++ b/docs/snippets/all/archetypes/graph_directed.rs @@ -0,0 +1,20 @@ +//! Log a simple directed graph. + +fn main() -> Result<(), Box> { + let rec = rerun::RecordingStreamBuilder::new("rerun_example_graph_directed").spawn()?; + + rec.log( + "simple", + &rerun::GraphNodes::new(["a", "b", "c"]) + .with_positions([(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)]) + .with_labels(["A", "B", "C"]) + )?; + // Note: We log to the same entity here. + rec.log( + "simple", + &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]) + .with_directed_edges() + )?; + + Ok(()) +} diff --git a/docs/snippets/all/archetypes/graph_undirected.py b/docs/snippets/all/archetypes/graph_undirected.py new file mode 100644 index 000000000000..adb46b117b19 --- /dev/null +++ b/docs/snippets/all/archetypes/graph_undirected.py @@ -0,0 +1,18 @@ +"""Log a simple undirected graph.""" + +import rerun as rr + +rr.init("rerun_example_graph_undirected", spawn=True) + +rr.log( + "simple", + rr.GraphNodes( + node_ids=["a", "b", "c"], positions=[(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)], labels=["A", "B", "C"] + ), +) +# Note: We log to the same entity here. +rr.log( + "edges", + # `graph_type` is optional, graphs are undirected by default. + rr.GraphEdges(edges=[("a", "b"), ("b", "c"), ("c", "a")], graph_type="undirected"), +) diff --git a/docs/snippets/all/archetypes/graph_undirected.rs b/docs/snippets/all/archetypes/graph_undirected.rs new file mode 100644 index 000000000000..60ea78c64f36 --- /dev/null +++ b/docs/snippets/all/archetypes/graph_undirected.rs @@ -0,0 +1,20 @@ +//! Log a simple undirected graph. + +fn main() -> Result<(), Box> { + let rec = rerun::RecordingStreamBuilder::new("rerun_example_graph_undirected").spawn()?; + + rec.log( + "simple", + &rerun::GraphNodes::new(["a", "b", "c"]) + .with_positions([(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)]) + .with_labels(["A", "B", "C"]) + )?; + // Note: We log to the same entity here. + rec.log( + "simple", + &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]) + .with_undirected_edges() // Optional: graphs are undirected by default. + )?; + + Ok(()) +} From 91e9385657be92d57ae47f94d9ed84a9b61ba95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 13:41:31 +0100 Subject: [PATCH 143/159] WIP: still broken! `C++` snippet --- .../all/archetypes/graph_undirected.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 docs/snippets/all/archetypes/graph_undirected.cpp diff --git a/docs/snippets/all/archetypes/graph_undirected.cpp b/docs/snippets/all/archetypes/graph_undirected.cpp new file mode 100644 index 000000000000..1ac4576f4507 --- /dev/null +++ b/docs/snippets/all/archetypes/graph_undirected.cpp @@ -0,0 +1,24 @@ +//! Log a simple undirected graph. + +#include + +int main() { + const auto rec = rerun::RecordingStream("rerun_example_graph_undirected"); + rec.spawn().exit_on_failure(); + + rec.log( + "simple", + rerun::GraphNodes({{"a"}, {"b"}, {"c"}}) + .with_positions({{0.0, 100.0}, {-100.0, 0.0}, {100.0, 0.0}}) + .with_labels({"A", "B", "C"}) + ); + + // Note: We log to the same entity here. + rec.log( + "simple", + // TODO(grtlr): This is still broken! + rerun::GraphEdges({{ first: {"a"}, second: {"b"}}}) + // Optional: graphs are undirected by default. + .with_graph_type(rerun::components::GraphType::Undirected) + ); +} From ebcbe4c0d9a5f1893784ac83d2720aa2eab1eb2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Wed, 30 Oct 2024 14:31:52 +0100 Subject: [PATCH 144/159] WIP: C++ examples with warnings --- .../all/archetypes/graph_directed.cpp | 27 +++++++++++++++++++ .../all/archetypes/graph_undirected.cpp | 8 ++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 docs/snippets/all/archetypes/graph_directed.cpp diff --git a/docs/snippets/all/archetypes/graph_directed.cpp b/docs/snippets/all/archetypes/graph_directed.cpp new file mode 100644 index 000000000000..9787fecd236a --- /dev/null +++ b/docs/snippets/all/archetypes/graph_directed.cpp @@ -0,0 +1,27 @@ +//! Log a simple directed graph. + +#include + +int main() { + const auto rec = rerun::RecordingStream("rerun_example_graph_directed"); + rec.spawn().exit_on_failure(); + + rec.log( + "simple", + rerun::GraphNodes({{"a"}, {"b"}, {"c"}}) + .with_positions({{0.0, 100.0}, {-100.0, 0.0}, {100.0, 0.0}}) + .with_labels({"A", "B", "C"}) + ); + + // TODO(grtlr): This still throws warnings! + rerun::datatypes::Utf8Pair edge_1 {.first {"a"}, .second {"b"}}; + rerun::datatypes::Utf8Pair edge_2 {.first {"b"}, .second {"c"}}; + rerun::datatypes::Utf8Pair edge_3 {.first {"c"}, .second {"a"}}; + + // Note: We log to the same entity here. + rec.log( + "simple", + rerun::GraphEdges({edge_1, edge_2, edge_3}) + .with_graph_type(rerun::components::GraphType::Directed) + ); +} diff --git a/docs/snippets/all/archetypes/graph_undirected.cpp b/docs/snippets/all/archetypes/graph_undirected.cpp index 1ac4576f4507..e536e9c0eb1b 100644 --- a/docs/snippets/all/archetypes/graph_undirected.cpp +++ b/docs/snippets/all/archetypes/graph_undirected.cpp @@ -13,11 +13,15 @@ int main() { .with_labels({"A", "B", "C"}) ); + // TODO(grtlr): This still throws warnings! + rerun::datatypes::Utf8Pair edge_1 {.first {"a"}, .second {"b"}}; + rerun::datatypes::Utf8Pair edge_2 {.first {"b"}, .second {"c"}}; + rerun::datatypes::Utf8Pair edge_3 {.first {"c"}, .second {"a"}}; + // Note: We log to the same entity here. rec.log( "simple", - // TODO(grtlr): This is still broken! - rerun::GraphEdges({{ first: {"a"}, second: {"b"}}}) + rerun::GraphEdges({edge_1, edge_2, edge_3}) // Optional: graphs are undirected by default. .with_graph_type(rerun::components::GraphType::Undirected) ); From 539ad0ae71c2f8d5aafafd6807a487809935ecbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:15:23 +0100 Subject: [PATCH 145/159] WIP: rerun :wink: codegen --- crates/viewer/re_viewer/src/reflection/mod.rs | 3 +++ .../reference/types/archetypes/graph_edges.md | 16 ++-------------- .../reference/types/archetypes/graph_nodes.md | 16 ++-------------- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 43b2fb52d944..6dda62d6975e 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -443,6 +443,7 @@ fn generate_component_reflection() -> Result Result Result - - - - - - + ### Simple directed graph snippet: archetypes/graph_directed - - - - - - - + diff --git a/docs/content/reference/types/archetypes/graph_nodes.md b/docs/content/reference/types/archetypes/graph_nodes.md index acf3235a9d0c..80f96ec54d49 100644 --- a/docs/content/reference/types/archetypes/graph_nodes.md +++ b/docs/content/reference/types/archetypes/graph_nodes.md @@ -26,23 +26,11 @@ A list of nodes in a graph with optional labels, colors, etc. snippet: archetypes/graph_undirected - - - - - - - + ### Simple directed graph snippet: archetypes/graph_directed - - - - - - - + From 02846251760b46c7068514b95f2bd3cd4b04f790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:16:45 +0100 Subject: [PATCH 146/159] WIP: fmt --- crates/viewer/re_space_view_graph/src/types.rs | 5 ++++- crates/viewer/re_space_view_graph/src/view.rs | 14 +++++++++----- .../re_space_view_graph/src/visualizers/edges.rs | 5 +---- .../re_space_view_graph/src/visualizers/nodes.rs | 9 ++++++--- .../rust/node_link/src/examples/binary_tree.rs | 5 ++++- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/types.rs b/crates/viewer/re_space_view_graph/src/types.rs index fae7287a527a..a982c0ace6da 100644 --- a/crates/viewer/re_space_view_graph/src/types.rs +++ b/crates/viewer/re_space_view_graph/src/types.rs @@ -1,4 +1,7 @@ -use re_types::{components::{self, GraphNode}, ArrowString}; +use re_types::{ + components::{self, GraphNode}, + ArrowString, +}; use crate::graph::NodeIndex; diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index a6b025d87afa..fdafd9383e61 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -218,16 +218,20 @@ impl SpaceViewClass for GraphSpaceView { .collect::>(); // TODO(grtlr): The following logic is quite hacky, because we have to place the implicit nodes somewhere. - let mut current_implicit_offset = Vec2::new(entity_rect.min.x, entity_rect.height() + 40.0); + let mut current_implicit_offset = + Vec2::new(entity_rect.min.x, entity_rect.height() + 40.0); for node in implicit_nodes { let ix = NodeIndex::from_entity_node(entity, node); seen.insert(ix); - let current = state.layout.entry(ix).or_insert(egui::Rect::ZERO.translate(entity_offset).translate(current_implicit_offset)); - let response = - scene.node(current.min, |ui| ui::draw_dummy(ui, node)); + let current = state.layout.entry(ix).or_insert( + egui::Rect::ZERO + .translate(entity_offset) + .translate(current_implicit_offset), + ); + let response = scene.node(current.min, |ui| ui::draw_dummy(ui, node)); *current = response.rect.translate(-entity_offset); // entity_rect = entity_rect.union(response.rect); - current_implicit_offset.x += 10.0; + current_implicit_offset.x += 10.0; } for edge in &data.edges { diff --git a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs index c367de0428ca..aeccc9eee326 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/edges.rs @@ -75,10 +75,7 @@ impl VisualizerSystem for EdgesVisualizer { self.data.insert( data_result.entity_path.clone(), - EdgeData { - edges, - graph_type, - }, + EdgeData { edges, graph_type }, ); } } diff --git a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs index 8d736ddbd471..f1dfef6fd64b 100644 --- a/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_space_view_graph/src/visualizers/nodes.rs @@ -9,7 +9,9 @@ use re_types::{ ArrowString, Loggable as _, }; use re_viewer_context::{ - self, IdentifiedViewSystem, QueryContext, SpaceViewSystemExecutionError, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem + self, IdentifiedViewSystem, QueryContext, SpaceViewSystemExecutionError, + TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, + ViewSystemIdentifier, VisualizerQueryInfo, VisualizerSystem, }; use crate::graph::NodeIndex; @@ -55,7 +57,9 @@ impl VisualizerSystem for NodeVisualizer { let all_colors = results.iter_as(query.timeline, components::Color::name()); let all_positions = results.iter_as(query.timeline, components::Position2D::name()); let all_labels = results.iter_as(query.timeline, components::Text::name()); - let show_labels = results.get_mono::().map_or(true, bool::from); + let show_labels = results + .get_mono::() + .map_or(true, bool::from); let data = range_zip_1x3( all_indexed_nodes.component::(), @@ -65,7 +69,6 @@ impl VisualizerSystem for NodeVisualizer { ); for (_index, nodes, colors, positions, labels) in data { - let nodes = clamped_zip_1x3( nodes.iter(), colors.unwrap_or_default().iter().map(Option::Some), diff --git a/examples/rust/node_link/src/examples/binary_tree.rs b/examples/rust/node_link/src/examples/binary_tree.rs index 4b0f52232b18..c144c9744ad5 100644 --- a/examples/rust/node_link/src/examples/binary_tree.rs +++ b/examples/rust/node_link/src/examples/binary_tree.rs @@ -126,7 +126,10 @@ pub fn run(args: &Args) -> anyhow::Result<()> { if !level.edges.is_empty() { t += 1; rec.set_time_seconds("stable_time", t as f64); - let _ = rec.log("sorted", &GraphEdges::new(level.edges).with_graph_type(GraphType::Directed)); + let _ = rec.log( + "sorted", + &GraphEdges::new(level.edges).with_graph_type(GraphType::Directed), + ); } } From c7de2bf7b40ed136fd00cd1f46fcede6271d193d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:21:34 +0100 Subject: [PATCH 147/159] WIP: more lints --- crates/store/re_types/src/archetypes/graph_edges_ext.rs | 2 ++ docs/snippets/all/archetypes/graph_directed.rs | 5 ++--- docs/snippets/all/archetypes/graph_undirected.rs | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/store/re_types/src/archetypes/graph_edges_ext.rs b/crates/store/re_types/src/archetypes/graph_edges_ext.rs index 752010d2f0fc..9e97e0797882 100644 --- a/crates/store/re_types/src/archetypes/graph_edges_ext.rs +++ b/crates/store/re_types/src/archetypes/graph_edges_ext.rs @@ -2,12 +2,14 @@ use super::GraphEdges; impl GraphEdges { /// Creates a graph with undirected edges. + #[inline(always)] pub fn with_undirected_edges(mut self) -> Self { self.graph_type = Some(crate::components::GraphType::Undirected); self } /// Creates a graph with directed edges. + #[inline(always)] pub fn with_directed_edges(mut self) -> Self { self.graph_type = Some(crate::components::GraphType::Directed); self diff --git a/docs/snippets/all/archetypes/graph_directed.rs b/docs/snippets/all/archetypes/graph_directed.rs index a794465ae956..96adef8ac0f2 100644 --- a/docs/snippets/all/archetypes/graph_directed.rs +++ b/docs/snippets/all/archetypes/graph_directed.rs @@ -7,13 +7,12 @@ fn main() -> Result<(), Box> { "simple", &rerun::GraphNodes::new(["a", "b", "c"]) .with_positions([(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)]) - .with_labels(["A", "B", "C"]) + .with_labels(["A", "B", "C"]), )?; // Note: We log to the same entity here. rec.log( "simple", - &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]) - .with_directed_edges() + &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]).with_directed_edges(), )?; Ok(()) diff --git a/docs/snippets/all/archetypes/graph_undirected.rs b/docs/snippets/all/archetypes/graph_undirected.rs index 60ea78c64f36..7fc028b064a5 100644 --- a/docs/snippets/all/archetypes/graph_undirected.rs +++ b/docs/snippets/all/archetypes/graph_undirected.rs @@ -7,13 +7,12 @@ fn main() -> Result<(), Box> { "simple", &rerun::GraphNodes::new(["a", "b", "c"]) .with_positions([(0.0, 100.0), (-100.0, 0.0), (100.0, 0.0)]) - .with_labels(["A", "B", "C"]) + .with_labels(["A", "B", "C"]), )?; // Note: We log to the same entity here. rec.log( "simple", - &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]) - .with_undirected_edges() // Optional: graphs are undirected by default. + &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]).with_undirected_edges(), // Optional: graphs are undirected by default. )?; Ok(()) From d295b433e9663f8fa758d069b4eabbcb24c478c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:33:55 +0100 Subject: [PATCH 148/159] WIP: remove unneeded dependencies --- Cargo.lock | 2 -- crates/viewer/re_space_view_graph/Cargo.toml | 2 -- 2 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96814c956f86..52f05851a09a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5999,7 +5999,6 @@ dependencies = [ "nohash-hasher", "re_chunk", "re_format", - "re_log", "re_log_types", "re_query", "re_renderer", @@ -6009,7 +6008,6 @@ dependencies = [ "re_ui", "re_viewer_context", "re_viewport_blueprint", - "thiserror", ] [[package]] diff --git a/crates/viewer/re_space_view_graph/Cargo.toml b/crates/viewer/re_space_view_graph/Cargo.toml index 22b6f0763f8a..5f7f38de5684 100644 --- a/crates/viewer/re_space_view_graph/Cargo.toml +++ b/crates/viewer/re_space_view_graph/Cargo.toml @@ -21,7 +21,6 @@ all-features = true [dependencies] re_chunk.workspace = true re_format.workspace = true -re_log.workspace = true re_log_types.workspace = true re_query.workspace = true re_renderer.workspace = true @@ -35,4 +34,3 @@ re_viewport_blueprint.workspace = true ahash.workspace = true egui.workspace = true nohash-hasher.workspace = true -thiserror.workspace = true From 29e4a53cafbd6b0341d852c55c9ee06810509d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:40:03 +0100 Subject: [PATCH 149/159] WIP: missing entry in `manifest.toml` --- examples/manifest.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/manifest.toml b/examples/manifest.toml index 992c12dd90f8..618a3dfe85a3 100644 --- a/examples/manifest.toml +++ b/examples/manifest.toml @@ -147,6 +147,7 @@ examples = [ "plots", "live_scrolling_plot", "raw_mesh", + "node_link", ] # These are examples that we explicitly exclude from our website. You can check that all examples are either included From 47c20a5f74aa85f669bcb85a4471d3d89ab199a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 11:54:58 +0100 Subject: [PATCH 150/159] WIP: improve Python example --- examples/python/node_link/node_link.py | 74 +++++++++++++++----------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/examples/python/node_link/node_link.py b/examples/python/node_link/node_link.py index 3ccc811739b2..39c71a3a71f9 100644 --- a/examples/python/node_link/node_link.py +++ b/examples/python/node_link/node_link.py @@ -11,33 +11,43 @@ # :warning: The nodes have to be unique, which is why we use `5_0`… NodeId = str -NodeInfo = dict[NodeId, str | tuple[float, float]] - -nodes: dict[NodeId, NodeInfo] = { - "1": {"label": "1", "pos": (0 * s, 0 * s)}, - "7": {"label": "7", "pos": (-20 * s, 30 * s)}, - "2": {"label": "2", "pos": (-30 * s, 60 * s)}, - "6": {"label": "6", "pos": (-10 * s, 60 * s)}, - "5_0": {"label": "5", "pos": (-20 * s, 90 * s)}, - "11": {"label": "11", "pos": (0 * s, 90 * s)}, - "9_0": {"label": "9", "pos": (20 * s, 30 * s)}, - "9_1": {"label": "9", "pos": (30 * s, 60 * s)}, - "5_1": {"label": "5", "pos": (20 * s, 90 * s)}, + + +class NodeInfo: + def __init__(self, label: str, pos: tuple[float, float]) -> None: + self.label = label + self.pos = pos + + +all_nodes: dict[NodeId, NodeInfo] = { + "1": NodeInfo(label="1", pos=(0 * s, 0 * s)), + "7": NodeInfo(label="7", pos=(-20 * s, 30 * s)), + "2": NodeInfo(label="2", pos=(-30 * s, 60 * s)), + "6": NodeInfo(label="6", pos=(-10 * s, 60 * s)), + "5_0": NodeInfo(label="5", pos=(-20 * s, 90 * s)), + "11": NodeInfo(label="11", pos=(0 * s, 90 * s)), + "9_0": NodeInfo(label="9", pos=(20 * s, 30 * s)), + "9_1": NodeInfo(label="9", pos=(30 * s, 60 * s)), + "5_1": NodeInfo(label="5", pos=(20 * s, 90 * s)), } -LevelInfo = dict[str, list[NodeId] | list[tuple[NodeId, NodeId]]] -Levels = list[LevelInfo] - -levels: Levels = [ - {"nodes": ["1"], "edges": []}, - {"nodes": ["1", "7", "9_0"], "edges": [("1", "7"), ("1", "9_0")]}, - { - "nodes": ["1", "7", "9_0", "2", "6", "9_1"], - "edges": [("1", "7"), ("1", "9_0"), ("7", "2"), ("7", "6"), ("9_0", "9_1")], - }, - { - "nodes": ["1", "7", "9_0", "2", "6", "9_1", "5_0", "11", "5_1"], - "edges": [ + +class Level: + def __init__(self, nodes: list[NodeId], edges: list[tuple[NodeId, NodeId]]): + self.nodes = nodes + self.edges = edges + + +levels: list[Level] = [ + Level(nodes=["1"], edges=[]), + Level(nodes=["1", "7", "9_0"], edges=[("1", "7"), ("1", "9_0")]), + Level( + nodes=["1", "7", "9_0", "2", "6", "9_1"], + edges=[("1", "7"), ("1", "9_0"), ("7", "2"), ("7", "6"), ("9_0", "9_1")], + ), + Level( + nodes=["1", "7", "9_0", "2", "6", "9_1", "5_0", "11", "5_1"], + edges=[ ("1", "7"), ("1", "9_0"), ("7", "2"), @@ -47,7 +57,7 @@ ("6", "11"), ("9_1", "5_1"), ], - }, + ), ] @@ -56,22 +66,22 @@ def main() -> None: t = 0 for level in levels: - if len(level["nodes"]) > 0: + if len(level.nodes) > 0: t = t + 1 rr.set_time_seconds("stable_time", t) rr.log( "binary_tree", rr.GraphNodes( - level["nodes"], - labels=list(map(lambda n: nodes[n]["label"], level["nodes"])), - positions=list(map(lambda n: nodes[n]["pos"], level["nodes"])), + level.nodes, + labels=list(map(lambda n: all_nodes[n].label, level.nodes)), + positions=list(map(lambda n: all_nodes[n].pos, level.nodes)), ), ) - if len(level["edges"]) > 0: + if len(level.edges) > 0: t = t + 1 rr.set_time_seconds("stable_time", t) - rr.log("binary_tree", rr.GraphEdges(level["edges"])) + rr.log("binary_tree", rr.GraphEdges(level.edges)) if __name__ == "__main__": From ebf8fa287041f65a80c82fe5490ade89939f31c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 12:07:29 +0100 Subject: [PATCH 151/159] WIP: more lints --- docs/snippets/all/archetypes/graph_directed.rs | 2 +- docs/snippets/all/archetypes/graph_undirected.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/snippets/all/archetypes/graph_directed.rs b/docs/snippets/all/archetypes/graph_directed.rs index 96adef8ac0f2..be05ad8bd407 100644 --- a/docs/snippets/all/archetypes/graph_directed.rs +++ b/docs/snippets/all/archetypes/graph_directed.rs @@ -12,7 +12,7 @@ fn main() -> Result<(), Box> { // Note: We log to the same entity here. rec.log( "simple", - &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]).with_directed_edges(), + &rerun::GraphEdges::new([("a", "b"), ("b", "c"), ("c", "a")]).with_directed_edges(), )?; Ok(()) diff --git a/docs/snippets/all/archetypes/graph_undirected.rs b/docs/snippets/all/archetypes/graph_undirected.rs index 7fc028b064a5..affd0ec3d0ee 100644 --- a/docs/snippets/all/archetypes/graph_undirected.rs +++ b/docs/snippets/all/archetypes/graph_undirected.rs @@ -12,7 +12,7 @@ fn main() -> Result<(), Box> { // Note: We log to the same entity here. rec.log( "simple", - &rerun::GraphEdges::new(&[("a", "b"), ("b", "c"), ("c", "a")]).with_undirected_edges(), // Optional: graphs are undirected by default. + &rerun::GraphEdges::new([("a", "b"), ("b", "c"), ("c", "a")]).with_undirected_edges(), // Optional: graphs are undirected by default. )?; Ok(()) From 89232ad13cb54eba7d83551f6041b3651e28fe2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 12:15:36 +0100 Subject: [PATCH 152/159] WIP: format C++ snippets --- docs/snippets/all/archetypes/graph_directed.cpp | 6 +++--- docs/snippets/all/archetypes/graph_undirected.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/snippets/all/archetypes/graph_directed.cpp b/docs/snippets/all/archetypes/graph_directed.cpp index 9787fecd236a..8b3f51a0c4da 100644 --- a/docs/snippets/all/archetypes/graph_directed.cpp +++ b/docs/snippets/all/archetypes/graph_directed.cpp @@ -14,9 +14,9 @@ int main() { ); // TODO(grtlr): This still throws warnings! - rerun::datatypes::Utf8Pair edge_1 {.first {"a"}, .second {"b"}}; - rerun::datatypes::Utf8Pair edge_2 {.first {"b"}, .second {"c"}}; - rerun::datatypes::Utf8Pair edge_3 {.first {"c"}, .second {"a"}}; + rerun::datatypes::Utf8Pair edge_1{.first{"a"}, .second{"b"}}; + rerun::datatypes::Utf8Pair edge_2{.first{"b"}, .second{"c"}}; + rerun::datatypes::Utf8Pair edge_3{.first{"c"}, .second{"a"}}; // Note: We log to the same entity here. rec.log( diff --git a/docs/snippets/all/archetypes/graph_undirected.cpp b/docs/snippets/all/archetypes/graph_undirected.cpp index e536e9c0eb1b..e8a8ab638b19 100644 --- a/docs/snippets/all/archetypes/graph_undirected.cpp +++ b/docs/snippets/all/archetypes/graph_undirected.cpp @@ -14,9 +14,9 @@ int main() { ); // TODO(grtlr): This still throws warnings! - rerun::datatypes::Utf8Pair edge_1 {.first {"a"}, .second {"b"}}; - rerun::datatypes::Utf8Pair edge_2 {.first {"b"}, .second {"c"}}; - rerun::datatypes::Utf8Pair edge_3 {.first {"c"}, .second {"a"}}; + rerun::datatypes::Utf8Pair edge_1{.first{"a"}, .second{"b"}}; + rerun::datatypes::Utf8Pair edge_2{.first{"b"}, .second{"c"}}; + rerun::datatypes::Utf8Pair edge_3{.first{"c"}, .second{"a"}}; // Note: We log to the same entity here. rec.log( From 83cb218045f738e2f8bce231a08be437da6812f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 13:04:07 +0100 Subject: [PATCH 153/159] WIP: improve C++ example --- .../all/archetypes/graph_directed.cpp | 7 +++---- .../all/archetypes/graph_undirected.cpp | 7 +++---- rerun_cpp/src/rerun/datatypes/utf8pair.hpp | 7 +++++++ .../src/rerun/datatypes/utf8pair_ext.cpp | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp diff --git a/docs/snippets/all/archetypes/graph_directed.cpp b/docs/snippets/all/archetypes/graph_directed.cpp index 8b3f51a0c4da..70cb1f4f2a44 100644 --- a/docs/snippets/all/archetypes/graph_directed.cpp +++ b/docs/snippets/all/archetypes/graph_directed.cpp @@ -13,10 +13,9 @@ int main() { .with_labels({"A", "B", "C"}) ); - // TODO(grtlr): This still throws warnings! - rerun::datatypes::Utf8Pair edge_1{.first{"a"}, .second{"b"}}; - rerun::datatypes::Utf8Pair edge_2{.first{"b"}, .second{"c"}}; - rerun::datatypes::Utf8Pair edge_3{.first{"c"}, .second{"a"}}; + rerun::datatypes::Utf8Pair edge_1({"a"}, {"b"}); + rerun::datatypes::Utf8Pair edge_2({"b"}, {"c"}); + rerun::datatypes::Utf8Pair edge_3({"c"}, {"a"}); // Note: We log to the same entity here. rec.log( diff --git a/docs/snippets/all/archetypes/graph_undirected.cpp b/docs/snippets/all/archetypes/graph_undirected.cpp index e8a8ab638b19..22e00a1d4c10 100644 --- a/docs/snippets/all/archetypes/graph_undirected.cpp +++ b/docs/snippets/all/archetypes/graph_undirected.cpp @@ -13,10 +13,9 @@ int main() { .with_labels({"A", "B", "C"}) ); - // TODO(grtlr): This still throws warnings! - rerun::datatypes::Utf8Pair edge_1{.first{"a"}, .second{"b"}}; - rerun::datatypes::Utf8Pair edge_2{.first{"b"}, .second{"c"}}; - rerun::datatypes::Utf8Pair edge_3{.first{"c"}, .second{"a"}}; + rerun::datatypes::Utf8Pair edge_1({"a"}, {"b"}); + rerun::datatypes::Utf8Pair edge_2({"b"}, {"c"}); + rerun::datatypes::Utf8Pair edge_3({"c"}, {"a"}); // Note: We log to the same entity here. rec.log( diff --git a/rerun_cpp/src/rerun/datatypes/utf8pair.hpp b/rerun_cpp/src/rerun/datatypes/utf8pair.hpp index 5b8e846da778..fc9137a4d545 100644 --- a/rerun_cpp/src/rerun/datatypes/utf8pair.hpp +++ b/rerun_cpp/src/rerun/datatypes/utf8pair.hpp @@ -24,6 +24,13 @@ namespace rerun::datatypes { /// The second string. rerun::datatypes::Utf8 second; + public: // START of extensions from utf8pair_ext.cpp: + /// Creates a string pair. + Utf8Pair(rerun::datatypes::Utf8 first_, rerun::datatypes::Utf8 second_) + : first(std::move(first_)), second(std::move(second_)) {} + + // END of extensions from utf8pair_ext.cpp, start of generated code: + public: Utf8Pair() = default; }; diff --git a/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp b/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp new file mode 100644 index 000000000000..e901bf173285 --- /dev/null +++ b/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp @@ -0,0 +1,19 @@ +#include +#include "utf8pair.hpp" + +// #define EDIT_EXTENSION + +namespace rerun { + namespace datatypes { + +#ifdef EDIT_EXTENSION + // + + /// Creates a string pair. + Utf8Pair(rerun::datatypes::Utf8 first_, rerun::datatypes::Utf8 second_) + : first(std::move(first_)), second(std::move(second_)) {} + + // +#endif + } // namespace archetypes +} // namespace rerun From 636a7c5113f9ea742dae6eef3a0ee7cc1fd0931c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 13:18:06 +0100 Subject: [PATCH 154/159] WIP: drive-by fix of `tensor_dimension_ext.cpp` --- rerun_cpp/src/rerun/datatypes/tensor_dimension_ext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rerun_cpp/src/rerun/datatypes/tensor_dimension_ext.cpp b/rerun_cpp/src/rerun/datatypes/tensor_dimension_ext.cpp index 1e1d8ce97a49..6699700c5ae9 100644 --- a/rerun_cpp/src/rerun/datatypes/tensor_dimension_ext.cpp +++ b/rerun_cpp/src/rerun/datatypes/tensor_dimension_ext.cpp @@ -4,7 +4,7 @@ // #define EDIT_EXTENSION namespace rerun { - namespace archetypes { + namespace datatypes { #ifdef EDIT_EXTENSION // @@ -17,5 +17,5 @@ namespace rerun { // #endif - } // namespace archetypes + } // namespace datatypes } // namespace rerun From 5a7cb203aa808e2ed20d66e9672d9888059dd996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 13:22:46 +0100 Subject: [PATCH 155/159] WIP: typo --- rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp b/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp index e901bf173285..db882494fd41 100644 --- a/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp +++ b/rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp @@ -15,5 +15,5 @@ namespace rerun { // #endif - } // namespace archetypes + } // namespace datatypes } // namespace rerun From a242daa3f11a2b62f2bf5ded820684fbe0722f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 15:40:30 +0100 Subject: [PATCH 156/159] WIP: fix doc comment --- crates/viewer/re_space_view_graph/src/graph/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/viewer/re_space_view_graph/src/graph/hash.rs b/crates/viewer/re_space_view_graph/src/graph/hash.rs index 10801afee27d..e15f8c103cc4 100644 --- a/crates/viewer/re_space_view_graph/src/graph/hash.rs +++ b/crates/viewer/re_space_view_graph/src/graph/hash.rs @@ -1,7 +1,7 @@ use re_log_types::hash::Hash64; use re_types::components; -/// A 64 bit hash of [`GraphNodeId`] with very small risk of collision. +/// A 64 bit hash of [`components::GraphNode`] with very small risk of collision. #[derive(Copy, Clone, Eq, PartialOrd, Ord)] pub(crate) struct GraphNodeHash(Hash64); From 9d1440210f99455ff7e7969d87b16690a1c54ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 4 Nov 2024 15:45:27 +0100 Subject: [PATCH 157/159] WIP: fix `entity` --- docs/snippets/all/archetypes/graph_directed.py | 2 +- docs/snippets/all/archetypes/graph_undirected.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/snippets/all/archetypes/graph_directed.py b/docs/snippets/all/archetypes/graph_directed.py index e4397bcfc9fb..0ba674447002 100644 --- a/docs/snippets/all/archetypes/graph_directed.py +++ b/docs/snippets/all/archetypes/graph_directed.py @@ -12,6 +12,6 @@ ) # Note: We log to the same entity here. rr.log( - "edges", + "simple", rr.GraphEdges(edges=[("a", "b"), ("b", "c"), ("c", "a")], graph_type="directed"), ) diff --git a/docs/snippets/all/archetypes/graph_undirected.py b/docs/snippets/all/archetypes/graph_undirected.py index adb46b117b19..26c24fda2fd0 100644 --- a/docs/snippets/all/archetypes/graph_undirected.py +++ b/docs/snippets/all/archetypes/graph_undirected.py @@ -12,7 +12,7 @@ ) # Note: We log to the same entity here. rr.log( - "edges", + "simple", # `graph_type` is optional, graphs are undirected by default. rr.GraphEdges(edges=[("a", "b"), ("b", "c"), ("c", "a")], graph_type="undirected"), ) From 9585b164dcc949eb97adfa9816edeb9d8829a845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 5 Nov 2024 10:46:14 +0100 Subject: [PATCH 158/159] WIP: reset layout after every frame --- crates/viewer/re_space_view_graph/src/view.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index fdafd9383e61..c5b247e6d534 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -283,8 +283,9 @@ impl SpaceViewClass for GraphSpaceView { // Update stored bounds on the state, so visualizers see an up-to-date value. state.world_bounds = Some(bounds); - // Clean up the layout for nodes that are no longer present. - state.layout.retain(|k, _| seen.contains(k)); + // For now, we reset the layout after every frame. Eventually, we want + // to keep information between frames so that the nodes don't jump around. + state.layout.clear(); Ok(()) } From c100d5035cc0c5c8eb0c75c3f9c0a58e50252611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Tue, 5 Nov 2024 13:34:47 +0100 Subject: [PATCH 159/159] WIP: fix view init --- .../re_space_view_graph/src/properties.rs | 6 +- .../re_space_view_graph/src/ui/state.rs | 10 ++- crates/viewer/re_space_view_graph/src/view.rs | 62 +++++++++---------- 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/crates/viewer/re_space_view_graph/src/properties.rs b/crates/viewer/re_space_view_graph/src/properties.rs index e9cae792ab5a..0c0ddebbd134 100644 --- a/crates/viewer/re_space_view_graph/src/properties.rs +++ b/crates/viewer/re_space_view_graph/src/properties.rs @@ -16,7 +16,11 @@ impl TypedComponentFallbackProvider for GraphSpaceView { return VisualBounds2D::default(); }; - let default_scene_rect = bounding_rect_from_iter(state.layout.values()); + let Some(layout) = &state.layout else { + return VisualBounds2D::default(); + }; + + let default_scene_rect = bounding_rect_from_iter(layout.values()); if valid_bound(&default_scene_rect) { default_scene_rect.into() diff --git a/crates/viewer/re_space_view_graph/src/ui/state.rs b/crates/viewer/re_space_view_graph/src/ui/state.rs index d2e4a6f87a79..9bae591806b2 100644 --- a/crates/viewer/re_space_view_graph/src/ui/state.rs +++ b/crates/viewer/re_space_view_graph/src/ui/state.rs @@ -14,8 +14,9 @@ use super::bounding_rect_from_iter; /// This state is preserved between frames, but not across Viewer sessions. #[derive(Default)] pub struct GraphSpaceViewState { - /// Positions of the nodes in world space. - pub layout: HashMap, + /// Positions of the nodes in world space. If the layout is `None`, the + /// nodes were never layed out. + pub layout: Option>, pub show_debug: bool, @@ -24,11 +25,14 @@ pub struct GraphSpaceViewState { impl GraphSpaceViewState { pub fn layout_ui(&mut self, ui: &mut egui::Ui) { + let Some(layout) = self.layout.as_ref() else { + return; + }; ui.grid_left_hand_label("Layout") .on_hover_text("The bounding box encompassing all entities in the view right now"); ui.vertical(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - let egui::Rect { min, max } = bounding_rect_from_iter(self.layout.values()); + let egui::Rect { min, max } = bounding_rect_from_iter(layout.values()); ui.label(format!("x [{} - {}]", format_f32(min.x), format_f32(max.x),)); ui.label(format!("y [{} - {}]", format_f32(min.y), format_f32(max.y),)); }); diff --git a/crates/viewer/re_space_view_graph/src/view.rs b/crates/viewer/re_space_view_graph/src/view.rs index c5b247e6d534..90f1a3538118 100644 --- a/crates/viewer/re_space_view_graph/src/view.rs +++ b/crates/viewer/re_space_view_graph/src/view.rs @@ -60,28 +60,26 @@ impl SpaceViewClass for GraphSpaceView { } fn preferred_tile_aspect_ratio(&self, state: &dyn SpaceViewState) -> Option { - state - .downcast_ref::() - .ok() - .map(|state| { - let (width, height) = state.world_bounds.map_or_else( - || { - let bbox = bounding_rect_from_iter(state.layout.values()); - ( - (bbox.max.x - bbox.min.x).abs(), - (bbox.max.y - bbox.min.y).abs(), - ) - }, - |bounds| { - ( - bounds.x_range.abs_len() as f32, - bounds.y_range.abs_len() as f32, - ) - }, - ); - - width / height - }) + let state = state.downcast_ref::().ok()?; + let layout = state.layout.as_ref()?; + + let (width, height) = state.world_bounds.map_or_else( + || { + let bbox = bounding_rect_from_iter(layout.values()); + ( + (bbox.max.x - bbox.min.x).abs(), + (bbox.max.y - bbox.min.y).abs(), + ) + }, + |bounds| { + ( + bounds.x_range.abs_len() as f32, + bounds.y_range.abs_len() as f32, + ) + }, + ); + + Some(width / height) } // TODO(grtlr): implement `recommended_root_for_entities` @@ -148,8 +146,6 @@ impl SpaceViewClass for GraphSpaceView { let state = state.downcast_mut::()?; - let layout_was_empty = state.layout.is_empty(); - let bounds_property = ViewProperty::from_archetype::( ctx.blueprint_db(), ctx.blueprint_query, @@ -159,6 +155,12 @@ impl SpaceViewClass for GraphSpaceView { let bounds: blueprint::components::VisualBounds2D = bounds_property.component_or_fallback(ctx, self, state)?; + let layout_was_empty = state.layout.is_none(); + + // For now, we reset the layout at every frame. Eventually, we want + // to keep information between frames so that the nodes don't jump around. + let layout = state.layout.insert(Default::default()); + state.world_bounds = Some(bounds); let bounds_rect: egui::Rect = bounds.into(); @@ -186,7 +188,7 @@ impl SpaceViewClass for GraphSpaceView { if let Some(data) = node_data.get(entity) { for node in &data.nodes { seen.insert(node.index); - let current = state.layout.entry(node.index).or_insert( + let current = layout.entry(node.index).or_insert( node.position .map_or(egui::Rect::ZERO.translate(entity_offset), |p| { Rect::from_center_size(p, egui::Vec2::ZERO) @@ -223,7 +225,7 @@ impl SpaceViewClass for GraphSpaceView { for node in implicit_nodes { let ix = NodeIndex::from_entity_node(entity, node); seen.insert(ix); - let current = state.layout.entry(ix).or_insert( + let current = layout.entry(ix).or_insert( egui::Rect::ZERO .translate(entity_offset) .translate(current_implicit_offset), @@ -236,8 +238,8 @@ impl SpaceViewClass for GraphSpaceView { for edge in &data.edges { if let (Some(source_pos), Some(target_pos)) = ( - state.layout.get(&edge.source_index), - state.layout.get(&edge.target_index), + layout.get(&edge.source_index), + layout.get(&edge.target_index), ) { scene.edge(|ui| { ui::draw_edge( @@ -283,10 +285,6 @@ impl SpaceViewClass for GraphSpaceView { // Update stored bounds on the state, so visualizers see an up-to-date value. state.world_bounds = Some(bounds); - // For now, we reset the layout after every frame. Eventually, we want - // to keep information between frames so that the nodes don't jump around. - state.layout.clear(); - Ok(()) } }